diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index 53d61fe6b..5891c25e6 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -336,6 +336,7 @@ class HandledProjectedModList(HandledList): class HandledProjectedDroneList(HandledDroneCargoList): + def append(self, proj): proj.projected = True HandledList.append(self, proj) @@ -343,6 +344,19 @@ class HandledProjectedDroneList(HandledDroneCargoList): # Remove invalid or non-projectable drones if proj.isInvalid or not proj.item.isType("projected"): self.remove(proj) + return False + return True + + def insert(self, idx, proj): + proj.projected = True + HandledList.insert(self, idx, proj) + + # Remove invalid or non-projectable drones + if proj.isInvalid or not proj.item.isType("projected"): + self.remove(proj) + return False + return True + class HandledItem(object): diff --git a/gui/builtinAdditionPanes/projectedView.py b/gui/builtinAdditionPanes/projectedView.py index a1098b1ba..7c0ce6295 100644 --- a/gui/builtinAdditionPanes/projectedView.py +++ b/gui/builtinAdditionPanes/projectedView.py @@ -122,8 +122,7 @@ class ProjectedView(d.Display): if row != -1: thing = self.get(row) if thing: - sFit.removeProjected(fitID, self.get(row)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.mainFrame.command.Submit(cmd.GuiRemoveProjectedCommand(fitID, self.get(row))) def handleDrag(self, type, fitID): # Those are drags coming from pyfa sources, NOT builtin wx drags diff --git a/gui/fitCommands/calc/fitAddProjectedModule.py b/gui/fitCommands/calc/fitAddProjectedModule.py index 159553b23..03827dda4 100644 --- a/gui/fitCommands/calc/fitAddProjectedModule.py +++ b/gui/fitCommands/calc/fitAddProjectedModule.py @@ -43,9 +43,11 @@ class FitAddProjectedModuleCommand(wx.Command): self.oldModuleInfo = ModuleInfoCache(oldPosition, oldItemID, oldState, oldChargeID, oldBaseItemID, oldMutaplasmidID, oldMutations) if self.newPosition is not None: - fit.projectedModules.insert(self.newPosition, mod) + if not fit.projectedModules.insert(self.newPosition, mod): + return False else: - fit.projectedModules.append(mod) + if not fit.projectedModules.append(mod): + return False self.newPosition = fit.projectedModules.index(mod) eos.db.commit() diff --git a/gui/fitCommands/calc/fitRemoveDrone.py b/gui/fitCommands/calc/fitRemoveDrone.py index 325c8571a..e39ad9bab 100644 --- a/gui/fitCommands/calc/fitRemoveDrone.py +++ b/gui/fitCommands/calc/fitRemoveDrone.py @@ -18,7 +18,7 @@ class FitRemoveDroneCommand(wx.Command): wx.Command.__init__(self, True, "Drone add") self.fitID = fitID self.position = position - self.amountToRemove = amount # add x amount. If this goes over amount, removes stack + self.amountToRemove = amount self.savedItemID = None self.savedAmount = None self.savedAmountActive = None diff --git a/gui/fitCommands/calc/fitRemoveProjectedDrone.py b/gui/fitCommands/calc/fitRemoveProjectedDrone.py index 9d70ade2e..d32874d9d 100644 --- a/gui/fitCommands/calc/fitRemoveProjectedDrone.py +++ b/gui/fitCommands/calc/fitRemoveProjectedDrone.py @@ -1,42 +1,67 @@ import wx -import eos.db from logbook import Logger + +import eos.db +from eos.saveddata.drone import Drone +from service.fit import Fit +from service.market import Market + + pyfalog = Logger(__name__) -# this has the same exact definition that regular projected modules, besides the undo class FitRemoveProjectedDroneCommand(wx.Command): """" from sFit.project """ - def __init__(self, fitID, position, stack=False): + def __init__(self, fitID, position, amount=1): wx.Command.__init__(self, True) self.fitID = fitID self.position = position - self.removed_item = None - self.stack = stack + self.amountToRemove = amount + self.savedItemID = None + self.savedAmount = None + self.savedAmountActive = None + self.removedStack = None def Do(self): - pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.position) - fit = eos.db.getFit(self.fitID) - + pyfalog.debug("Removing ({0}) onto: {1}".format(self.fitID, self.position)) + fit = Fit.getInstance().getFit(self.fitID) drone = fit.projectedDrones[self.position] - if self.stack: - fit.projectedDrones.remove(drone) + self.savedItemID = drone.itemID + self.savedAmount = drone.amount + self.savedAmountActive = drone.amountActive + + drone.amount -= self.amountToRemove + if drone.amountActive > 0: + drone.amountActive -= self.amountToRemove + + if drone.amount == 0: + del fit.projectedDrones[self.position] + self.removedStack = True else: - if drone.amount > 1: - drone.amount -= 1 - else: - fit.projectedDrones.remove(drone) - - self.drone_item = drone.itemID - + self.removedStack = False eos.db.commit() return True def Undo(self): - from gui.fitCommands.calc.fitAddProjectedDrone import FitAddProjectedDroneCommand - cmd = FitAddProjectedDroneCommand(self.fitID, self.drone_item) - cmd.Do() + fit = Fit.getInstance().getFit(self.fitID) + if self.removedStack: + droneItem = Market.getInstance().getItem(self.savedItemID, eager=("attributes", "group.category")) + try: + drone = Drone(droneItem) + except ValueError: + pyfalog.warning("Invalid drone: {}", droneItem) + return False + if not drone.fits(fit): + return False + drone.amount = self.savedAmount + drone.amountActive = self.savedAmountActive + fit.projectedDrones.insert(self.position, drone) + else: + drone = fit.projectedDrones[self.position] + drone.amount = self.savedAmount + drone.amountActive = self.savedAmountActive + eos.db.commit() return True diff --git a/service/fitDeprecated.py b/service/fitDeprecated.py index 138da90e6..20410541b 100644 --- a/service/fitDeprecated.py +++ b/service/fitDeprecated.py @@ -353,23 +353,6 @@ class FitDeprecated(object): eos.db.commit() self.recalc(fit) - @deprecated - def removeProjected(self, fitID, thing): - pyfalog.debug("Removing projection on fit ({0}) from: {1}", fitID, thing) - fit = eos.db.getFit(fitID) - if isinstance(thing, es_Drone): - fit.projectedDrones.remove(thing) - elif isinstance(thing, es_Module): - fit.projectedModules.remove(thing) - elif isinstance(thing, es_Fighter): - fit.projectedFighters.remove(thing) - else: - del fit.projectedFitDict[thing.ID] - # fit.projectedFits.remove(thing) - - eos.db.commit() - self.recalc(fit) - @deprecated def removeCommand(self, fitID, thing): pyfalog.debug("Removing command projection from fit ({0}) for: {1}", fitID, thing)