Avoid duplicating names in context menu

This commit is contained in:
DarkPhoenix
2019-12-06 02:59:14 +03:00
parent 6a3157a4c8
commit 7fa998f276
3 changed files with 22 additions and 14 deletions

View File

@@ -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)

View File

@@ -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):

View File

@@ -17,8 +17,8 @@
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# =============================================================================
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]