Partially rework damage pattern switcher

This commit is contained in:
DarkPhoenix
2019-12-05 20:04:50 +03:00
parent e386232de1
commit e99be78c54

View File

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