diff --git a/gui/builtinContextMenus/damagePatternChange.py b/gui/builtinContextMenus/damagePatternChange.py index 7bc2ba80b..e28a7e963 100644 --- a/gui/builtinContextMenus/damagePatternChange.py +++ b/gui/builtinContextMenus/damagePatternChange.py @@ -6,7 +6,7 @@ import wx import gui.globalEvents as GE import gui.mainFrame from gui.contextMenu import ContextMenuUnconditional -from service.damagePattern import DamagePattern as import_DamagePattern +from service.damagePattern import DamagePattern as DmgPatternSvc from service.fit import Fit @@ -23,7 +23,7 @@ class ChangeDamagePattern(ContextMenuUnconditional): return self.mainFrame.getActiveFit() is not None def getText(self, callingWindow, itmContext): - sDP = import_DamagePattern.getInstance() + sDP = DmgPatternSvc.getInstance() sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() self.fit = sFit.getFit(fitID) @@ -31,10 +31,8 @@ class ChangeDamagePattern(ContextMenuUnconditional): self.patterns = sDP.getDamagePatternList() self.patterns.sort(key=lambda p: (p.name not in ["Uniform", "Selected Ammo"], p.name)) - self.patternIds = {} - self.subMenus = OrderedDict() - self.singles = [] - self.items = OrderedDict() + self.patternEventMap = {} + self.items = ([], OrderedDict()) for pattern in self.patterns: remainingName = pattern.name.strip() @@ -42,37 +40,16 @@ class ChangeDamagePattern(ContextMenuUnconditional): while True: start, end = remainingName.find('['), remainingName.find(']') if start == -1 or end == -1: - container[remainingName] = pattern + container[0].append((remainingName, pattern)) break - container = container.setdefault(remainingName[start + 1:end], OrderedDict()) + container = container[1].setdefault(remainingName[start + 1:end], ([], OrderedDict())) remainingName = remainingName[end + 1:].strip() - # iterate and separate damage patterns based on "[Parent] Child" - 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] - name = pattern.name[end + 1:].strip() - if not name: - self.singles.append(pattern) - continue - # set helper attr - setattr(pattern, "_name", name) - if currBase not in self.subMenus: - self.subMenus[currBase] = [] - self.subMenus[currBase].append(pattern) - else: - self.singles.append(pattern) + return [i[0] for i in self.items[0]] + list(self.items[1].keys()) - # return list of names, with singles first followed by submenu names - self.m = [p.name for p in self.singles] + list(self.subMenus.keys()) - return self.m - - def addPattern(self, rootMenu, pattern): + def addPattern(self, rootMenu, pattern, name): id = ContextMenuUnconditional.nextID() - name = getattr(pattern, "_name", pattern.name) if pattern is not None else "No Profile" - - self.patternIds[id] = pattern + self.patternEventMap[id] = pattern menuItem = wx.MenuItem(rootMenu, id, name, kind=wx.ITEM_CHECK) rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, menuItem) @@ -83,16 +60,12 @@ class ChangeDamagePattern(ContextMenuUnconditional): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() fit = sFit.getFit(fitID) - if fit: - dp = fit.damagePattern - checked = dp is pattern - else: - checked = False + checked = fit.damagePattern is pattern if fit else False return menuItem, checked def isChecked(self, i): try: - single = self.singles[i] + single = self.items[0][i] except IndexError: return super().isChecked(i) if self.fit and single is self.fit.damagePattern: @@ -100,32 +73,29 @@ class ChangeDamagePattern(ContextMenuUnconditional): return False def getSubMenu(self, callingWindow, context, rootMenu, i, pitem): - # Attempt to remove attribute which carries info if non-sub-items should - # be checked or not - self.checked = None - if self.m[i] not in self.subMenus: + if i < len(self.items[0]): # if we're trying to get submenu to something that shouldn't have one, # redirect event of the item to handlePatternSwitch and put pattern in # our patternIds mapping, then return None for no submenu id = pitem.GetId() - self.patternIds[id] = self.singles[i] + self.patternEventMap[id] = self.items[0][i][1] rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, pitem) return False + msw = "wxMSW" in wx.PlatformInfo sub = wx.Menu() - # Items that have a parent - msw = "wxMSW" in wx.PlatformInfo - for pattern in self.subMenus[self.m[i]]: - mitem, checked = self.addPattern(rootMenu if msw else sub, pattern) + mitemName = list(self.items[1].keys())[i - len(self.items[0])] + for name, pattern in self.items[1][mitemName][0]: + mitem, checked = self.addPattern(rootMenu if msw else sub, pattern, name) sub.Append(mitem) mitem.Check(checked) return sub def handlePatternSwitch(self, event): - pattern = self.patternIds.get(event.Id, False) + pattern = self.patternEventMap.get(event.Id, False) if pattern is False: event.Skip() return