Restore state of removed implants on undo

This commit is contained in:
DarkPhoenix
2019-04-10 19:32:48 +03:00
parent 8072bb600c
commit 3fc77d03b4
5 changed files with 49 additions and 41 deletions

View File

@@ -213,45 +213,46 @@ class HandledDroneCargoList(HandledList):
class HandledImplantList(HandledList):
def append(self, thing):
if thing.isInvalid:
HandledList.append(self, thing)
self.remove(thing)
def append(self, implant):
if implant.isInvalid:
HandledList.append(self, implant)
self.remove(implant)
return
self.makeRoom(thing)
HandledList.append(self, thing)
self.makeRoom(implant)
HandledList.append(self, implant)
def makeRoom(self, thing):
def makeRoom(self, implant):
# if needed, remove booster that was occupying slot
oldObj = next((m for m in self if m.slot == thing.slot), None)
oldObj = next((m for m in self if m.slot == implant.slot), None)
if oldObj:
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name,
thing.item.name)
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", implant.slot, oldObj.item.name,
implant.item.name)
itemID = oldObj.itemID
state = oldObj.active
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
return itemID
return None
return itemID, state
return None, None
class HandledBoosterList(HandledList):
def append(self, thing):
if thing.isInvalid:
HandledList.append(self, thing)
self.remove(thing)
def append(self, booster):
if booster.isInvalid:
HandledList.append(self, booster)
self.remove(booster)
return
self.makeRoom(thing)
HandledList.append(self, thing)
self.makeRoom(booster)
HandledList.append(self, booster)
def makeRoom(self, thing):
def makeRoom(self, booster):
# if needed, remove booster that was occupying slot
oldObj = next((m for m in self if m.slot == thing.slot), None)
oldObj = next((m for m in self if m.slot == booster.slot), None)
if oldObj:
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name,
thing.item.name)
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", booster.slot, oldObj.item.name,
booster.item.name)
itemID = oldObj.itemID
state = oldObj.active
sideEffects = {se.effectID: se.active for se in oldObj.sideEffects}

View File

@@ -9,40 +9,44 @@ class FitAddImplantCommand(wx.Command):
""""
from sFit.addImplant
"""
def __init__(self, fitID, itemID):
wx.Command.__init__(self, True, "Cargo add")
def __init__(self, fitID, itemID, state):
wx.Command.__init__(self, True, "Add Implant")
self.fitID = fitID
self.itemID = itemID
self.old_item = None
self.newItemID = itemID
self.newState = state
self.newIndex = None
self.oldItemID = None
self.oldState = None
def Do(self):
pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", self.fitID, self.itemID)
pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", self.fitID, self.newItemID)
fit = eos.db.getFit(self.fitID)
item = eos.db.getItem(self.itemID, eager="attributes")
item = eos.db.getItem(self.newItemID, eager="attributes")
if next((x for x in fit.implants if x.itemID == self.itemID), None):
if next((x for x in fit.implants if x.itemID == self.newItemID), None):
return False # already have item in list of implants
try:
implant = Implant(item)
except ValueError:
pyfalog.warning("Invalid item: {0}", self.itemID)
pyfalog.warning("Invalid item: {0}", self.newItemID)
return False
self.old_item = fit.implants.makeRoom(implant)
implant.active = self.newState
self.oldItemID, self.oldState = fit.implants.makeRoom(implant)
fit.implants.append(implant)
self.new_index = fit.implants.index(implant)
self.newIndex = fit.implants.index(implant)
return True
def Undo(self):
if self.old_item:
if self.oldItemID:
# If we had an item in the slot previously, add it back.
cmd = FitAddImplantCommand(self.fitID, self.old_item)
cmd = FitAddImplantCommand(self.fitID, self.oldItemID, self.oldState)
cmd.Do()
return True
from .fitRemoveImplant import FitRemoveImplantCommand # Avoid circular import
cmd = FitRemoveImplantCommand(self.fitID, self.new_index)
cmd = FitRemoveImplantCommand(self.fitID, self.newIndex)
cmd.Do()
return True

View File

@@ -14,19 +14,21 @@ class FitRemoveImplantCommand(wx.Command):
wx.Command.__init__(self, True, "Implant remove")
self.fitID = fitID
self.position = position
self.old_implant = None
self.savedItemID = None
self.savedState = None
def Do(self):
pyfalog.debug("Removing implant from position ({0}) for fit ID: {1}", self.position, self.fitID)
fit = eos.db.getFit(self.fitID)
implant = fit.implants[self.position]
self.old_implant = implant.itemID
self.savedItemID = implant.itemID
self.savedState = implant.active
fit.implants.remove(implant)
return True
def Undo(self):
from gui.fitCommands.calc.fitAddImplant import FitAddImplantCommand # Avoid circular import
cmd = FitAddImplantCommand(self.fitID, self.old_implant)
cmd = FitAddImplantCommand(self.fitID, self.savedItemID, self.savedState)
cmd.Do()
return True

View File

@@ -18,7 +18,7 @@ class GuiAddImplantCommand(wx.Command):
self.itemID = itemID
def Do(self):
if self.internal_history.Submit(FitAddImplantCommand(self.fitID, self.itemID)) and self.internal_history.Submit(FitChangeImplantLocation(self.fitID, ImplantLocation.FIT)):
if self.internal_history.Submit(FitAddImplantCommand(self.fitID, self.itemID, True)) and self.internal_history.Submit(FitChangeImplantLocation(self.fitID, ImplantLocation.FIT)):
self.sFit.recalc(self.fitID)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
return True

View File

@@ -33,7 +33,8 @@ class GuiMetaSwapCommand(wx.Command):
elif context == 'implantItem':
for x in selection:
idx = fit.implants.index(x)
self.data.append(((FitRemoveImplantCommand, fitID, idx), (FitAddImplantCommand, fitID, itemID)))
state = x.active
self.data.append(((FitRemoveImplantCommand, fitID, idx), (FitAddImplantCommand, fitID, itemID, state)))
elif context == 'boosterItem':
for x in selection:
idx = fit.boosters.index(x)