diff --git a/gui/builtinContextMenus/damagePattern.py b/gui/builtinContextMenus/damagePattern.py index ca65cf9c9..03cde1794 100644 --- a/gui/builtinContextMenus/damagePattern.py +++ b/gui/builtinContextMenus/damagePattern.py @@ -20,7 +20,11 @@ class DamagePattern(ContextMenu): if not self.settings.get('damagePattern'): return False - return srcContext == "resistancesViewFull" and self.mainFrame.getActiveFit() is not None + return srcContext == "resistancesViewFull" + + @property + def enabled(self): + return self.mainFrame.getActiveFit() is not None def getText(self, itmContext, selection): sDP = import_DamagePattern.getInstance() @@ -66,12 +70,12 @@ class DamagePattern(ContextMenu): # determine active pattern sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() - f = sFit.getFit(fitID) - dp = f.damagePattern - - if dp == pattern: - bitmap = BitmapLoader.getBitmap("state_active_small", "gui") - menuItem.SetBitmap(bitmap) + fit = sFit.getFit(fitID) + if fit: + dp = fit.damagePattern + if dp == pattern: + bitmap = BitmapLoader.getBitmap("state_active_small", "gui") + menuItem.SetBitmap(bitmap) return menuItem def getSubMenu(self, context, selection, rootMenu, i, pitem): @@ -84,9 +88,9 @@ class DamagePattern(ContextMenu): id = pitem.GetId() self.patternIds[id] = self.singles[i] rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, pitem) - if self.patternIds[id] == self.fit.damagePattern: - bitmap = BitmapLoader.getBitmap("state_active_small", "gui") - pitem.SetBitmap(bitmap) + if self.fit and self.patternIds[id] == self.fit.damagePattern: + bitmap = BitmapLoader.getBitmap("state_active_small", "gui") + pitem.SetBitmap(bitmap) return False sub = wx.Menu() diff --git a/gui/builtinContextMenus/factorReload.py b/gui/builtinContextMenus/factorReload.py index d759734a6..2049b6e63 100644 --- a/gui/builtinContextMenus/factorReload.py +++ b/gui/builtinContextMenus/factorReload.py @@ -16,7 +16,11 @@ class FactorReload(ContextMenu): if not self.settings.get('factorReload'): return False - return srcContext == "firepowerViewFull" and self.mainFrame.getActiveFit() is not None + return srcContext == "firepowerViewFull" + + @property + def enabled(self): + return self.mainFrame.getActiveFit() is not None def getText(self, itmContext, selection): return "Factor in Reload Time" diff --git a/gui/builtinStatsViews/firepowerViewFull.py b/gui/builtinStatsViews/firepowerViewFull.py index c678e0b61..9a7f41d4f 100644 --- a/gui/builtinStatsViews/firepowerViewFull.py +++ b/gui/builtinStatsViews/firepowerViewFull.py @@ -47,10 +47,10 @@ class FirepowerViewFull(StatsView): parent = self.panel = contentPanel self.headerPanel = headerPanel - hsizer = self.headerPanel.GetSizer() + hsizer = self.headerPanel.Parent.GetHeaderContentSizer() self.stEff = wx.StaticText(self.headerPanel, wx.ID_ANY, "( Effective )") hsizer.Add(self.stEff) - self.headerPanel.GetParent().AddToggleItem(self.stEff) + # self.headerPanel.GetParent().AddToggleItem(self.stEff) panel = "full" diff --git a/gui/builtinStatsViews/resistancesViewFull.py b/gui/builtinStatsViews/resistancesViewFull.py index 684a0e617..d053b91b2 100644 --- a/gui/builtinStatsViews/resistancesViewFull.py +++ b/gui/builtinStatsViews/resistancesViewFull.py @@ -55,9 +55,8 @@ class ResistancesViewFull(StatsView): self.headerPanel = headerPanel # Custom header EHP - headerContentSizer = wx.BoxSizer(wx.HORIZONTAL) - hsizer = headerPanel.GetSizer() - hsizer.Add(headerContentSizer, 0, 0, 0) + headerContentSizer = self.headerPanel.Parent.GetHeaderContentSizer() + self.stEff = wx.StaticText(headerPanel, wx.ID_ANY, "( Effective HP: ") headerContentSizer.Add(self.stEff) headerPanel.GetParent().AddToggleItem(self.stEff) diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 0625ff5ba..8b8819dff 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -33,6 +33,16 @@ class ContextMenu(object): def register(cls): ContextMenu.menus.append(cls) + @classmethod + def hasMenu(cls, selection, *fullContexts): + for i, fullContext in enumerate(fullContexts): + srcContext = fullContext[0] + for menuHandler in cls.menus: + m = menuHandler() + if m.display(srcContext, selection): + return True + return False + @classmethod def getMenu(cls, selection, *fullContexts): """ @@ -117,6 +127,7 @@ class ContextMenu(object): if check is not None: rootItem.Check(check) + rootItem.Enable(m.enabled) empty = False @@ -186,6 +197,11 @@ class ContextMenu(object): '''If menu item is toggleable, this should return bool value''' return None + @property + def enabled(self): + '''If menu item is enabled. Allows an item to display, but not be selected''' + return True + # noinspection PyUnresolvedReferences from gui.builtinContextMenus import ( # noqa: E402,F401 openFit, diff --git a/gui/statsPane.py b/gui/statsPane.py index ec13c5ff8..654531033 100644 --- a/gui/statsPane.py +++ b/gui/statsPane.py @@ -114,7 +114,7 @@ class StatsPane(wx.Panel): tp.SetLabel(view.getHeaderText(None)) view.refreshPanel(None) - contentPanel.Bind(wx.EVT_CONTEXT_MENU, self.contextHandler(contentPanel)) + contentPanel.Bind(wx.EVT_CONTEXT_MENU, self.contextHandler(contentPanel, tp)) mainSizer.Add(tp, 0, wx.EXPAND | wx.LEFT, 3) if i < maxviews - 1: @@ -130,14 +130,25 @@ class StatsPane(wx.Panel): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) @staticmethod - def contextHandler(contentPanel): + def contextHandler(contentPanel, tp): viewName = contentPanel.viewName def handler(event): menu = ContextMenu.getMenu(None, (viewName,)) + if menu is not None: contentPanel.PopupMenu(menu) event.Skip() + if ContextMenu.hasMenu(None, (viewName,)): + sizer = tp.GetHeaderContentSizer() + sizer.AddStretchSpacer() + # Add menu + header_menu = wx.StaticText(tp.GetHeaderPanel(), wx.ID_ANY, "\u2630", size=wx.Size((10, -1))) + sizer.Add(header_menu , 0, wx.EXPAND | wx.RIGHT | wx.ALIGN_RIGHT, 5) + + header_menu.Bind(wx.EVT_CONTEXT_MENU, handler) + header_menu.Bind(wx.EVT_LEFT_UP, handler) + return handler diff --git a/gui/toggle_panel.py b/gui/toggle_panel.py index 2f7421d38..46215badb 100644 --- a/gui/toggle_panel.py +++ b/gui/toggle_panel.py @@ -49,7 +49,7 @@ class TogglePanel (wx.Panel): # Add a sizer for additional header items if we need it self.hcontent_sizer = wx.BoxSizer(wx.HORIZONTAL) - header_sizer.Add(self.hcontent_sizer, 0, wx.RIGHT, 5) + header_sizer.Add(self.hcontent_sizer, 1, wx.RIGHT, 5) # Create the content panel, set sizer, and add to main sizer self.content_panel = wx.Panel(self)