From dde1e7990d8ab00b1a1f458cd3b1bd4cdce38f08 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 24 Apr 2019 17:25:20 +0300 Subject: [PATCH] Allow batch manipulation of fighter abilities --- gui/builtinContextMenus/fighterAbilities.py | 32 ++++--- .../calc/drone/projectedToggleState.py | 5 +- .../calc/fighter/abilityToggleState.py | 44 ---------- .../calc/fighter/abilityToggleStates.py | 87 +++++++++++++++++++ .../{toggleState.py => toggleStates.py} | 0 .../gui/localFighter/abilityToggleState.py | 14 ++- .../gui/localFighter/toggleStates.py | 2 +- .../projectedFighter/abilityToggleState.py | 14 ++- .../gui/projectedFighter/toggleStates.py | 2 +- 9 files changed, 135 insertions(+), 65 deletions(-) delete mode 100644 gui/fitCommands/calc/fighter/abilityToggleState.py create mode 100644 gui/fitCommands/calc/fighter/abilityToggleStates.py rename gui/fitCommands/calc/fighter/{toggleState.py => toggleStates.py} (100%) diff --git a/gui/builtinContextMenus/fighterAbilities.py b/gui/builtinContextMenus/fighterAbilities.py index 01608166d..2f3c72591 100644 --- a/gui/builtinContextMenus/fighterAbilities.py +++ b/gui/builtinContextMenus/fighterAbilities.py @@ -3,19 +3,20 @@ import wx import gui.mainFrame from gui import fitCommands as cmd -from gui.contextMenu import ContextMenuSingle +from gui.fitCommands.helpers import getSimilarFighters +from gui.contextMenu import ContextMenuCombined from service.fit import Fit from service.settings import ContextMenuSettings -class FighterAbilities(ContextMenuSingle): +class FighterAbilities(ContextMenuCombined): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.settings = ContextMenuSettings.getInstance() self.isProjected = None - def display(self, srcContext, mainItem): + def display(self, srcContext, mainItem, selection): if self.mainFrame.getActiveFit() is None or srcContext not in ("fighterItem", "projectedFighter"): return False @@ -23,21 +24,22 @@ class FighterAbilities(ContextMenuSingle): return False self.fighter = mainItem + self.selection = selection self.isProjected = True if srcContext == "projectedFighter" else False return True - def getText(self, itmContext, mainItem): + def getText(self, itmContext, mainItem, selection): return "Abilities" def addAbility(self, menu, ability): label = ability.name - id = ContextMenuSingle.nextID() + 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, context, mainItem, rootMenu, i, pitem): + def getSubMenu(self, context, mainItem, selection, rootMenu, i, pitem): msw = True if "wxMSW" in wx.PlatformInfo else False self.context = context self.abilityIds = {} @@ -65,13 +67,23 @@ class FighterAbilities(ContextMenuSingle): if self.fighter in fit.projectedFighters: position = fit.projectedFighters.index(self.fighter) self.mainFrame.command.Submit(cmd.GuiToggleProjectedFighterAbilityStateCommand( - fitID=fitID, position=position, effectID=ability.effectID)) + fitID=fitID, mainPosition=position, positions=[position], effectID=ability.effectID)) else: if self.fighter in fit.fighters: - position = fit.fighters.index(self.fighter) + mainPosition = fit.fighters.index(self.fighter) + if wx.GetMouseState().altDown: + fighters = getSimilarFighters(fit.fighters, self.fighter) + else: + fighters = self.selection + positions = [] + for fighter in fighters: + if fighter in fit.fighters: + positions.append(fit.fighters.index(fighter)) self.mainFrame.command.Submit(cmd.GuiToggleLocalFighterAbilityStateCommand( - fitID=fitID, position=position, effectID=ability.effectID)) - + fitID=fitID, + mainPosition=mainPosition, + positions=positions, + effectID=ability.effectID)) FighterAbilities.register() diff --git a/gui/fitCommands/calc/drone/projectedToggleState.py b/gui/fitCommands/calc/drone/projectedToggleState.py index f5d492c06..0e10e08a1 100644 --- a/gui/fitCommands/calc/drone/projectedToggleState.py +++ b/gui/fitCommands/calc/drone/projectedToggleState.py @@ -42,5 +42,8 @@ class CalcToggleProjectedDroneStateCommand(wx.Command): def Undo(self): pyfalog.debug('Undoing toggling of projected drone {} state for fit {}'.format(self.itemID, self.fitID)) - cmd = CalcToggleProjectedDroneStateCommand(fitID=self.fitID, itemID=self.itemID, forceAmountActive=self.savedAmountActive) + cmd = CalcToggleProjectedDroneStateCommand( + fitID=self.fitID, + itemID=self.itemID, + forceAmountActive=self.savedAmountActive) return cmd.Do() diff --git a/gui/fitCommands/calc/fighter/abilityToggleState.py b/gui/fitCommands/calc/fighter/abilityToggleState.py deleted file mode 100644 index f95949163..000000000 --- a/gui/fitCommands/calc/fighter/abilityToggleState.py +++ /dev/null @@ -1,44 +0,0 @@ -import wx -from logbook import Logger - -import eos.db -from service.fit import Fit - - -pyfalog = Logger(__name__) - - -class CalcToggleFighterAbilityStateCommand(wx.Command): - - def __init__(self, fitID, projected, position, effectID, forceState=None): - wx.Command.__init__(self, True, 'Toggle Fighter Ability State') - self.fitID = fitID - self.projected = projected - self.position = position - self.effectID = effectID - self.forceState = forceState - self.savedState = None - - def Do(self): - pyfalog.debug('Doing toggling of fighter ability {} state at position {} for fit {}'.format(self.effectID, self.position, self.fitID)) - fit = Fit.getInstance().getFit(self.fitID) - container = fit.projectedFighters if self.projected else fit.fighters - fighter = container[self.position] - ability = next((fa for fa in fighter.abilities if fa.effectID == self.effectID), None) - if ability is None: - pyfalog.warning('Unable to find fighter ability') - return False - self.savedState = ability.active - ability.active = not ability.active if self.forceState is None else self.forceState - eos.db.commit() - return True - - def Undo(self): - pyfalog.debug('Unoing toggling of fighter ability {} state at position {} for fit {}'.format(self.effectID, self.position, self.fitID)) - cmd = CalcToggleFighterAbilityStateCommand( - fitID=self.fitID, - projected=self.projected, - position=self.position, - effectID=self.effectID, - forceState=self.savedState) - return cmd.Do() diff --git a/gui/fitCommands/calc/fighter/abilityToggleStates.py b/gui/fitCommands/calc/fighter/abilityToggleStates.py new file mode 100644 index 000000000..2a7e52947 --- /dev/null +++ b/gui/fitCommands/calc/fighter/abilityToggleStates.py @@ -0,0 +1,87 @@ +import wx +from logbook import Logger + +import eos.db +from service.fit import Fit + + +pyfalog = Logger(__name__) + + +class CalcToggleFighterAbilityStatesCommand(wx.Command): + + def __init__(self, fitID, projected, mainPosition, positions, effectID, forceStates=None): + wx.Command.__init__(self, True, 'Toggle Fighter Ability States') + self.fitID = fitID + self.projected = projected + self.mainPosition = mainPosition + self.positions = positions + self.effectID = effectID + self.forceStates = forceStates + self.savedStates = None + + def Do(self): + pyfalog.debug('Doing toggling of fighter ability {} state at position {}/{} for fit {}'.format(self.effectID, self.mainPosition, self.positions, self.fitID)) + fit = Fit.getInstance().getFit(self.fitID) + container = fit.projectedFighters if self.projected else fit.fighters + + positions = self.positions[:] + if self.mainPosition not in positions: + positions.append(self.mainPosition) + savedStates = {} + for position in positions: + fighter = container[position] + ability = next((fa for fa in fighter.abilities if fa.effectID == self.effectID), None) + if ability is None: + continue + savedStates[position] = ability.active + if len(savedStates) > 0: + self.savedStates = savedStates + + mainFighter = container[self.mainPosition] + mainAbility = next((fa for fa in mainFighter.abilities if fa.effectID == self.effectID), None) + + changes = False + if self.forceStates is not None: + for position, state in self.forceStates.items(): + fighter = container[position] + ability = next((fa for fa in fighter.abilities if fa.effectID == self.effectID), None) + if ability is None: + continue + changes = True + if ability.active is not state: + ability.active = state + elif mainAbility is None: + pyfalog.warning('Unable to find main fighter ability') + return False + elif mainAbility.active: + for position in positions: + fighter = container[position] + ability = next((fa for fa in fighter.abilities if fa.effectID == self.effectID), None) + if ability is None: + continue + if ability.active: + changes = True + ability.active = False + else: + for position in positions: + fighter = container[position] + ability = next((fa for fa in fighter.abilities if fa.effectID == self.effectID), None) + if ability is None: + continue + if not ability.active: + changes = True + ability.active = True + eos.db.commit() + return changes + + def Undo(self): + pyfalog.debug('Undoing toggling of fighter ability {} state at position {}/{} for fit {}'.format(self.effectID, self.mainPosition, self.positions, self.fitID)) + cmd = CalcToggleFighterAbilityStatesCommand( + fitID=self.fitID, + projected=self.projected, + mainPosition=self.mainPosition, + positions=self.positions, + effectID=self.effectID, + forceStates=self.savedStates) + return cmd.Do() diff --git a/gui/fitCommands/calc/fighter/toggleState.py b/gui/fitCommands/calc/fighter/toggleStates.py similarity index 100% rename from gui/fitCommands/calc/fighter/toggleState.py rename to gui/fitCommands/calc/fighter/toggleStates.py diff --git a/gui/fitCommands/gui/localFighter/abilityToggleState.py b/gui/fitCommands/gui/localFighter/abilityToggleState.py index 4ba75260a..6c8d1bed7 100644 --- a/gui/fitCommands/gui/localFighter/abilityToggleState.py +++ b/gui/fitCommands/gui/localFighter/abilityToggleState.py @@ -2,22 +2,28 @@ import wx import gui.mainFrame from gui import globalEvents as GE -from gui.fitCommands.calc.fighter.abilityToggleState import CalcToggleFighterAbilityStateCommand +from gui.fitCommands.calc.fighter.abilityToggleStates import CalcToggleFighterAbilityStatesCommand from gui.fitCommands.helpers import InternalCommandHistory from service.fit import Fit class GuiToggleLocalFighterAbilityStateCommand(wx.Command): - def __init__(self, fitID, position, effectID): + def __init__(self, fitID, mainPosition, positions, effectID): wx.Command.__init__(self, True, 'Toggle Local Fighter Ability State') self.internalHistory = InternalCommandHistory() self.fitID = fitID - self.position = position + self.mainPosition = mainPosition + self.positions = positions self.effectID = effectID def Do(self): - cmd = CalcToggleFighterAbilityStateCommand(fitID=self.fitID, projected=False, position=self.position, effectID=self.effectID) + cmd = CalcToggleFighterAbilityStatesCommand( + fitID=self.fitID, + projected=False, + mainPosition=self.mainPosition, + positions=self.positions, + effectID=self.effectID) success = self.internalHistory.submit(cmd) Fit.getInstance().recalc(self.fitID) wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitID=self.fitID)) diff --git a/gui/fitCommands/gui/localFighter/toggleStates.py b/gui/fitCommands/gui/localFighter/toggleStates.py index 3080950a5..8bade72ee 100644 --- a/gui/fitCommands/gui/localFighter/toggleStates.py +++ b/gui/fitCommands/gui/localFighter/toggleStates.py @@ -2,7 +2,7 @@ import wx import gui.mainFrame from gui import globalEvents as GE -from gui.fitCommands.calc.fighter.toggleState import CalcToggleFighterStatesCommand +from gui.fitCommands.calc.fighter.toggleStates import CalcToggleFighterStatesCommand from gui.fitCommands.helpers import InternalCommandHistory from service.fit import Fit diff --git a/gui/fitCommands/gui/projectedFighter/abilityToggleState.py b/gui/fitCommands/gui/projectedFighter/abilityToggleState.py index ca7807db0..3d1f278ad 100644 --- a/gui/fitCommands/gui/projectedFighter/abilityToggleState.py +++ b/gui/fitCommands/gui/projectedFighter/abilityToggleState.py @@ -2,22 +2,28 @@ import wx import gui.mainFrame from gui import globalEvents as GE -from gui.fitCommands.calc.fighter.abilityToggleState import CalcToggleFighterAbilityStateCommand +from gui.fitCommands.calc.fighter.abilityToggleStates import CalcToggleFighterAbilityStatesCommand from gui.fitCommands.helpers import InternalCommandHistory from service.fit import Fit class GuiToggleProjectedFighterAbilityStateCommand(wx.Command): - def __init__(self, fitID, position, effectID): + def __init__(self, fitID, mainPosition, positions, effectID): wx.Command.__init__(self, True, 'Toggle Projected Fighter Ability State') self.internalHistory = InternalCommandHistory() self.fitID = fitID - self.position = position + self.mainPosition = mainPosition + self.positions = positions self.effectID = effectID def Do(self): - cmd = CalcToggleFighterAbilityStateCommand(fitID=self.fitID, projected=True, position=self.position, effectID=self.effectID) + cmd = CalcToggleFighterAbilityStatesCommand( + fitID=self.fitID, + projected=True, + mainPosition=self.mainPosition, + positions=self.positions, + effectID=self.effectID) success = self.internalHistory.submit(cmd) Fit.getInstance().recalc(self.fitID) wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitID=self.fitID)) diff --git a/gui/fitCommands/gui/projectedFighter/toggleStates.py b/gui/fitCommands/gui/projectedFighter/toggleStates.py index fdb1f854a..440962541 100644 --- a/gui/fitCommands/gui/projectedFighter/toggleStates.py +++ b/gui/fitCommands/gui/projectedFighter/toggleStates.py @@ -2,7 +2,7 @@ import wx import gui.mainFrame from gui import globalEvents as GE -from gui.fitCommands.calc.fighter.toggleState import CalcToggleFighterStatesCommand +from gui.fitCommands.calc.fighter.toggleStates import CalcToggleFighterStatesCommand from gui.fitCommands.helpers import InternalCommandHistory from service.fit import Fit