Make removal of fighters undoable w/o information loss
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
import wx
|
||||
import eos.db
|
||||
from logbook import Logger
|
||||
|
||||
import eos.db
|
||||
from eos.saveddata.fighter import Fighter
|
||||
from service.fit import Fit
|
||||
from service.market import Market
|
||||
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
|
||||
@@ -9,40 +14,45 @@ class FitAddFighterCommand(wx.Command):
|
||||
""""
|
||||
from sFit.addFighter
|
||||
"""
|
||||
def __init__(self, fitID, itemID):
|
||||
wx.Command.__init__(self, True, "Cargo add")
|
||||
def __init__(self, fitID, itemID, state, abilities):
|
||||
wx.Command.__init__(self, True, "Add Fighter")
|
||||
self.fitID = fitID
|
||||
self.itemID = itemID
|
||||
self.new_index = None
|
||||
self.newItemID = itemID
|
||||
self.newState = state
|
||||
self.newAbilities = abilities
|
||||
self.newIndex = None
|
||||
|
||||
def Do(self):
|
||||
fit = eos.db.getFit(self.fitID)
|
||||
item = eos.db.getItem(self.itemID, eager=("attributes", "group.category"))
|
||||
|
||||
fit = Fit.getInstance().getFit(self.fitID)
|
||||
item = Market.getInstance().getItem(self.newItemID, eager=("attributes", "group.category"))
|
||||
try:
|
||||
fighter = Fighter(item)
|
||||
except ValueError:
|
||||
pyfalog.warning("Invalid fighter: {}", item)
|
||||
return False
|
||||
|
||||
if not fighter.fits(fit):
|
||||
return False
|
||||
|
||||
used = fit.getSlotsUsed(fighter.slot)
|
||||
total = fit.getNumSlots(fighter.slot)
|
||||
|
||||
if used >= total:
|
||||
if self.newState is not None:
|
||||
fighter.active = self.newState
|
||||
elif used >= total:
|
||||
fighter.active = False
|
||||
else:
|
||||
fighter.active = True
|
||||
|
||||
if self.newAbilities is not None:
|
||||
for ability in fighter.abilities:
|
||||
ability.active = self.newAbilities.get(ability.effectID, ability.active)
|
||||
|
||||
fit.fighters.append(fighter)
|
||||
self.new_index = fit.fighters.index(fighter)
|
||||
|
||||
self.newIndex = fit.fighters.index(fighter)
|
||||
eos.db.commit()
|
||||
|
||||
return True
|
||||
|
||||
def Undo(self):
|
||||
from .fitRemoveFighter import FitRemoveFighterCommand # Avoid circular import
|
||||
cmd = FitRemoveFighterCommand(self.fitID, self.new_index)
|
||||
cmd = FitRemoveFighterCommand(self.fitID, self.newIndex)
|
||||
cmd.Do()
|
||||
return True
|
||||
|
||||
@@ -17,18 +17,24 @@ class FitRemoveFighterCommand(wx.Command):
|
||||
self.fitID = fitID
|
||||
self.position = position
|
||||
self.change = None
|
||||
self.removed_item = None
|
||||
self.savedItemID = None
|
||||
self.savedAmount = None
|
||||
self.savedStatus = None
|
||||
self.savedAbilities = None
|
||||
|
||||
def Do(self):
|
||||
fitID = self.fitID
|
||||
fit = eos.db.getFit(fitID)
|
||||
f = fit.fighters[self.position]
|
||||
fit.fighters.remove(f)
|
||||
self.removed_item = f.itemID
|
||||
fighter = fit.fighters[self.position]
|
||||
self.savedItemID = fighter.itemID
|
||||
self.savedAmount = fighter.amount
|
||||
self.savedStatus = fighter.active
|
||||
self.savedAbilities = {fa.effectID: fa.active for fa in fighter.abilities}
|
||||
fit.fighters.remove(fighter)
|
||||
eos.db.commit()
|
||||
return True
|
||||
|
||||
def Undo(self):
|
||||
from gui.fitCommands.calc.fitAddFighter import FitAddFighterCommand # avoids circular import
|
||||
cmd = FitAddFighterCommand(self.fitID, self.removed_item)
|
||||
cmd = FitAddFighterCommand(self.fitID, self.savedItemID, self.savedStatus, self.savedAbilities)
|
||||
return cmd.Do()
|
||||
|
||||
@@ -16,7 +16,7 @@ class GuiAddFighterCommand(wx.Command):
|
||||
self.itemID = itemID
|
||||
|
||||
def Do(self):
|
||||
if self.internal_history.Submit(FitAddFighterCommand(self.fitID, self.itemID)):
|
||||
if self.internal_history.Submit(FitAddFighterCommand(self.fitID, self.itemID, None, None)):
|
||||
self.sFit.recalc(self.fitID)
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
|
||||
return True
|
||||
|
||||
@@ -46,7 +46,9 @@ class GuiMetaSwapCommand(wx.Command):
|
||||
self.data.append(((FitRemoveCargoCommand, fitID, x.itemID, 1, True), (FitAddCargoCommand, fitID, itemID, x.amount)))
|
||||
elif context == 'fighterItem':
|
||||
for x in selection:
|
||||
self.data.append(((FitRemoveFighterCommand, fitID, fit.fighters.index(x)), (FitAddFighterCommand, fitID, itemID)))
|
||||
state = x.active
|
||||
abilities = {fa.effectID: fa.active for fa in x.abilities}
|
||||
self.data.append(((FitRemoveFighterCommand, fitID, fit.fighters.index(x)), (FitAddFighterCommand, fitID, itemID, state, abilities)))
|
||||
elif context == 'droneItem':
|
||||
for x in selection:
|
||||
self.data.append(((FitChangeDroneVariationCommand, fitID, fit.drones.index(x), itemID),),)
|
||||
|
||||
@@ -17,7 +17,6 @@ class GuiRemoveFighterCommand(wx.Command):
|
||||
|
||||
def Do(self):
|
||||
success = self.internal_history.Submit(FitRemoveFighterCommand(self.fitID, self.position))
|
||||
|
||||
if success:
|
||||
self.sFit.recalc(self.fitID)
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
|
||||
|
||||
Reference in New Issue
Block a user