Partially rework damage pattern switcher
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user