diff --git a/gui/sfBrowserItem.py b/gui/sfBrowserItem.py index 7161a6aad..3892e193c 100644 --- a/gui/sfBrowserItem.py +++ b/gui/sfBrowserItem.py @@ -14,18 +14,28 @@ BTN_DISABLED = 8 class PFBaseButton(object): - def __init__(self, normalBitmap = wx.NullBitmap,label = "", callback = None, hoverBitmap = None, disabledBitmap = None): + def __init__(self, normalBitmap = wx.NullBitmap,label = "", callback = None, hoverBitmap = None, disabledBitmap = None, show = True): self.normalBmp = normalBitmap self.hoverBmp = hoverBitmap self.disabledBmp = disabledBitmap self.label = label + self.show = show self.callback = callback self.state = BTN_NORMAL # state : BTN_STUFF + def Show(self, show): + self.show = show + + def Hide(self): + self.show = False + + def IsVisible(self): + return self.show + def SetCallback(self, callback): self.callback = callback @@ -78,8 +88,8 @@ class PFToolbar(object): def SetPosition(self, pos): self.toolbarX, self.toolbarY = pos - def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None): - btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap) + def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None, show = True): + btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap, show) self.buttons.append(btn) return btn @@ -95,6 +105,9 @@ class PFToolbar(object): self.hoverLabel = "" for button in self.buttons: + if not button.IsVisible(): + continue + state = button.GetState() if self.HitTest( (bx, self.toolbarY), event.GetPosition(), button.GetSize()): changeCursor = True @@ -119,6 +132,9 @@ class PFToolbar(object): mx,my = event.GetPosition() bx = self.toolbarX for button in self.buttons: + if not button.IsVisible(): + continue + state = button.GetState() if state & BTN_PRESSED: button.SetState(state ^ BTN_PRESSED ) @@ -131,7 +147,11 @@ class PFToolbar(object): bx = self.toolbarX for button in self.buttons: + if not button.IsVisible(): + continue + state = button.GetState() + if self.HitTest( (bx, self.toolbarY), event.GetPosition(), button.GetSize()): if event.LeftDown() or event.LeftDClick(): @@ -144,20 +164,29 @@ class PFToolbar(object): bwidth, bheight = button.GetSize() bx += bwidth + self.padding + return None def GetWidth(self): bx = 0 for button in self.buttons: + if not button.IsVisible(): + continue + bwidth, bheight = button.GetSize() bx += bwidth + self.padding + return bx def GetHeight(self): height = 0 for button in self.buttons: + if not button.IsVisible(): + continue + bwidth, bheight = button.GetSize() height = max(height, bheight) + return height def HitTest(self, target, position, area): @@ -171,6 +200,9 @@ class PFToolbar(object): def Render(self, pdc): bx = self.toolbarX for button in self.buttons: + if not button.IsVisible(): + continue + by = self.toolbarY tbx = bx @@ -193,6 +225,7 @@ class PFToolbar(object): pdc.DrawBitmap(bmp, tbx, by) bx += bmpWidth + self.padding + class SFBrowserItem(wx.Window): def __init__(self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = (0,16), style = 0): wx.Window.__init__(self, parent, id, pos, size, style) diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 2269ce63e..ec735c61a 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -288,6 +288,200 @@ class RaceSelector(wx.Window): event.Skip() +class NavigationPanel(SFItem.SFBrowserItem): + def __init__(self,parent, size = (-1,24)): + SFItem.SFBrowserItem.__init__(self,parent,size = size) + + self.rewBmpH = bitmapLoader.getBitmap("frewind_small","icons") + self.forwBmp = bitmapLoader.getBitmap("fforward_small","icons") + self.searchBmpH = bitmapLoader.getBitmap("fsearch_small","icons") + self.newBmpH = bitmapLoader.getBitmap("fit_add_small","icons") + self.resetBmpH = bitmapLoader.getBitmap("freset_small","icons") + self.switchBmpH = bitmapLoader.getBitmap("fit_switch_view_mode_small","icons") + + self.resetBmp = self.AdjustAlphaChannel(self.resetBmpH) + self.rewBmp = self.AdjustAlphaChannel(self.rewBmpH) + self.searchBmp = self.AdjustAlphaChannel(self.searchBmpH) + self.switchBmp = self.AdjustAlphaChannel(self.switchBmpH) + self.newBmp = self.AdjustAlphaChannel(self.newBmpH) + + self.toolbar.AddButton(self.resetBmp, "Ship groups", clickCallback = self.OnHistoryReset, hoverBitmap = self.resetBmpH) + self.toolbar.AddButton(self.rewBmp, "Back", clickCallback = self.OnHistoryBack, hoverBitmap = self.rewBmpH) + self.toolbar.AddButton(self.searchBmp, "Search fittings", clickCallback = self.ToggleSearchBox, hoverBitmap = self.searchBmpH) + self.btnNew = self.toolbar.AddButton(self.newBmp, "New fitting", clickCallback = self.OnNewFitting, hoverBitmap = self.newBmpH, show = False) + self.btnSwitch = self.toolbar.AddButton(self.switchBmp, "Hide empty ship groups", clickCallback = self.ToggleEmptyGroupsView, hoverBitmap = self.switchBmpH, show = False) + + self.padding = 4 + self.fontSmall = wx.FontFromPixelSize((0,12),wx.SWISS, wx.NORMAL, wx.NORMAL, False) + + self.BrowserSearchBox = wx.TextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, (-1,-1), wx.TE_PROCESS_ENTER) + self.BrowserSearchBox.Show(False) + + self.BrowserSearchBox.Bind(wx.EVT_TEXT_ENTER, self.OnBrowserSearchBoxEnter) + self.BrowserSearchBox.Bind(wx.EVT_KILL_FOCUS, self.OnBrowserSearchBoxLostFocus) + self.BrowserSearchBox.Bind(wx.EVT_KEY_DOWN, self.OnBrowserSearchBoxEsc) + self.BrowserSearchBox.Bind(wx.EVT_TEXT, self.OnScheduleSearch) + + self.SetMinSize(size) + self.shipBrowser = self.Parent + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + self.Bind(wx.EVT_SIZE, self.OnResize) + + + def OnScheduleSearch(self, event): + search = self.BrowserSearchBox.GetValue() + if len(search) < 3 and len(search) >= 0: + if len(self.shipBrowser.browseHist) > 0: + stage,data = self.shipBrowser.browseHist.pop() + self.gotoStage(stage,data) + print stage,data + else: + wx.PostEvent(self.shipBrowser,SearchSelected(text=search, back = False)) + + def ToggleSearchBox(self): + if self.BrowserSearchBox.IsShown(): + self.BrowserSearchBox.Show(False) + else: + self.BrowserSearchBox.Show(True) + self.BrowserSearchBox.SetFocus() + + def OnBrowserSearchBoxEnter(self, event): + pass + + def OnBrowserSearchBoxLostFocus(self, event): + self.BrowserSearchBox.Show(False) + + def OnBrowserSearchBoxEsc(self, event): + if event.GetKeyCode() == wx.WXK_ESCAPE: + self.BrowserSearchBox.Show(False) + else: + event.Skip() + + + def OnResize(self, event): + self.Refresh() + + def ToggleEmptyGroupsView(self): + if self.shipBrowser.filterShipsWithNoFits: + self.shipBrowser.filterShipsWithNoFits = False + self.btnSwitch.label = "Hide empty ship groups" + else: + self.shipBrowser.filterShipsWithNoFits = True + self.btnSwitch.label = "Show empty ship groups" + stage = self.shipBrowser.GetActiveStage() + if stage == 2: + categoryID = self.shipBrowser.GetStageData(stage) + wx.PostEvent(self.shipBrowser,Stage2Selected(categoryID=categoryID, back = True)) + + def ShowNewFitButton(self, show): + self.btnNew.Show(show) + self.Refresh() + + def ShowSwitchEmptyGroupsButton(self, show): + self.btnSwitch.Show(show) + self.Refresh() + + def OnNewFitting(self): + stage = self.Parent.GetActiveStage() + if stage == 3: + shipID = self.Parent.GetStageData(stage) + shipName = self.Parent.GetStage3ShipName() + sFit = service.Fit.getInstance() + fitID = sFit.newFit(shipID, "%s fit" %shipName) + self.shipBrowser.fitIDMustEditName = fitID + wx.PostEvent(self.Parent,Stage3Selected(shipID=shipID, back = True)) + wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID)) + + def OnHistoryReset(self): + if self.shipBrowser.browseHist: + self.shipBrowser.browseHist = [] + self.gotoStage(1,0) + + def OnHistoryBack(self): + if len(self.shipBrowser.browseHist) > 0: + stage,data = self.shipBrowser.browseHist.pop() + self.gotoStage(stage,data) + + def AdjustAlphaChannel(self, bitmap): + img = wx.ImageFromBitmap(bitmap) + img = img.AdjustChannels(1,1,1,0.4) + return wx.BitmapFromImage(img) + def UpdateElementsPos(self, mdc): + rect = self.GetRect() + + self.toolbarx = self.padding + self.toolbary = (rect.height - self.toolbar.GetHeight()) / 2 + + mdc.SetFont(self.fontSmall) + + wlabel,hlabel = mdc.GetTextExtent(self.toolbar.hoverLabel) + + self.thoverx = self.toolbar.GetWidth() + self.padding + self.thovery = (rect.height - hlabel)/2 + self.thoverw = wlabel + + self.browserBoxX = self.thoverx + bEditBoxWidth, bEditBoxHeight = self.BrowserSearchBox.GetSize() + self.browserBoxY = (rect.height - bEditBoxHeight) / 2 + + self.bEditBoxWidth = rect.width - self.browserBoxX + + 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.BrowserSearchBox.SetPosition((self.browserBoxX, self.browserBoxY)) + self.BrowserSearchBox.SetSize(wx.Size(self.bEditBoxWidth, -1)) + + self.toolbar.SetPosition((self.toolbarx, self.toolbary)) + mdc.SetFont(self.fontSmall) + mdc.DrawText(self.toolbar.hoverLabel, self.thoverx, self.thovery) + + def RenderBackground(self): + rect = self.GetRect() + + windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW) + + sFactor = 0.1 + mFactor = 0.2 + eFactor = 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, 2) + + self.bkBitmap.sFactor = sFactor + self.bkBitmap.eFactor = eFactor + self.bkBitmap.mFactor = mFactor + + + def gotoStage(self,stage, data = None): + if stage == 1: + wx.PostEvent(self.Parent,Stage1Selected()) + elif stage == 2: + wx.PostEvent(self.Parent,Stage2Selected(categoryID=data, back = True)) + elif stage == 3: + wx.PostEvent(self.Parent,Stage3Selected(shipID=data, back = 1)) + elif stage == 4: + self.shipBrowser._activeStage = 4 + self.stStatus.SetLabel("Search: %s" % data.capitalize()) + self.Layout() + wx.PostEvent(self.Parent,SearchSelected(text=data, back = True)) + else: + wx.PostEvent(self.Parent,Stage1Selected()) + + class ShipBrowser(wx.Panel): def __init__(self, parent): wx.Panel.__init__ (self, parent,style = 0) @@ -318,19 +512,21 @@ class ShipBrowser(wx.Panel): mainSizer = wx.BoxSizer(wx.VERTICAL) - self.hpane = HeaderPane(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.hpane = HeaderPane(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.lpane = PFWidgetsContainer(self) layout = wx.HORIZONTAL +# self.navpanel = NavigationPanel(self) self.raceselect = RaceSelector(self, layout = layout, animate = False) container = wx.BoxSizer(wx.VERTICAL if layout == wx.HORIZONTAL else wx.HORIZONTAL) if layout == wx.HORIZONTAL: +# container.Add(self.navpanel,0,wx.EXPAND) container.Add(self.lpane,1,wx.EXPAND) container.Add(self.raceselect,0,wx.EXPAND) else: @@ -409,8 +605,12 @@ class ShipBrowser(wx.Panel): self._lastStage = self._activeStage self._activeStage = 1 self.lastdata = 0 - self.hpane.ToggleNewFitSB(False) - self.hpane.ToggleFitViewModeSB(False) +# self.hpane.ToggleNewFitSB(False) +# self.hpane.ToggleFitViewModeSB(False) + + self.navpanel.ShowNewFitButton(False) + self.navpanel.ShowSwitchEmptyGroupsButton(False) + sMarket = service.Market.getInstance() self.lpane.ShowLoading(False) @@ -496,8 +696,12 @@ class ShipBrowser(wx.Panel): sMarket.getShipListDelayed(self.stage2Callback, categoryID) self._stage2Data = categoryID - self.hpane.ToggleNewFitSB(False) - self.hpane.ToggleFitViewModeSB(True) +# self.hpane.ToggleNewFitSB(False) +# self.hpane.ToggleFitViewModeSB(True) + + self.navpanel.ShowNewFitButton(False) + self.navpanel.ShowSwitchEmptyGroupsButton(True) + def nameKey(self, info): return info[1] @@ -531,6 +735,10 @@ class ShipBrowser(wx.Panel): return self.hpane.ToggleFitViewModeSB(False) self.hpane.ToggleNewFitSB(True) + + self.navpanel.ShowNewFitButton(True) + self.navpanel.ShowSwitchEmptyGroupsButton(False) + fitList.sort(key=self.nameKey) shipName = sMarket.getItem(shipID).name