Rewriten fleet browser item
This commit is contained in:
@@ -8,6 +8,11 @@ from gui.utils.drawUtils import GetPartialText
|
||||
|
||||
from wx.lib.buttons import GenBitmapButton
|
||||
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
|
||||
import gui.sfBrowserItem as SFItem
|
||||
|
||||
FleetSelected, EVT_FLEET_SELECTED = wx.lib.newevent.NewEvent()
|
||||
|
||||
FleetItemSelect, EVT_FLEET_ITEM_SELECT = wx.lib.newevent.NewEvent()
|
||||
@@ -96,6 +101,7 @@ class FleetBrowser(wx.Panel):
|
||||
widget = self.fleetItemContainer.GetWidgetByFleetID(ID)
|
||||
self.fleetItemContainer.RefreshList(True)
|
||||
self.fleetItemContainer.ScrollChildIntoView(widget)
|
||||
wx.PostEvent(self, FleetItemSelect(fleetID = ID))
|
||||
|
||||
def PopulateFleetList(self):
|
||||
self.Freeze()
|
||||
@@ -234,31 +240,22 @@ class PFFleetItemContainer(PFListPane):
|
||||
def OnLeftUp(self, event):
|
||||
event.Skip()
|
||||
|
||||
class FleetItem(wx.Window):
|
||||
class FleetItem(SFItem.SFBrowserItem):
|
||||
def __init__(self, parent, fleetID, fleetName, fleetCount,
|
||||
id=wx.ID_ANY, pos=wx.DefaultPosition,
|
||||
size=(0,32), style=0):
|
||||
wx.Window.__init__(self, parent, id, pos, size, style)
|
||||
size=(0,40), style=0):
|
||||
SFItem.SFBrowserItem.__init__(self, parent, size = size)
|
||||
|
||||
# self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
# self.fleetBrowser = self.mainFrame.fleetBrowser
|
||||
# print self.fleetBrowser
|
||||
self.fleetBrowser = self.Parent
|
||||
self.fleetID = fleetID
|
||||
self.fleetName = fleetName
|
||||
self.fleetCount = fleetCount
|
||||
self.highlighted = 0
|
||||
|
||||
self.buttonsTip = ""
|
||||
self.selected = False
|
||||
self.padding = 5
|
||||
self.editHasFocus = False
|
||||
|
||||
self.cleanupTimer = None
|
||||
self.cleanupTimerId = wx.NewId()
|
||||
self.padding = 4
|
||||
|
||||
self.fontBig = wx.FontFromPixelSize((0,15),wx.SWISS, wx.NORMAL, wx.BOLD, False)
|
||||
self.fontSmall = wx.FontFromPixelSize((0,13),wx.SWISS, wx.NORMAL, wx.NORMAL, False)
|
||||
self.fontNormal = wx.FontFromPixelSize((0,14),wx.SWISS, wx.NORMAL, wx.NORMAL, False)
|
||||
self.fontSmall = wx.FontFromPixelSize((0,12),wx.SWISS, wx.NORMAL, wx.NORMAL, False)
|
||||
|
||||
self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons")
|
||||
self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons")
|
||||
@@ -266,29 +263,18 @@ class FleetItem(wx.Window):
|
||||
self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons")
|
||||
self.fleetBmp = bitmapLoader.getBitmap("fleet_item_big", "icons")
|
||||
|
||||
self.copyBmpGrey = self.GreyBitmap(self.copyBmp)
|
||||
self.renameBmpGrey = self.GreyBitmap(self.renameBmp)
|
||||
self.deleteBmpGrey = self.GreyBitmap(self.deleteBmp)
|
||||
self.acceptBmpGrey = self.GreyBitmap(self.acceptBmp)
|
||||
fleetImg = self.fleetBmp.ConvertToImage()
|
||||
fleetImg = fleetImg.Blur(2)
|
||||
|
||||
self.btnSize = (18,18)
|
||||
if not fleetImg.HasAlpha():
|
||||
fleetImg.InitAlpha()
|
||||
|
||||
if 'wxMac' in wx.PlatformInfo:
|
||||
self.btnbgcolour = wx.Colour(0, 0, 0, 0)
|
||||
else:
|
||||
self.btnbgcolour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_3DFACE)
|
||||
fleetImg = fleetImg.AdjustChannels(1, 1, 1, 0.5)
|
||||
self.fleetEffBmp = wx.BitmapFromImage(fleetImg)
|
||||
|
||||
self.btnCopy = PFGenBitmapButton( self, wx.ID_ANY, self.copyBmp, wx.DefaultPosition, self.btnSize, wx.BORDER_NONE )
|
||||
self.btnCopy.Show(False)
|
||||
self.btnCopy.SetBackgroundColour( self.btnbgcolour )
|
||||
|
||||
self.btnRename = PFGenBitmapButton( self, wx.ID_ANY, self.renameBmp, wx.DefaultPosition, self.btnSize, wx.BORDER_NONE )
|
||||
self.btnRename.Show(False)
|
||||
self.btnRename.SetBackgroundColour( self.btnbgcolour )
|
||||
|
||||
self.btnDelete = PFGenBitmapButton( self, wx.ID_ANY, self.deleteBmp, wx.DefaultPosition, self.btnSize, wx.BORDER_NONE )
|
||||
self.btnDelete.Show(False)
|
||||
self.btnDelete.SetBackgroundColour( self.btnbgcolour )
|
||||
self.toolbar.AddButton(self.copyBmp, "Copy", self.CopyFleetCB)
|
||||
self.toolbar.AddButton(self.renameBmp, "Rename", self.RenameFleetCB)
|
||||
self.toolbar.AddButton(self.deleteBmp, "Delete", self.DeleteFleetCB)
|
||||
|
||||
self.editWidth = 150
|
||||
self.tcFleetName = wx.TextCtrl(self, wx.ID_ANY, "%s" % self.fleetName, wx.DefaultPosition, (self.editWidth,-1), wx.TE_PROCESS_ENTER)
|
||||
@@ -298,270 +284,140 @@ class FleetItem(wx.Window):
|
||||
else:
|
||||
self.tcFleetName.SetFocus()
|
||||
self.tcFleetName.SelectAll()
|
||||
self.btnRename.SetBitmapLabel(self.acceptBmp, False)
|
||||
self.editHasFocus = True
|
||||
self.fleetBrowser.fleetIDMustEditName = -1
|
||||
|
||||
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
||||
self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None)
|
||||
|
||||
self.Bind(wx.EVT_LEAVE_WINDOW, self.LeaveWindow)
|
||||
self.Bind(wx.EVT_ENTER_WINDOW, self.EnterWindow)
|
||||
self.Bind(wx.EVT_LEFT_UP, self.OnSelect)
|
||||
|
||||
self.btnCopy.Bind(wx.EVT_ENTER_WINDOW, self.OnBtnEnterWindow)
|
||||
self.btnRename.Bind(wx.EVT_ENTER_WINDOW, self.OnBtnEnterWindow)
|
||||
self.btnDelete.Bind(wx.EVT_ENTER_WINDOW, self.OnBtnEnterWindow)
|
||||
|
||||
self.btnDelete.Bind(wx.EVT_BUTTON, self.OnDeleteBtn)
|
||||
self.btnCopy.Bind(wx.EVT_BUTTON, self.OnCopyBtn)
|
||||
self.btnRename.Bind(wx.EVT_BUTTON, self.OnRenameBtn)
|
||||
self.selected = True
|
||||
|
||||
self.tcFleetName.Bind(wx.EVT_KILL_FOCUS, self.OnEditLostFocus)
|
||||
self.tcFleetName.Bind(wx.EVT_TEXT_ENTER, self.RenameFit)
|
||||
self.tcFleetName.Bind(wx.EVT_TEXT_ENTER, self.RenameFleet)
|
||||
self.tcFleetName.Bind(wx.EVT_KEY_DOWN, self.EditCheckEsc)
|
||||
|
||||
self.Bind(wx.EVT_TIMER, self.OnTimer)
|
||||
|
||||
def OnSelect(self, event):
|
||||
if self.editHasFocus:
|
||||
self.HideEdit()
|
||||
self.animCount = 0
|
||||
|
||||
def MouseLeftUp(self, event):
|
||||
if self.tcFleetName.IsShown():
|
||||
self.tcFleetName.Show(False)
|
||||
else:
|
||||
wx.PostEvent(self.fleetBrowser, FleetItemSelect(fleetID = self.fleetID))
|
||||
event.Skip()
|
||||
|
||||
def OnRenameBtn(self, event):
|
||||
def CopyFleetCB(self):
|
||||
wx.PostEvent(self.fleetBrowser, FleetItemCopy(fleetID = self.fleetID))
|
||||
|
||||
def RenameFleetCB(self):
|
||||
|
||||
if self.tcFleetName.IsShown():
|
||||
self.HideEdit()
|
||||
self.btnRename.SetBitmapLabel(self.renameBmp, False)
|
||||
self.RenameFit(None)
|
||||
self.tcFleetName.Show(False)
|
||||
self.RenameFleet(None)
|
||||
else:
|
||||
if not self.editHasFocus:
|
||||
self.btnRename.SetBitmapLabel(self.acceptBmp,False)
|
||||
self.tcFleetName.Show(True)
|
||||
self.tcFleetName.SetFocus()
|
||||
self.tcFleetName.SelectAll()
|
||||
self.editHasFocus = True
|
||||
event.Skip()
|
||||
self.tcFleetName.SetValue(self.fleetName)
|
||||
self.tcFleetName.Show()
|
||||
|
||||
def OnDeleteBtn(self, event):
|
||||
if self.editHasFocus:
|
||||
self.HideEdit()
|
||||
else:
|
||||
wx.PostEvent(self.fleetBrowser, FleetItemDelete(fleetID = self.fleetID))
|
||||
event.Skip()
|
||||
self.tcFleetName.SetFocus()
|
||||
self.tcFleetName.SelectAll()
|
||||
|
||||
def OnCopyBtn(self, event):
|
||||
if self.editHasFocus:
|
||||
self.HideEdit()
|
||||
else:
|
||||
wx.PostEvent(self.fleetBrowser, FleetItemCopy(fleetID = self.fleetID))
|
||||
event.Skip()
|
||||
self.Refresh()
|
||||
|
||||
def RenameFit(self, event):
|
||||
self.HideEdit()
|
||||
def RenameFleet(self, event):
|
||||
|
||||
newFleetName = self.tcFleetName.GetValue()
|
||||
self.fleetName = newFleetName
|
||||
|
||||
self.tcFleetName.Show(False)
|
||||
|
||||
wx.PostEvent(self.fleetBrowser, FleetItemRename(fleetID = self.fleetID, fleetName = self.fleetName))
|
||||
self.Refresh()
|
||||
|
||||
def DeleteFleetCB(self):
|
||||
wx.PostEvent(self.fleetBrowser, FleetItemDelete(fleetID = self.fleetID))
|
||||
|
||||
def OnEditLostFocus(self, event):
|
||||
self.tcFleetName.Show(False)
|
||||
self.Refresh()
|
||||
|
||||
def EditCheckEsc(self, event):
|
||||
if event.GetKeyCode() == wx.WXK_ESCAPE:
|
||||
self.tcFleetName.Show(False)
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
def IsSelected(self):
|
||||
return self.selected
|
||||
|
||||
def SetSelected(self, state = True):
|
||||
self.selected = state
|
||||
|
||||
def OnPaint(self, event):
|
||||
def UpdateElementsPos(self, mdc):
|
||||
rect = self.GetRect()
|
||||
|
||||
#Bitmap for our buffered DC
|
||||
canvas = wx.EmptyBitmap(rect.width, rect.height)
|
||||
self.toolbarx = rect.width - self.toolbar.GetWidth() - self.padding
|
||||
self.toolbary = (rect.height - self.toolbar.GetHeight()) / 2
|
||||
|
||||
#Buffered DC
|
||||
bdc = wx.BufferedPaintDC(self)
|
||||
bdc.SelectObject(canvas)
|
||||
self.toolbarx = self.toolbarx + self.animCount
|
||||
|
||||
#gradient rect - clear the window
|
||||
grect = copy.copy(rect)
|
||||
grect.top = grect.left = 0
|
||||
self.fleetBmpx = self.padding + (rect.height - self.fleetBmp.GetWidth()) / 2
|
||||
self.fleetBmpy = (rect.height - self.fleetBmp.GetHeight()) / 2
|
||||
|
||||
grect.height = grect.height / 2
|
||||
self.fleetBmpx -= self.animCount
|
||||
|
||||
if self.highlighted:
|
||||
self.textStartx = self.fleetBmpx + self.fleetBmp.GetWidth() + self.padding
|
||||
|
||||
sr = 221
|
||||
sg = 221
|
||||
sb = 221
|
||||
self.fleetNamey = (rect.height - self.fleetBmp.GetHeight()) / 2
|
||||
|
||||
startColor = (sr,sg,sb)
|
||||
mdc.SetFont(self.fontBig)
|
||||
wtext, htext = mdc.GetTextExtent(self.fleetName)
|
||||
|
||||
bdc.GradientFillLinear(grect, startColor, wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW),wx.SOUTH)
|
||||
grect.top = grect.height
|
||||
bdc.GradientFillLinear(grect, startColor, wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW),wx.NORTH)
|
||||
bdc.SetTextForeground(wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWTEXT ))
|
||||
self.fleetCounty = self.fleetNamey + htext
|
||||
|
||||
else:
|
||||
if self.selected:
|
||||
bkcolor = wx.Colour(221,221,221)
|
||||
else:
|
||||
bkcolor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
mdc.SetFont(self.fontSmall)
|
||||
|
||||
bdc.SetBackground(wx.Brush(bkcolor))
|
||||
bdc.SetTextForeground(wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWTEXT ))
|
||||
bdc.Clear()
|
||||
wlabel,hlabel = mdc.GetTextExtent(self.toolbar.hoverLabel)
|
||||
|
||||
self.thoverx = self.toolbarx - self.padding - wlabel
|
||||
self.thovery = (rect.height - hlabel)/2
|
||||
self.thoverw = wlabel
|
||||
|
||||
def DrawItem(self, mdc):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitableColor(windowColor, 1)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
|
||||
self.UpdateElementsPos(mdc)
|
||||
|
||||
self.toolbar.SetPosition((self.toolbarx, self.toolbary))
|
||||
mdc.DrawBitmap(self.fleetEffBmp, self.fleetBmpx + 3, self.fleetBmpy + 2)
|
||||
mdc.DrawBitmap(self.fleetBmp, self.fleetBmpx,self.fleetBmpy)
|
||||
|
||||
mdc.SetFont(self.fontNormal)
|
||||
|
||||
bdc.DrawBitmap(self.fleetBmp, 0, (rect.height - self.fleetBmp.GetHeight())/2)
|
||||
textStart = self.padding + self.fleetBmp.GetWidth()
|
||||
suffix = "%d ships" % self.fleetCount if self.fleetCount >1 else "%d ship" % self.fleetCount if self.fleetCount == 1 else "No ships"
|
||||
fleetCount = "Fleet size: %s" % suffix
|
||||
fleetCount = drawUtils.GetPartialText(mdc, fleetCount, self.toolbarx - self.textStartx - self.padding * 2 - self.thoverw)
|
||||
|
||||
btnWidth,btnHeight = self.btnSize
|
||||
self.deletePosX = rect.width - btnWidth - self.padding
|
||||
self.renamePosX = self.deletePosX - btnWidth
|
||||
# - self.padding
|
||||
self.copyPosX = self.renamePosX - btnWidth
|
||||
# - self.padding
|
||||
self.renamePosY = self.deletePosY = self.copyPosY = (rect.height - btnHeight) / 2
|
||||
mdc.DrawText(fleetCount, self.textStartx, self.fleetCounty)
|
||||
|
||||
bdc.SetFont(self.fontSmall)
|
||||
tx,ty = bdc.GetTextExtent(self.buttonsTip)
|
||||
mdc.SetFont(self.fontSmall)
|
||||
mdc.DrawText(self.toolbar.hoverLabel, self.thoverx, self.thovery)
|
||||
|
||||
bdc.SetFont(self.fontBig)
|
||||
fnx,fny = bdc.GetTextExtent(self.fleetName)
|
||||
pfn = GetPartialText(bdc, self.fleetName, self.copyPosX - 16 - self.padding - tx - textStart)
|
||||
bdc.DrawText(pfn, textStart, (rect.height/2 - fny) / 2)
|
||||
mdc.SetFont(self.fontBig)
|
||||
|
||||
bdc.SetFont(self.fontSmall)
|
||||
fcx,fcy = bdc.GetTextExtent(fleetCount)
|
||||
pfc = GetPartialText(bdc, fleetCount, self.copyPosX - 16 - self.padding - tx - textStart)
|
||||
bdc.DrawText(pfc, textStart, rect.height/2 + (rect.height/2 -fcy) / 2 )
|
||||
pfname = drawUtils.GetPartialText(mdc, self.fleetName, self.toolbarx - self.textStartx - self.padding * 2 - self.thoverw)
|
||||
mdc.DrawText(pfname, self.textStartx, self.fleetNamey)
|
||||
|
||||
bdc.SetFont(self.fontSmall)
|
||||
if self.tcFleetName.IsShown():
|
||||
self.AdjustControlSizePos(self.tcFleetName, self.textStartx, self.toolbarx - self.editWidth - self.padding)
|
||||
|
||||
if self.highlighted:
|
||||
brush = wx.Brush(self.btnbgcolour)
|
||||
pen = wx.Pen(self.btnbgcolour)
|
||||
|
||||
bdc.SetPen(pen)
|
||||
bdc.SetBrush(brush)
|
||||
|
||||
bdc.DrawRoundedRectangle(self.copyPosX - 8 - tx - self.padding, self.copyPosY-1, rect.width,20, 8)
|
||||
bdc.DrawText(self.buttonsTip,self.copyPosX - tx - self.padding, self.copyPosY + 8 - ty/2)
|
||||
|
||||
self.btnCopy.SetPosition((self.copyPosX, self.copyPosY))
|
||||
self.btnRename.SetPosition((self.renamePosX, self.renamePosY))
|
||||
self.btnDelete.SetPosition((self.deletePosX, self.deletePosY))
|
||||
|
||||
self.btnCopy.Show()
|
||||
self.btnRename.Show()
|
||||
self.btnDelete.Show()
|
||||
|
||||
else:
|
||||
self.btnCopy.Show(False)
|
||||
self.btnRename.Show(False)
|
||||
self.btnDelete.Show(False)
|
||||
|
||||
bdc.DrawBitmap(self.copyBmpGrey, self.copyPosX + 1, self.copyPosY + 1 )
|
||||
|
||||
if self.editHasFocus:
|
||||
bdc.DrawBitmap(self.acceptBmpGrey, self.renamePosX + 1, self.renamePosY + 1 )
|
||||
else:
|
||||
bdc.DrawBitmap(self.renameBmpGrey, self.renamePosX + 1, self.renamePosY + 1 )
|
||||
|
||||
bdc.DrawBitmap(self.deleteBmpGrey, self.deletePosX + 1, self.deletePosY + 1 )
|
||||
|
||||
|
||||
self.AdjustFleetNameEditSize(textStart, self.copyPosX - self.editWidth - self.padding)
|
||||
|
||||
def AdjustFleetNameEditSize(self, start,end):
|
||||
fnEditSize = self.tcFleetName.GetSize()
|
||||
def AdjustControlSizePos(self, editCtl, start, end):
|
||||
fnEditSize = editCtl.GetSize()
|
||||
wSize = self.GetSize()
|
||||
fnEditPosX = end
|
||||
fnEditPosY = (wSize.height - fnEditSize.height)/2
|
||||
if fnEditPosX < start:
|
||||
self.tcFleetName.SetSize((self.editWidth + fnEditPosX - start,-1))
|
||||
self.tcFleetName.SetPosition((start,fnEditPosY))
|
||||
editCtl.SetSize((self.editWidth + fnEditPosX - start,-1))
|
||||
editCtl.SetPosition((start,fnEditPosY))
|
||||
else:
|
||||
self.tcFleetName.SetSize((self.editWidth,-1))
|
||||
self.tcFleetName.SetPosition((fnEditPosX,fnEditPosY))
|
||||
editCtl.SetSize((self.editWidth,-1))
|
||||
editCtl.SetPosition((fnEditPosX,fnEditPosY))
|
||||
|
||||
def OnEditLostFocus(self, event):
|
||||
if self.highlighted == 1:
|
||||
self.editHasFocus = True
|
||||
else:
|
||||
self.HideEdit()
|
||||
event.Skip()
|
||||
|
||||
def EditCheckEsc(self, event):
|
||||
if event.GetKeyCode() == wx.WXK_ESCAPE:
|
||||
self.HideEdit()
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
def HideEdit(self):
|
||||
self.tcFleetName.Show(False)
|
||||
self.editHasFocus = False
|
||||
self.btnRename.SetBitmapLabel(self.renameBmp, False)
|
||||
self.Refresh()
|
||||
|
||||
|
||||
def OnBtnEnterWindow(self, event):
|
||||
btn = event.GetEventObject()
|
||||
if btn == self.btnCopy:
|
||||
self.buttonsTip = "Copy Fleet"
|
||||
elif btn == self.btnDelete:
|
||||
self.buttonsTip = "Delete Fleet"
|
||||
elif btn == self.btnRename:
|
||||
self.buttonsTip = "Rename Fleet"
|
||||
else:
|
||||
self.buttonsTip = ""
|
||||
self.Refresh()
|
||||
event.Skip()
|
||||
|
||||
|
||||
def EnterWindow(self, event):
|
||||
if not self.cleanupTimer:
|
||||
self.cleanupTimer = wx.Timer(self, self.cleanupTimerId)
|
||||
if not self.cleanupTimer.IsRunning():
|
||||
self.cleanupTimer.Start(50)
|
||||
|
||||
self.highlighted = 1
|
||||
self.buttonsTip = ""
|
||||
self.Refresh()
|
||||
event.Skip()
|
||||
|
||||
def LeaveWindow(self, event):
|
||||
mposx, mposy = wx.GetMousePosition()
|
||||
rect = self.GetRect()
|
||||
rect.top = rect.left = 0
|
||||
cx,cy = self.ScreenToClient((mposx,mposy))
|
||||
if not rect.Contains((cx,cy)):
|
||||
self.highlighted = 0
|
||||
self.Refresh()
|
||||
if self.cleanupTimer:
|
||||
if self.cleanupTimer.IsRunning():
|
||||
self.cleanupTimer.Stop()
|
||||
|
||||
event.Skip()
|
||||
|
||||
def OnTimer(self, event):
|
||||
if event.GetId() == self.cleanupTimerId:
|
||||
mposx, mposy = wx.GetMousePosition()
|
||||
rect = self.GetRect()
|
||||
rect.top = rect.left = 0
|
||||
cx,cy = self.ScreenToClient((mposx,mposy))
|
||||
if not rect.Contains((cx,cy)):
|
||||
self.highlighted = 0
|
||||
self.Refresh()
|
||||
self.cleanupTimer.Stop()
|
||||
event.Skip()
|
||||
|
||||
def GreyBitmap(self, bitmap):
|
||||
img = bitmap.ConvertToImage()
|
||||
img = img.ConvertToGreyscale()
|
||||
return wx.BitmapFromImage(img)
|
||||
|
||||
class PFGenBitmapButton(GenBitmapButton):
|
||||
def __init__(self, parent, id, bitmap, pos, size, style):
|
||||
|
||||
Reference in New Issue
Block a user