457 lines
16 KiB
Python
457 lines
16 KiB
Python
import wx
|
|
import copy
|
|
from gui.bitmapLoader import BitmapLoader
|
|
import gui.mainFrame
|
|
from gui.PFListPane import PFListPane
|
|
import service.fleet
|
|
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()
|
|
FleetRenamed, EVT_FLEET_RENAMED = wx.lib.newevent.NewEvent()
|
|
FleetRemoved, EVT_FLEET_REMOVED = wx.lib.newevent.NewEvent()
|
|
|
|
|
|
FleetItemSelect, EVT_FLEET_ITEM_SELECT = wx.lib.newevent.NewEvent()
|
|
FleetItemDelete, EVT_FLEET_ITEM_DELETE = wx.lib.newevent.NewEvent()
|
|
FleetItemNew, EVT_FLEET_ITEM_NEW = wx.lib.newevent.NewEvent()
|
|
FleetItemCopy, EVT_FLEET_ITEM_COPY = wx.lib.newevent.NewEvent()
|
|
FleetItemRename, EVT_FLEET_ITEM_RENAME = wx.lib.newevent.NewEvent()
|
|
|
|
|
|
|
|
class FleetBrowser(wx.Panel):
|
|
def __init__(self, parent):
|
|
wx.Panel.__init__(self, parent)
|
|
|
|
self.sFleet = service.fleet.Fleet.getInstance()
|
|
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
|
|
|
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
self.hpane = FleetBrowserHeader(self)
|
|
mainSizer.Add(self.hpane, 0, wx.EXPAND)
|
|
|
|
self.m_sl2 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL )
|
|
mainSizer.Add( self.m_sl2, 0, wx.EXPAND, 0 )
|
|
|
|
self.fleetItemContainer = PFFleetItemContainer(self)
|
|
|
|
mainSizer.Add(self.fleetItemContainer, 1, wx.EXPAND)
|
|
|
|
self.SetSizer(mainSizer)
|
|
self.Layout()
|
|
|
|
self.filter = ""
|
|
self.fleetIDMustEditName = -1
|
|
|
|
self.Bind(wx.EVT_SIZE, self.SizeRefreshList)
|
|
|
|
self.Bind(EVT_FLEET_ITEM_NEW, self.AddNewFleetItem)
|
|
self.Bind(EVT_FLEET_ITEM_SELECT, self.SelectFleetItem)
|
|
self.Bind(EVT_FLEET_ITEM_DELETE, self.DeleteFleetItem)
|
|
self.Bind(EVT_FLEET_ITEM_COPY, self.CopyFleetItem)
|
|
self.Bind(EVT_FLEET_ITEM_RENAME, self.RenameFleetItem)
|
|
|
|
self.PopulateFleetList()
|
|
|
|
def AddNewFleetItem(self, event):
|
|
fleetName = event.fleetName
|
|
newFleet = self.sFleet.addFleet()
|
|
self.sFleet.renameFleet(newFleet, fleetName)
|
|
|
|
self.fleetIDMustEditName = newFleet.ID
|
|
self.AddItem(newFleet.ID, newFleet.name, newFleet.count())
|
|
|
|
def SelectFleetItem(self, event):
|
|
fleetID = event.fleetID
|
|
self.fleetItemContainer.SelectWidgetByFleetID(fleetID)
|
|
wx.PostEvent(self.mainFrame, FleetSelected(fleetID=fleetID))
|
|
|
|
def CopyFleetItem(self, event):
|
|
fleetID = event.fleetID
|
|
fleet = self.sFleet.copyFleetByID(fleetID)
|
|
|
|
fleetName = fleet.name + " Copy"
|
|
self.sFleet.renameFleet(fleet,fleetName)
|
|
|
|
self.fleetIDMustEditName = fleet.ID
|
|
self.AddItem(fleet.ID, fleet.name, fleet.count())
|
|
|
|
self.fleetItemContainer.SelectWidgetByFleetID(fleet.ID)
|
|
wx.PostEvent(self.mainFrame, FleetSelected(fleetID=fleet.ID))
|
|
|
|
def RenameFleetItem(self, event):
|
|
fleetID = event.fleetID
|
|
fleet = self.sFleet.getFleetByID(fleetID)
|
|
|
|
newFleetName = event.fleetName
|
|
|
|
self.sFleet.renameFleet(fleet, newFleetName)
|
|
wx.PostEvent(self.mainFrame, FleetRenamed(fleetID = fleet.ID))
|
|
|
|
def DeleteFleetItem(self, event):
|
|
self.sFleet.deleteFleetByID(event.fleetID)
|
|
self.PopulateFleetList()
|
|
wx.PostEvent(self.mainFrame, FleetRemoved(fleetID = event.fleetID))
|
|
|
|
def AddItem (self, ID, name, count):
|
|
self.fleetItemContainer.AddWidget(FleetItem(self, ID, name, count))
|
|
widget = self.fleetItemContainer.GetWidgetByFleetID(ID)
|
|
self.fleetItemContainer.RefreshList(True)
|
|
self.fleetItemContainer.ScrollChildIntoView(widget)
|
|
wx.PostEvent(self, FleetItemSelect(fleetID = ID))
|
|
|
|
def PopulateFleetList(self):
|
|
self.Freeze()
|
|
filter = self.filter
|
|
self.fleetItemContainer.RemoveAllChildren()
|
|
fleetList = self.sFleet.getFleetList()
|
|
for fleetID, fleetName, fleetCount in fleetList:
|
|
if fleetName.lower().find(filter.lower()) != -1:
|
|
self.fleetItemContainer.AddWidget(FleetItem(self, fleetID, fleetName, fleetCount))
|
|
self.fleetItemContainer.RefreshList()
|
|
self.Thaw()
|
|
|
|
def SetFilter(self, filter):
|
|
self.filter = filter
|
|
|
|
def SizeRefreshList(self, event):
|
|
ewidth, eheight = event.GetSize()
|
|
self.Layout()
|
|
self.fleetItemContainer.Layout()
|
|
self.fleetItemContainer.RefreshList(True)
|
|
event.Skip()
|
|
|
|
|
|
class FleetBrowserHeader (wx.Panel):
|
|
def __init__(self, parent):
|
|
wx.Panel.__init__ (self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 24), style=wx.TAB_TRAVERSAL)
|
|
self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE ) )
|
|
|
|
self.newBmp = BitmapLoader.getBitmap("fit_add_small","gui")
|
|
bmpSize = (16,16)
|
|
|
|
mainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
if 'wxMac' in wx.PlatformInfo:
|
|
bgcolour = wx.Colour(0, 0, 0, 0)
|
|
else:
|
|
bgcolour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE )
|
|
|
|
self.fbNewFleet = PFGenBitmapButton( self, wx.ID_ANY, self.newBmp, wx.DefaultPosition, bmpSize, wx.BORDER_NONE )
|
|
mainSizer.Add(self.fbNewFleet, 0, wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL , 5)
|
|
self.fbNewFleet.SetBackgroundColour( bgcolour )
|
|
|
|
self.sl1 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_VERTICAL )
|
|
mainSizer.Add( self.sl1, 0, wx.EXPAND |wx.LEFT, 5 )
|
|
|
|
self.tcFilter = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
|
|
mainSizer.Add( self.tcFilter, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5 )
|
|
|
|
self.stStatus = wx.StaticText( self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 )
|
|
self.stStatus.Wrap( -1 )
|
|
mainSizer.Add( self.stStatus, 1, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5 )
|
|
|
|
self.SetSizer(mainSizer)
|
|
self.Layout()
|
|
|
|
self.fbNewFleet.Bind(wx.EVT_ENTER_WINDOW, self.fbNewEnterWindow)
|
|
self.fbNewFleet.Bind(wx.EVT_LEAVE_WINDOW, self.fbHItemLeaveWindow)
|
|
self.fbNewFleet.Bind(wx.EVT_BUTTON, self.OnNewFleetItem)
|
|
|
|
self.tcFilter.Bind(wx.EVT_TEXT, self.OnFilterText)
|
|
|
|
self.tcFilter.Bind(wx.EVT_ENTER_WINDOW, self.fbFilterEnterWindow)
|
|
self.tcFilter.Bind(wx.EVT_LEAVE_WINDOW, self.fbHItemLeaveWindow)
|
|
|
|
def OnFilterText(self, event):
|
|
filter = self.tcFilter.GetValue()
|
|
self.Parent.SetFilter(filter)
|
|
self.Parent.PopulateFleetList()
|
|
event.Skip()
|
|
|
|
def OnNewFleetItem(self, event):
|
|
wx.PostEvent(self.Parent, FleetItemNew(fleetName = "New Fleet"))
|
|
|
|
def fbNewEnterWindow(self, event):
|
|
self.stStatus.SetLabel("New fleet")
|
|
self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_HAND))
|
|
event.Skip()
|
|
|
|
def fbHItemLeaveWindow(self, event):
|
|
self.stStatus.SetLabel("")
|
|
self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
|
|
event.Skip()
|
|
|
|
def fbFilterEnterWindow(self, event):
|
|
self.stStatus.SetLabel("Filter list")
|
|
event.Skip()
|
|
|
|
|
|
|
|
class PFFleetItemContainer(PFListPane):
|
|
def __init__(self,parent):
|
|
PFListPane.__init__(self,parent)
|
|
self.selectedWidget = -1
|
|
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
|
|
|
|
def IsWidgetSelectedByContext(self, widget):
|
|
if self.GetWidgetList()[widget].IsSelected():
|
|
return True
|
|
return False
|
|
|
|
def GetWidgetIndex(self, widgetWnd):
|
|
return self.GetWidgetList().index(widgetWnd)
|
|
|
|
def GetWidgetByFleetID(self, fleetID):
|
|
for widget in self.GetWidgetList():
|
|
if widget.fleetID == fleetID:
|
|
return widget
|
|
return None
|
|
|
|
def SelectWidget(self, widgetWnd):
|
|
wlist = self.GetWidgetList()
|
|
if self.selectedWidget != -1:
|
|
wlist[self.selectedWidget].SetSelected(False)
|
|
wlist[self.selectedWidget].Refresh()
|
|
windex = self.GetWidgetIndex(widgetWnd)
|
|
wlist[windex].SetSelected(True)
|
|
wlist[windex].Refresh()
|
|
self.selectedWidget = windex
|
|
|
|
def SelectWidgetByFleetID(self, fleetID):
|
|
widgetWnd = self.GetWidgetByFleetID(fleetID)
|
|
if widgetWnd:
|
|
self.SelectWidget(widgetWnd)
|
|
|
|
def RemoveWidget(self, child):
|
|
child.Destroy()
|
|
self.selectedWidget = -1
|
|
self._wList.remove(child)
|
|
|
|
|
|
def RemoveAllChildren(self):
|
|
for widget in self._wList:
|
|
widget.Destroy()
|
|
|
|
self.selectedWidget = -1
|
|
self._wList = []
|
|
|
|
def OnLeftUp(self, event):
|
|
event.Skip()
|
|
|
|
class FleetItem(SFItem.SFBrowserItem):
|
|
def __init__(self, parent, fleetID, fleetName, fleetCount,
|
|
id=wx.ID_ANY, pos=wx.DefaultPosition,
|
|
size=(0,40), style=0):
|
|
SFItem.SFBrowserItem.__init__(self, parent, size = size)
|
|
|
|
self.fleetBrowser = self.Parent
|
|
self.fleetID = fleetID
|
|
self.fleetName = fleetName
|
|
self.fleetCount = fleetCount
|
|
|
|
self.padding = 4
|
|
|
|
self.fontBig = wx.FontFromPixelSize((0,15),wx.SWISS, wx.NORMAL, wx.BOLD, 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", "gui")
|
|
self.renameBmp = BitmapLoader.getBitmap("fit_rename_small", "gui")
|
|
self.deleteBmp = BitmapLoader.getBitmap("fit_delete_small","gui")
|
|
self.acceptBmp = BitmapLoader.getBitmap("faccept_small", "gui")
|
|
self.fleetBmp = BitmapLoader.getBitmap("fleet_item_big", "gui")
|
|
|
|
fleetImg = self.fleetBmp.ConvertToImage()
|
|
fleetImg = fleetImg.Blur(2)
|
|
|
|
if not fleetImg.HasAlpha():
|
|
fleetImg.InitAlpha()
|
|
|
|
fleetImg = fleetImg.AdjustChannels(1, 1, 1, 0.5)
|
|
self.fleetEffBmp = wx.BitmapFromImage(fleetImg)
|
|
|
|
self.toolbar.AddButton(self.copyBmp, "Copy", self.CopyFleetCB)
|
|
self.renameBtn = 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)
|
|
|
|
if self.fleetBrowser.fleetIDMustEditName != self.fleetID:
|
|
self.tcFleetName.Show(False)
|
|
else:
|
|
self.tcFleetName.SetFocus()
|
|
self.tcFleetName.SelectAll()
|
|
self.fleetBrowser.fleetIDMustEditName = -1
|
|
self.renameBtn.SetBitmap(self.acceptBmp)
|
|
self.selected = True
|
|
|
|
self.tcFleetName.Bind(wx.EVT_KILL_FOCUS, self.OnEditLostFocus)
|
|
self.tcFleetName.Bind(wx.EVT_TEXT_ENTER, self.RenameFleet)
|
|
self.tcFleetName.Bind(wx.EVT_KEY_DOWN, self.EditCheckEsc)
|
|
|
|
|
|
self.animCount = 0
|
|
|
|
def MouseLeftUp(self, event):
|
|
if self.tcFleetName.IsShown():
|
|
self.RestoreEditButton()
|
|
else:
|
|
wx.PostEvent(self.fleetBrowser, FleetItemSelect(fleetID = self.fleetID))
|
|
|
|
def CopyFleetCB(self):
|
|
if self.tcFleetName.IsShown():
|
|
self.RestoreEditButton()
|
|
return
|
|
|
|
wx.PostEvent(self.fleetBrowser, FleetItemCopy(fleetID = self.fleetID))
|
|
|
|
def RenameFleetCB(self):
|
|
|
|
if self.tcFleetName.IsShown():
|
|
|
|
self.RenameFleet(None)
|
|
self.RestoreEditButton()
|
|
|
|
else:
|
|
self.tcFleetName.SetValue(self.fleetName)
|
|
self.tcFleetName.Show()
|
|
|
|
self.renameBtn.SetBitmap(self.acceptBmp)
|
|
self.Refresh()
|
|
|
|
self.tcFleetName.SetFocus()
|
|
self.tcFleetName.SelectAll()
|
|
|
|
self.Refresh()
|
|
|
|
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):
|
|
if self.tcFleetName.IsShown():
|
|
self.RestoreEditButton()
|
|
return
|
|
wx.PostEvent(self.fleetBrowser, FleetItemDelete(fleetID = self.fleetID))
|
|
|
|
def RestoreEditButton(self):
|
|
self.tcFleetName.Show(False)
|
|
self.renameBtn.SetBitmap(self.renameBmp)
|
|
self.Refresh()
|
|
|
|
def OnEditLostFocus(self, event):
|
|
self.RestoreEditButton()
|
|
self.Refresh()
|
|
|
|
def EditCheckEsc(self, event):
|
|
if event.GetKeyCode() == wx.WXK_ESCAPE:
|
|
self.RestoreEditButton()
|
|
else:
|
|
event.Skip()
|
|
|
|
def IsSelected(self):
|
|
return self.selected
|
|
|
|
def UpdateElementsPos(self, mdc):
|
|
rect = self.GetRect()
|
|
|
|
self.toolbarx = rect.width - self.toolbar.GetWidth() - self.padding
|
|
self.toolbary = (rect.height - self.toolbar.GetHeight()) / 2
|
|
|
|
self.toolbarx = self.toolbarx + self.animCount
|
|
|
|
self.fleetBmpx = self.padding + (rect.height - self.fleetBmp.GetWidth()) / 2
|
|
self.fleetBmpy = (rect.height - self.fleetBmp.GetHeight()) / 2
|
|
|
|
self.fleetBmpx -= self.animCount
|
|
|
|
self.textStartx = self.fleetBmpx + self.fleetBmp.GetWidth() + self.padding
|
|
|
|
self.fleetNamey = (rect.height - self.fleetBmp.GetHeight()) / 2
|
|
|
|
mdc.SetFont(self.fontBig)
|
|
wtext, htext = mdc.GetTextExtent(self.fleetName)
|
|
|
|
self.fleetCounty = self.fleetNamey + htext
|
|
|
|
mdc.SetFont(self.fontSmall)
|
|
|
|
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)
|
|
|
|
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)
|
|
|
|
mdc.DrawText(fleetCount, self.textStartx, self.fleetCounty)
|
|
|
|
mdc.SetFont(self.fontSmall)
|
|
mdc.DrawText(self.toolbar.hoverLabel, self.thoverx, self.thovery)
|
|
|
|
mdc.SetFont(self.fontBig)
|
|
|
|
pfname = drawUtils.GetPartialText(mdc, self.fleetName, self.toolbarx - self.textStartx - self.padding * 2 - self.thoverw)
|
|
mdc.DrawText(pfname, self.textStartx, self.fleetNamey)
|
|
|
|
if self.tcFleetName.IsShown():
|
|
self.AdjustControlSizePos(self.tcFleetName, self.textStartx, self.toolbarx - self.editWidth - self.padding)
|
|
|
|
def AdjustControlSizePos(self, editCtl, start, end):
|
|
fnEditSize = editCtl.GetSize()
|
|
wSize = self.GetSize()
|
|
fnEditPosX = end
|
|
fnEditPosY = (wSize.height - fnEditSize.height)/2
|
|
if fnEditPosX < start:
|
|
editCtl.SetSize((self.editWidth + fnEditPosX - start,-1))
|
|
editCtl.SetPosition((start,fnEditPosY))
|
|
else:
|
|
editCtl.SetSize((self.editWidth,-1))
|
|
editCtl.SetPosition((fnEditPosX,fnEditPosY))
|
|
|
|
|
|
class PFGenBitmapButton(GenBitmapButton):
|
|
def __init__(self, parent, id, bitmap, pos, size, style):
|
|
GenBitmapButton.__init__(self, parent, id, bitmap, pos, size, style)
|
|
self.bgcolor = wx.Brush(wx.WHITE)
|
|
|
|
def SetBackgroundColour(self, color):
|
|
self.bgcolor = wx.Brush(color)
|
|
|
|
def GetBackgroundBrush(self, dc):
|
|
return self.bgcolor
|