diff --git a/gui/builtinContextMenus/changeAffectingSkills.py b/gui/builtinContextMenus/changeAffectingSkills.py index 4d1f5fdd4..95d2bc228 100644 --- a/gui/builtinContextMenus/changeAffectingSkills.py +++ b/gui/builtinContextMenus/changeAffectingSkills.py @@ -67,7 +67,7 @@ class ChangeAffectingSkills(ContextMenu): rootMenu.Bind(wx.EVT_MENU, self.handleSkillChange, menuItem) return menuItem - def getSubMenu(self, context, selection, menu, i): + def getSubMenu(self, context, selection, menu, i, id): self.context = context self.skillIds = {} diff --git a/gui/builtinContextMenus/damagePattern.py b/gui/builtinContextMenus/damagePattern.py index 1cde95a54..2242dba30 100644 --- a/gui/builtinContextMenus/damagePattern.py +++ b/gui/builtinContextMenus/damagePattern.py @@ -15,33 +15,82 @@ class DamagePattern(ContextMenu): def getText(self, itmContext, selection): sDP = service.DamagePattern.getInstance() self.patterns = sDP.getDamagePatternList() - self.patterns.sort( key=lambda p: (p.name in ["Selected Ammo", - "Uniform"], p.name) ) - m = map(lambda p: p.name, self.patterns) - return m + self.patterns.sort( key=lambda p: (p.name not in ["Uniform", + "Selected Ammo"], p.name) ) + + self.patternIds = {} + self.subMenus = {} + self.singles = [] + + # 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] + # 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) + + # return list of names, with singles first followed by submenu names + self.m = map(lambda p: p.name, self.singles) + self.subMenus.keys() + return self.m + + def handlePatternSwitch(self, event): + pattern = self.patternIds.get(event.Id, False) + if pattern is False: + event.Skip() + return - def activate(self, fullContext, selection, i): - sDP = service.DamagePattern.getInstance() sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() - sFit.setDamagePattern(fitID, self.patterns[i]) - setattr(self.mainFrame,"_activeDmgPattern",self.patterns[i]) + sFit.setDamagePattern(fitID, pattern) + setattr(self.mainFrame,"_activeDmgPattern", pattern) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) - def getBitmap(self, context, selection): + def addPattern(self, menu, pattern): + id = wx.NewId() + name = getattr(pattern, "_name", pattern.name) if pattern is not None else "No Profile" + + self.patternIds[id] = pattern + item = wx.MenuItem(menu, id, name) + menu.Bind(wx.EVT_MENU, self.handlePatternSwitch, item) + + # set pattern attr to menu item + item.pattern = pattern + + # determine active pattern sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() f = sFit.getFit(fitID) dp = f.damagePattern - if dp is None: + + if dp == pattern: + bitmap = bitmapLoader.getBitmap("state_active_small", "icons") + item.SetBitmap(bitmap) + return item + + def getSubMenu(self, context, selection, menu, i, id): + menu.Bind(wx.EVT_MENU, self.handlePatternSwitch) # this bit is required for some reason + + if self.m[i] not in self.subMenus: + # 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 + self.patternIds[id] = self.singles[i] + menu.Bind(wx.EVT_MENU, self.handlePatternSwitch, id=id) return None - index = self.patterns.index(dp) - bitmap = bitmapLoader.getBitmap("state_active_small", "icons") - l = [None] * len(self.patterns) - l[index] = bitmap + sub = wx.Menu() + sub.Bind(wx.EVT_MENU, self.handlePatternSwitch) - return l + # Items that have a parent + for pattern in self.subMenus[self.m[i]]: + sub.AppendItem(self.addPattern(sub, pattern)) + return sub DamagePattern.register() diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py index c19c9d7ab..a1a9f45cf 100644 --- a/gui/builtinContextMenus/moduleAmmoPicker.py +++ b/gui/builtinContextMenus/moduleAmmoPicker.py @@ -116,7 +116,7 @@ class ModuleAmmoPicker(ContextMenu): m.Append(id, u'─ %s ─' % text) m.Enable(id, False) - def getSubMenu(self, context, selection, menu, i): + def getSubMenu(self, context, selection, menu, i, id): self.context = context menu.Bind(wx.EVT_MENU, self.handleAmmoSwitch) m = wx.Menu() diff --git a/gui/builtinContextMenus/targetResists.py b/gui/builtinContextMenus/targetResists.py index d88e0685a..c5b9c1892 100644 --- a/gui/builtinContextMenus/targetResists.py +++ b/gui/builtinContextMenus/targetResists.py @@ -63,7 +63,7 @@ class TargetResists(ContextMenu): m.Append(id, u'─ %s ─' % text) m.Enable(id, False) - def getSubMenu(self, context, selection, menu, i): + def getSubMenu(self, context, selection, menu, i, id): self.context = context menu.Bind(wx.EVT_MENU, self.handleResistSwitch) m = wx.Menu() diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py index 146139aa8..522d40bd2 100644 --- a/gui/builtinContextMenus/whProjector.py +++ b/gui/builtinContextMenus/whProjector.py @@ -17,7 +17,7 @@ class WhProjector(ContextMenu): def activate(self, fullContext, selection, i): pass - def getSubMenu(self, context, selection, menu, i): + def getSubMenu(self, context, selection, menu, i, id): self.idmap = {} menu.Bind(wx.EVT_MENU, self.handleSelection) m = wx.Menu() diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 9f0a8d7bd..e5dd47508 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -54,7 +54,7 @@ class ContextMenu(object): item = wx.MenuItem(menu, id, text) menu.info[id] = (m, fullContext, it) - sub = m.getSubMenu(srcContext, selection, menu, it) + sub = m.getSubMenu(srcContext, selection, menu, it, id) if sub is not None: item.SetSubMenu(sub)