Allow batch manipulation of fighter abilities

This commit is contained in:
DarkPhoenix
2019-04-24 17:25:20 +03:00
parent 6e4ec54ac6
commit dde1e7990d
9 changed files with 135 additions and 65 deletions

View File

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

View File

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

View File

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

View 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()

View File

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

View File

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

View File

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

View File

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