Allow batch manipulation of fighter abilities
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
87
gui/fitCommands/calc/fighter/abilityToggleStates.py
Normal file
87
gui/fitCommands/calc/fighter/abilityToggleStates.py
Normal file
@@ -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()
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user