diff --git a/gui/builtinContextMenus/damagePatternChange.py b/gui/builtinContextMenus/damagePatternChange.py index c6de05b3b..d4419bc7a 100644 --- a/gui/builtinContextMenus/damagePatternChange.py +++ b/gui/builtinContextMenus/damagePatternChange.py @@ -1,4 +1,5 @@ from collections import OrderedDict +from itertools import chain # noinspection PyPackageRequirements import wx @@ -28,11 +29,13 @@ class ChangeDamagePattern(ContextMenuUnconditional): fitID = self.mainFrame.getActiveFit() self.fit = sFit.getFit(fitID) - self.patterns = sDP.getDamagePatternList() + # Order here is important: patterns with duplicate names from the latter will overwrite + # patterns from the former + self.patterns = list(chain(sDP.getBuiltinDamagePatternList(), sDP.getUserDamagePatternList())) self.patterns.sort(key=lambda p: (p.name not in ["Uniform", "Selected Ammo"], p.name)) self.patternEventMap = {} - self.items = ([], OrderedDict()) + self.items = (OrderedDict(), OrderedDict()) for pattern in self.patterns: remainingName = pattern.name.strip() @@ -40,12 +43,12 @@ class ChangeDamagePattern(ContextMenuUnconditional): while True: start, end = remainingName.find('['), remainingName.find(']') if start == -1 or end == -1: - container[0].append((remainingName, pattern)) + container[0][remainingName] = pattern break - container = container[1].setdefault(remainingName[start + 1:end], ([], OrderedDict())) + container = container[1].setdefault(remainingName[start + 1:end], (OrderedDict(), OrderedDict())) remainingName = remainingName[end + 1:].strip() - return [i[0] for i in self.items[0]] + list(self.items[1].keys()) + return list(self.items[0].keys()) + list(self.items[1].keys()) def _addPattern(self, parentMenu, pattern, name): id = ContextMenuUnconditional.nextID() @@ -68,10 +71,11 @@ class ChangeDamagePattern(ContextMenuUnconditional): def isChecked(self, i): try: - single = self.items[0][i][1] + patternName = list(self.items[0].keys())[i] except IndexError: return super().isChecked(i) - if self.fit and single is self.fit.damagePattern: + pattern = self.items[0][patternName] + if self.fit and pattern is self.fit.damagePattern: return True return False @@ -80,7 +84,7 @@ class ChangeDamagePattern(ContextMenuUnconditional): # Pattern as menu item if i < len(self.items[0]): id = pitem.GetId() - self.patternEventMap[id] = self.items[0][i][1] + self.patternEventMap[id] = list(self.items[0].values())[i] rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, pitem) return False @@ -94,7 +98,7 @@ class ChangeDamagePattern(ContextMenuUnconditional): subMenu = makeMenu(subcontainer, menu) menuItem.SetSubMenu(subMenu) menu.Append(menuItem) - for name, pattern in container[0]: + for name, pattern in container[0].items(): menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, pattern, name) menu.Append(menuItem) menuItem.Check(checked) diff --git a/gui/patternEditor.py b/gui/patternEditor.py index ee22d3fd1..1c1516488 100644 --- a/gui/patternEditor.py +++ b/gui/patternEditor.py @@ -66,7 +66,7 @@ class DmgPatternEntityEditor(EntityEditor): def getEntitiesFromContext(self): sDP = DamagePattern.getInstance() - choices = sorted(sDP.getDamagePatternList(), key=lambda p: p.name) + choices = sorted(sDP.getUserDamagePatternList(), key=lambda p: p.name) return [c for c in choices if c.name != "Selected Ammo"] def DoNew(self, name): diff --git a/service/damagePattern.py b/service/damagePattern.py index 792f8c722..76aff9ce1 100644 --- a/service/damagePattern.py +++ b/service/damagePattern.py @@ -17,8 +17,8 @@ # along with pyfa. If not, see . # ============================================================================= + import copy -from itertools import chain import eos.db from eos.saveddata.damagePattern import DamagePattern as es_DamagePattern @@ -39,8 +39,12 @@ class DamagePattern: return cls.instance @staticmethod - def getDamagePatternList(): - return list(chain(es_DamagePattern.getBuiltins(), eos.db.getDamagePatternList())) + def getUserDamagePatternList(): + return eos.db.getDamagePatternList() + + @staticmethod + def getBuiltinDamagePatternList(): + return es_DamagePattern.getBuiltins() @staticmethod def getDamagePattern(name): @@ -82,7 +86,7 @@ class DamagePattern: raise ImportError("%d patterns imported from clipboard; %d had errors" % (num, num - lenImports)) def exportPatterns(self): - patterns = self.getDamagePatternList() + patterns = self.getUserDamagePatternList() for i in range(len(patterns) - 1, -1, -1): if patterns[i].name in ("Uniform", "Selected Ammo"): del patterns[i]