Files
pyfa/gui/builtinContextMenus/fighterAbilities.py
2020-06-23 15:55:16 +08:00

91 lines
3.0 KiB
Python

# noinspection PyPackageRequirements
import wx
import gui.mainFrame
from gui import fitCommands as cmd
from gui.contextMenu import ContextMenuCombined
from gui.fitCommands.helpers import getSimilarFighters
from service.fit import Fit
_t = wx.GetTranslation
class FighterAbilities(ContextMenuCombined):
def __init__(self):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
self.isProjected = None
def display(self, callingWindow, srcContext, mainItem, selection):
if self.mainFrame.getActiveFit() is None or srcContext not in ("fighterItem", "projectedFighter"):
return False
if mainItem is None:
return False
self.fighter = mainItem
self.selection = selection
self.isProjected = True if srcContext == "projectedFighter" else False
return True
def getText(self, callingWindow, itmContext, mainItem, selection):
return _t("Abilities")
def addAbility(self, menu, ability):
label = ability.name
id = ContextMenuCombined.nextID()
self.abilityIds[id] = ability
menuItem = wx.MenuItem(menu, id, label, kind=wx.ITEM_CHECK)
menu.Bind(wx.EVT_MENU, self.handleMode, menuItem)
return menuItem
def getSubMenu(self, callingWindow, context, mainItem, selection, rootMenu, i, pitem):
msw = True if "wxMSW" in wx.PlatformInfo else False
self.context = context
self.abilityIds = {}
sub = wx.Menu()
for ability in self.fighter.abilities:
if not ability.effect.isImplemented:
continue
menuItem = self.addAbility(rootMenu if msw else sub, ability)
sub.Append(menuItem)
menuItem.Check(ability.active)
return sub
def handleMode(self, event):
ability = self.abilityIds[event.Id]
if ability is False or ability not in self.fighter.abilities:
event.Skip()
return
fitID = self.mainFrame.getActiveFit()
fit = Fit.getInstance().getFit(fitID)
if self.isProjected:
container = fit.projectedFighters
command = cmd.GuiToggleProjectedFighterAbilityStateCommand
else:
container = fit.fighters
command = cmd.GuiToggleLocalFighterAbilityStateCommand
if self.fighter in container:
mainPosition = container.index(self.fighter)
if wx.GetMouseState().GetModifiers() in (wx.MOD_ALT, wx.MOD_CONTROL):
fighters = getSimilarFighters(container, self.fighter)
else:
fighters = self.selection
positions = []
for fighter in fighters:
if fighter in container:
positions.append(container.index(fighter))
self.mainFrame.command.Submit(command(
fitID=fitID,
mainPosition=mainPosition,
positions=positions,
effectID=ability.effectID))
FighterAbilities.register()