From 1e3783c21df6cad1ff1be356991caa15726bcd69 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 31 Jul 2019 09:53:37 +0300 Subject: [PATCH] Move target profile context menu handling to separate package This is needed to be able to import them separately at different times and avoid code duplication --- gui/builtinContextMenus/__init__.py | 91 +++++++------- .../targetProfile/__init__.py | 0 .../targetProfile/adder.py | 111 ++++++++++++++++++ .../targetProfile/common.py | 0 .../switcher.py} | 18 +-- 5 files changed, 164 insertions(+), 56 deletions(-) create mode 100644 gui/builtinContextMenus/targetProfile/__init__.py create mode 100644 gui/builtinContextMenus/targetProfile/adder.py create mode 100644 gui/builtinContextMenus/targetProfile/common.py rename gui/builtinContextMenus/{targetProfile.py => targetProfile/switcher.py} (87%) diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index ee56a8191..b6df7a772 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -1,47 +1,44 @@ -# noinspection PyUnresolvedReferences -from gui.builtinContextMenus import ( # noqa: E402,F401 - # Various command and projected-related items which we want to have first, - # before generic commands - fitOpenNewTab, - envEffectAdd, - fitAddCurrentlyOpen, - commandFitAdd, - # Often-used item manipulations - shipModeChange, - moduleAmmoChange, - moduleSpool, - boosterSideEffects, - fighterAbilities, - # Item info - itemStats, - itemMarketJump, - fitSystemSecurity, # Not really an item info but want to keep it here - shipJump, - # Generic item manipulations - itemRemove, - itemAmountChange, - droneSplitStack, - itemVariationChange, - moduleMutations, - moduleFill, - skillAffectors, - # Market stuff - itemFill, - droneAddStack, - cargoAdd, - cargoAddAmmo, - itemProject, - ammoToDmgPattern, - implantSetAdd, - # Price - priceOptions, - # Resistance panel - damagePatternChange, - # Firepower panel - factorReload, - targetProfile, - # Graph extra options - graphDmgIgnoreResists, - graphDmgApplyProjected, - graphDmgDroneMode, -) +# Various command and projected-related items which we want to have first, +# before generic commands +from gui.builtinContextMenus import fitOpenNewTab +from gui.builtinContextMenus import envEffectAdd +from gui.builtinContextMenus import fitAddCurrentlyOpen +from gui.builtinContextMenus import commandFitAdd +# Often-used item manipulations +from gui.builtinContextMenus import shipModeChange +from gui.builtinContextMenus import moduleAmmoChange +from gui.builtinContextMenus import moduleSpool +from gui.builtinContextMenus import boosterSideEffects +from gui.builtinContextMenus import fighterAbilities +# Item info +from gui.builtinContextMenus import itemStats +from gui.builtinContextMenus import itemMarketJump +from gui.builtinContextMenus import fitSystemSecurity # Not really an item info but want to keep it here +from gui.builtinContextMenus import shipJump +# Generic item manipulations +from gui.builtinContextMenus import itemRemove +from gui.builtinContextMenus import itemAmountChange +from gui.builtinContextMenus import droneSplitStack +from gui.builtinContextMenus import itemVariationChange +from gui.builtinContextMenus import moduleMutations +from gui.builtinContextMenus import moduleFill +from gui.builtinContextMenus import skillAffectors +# Market stuff +from gui.builtinContextMenus import itemFill +from gui.builtinContextMenus import droneAddStack +from gui.builtinContextMenus import cargoAdd +from gui.builtinContextMenus import cargoAddAmmo +from gui.builtinContextMenus import itemProject +from gui.builtinContextMenus import ammoToDmgPattern +from gui.builtinContextMenus import implantSetAdd +# Price +from gui.builtinContextMenus import priceOptions +# Resistance panel +from gui.builtinContextMenus import damagePatternChange +# Firepower panel +from gui.builtinContextMenus import factorReload +from gui.builtinContextMenus.targetProfile import switcher +# Graph extra options +from gui.builtinContextMenus import graphDmgIgnoreResists +from gui.builtinContextMenus import graphDmgApplyProjected +from gui.builtinContextMenus import graphDmgDroneMode diff --git a/gui/builtinContextMenus/targetProfile/__init__.py b/gui/builtinContextMenus/targetProfile/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/gui/builtinContextMenus/targetProfile/adder.py b/gui/builtinContextMenus/targetProfile/adder.py new file mode 100644 index 000000000..cbaa4e8a4 --- /dev/null +++ b/gui/builtinContextMenus/targetProfile/adder.py @@ -0,0 +1,111 @@ +from collections import OrderedDict + +# noinspection PyPackageRequirements +import wx + +import gui.globalEvents as GE +import gui.mainFrame +from gui.bitmap_loader import BitmapLoader +from gui.contextMenu import ContextMenuUnconditional +from service.fit import Fit +from service.targetProfile import TargetProfile as svc_TargetProfile + + +class TargetProfileAdder(ContextMenuUnconditional): + + def __init__(self): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def display(self, callingWindow, srcContext): + if srcContext != 'graphTgtList': + return False + + sTR = svc_TargetProfile.getInstance() + self.patterns = sTR.getTargetProfileList() + self.patterns.sort(key=lambda p: (p.name in ['None'], p.name)) + + return len(self.patterns) > 0 + + def getText(self, callingWindow, itmContext): + return 'Add Target Profile' + + def handleResistSwitch(self, event): + pattern = self.patternIds.get(event.Id, False) + if pattern is False: + event.Skip() + return + + sFit = Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + sFit.setTargetProfile(fitID, pattern) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,))) + + def addPattern(self, rootMenu, pattern): + id = ContextMenuUnconditional.nextID() + name = getattr(pattern, '_name', pattern.name) if pattern is not None else 'No Profile' + + self.patternIds[id] = pattern + item = wx.MenuItem(rootMenu, id, name) + rootMenu.Bind(wx.EVT_MENU, self.handleResistSwitch, item) + + # set pattern attr to menu item + item.pattern = pattern + + # determine active pattern + sFit = Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + f = sFit.getFit(fitID) + tr = f.targetProfile + + if tr == pattern: + bitmap = BitmapLoader.getBitmap('state_active_small', 'gui') + item.SetBitmap(bitmap) + return item + + def getSubMenu(self, callingWindow, context, rootMenu, i, pitem): + msw = True if 'wxMSW' in wx.PlatformInfo else False + self.patternIds = {} + self.subMenus = OrderedDict() + self.singles = [] + + sub = wx.Menu() + for pattern in self.patterns: + start, end = pattern.name.find('['), pattern.name.find(']') + if start is not -1 and end is not -1: + currBase = pattern.name[start + 1:end] + # set helper attr + setattr(pattern, '_name', pattern.name[end + 1:].strip()) + if currBase not in self.subMenus: + self.subMenus[currBase] = [] + self.subMenus[currBase].append(pattern) + else: + self.singles.append(pattern) + + sub.Append(self.addPattern(rootMenu if msw else sub, None)) # Add reset + sub.AppendSeparator() + + # Single items, no parent + for pattern in self.singles: + sub.Append(self.addPattern(rootMenu if msw else sub, pattern)) + + # Items that have a parent + for menuName, patterns in list(self.subMenus.items()): + # Create parent item for root menu that is simply name of parent + item = wx.MenuItem(rootMenu, ContextMenuUnconditional.nextID(), menuName) + + # Create menu for child items + grandSub = wx.Menu() + # sub.Bind(wx.EVT_MENU, self.handleResistSwitch) + + # Apply child menu to parent item + item.SetSubMenu(grandSub) + + # Append child items to child menu + for pattern in patterns: + grandSub.Append(self.addPattern(rootMenu if msw else grandSub, pattern)) + sub.Append(item) # finally, append parent item to root menu + + return sub + + +TargetProfileAdder.register() diff --git a/gui/builtinContextMenus/targetProfile/common.py b/gui/builtinContextMenus/targetProfile/common.py new file mode 100644 index 000000000..e69de29bb diff --git a/gui/builtinContextMenus/targetProfile.py b/gui/builtinContextMenus/targetProfile/switcher.py similarity index 87% rename from gui/builtinContextMenus/targetProfile.py rename to gui/builtinContextMenus/targetProfile/switcher.py index 7fea77b8a..74b256267 100644 --- a/gui/builtinContextMenus/targetProfile.py +++ b/gui/builtinContextMenus/targetProfile/switcher.py @@ -11,24 +11,24 @@ from service.fit import Fit from service.targetProfile import TargetProfile as svc_TargetProfile -class TargetProfile(ContextMenuUnconditional): +class TargetProfileSwitcher(ContextMenuUnconditional): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() def display(self, callingWindow, srcContext): - if self.mainFrame.getActiveFit() is None or srcContext != "firepowerViewFull": + if self.mainFrame.getActiveFit() is None or srcContext != 'firepowerViewFull': return False sTR = svc_TargetProfile.getInstance() self.patterns = sTR.getTargetProfileList() - self.patterns.sort(key=lambda p: (p.name in ["None"], p.name)) + self.patterns.sort(key=lambda p: (p.name in ['None'], p.name)) return len(self.patterns) > 0 def getText(self, callingWindow, itmContext): # We take into consideration just target resists, so call menu item accordingly - return "Target Resists" + return 'Target Resists' def handleResistSwitch(self, event): pattern = self.patternIds.get(event.Id, False) @@ -43,7 +43,7 @@ class TargetProfile(ContextMenuUnconditional): def addPattern(self, rootMenu, pattern): id = ContextMenuUnconditional.nextID() - name = getattr(pattern, "_name", pattern.name) if pattern is not None else "No Profile" + name = getattr(pattern, '_name', pattern.name) if pattern is not None else 'No Profile' self.patternIds[id] = pattern item = wx.MenuItem(rootMenu, id, name) @@ -59,12 +59,12 @@ class TargetProfile(ContextMenuUnconditional): tr = f.targetProfile if tr == pattern: - bitmap = BitmapLoader.getBitmap("state_active_small", "gui") + bitmap = BitmapLoader.getBitmap('state_active_small', 'gui') item.SetBitmap(bitmap) return item def getSubMenu(self, callingWindow, context, rootMenu, i, pitem): - msw = True if "wxMSW" in wx.PlatformInfo else False + msw = True if 'wxMSW' in wx.PlatformInfo else False self.patternIds = {} self.subMenus = OrderedDict() self.singles = [] @@ -75,7 +75,7 @@ class TargetProfile(ContextMenuUnconditional): if start is not -1 and end is not -1: currBase = pattern.name[start + 1:end] # set helper attr - setattr(pattern, "_name", pattern.name[end + 1:].strip()) + setattr(pattern, '_name', pattern.name[end + 1:].strip()) if currBase not in self.subMenus: self.subMenus[currBase] = [] self.subMenus[currBase].append(pattern) @@ -109,4 +109,4 @@ class TargetProfile(ContextMenuUnconditional): return sub -TargetProfile.register() +TargetProfileSwitcher.register()