Completed ShipItem class rewrite (it uses SBItem base class)
This commit is contained in:
@@ -740,6 +740,9 @@ class PFBaseButton(object):
|
||||
def GetBitmap(self):
|
||||
return self.normalBmp
|
||||
|
||||
def SetBitmap(self, bitmap):
|
||||
self.normalBmp = bitmap
|
||||
|
||||
def GetLabel(self):
|
||||
return self.label
|
||||
|
||||
@@ -759,25 +762,32 @@ class PFToolbar(object):
|
||||
self.toolbarX = 0
|
||||
self.toolbarY = 0
|
||||
self.padding = 2
|
||||
self.hoverLabel = ""
|
||||
|
||||
def SetPosition(self, pos):
|
||||
self.toolbarX, self.toolbarY = pos
|
||||
|
||||
def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None):
|
||||
self.buttons.append( PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap) )
|
||||
btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap)
|
||||
self.buttons.append(btn)
|
||||
return btn
|
||||
|
||||
def ClearState(self):
|
||||
for button in self.buttons:
|
||||
button.SetState()
|
||||
self.hoverLabel = ""
|
||||
|
||||
def MouseMove(self, event):
|
||||
doRefresh = False
|
||||
bx = self.toolbarX
|
||||
self.hoverLabel = ""
|
||||
|
||||
for button in self.buttons:
|
||||
state = button.GetState()
|
||||
if self.HitTest( (bx, self.toolbarY), event.GetPosition(), button.GetSize()):
|
||||
if not state & BTN_HOVER:
|
||||
button.SetState(state | BTN_HOVER)
|
||||
self.hoverLabel = button.GetLabel()
|
||||
doRefresh = True
|
||||
else:
|
||||
if state & BTN_HOVER:
|
||||
@@ -807,7 +817,7 @@ class PFToolbar(object):
|
||||
state = button.GetState()
|
||||
if self.HitTest( (bx, self.toolbarY), event.GetPosition(), button.GetSize()):
|
||||
|
||||
if event.LeftDown():
|
||||
if event.LeftDown() or event.LeftDClick():
|
||||
button.SetState(state | BTN_PRESSED)
|
||||
return button
|
||||
|
||||
@@ -819,6 +829,20 @@ class PFToolbar(object):
|
||||
bx += bwidth + self.padding
|
||||
return None
|
||||
|
||||
def GetWidth(self):
|
||||
bx = 0
|
||||
for button in self.buttons:
|
||||
bwidth, bheight = button.GetSize()
|
||||
bx += bwidth + self.padding
|
||||
return bx
|
||||
|
||||
def GetHeight(self):
|
||||
height = 0
|
||||
for button in self.buttons:
|
||||
bwidth, bheight = button.GetSize()
|
||||
height = max(height, bheight)
|
||||
return height
|
||||
|
||||
def HitTest(self, target, position, area):
|
||||
x, y = target
|
||||
px, py = position
|
||||
@@ -865,6 +889,11 @@ class SBItem(wx.Window):
|
||||
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
||||
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
|
||||
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
|
||||
|
||||
if "wxMSW" in wx.PlatformInfo:
|
||||
self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown)
|
||||
|
||||
|
||||
self.Bind(wx.EVT_LEFT_DOWN,self.OnLeftDown)
|
||||
self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
|
||||
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
|
||||
@@ -934,9 +963,14 @@ class SBItem(wx.Window):
|
||||
event.Skip()
|
||||
|
||||
def OnLeaveWindow(self, event):
|
||||
self.SetHighlighted(False)
|
||||
self.toolbar.ClearState()
|
||||
self.Refresh()
|
||||
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.SetHighlighted(False)
|
||||
self.toolbar.ClearState()
|
||||
self.Refresh()
|
||||
event.Skip()
|
||||
|
||||
def OnMotion(self, event):
|
||||
@@ -1017,18 +1051,9 @@ class CategoryItem(SBItem):
|
||||
self.fontBig = wx.FontFromPixelSize((0,15),wx.SWISS, wx.NORMAL, wx.NORMAL, False)
|
||||
|
||||
|
||||
# self.newBmp = bitmapLoader.getBitmap("fit_add_small", "icons")
|
||||
# self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons")
|
||||
#
|
||||
# self.toolbar.AddButton(self.newBmp, "New", self.CallbackTest,self.acceptBmp)
|
||||
# self.toolbar.AddButton(self.acceptBmp, "Accept", self.CallbackTest,self.newBmp)
|
||||
|
||||
def GetType(self):
|
||||
return 1
|
||||
|
||||
def CallbackTest(self):
|
||||
print "Callback Test"
|
||||
|
||||
def MouseLeftUp(self, event):
|
||||
|
||||
categoryID = self.categoryID
|
||||
@@ -1075,11 +1100,11 @@ class CategoryItem(SBItem):
|
||||
ypos = (rect.height - ytext)/2
|
||||
|
||||
|
||||
class ShipItem(wx.Window):
|
||||
class ShipItem(SBItem):
|
||||
def __init__(self, parent, shipID=None, shipFittingInfo=("Test", 2), itemData=None,
|
||||
id=wx.ID_ANY, range=100, pos=wx.DefaultPosition,
|
||||
id=wx.ID_ANY, pos=wx.DefaultPosition,
|
||||
size=(0, 40), style=0):
|
||||
wx.Window.__init__(self, parent, id, pos, size, style)
|
||||
SBItem.__init__(self, parent, size = size)
|
||||
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
|
||||
@@ -1098,17 +1123,13 @@ class ShipItem(wx.Window):
|
||||
self.shipBmp = bitmapLoader.getBitmap(str(shipID),"ships")
|
||||
if not self.shipBmp:
|
||||
self.shipBmp = bitmapLoader.getBitmap("ship_no_image_big","icons")
|
||||
|
||||
self.shipFittingInfo = shipFittingInfo
|
||||
self.shipName, self.shipFits = shipFittingInfo
|
||||
|
||||
self.newBmp = bitmapLoader.getBitmap("fit_add_small", "icons")
|
||||
self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons")
|
||||
|
||||
img = self.acceptBmp.ConvertToImage()
|
||||
img.RotateHue(0.625)
|
||||
self.acceptBmp = wx.BitmapFromImage(img)
|
||||
|
||||
self.newToggleBmp = self.newBmp
|
||||
self.shipEffBk = bitmapLoader.getBitmap("fshipbk_big","icons")
|
||||
self.raceBmp = bitmapLoader.getBitmap("race_%s_small" % self.shipRace, "icons")
|
||||
|
||||
@@ -1122,207 +1143,72 @@ class ShipItem(wx.Window):
|
||||
|
||||
self.shipBrowser = self.Parent.Parent
|
||||
|
||||
self.editPosX = 0
|
||||
self.editPosY = 0
|
||||
self.highlighted = 0
|
||||
self.selected = False
|
||||
self.editWasShown = 0
|
||||
self.btnsStatus = ""
|
||||
self.bkBitmap = None
|
||||
self.editWidth = 150
|
||||
self.padding = 5
|
||||
|
||||
self.tcFitName = wx.TextCtrl(self, wx.ID_ANY, "%s fit" % self.shipName, wx.DefaultPosition, (120,-1), wx.TE_PROCESS_ENTER)
|
||||
self.tcFitName.Show(False)
|
||||
|
||||
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
|
||||
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
||||
|
||||
self.Bind(wx.EVT_LEFT_UP, self.checkPosition)
|
||||
self.Bind(wx.EVT_MOTION, self.cursorCheck)
|
||||
|
||||
self.Bind(wx.EVT_ENTER_WINDOW, self.enterW)
|
||||
self.Bind(wx.EVT_LEAVE_WINDOW, self.leaveW)
|
||||
self.newBtn = self.toolbar.AddButton(self.newBmp,"New", self.newBtnCB)
|
||||
|
||||
self.tcFitName.Bind(wx.EVT_TEXT_ENTER, self.createNewFit)
|
||||
self.tcFitName.Bind(wx.EVT_KILL_FOCUS, self.editLostFocus)
|
||||
self.tcFitName.Bind(wx.EVT_KEY_DOWN, self.editCheckEsc)
|
||||
|
||||
def MouseLeftUp(self, event):
|
||||
if self.tcFitName.IsShown():
|
||||
self.tcFitName.Show(False)
|
||||
self.newBtn.SetBitmap(self.newBmp)
|
||||
self.Refresh()
|
||||
else:
|
||||
wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID, back = -1 if self.shipBrowser.GetActiveStage() == 4 else 0))
|
||||
|
||||
def GetType(self):
|
||||
return 2
|
||||
|
||||
def SetData(self, data):
|
||||
self._itemData = data
|
||||
def newBtnCB(self):
|
||||
if self.tcFitName.IsShown():
|
||||
self.tcFitName.Show(False)
|
||||
self.createNewFit()
|
||||
else:
|
||||
self.tcFitName.SetValue("%s fit" % self.shipName)
|
||||
self.tcFitName.Show()
|
||||
|
||||
def GetData(self):
|
||||
return self._itemData
|
||||
self.tcFitName.SetFocus()
|
||||
self.tcFitName.SelectAll()
|
||||
|
||||
self.newBtn.SetBitmap(self.acceptBmp)
|
||||
|
||||
self.Refresh()
|
||||
|
||||
def editLostFocus(self, event):
|
||||
self.tcFitName.Show(False)
|
||||
if self.highlighted == 1:
|
||||
self.editWasShown = 1
|
||||
self.newToggleBmp = self.newBmp
|
||||
self.newBtn.SetBitmap(self.newBmp)
|
||||
self.Refresh()
|
||||
|
||||
def editCheckEsc(self, event):
|
||||
if event.GetKeyCode() == wx.WXK_ESCAPE:
|
||||
self.tcFitName.Show(False)
|
||||
self.editWasShown = 0
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
def cursorCheck(self, event):
|
||||
pos = event.GetPosition()
|
||||
if self.NHitTest((self.editPosX, self.editPosY), pos, (16, 16)):
|
||||
self.SetCursor(wx.StockCursor(wx.CURSOR_HAND))
|
||||
if self.btnsStatus != "New fit":
|
||||
self.btnsStatus = "New fit"
|
||||
self.Refresh()
|
||||
else:
|
||||
self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
|
||||
if self.btnsStatus != "":
|
||||
self.btnsStatus = ""
|
||||
self.Refresh()
|
||||
|
||||
def checkPosition(self, event):
|
||||
|
||||
pos = event.GetPosition()
|
||||
x, y = pos
|
||||
if self.NHitTest((self.editPosX, self.editPosY), pos, (16, 16)):
|
||||
if self.editWasShown == 1:
|
||||
self.createNewFit()
|
||||
return
|
||||
else:
|
||||
fnEditSize = self.tcFitName.GetSize()
|
||||
wSize = self.GetSize()
|
||||
fnEditPosX = self.editPosX - fnEditSize.width - 5
|
||||
fnEditPosY = (wSize.height - fnEditSize.height) / 2
|
||||
self.tcFitName.SetPosition((fnEditPosX, fnEditPosY))
|
||||
self.tcFitName.Show(True)
|
||||
self.tcFitName.SetFocus()
|
||||
self.tcFitName.SelectAll()
|
||||
self.newToggleBmp = self.acceptBmp
|
||||
self.Refresh()
|
||||
return
|
||||
|
||||
if (not self.NHitTest((self.editPosX, self.editPosY), pos, (16, 16))):
|
||||
if self.shipFits > 0:
|
||||
if self.editWasShown == 1:
|
||||
self.editWasShown = 0
|
||||
else:
|
||||
wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID, back = -1 if self.shipBrowser.GetActiveStage() == 4 else 0))
|
||||
else:
|
||||
if self.editWasShown == 0:
|
||||
fnEditSize = self.tcFitName.GetSize()
|
||||
wSize = self.GetSize()
|
||||
fnEditPosX = self.editPosX - fnEditSize.width - 5
|
||||
fnEditPosY = (wSize.height - fnEditSize.height) / 2
|
||||
self.tcFitName.SetPosition((fnEditPosX, fnEditPosY))
|
||||
self.tcFitName.Show(True)
|
||||
self.tcFitName.SetFocus()
|
||||
self.tcFitName.SelectAll()
|
||||
self.newToggleBmp = self.acceptBmp
|
||||
self.Refresh()
|
||||
else:
|
||||
self.editWasShown = 0
|
||||
|
||||
event.Skip()
|
||||
|
||||
def createNewFit(self, event=None):
|
||||
self.tcFitName.Show(False)
|
||||
|
||||
sFit = service.Fit.getInstance()
|
||||
fitID = sFit.newFit(self.shipID, self.tcFitName.GetValue())
|
||||
self.tcFitName.Show(False)
|
||||
self.editWasShown = 0
|
||||
|
||||
wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID, back=False))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID))
|
||||
|
||||
def NHitTest(self, target, position, area):
|
||||
x, y = target
|
||||
px, py = position
|
||||
aX, aY = area
|
||||
if (px > x and px < x + aX) and (py > y and py < y + aY):
|
||||
return True
|
||||
return False
|
||||
def enterW(self, event):
|
||||
self.highlighted = 1
|
||||
self.Refresh()
|
||||
event.Skip()
|
||||
|
||||
def leaveW(self, event):
|
||||
self.highlighted = 0
|
||||
self.Refresh()
|
||||
event.Skip()
|
||||
|
||||
def OnEraseBackground(self, event):
|
||||
pass
|
||||
|
||||
def GetState(self):
|
||||
activeFitID = self.mainFrame.getActiveFit()
|
||||
|
||||
if self.highlighted and not self.selected:
|
||||
state = SB_ITEM_HIGHLIGHTED
|
||||
|
||||
elif self.selected:
|
||||
if self.highlighted:
|
||||
state = SB_ITEM_SELECTED | SB_ITEM_HIGHLIGHTED
|
||||
else:
|
||||
state = SB_ITEM_SELECTED
|
||||
else:
|
||||
state = SB_ITEM_NORMAL
|
||||
|
||||
return state
|
||||
|
||||
def RenderBackground(self):
|
||||
def DrawItem(self, mdc):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
|
||||
state = self.GetState()
|
||||
|
||||
sFactor = 0.2
|
||||
mFactor = None
|
||||
eFactor = 0
|
||||
|
||||
if state == SB_ITEM_HIGHLIGHTED:
|
||||
mFactor = 0.55
|
||||
|
||||
elif state == SB_ITEM_SELECTED | SB_ITEM_HIGHLIGHTED:
|
||||
eFactor = 0.3
|
||||
elif state == SB_ITEM_SELECTED:
|
||||
eFactor = 0.15
|
||||
else:
|
||||
sFactor = 0
|
||||
|
||||
if self.bkBitmap:
|
||||
if self.bkBitmap.eFactor == eFactor and self.bkBitmap.sFactor == sFactor and self.bkBitmap.mFactor == mFactor \
|
||||
and rect.width == self.bkBitmap.GetWidth() and rect.height == self.bkBitmap.GetHeight() :
|
||||
return
|
||||
else:
|
||||
del self.bkBitmap
|
||||
|
||||
self.bkBitmap = drawUtils.RenderGradientBar(windowColor, rect.width, rect.height, sFactor, eFactor, mFactor)
|
||||
self.bkBitmap.state = state
|
||||
self.bkBitmap.sFactor = sFactor
|
||||
self.bkBitmap.eFactor = eFactor
|
||||
self.bkBitmap.mFactor = mFactor
|
||||
|
||||
def Refresh(self):
|
||||
self.RenderBackground()
|
||||
wx.Window.Refresh(self)
|
||||
|
||||
def OnPaint(self, event):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitableColor(windowColor, 1)
|
||||
|
||||
mdc = wx.BufferedPaintDC(self)
|
||||
|
||||
if self.bkBitmap is None:
|
||||
self.RenderBackground()
|
||||
|
||||
mdc.DrawBitmap(self.bkBitmap, 0,0)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
tpx = rect.width - self.toolbar.GetWidth() - 5
|
||||
tpy = (rect.height - self.toolbar.GetHeight()) / 2
|
||||
|
||||
self.toolbar.SetPosition((tpx, tpy))
|
||||
|
||||
mdc.SetFont(self.fontBig)
|
||||
mdc.DrawBitmap(self.shipEffBk, 5 + (rect.height - self.shipEffBk.GetWidth())/2, (rect.height - self.shipEffBk.GetHeight())/2, 0)
|
||||
@@ -1332,13 +1218,16 @@ class ShipItem(wx.Window):
|
||||
|
||||
|
||||
ypos = (rect.height - 32) / 2
|
||||
|
||||
textStart = 48
|
||||
xtext, ytext = mdc.GetTextExtent(shipName)
|
||||
wtext, htext = mdc.GetTextExtent(shipName)
|
||||
|
||||
mdc.DrawBitmap(self.raceBmp,textStart, ypos + self.raceBmp.GetHeight()/2)
|
||||
|
||||
textStart += self.raceBmp.GetWidth() + 4
|
||||
sposy = ypos
|
||||
|
||||
ypos += ytext
|
||||
ypos += htext
|
||||
|
||||
mdc.SetFont(self.fontNormal)
|
||||
|
||||
@@ -1350,47 +1239,38 @@ class ShipItem(wx.Window):
|
||||
else:
|
||||
fformat = "%d fits"
|
||||
|
||||
if fittings>0:
|
||||
xtext, ytext = mdc.GetTextExtent(fformat % fittings)
|
||||
else:
|
||||
xtext, ytext = mdc.GetTextExtent(fformat)
|
||||
|
||||
mdc.DrawText(fformat %fittings if fittings >0 else fformat, textStart, ypos)
|
||||
|
||||
self.editPosX = rect.width - self.newToggleBmp.GetWidth() -5
|
||||
self.editPosY = (rect.height - self.newToggleBmp.GetHeight()) / 2
|
||||
|
||||
mdc.DrawBitmap(self.newToggleBmp, self.editPosX, self.editPosY, 0)
|
||||
mdc.SetFont(self.fontSmall)
|
||||
if self.btnsStatus != "":
|
||||
status = "%s" % self.btnsStatus
|
||||
xtext, ytext = mdc.GetTextExtent(status)
|
||||
ytext = (rect.height - ytext)/2
|
||||
mdc.DrawText(status, self.editPosX - xtext -5,ytext)
|
||||
else:
|
||||
xtext =0
|
||||
|
||||
wlabel,hlabel = mdc.GetTextExtent(self.toolbar.hoverLabel)
|
||||
|
||||
lx = tpx - self.padding - wlabel
|
||||
ly = (rect.height - hlabel)/2
|
||||
|
||||
mdc.DrawText(self.toolbar.hoverLabel, lx, ly)
|
||||
|
||||
mdc.SetFont(self.fontBig)
|
||||
fnwidths = mdc.GetPartialTextExtents(shipName)
|
||||
count = 0
|
||||
maxsize = self.editPosX -xtext - 15 - textStart
|
||||
for i in fnwidths:
|
||||
if i<= maxsize:
|
||||
count +=1
|
||||
else:
|
||||
break
|
||||
|
||||
shipName = "%s%s" % (shipName[:count if count >5 else 5],"..." if len(shipName)>count else "")
|
||||
mdc.DrawText(shipName, textStart, sposy)
|
||||
psname = drawUtils.GetPartialText(mdc, shipName,tpx-textStart - self.padding - wlabel)
|
||||
|
||||
mdc.DrawText(psname, textStart, sposy)
|
||||
|
||||
if self.tcFitName.IsShown():
|
||||
fnEditSize = self.tcFitName.GetSize()
|
||||
wSize = self.GetSize()
|
||||
fnEditPosX = self.editPosX - fnEditSize.width -5
|
||||
fnEditPosY = (wSize.height - fnEditSize.height)/2
|
||||
self.tcFitName.SetPosition((fnEditPosX,fnEditPosY))
|
||||
self.AdjustControlSizePos(self.tcFitName, textStart, tpx - self.editWidth - self.padding)
|
||||
|
||||
event.Skip()
|
||||
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 PFBitmapFrame(wx.Frame):
|
||||
def __init__ (self,parent, pos, bitmap):
|
||||
|
||||
Reference in New Issue
Block a user