From 7f870cf6756c42f6a754116718114551cb104f95 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 13 Apr 2019 16:25:49 +0300 Subject: [PATCH] Rework projected drone fit commands --- gui/fitCommands/calc/fitAddCargo.py | 2 +- gui/fitCommands/calc/fitAddDrone.py | 24 ++++-- gui/fitCommands/calc/fitAddProjectedDrone.py | 82 ++++++++++++------- .../calc/fitRemoveProjectedDrone.py | 71 ++++++---------- gui/fitCommands/guiAddProjected.py | 6 +- gui/fitCommands/guiRemoveProjected.py | 3 +- 6 files changed, 101 insertions(+), 87 deletions(-) diff --git a/gui/fitCommands/calc/fitAddCargo.py b/gui/fitCommands/calc/fitAddCargo.py index 475c2e470..2f334dc5c 100644 --- a/gui/fitCommands/calc/fitAddCargo.py +++ b/gui/fitCommands/calc/fitAddCargo.py @@ -19,7 +19,7 @@ class FitAddCargoCommand(wx.Command): def Do(self): pyfalog.debug('Doing addition of cargo {} to fit {}'.format(self.cargoInfo, self.fitID)) fit = Fit.getInstance().getFit(self.fitID) - cargo = next((x for x in fit.cargo if x.itemID == self.cargoInfo.itemID), None) + cargo = next((c for c in fit.cargo if c.itemID == self.cargoInfo.itemID), None) if cargo is None: cargo = self.cargoInfo.toCargo() try: diff --git a/gui/fitCommands/calc/fitAddDrone.py b/gui/fitCommands/calc/fitAddDrone.py index accb06157..29e893ca4 100644 --- a/gui/fitCommands/calc/fitAddDrone.py +++ b/gui/fitCommands/calc/fitAddDrone.py @@ -3,6 +3,7 @@ from logbook import Logger import eos.db from eos.exception import HandledListActionError +from gui.fitCommands.helpers import DroneInfo from service.fit import Fit from service.market import Market @@ -16,7 +17,8 @@ class FitAddDroneCommand(wx.Command): wx.Command.__init__(self, True, 'Add Drone') self.fitID = fitID self.droneInfo = droneInfo - self.position = None + self.savedDroneInfo = None + self.savedPosition = None def Do(self): pyfalog.debug('Doing addition of drone {} to fit {}'.format(self.droneInfo, self.fitID)) @@ -25,15 +27,15 @@ class FitAddDroneCommand(wx.Command): # If we're not adding any active drones, check if there's an inactive stack # with enough space for new drones and use it if self.droneInfo.amountActive == 0: - for d in fit.drones.find(item): + for drone in fit.drones.find(item): if ( - d is not None and d.amountActive == 0 and - d.amount + self.droneInfo.amount) <= max(5, fit.extraAttributes["maxActiveDrones"] + drone is not None and drone.amountActive == 0 and + drone.amount + self.droneInfo.amount) <= max(5, fit.extraAttributes["maxActiveDrones"] ): - drone = d + self.savedDroneInfo = DroneInfo.fromDrone(drone) + self.savedPosition = fit.drones.index(drone) drone.amount += self.droneInfo.amount eos.db.commit() - self.position = fit.drones.index(drone) return True # Do new stack otherwise drone = self.droneInfo.toDrone() @@ -49,11 +51,17 @@ class FitAddDroneCommand(wx.Command): eos.db.commit() return False eos.db.commit() - self.position = fit.drones.index(drone) + self.savedPosition = fit.drones.index(drone) return True def Undo(self): pyfalog.debug('Undoing addition of drone {} to fit {}'.format(self.droneInfo, self.fitID)) + if self.savedDroneInfo is not None: + fit = Fit.getInstance().getFit(self.fitID) + drone = fit.drones[self.savedPosition] + drone.amount = self.savedDroneInfo.amount + drone.amountActive = self.savedDroneInfo.amountActive + return True from .fitRemoveDrone import FitRemoveDroneCommand - cmd = FitRemoveDroneCommand(fitID=self.fitID, position=self.position, amount=self.droneInfo.amount) + cmd = FitRemoveDroneCommand(fitID=self.fitID, position=self.savedPosition, amount=self.droneInfo.amount) return cmd.Do() diff --git a/gui/fitCommands/calc/fitAddProjectedDrone.py b/gui/fitCommands/calc/fitAddProjectedDrone.py index c3c365d81..10e441ffc 100644 --- a/gui/fitCommands/calc/fitAddProjectedDrone.py +++ b/gui/fitCommands/calc/fitAddProjectedDrone.py @@ -1,46 +1,66 @@ import wx -import eos.db from logbook import Logger -from eos.saveddata.drone import Drone + +import eos.db +from eos.exception import HandledListActionError +from gui.fitCommands.helpers import DroneInfo +from service.fit import Fit + + pyfalog = Logger(__name__) class FitAddProjectedDroneCommand(wx.Command): - """" - from sFit.project - """ - def __init__(self, fitID, itemID): - wx.Command.__init__(self, True) + + def __init__(self, fitID, droneInfo): + wx.Command.__init__(self, True, 'Add Projected Drone') self.fitID = fitID - self.itemID = itemID - self.index = None + self.droneInfo = droneInfo + self.savedDroneInfo = None def Do(self): - pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.itemID) - fit = eos.db.getFit(self.fitID) - item = eos.db.getItem(self.itemID) - - drone = None - for d in fit.projectedDrones.find(item): - if d is None or d.amountActive == d.amount or d.amount >= 5: - drone = d - break - + pyfalog.debug('Doing addition of projected drone {} to fit {}'.format(self.droneInfo, self.fitID)) + fit = Fit.getInstance().getFit(self.fitID) + drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.droneInfo.itemID), None) + # Changing existing stack + if drone is not None: + self.savedDroneInfo = DroneInfo.fromDrone(drone) + # Ignore drone info's active amount parameter if we're adding to existing stack, + # and decide based on stack's state + drone.amount += self.droneInfo.amount + if drone.amountActive > 0: + drone.amountActive += self.droneInfo.amount + eos.db.commit() + return True + # Making new stack + drone = self.droneInfo.toDrone() if drone is None: - drone = Drone(item) - if not drone.item.isType("projected"): - return False + return False + if not drone.item.isType('projected'): + pyfalog.debug('Drone is not projectable') + return False + try: fit.projectedDrones.append(drone) - - self.index = fit.projectedDrones.index(drone) - drone.amount += 1 - drone.amountActive = drone.amount - + except HandledListActionError: + pyfalog.warning('Failed to append to list') + eos.db.commit() + return False eos.db.commit() return True def Undo(self): - from gui.fitCommands.calc.fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand # avoids circular import - cmd = FitRemoveProjectedDroneCommand(self.fitID, self.index) - cmd.Do() - return True + pyfalog.debug('Undoing addition of projected drone {} to fit {}'.format(self.droneInfo, self.fitID)) + # Changing existing stack + if self.savedDroneInfo is not None: + fit = Fit.getInstance().getFit(self.fitID) + drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.savedDroneInfo.itemID), None) + if drone is None: + pyfalog.warning('Unable to find projected drone for modification') + return False + drone.amount = self.savedDroneInfo.amount + drone.amountActive = self.savedDroneInfo.amountActive + return True + # Removing new stack + from .fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand + cmd = FitRemoveProjectedDroneCommand(self.fitID, self.droneInfo) + return cmd.Do() diff --git a/gui/fitCommands/calc/fitRemoveProjectedDrone.py b/gui/fitCommands/calc/fitRemoveProjectedDrone.py index d32874d9d..3d9a0b501 100644 --- a/gui/fitCommands/calc/fitRemoveProjectedDrone.py +++ b/gui/fitCommands/calc/fitRemoveProjectedDrone.py @@ -2,66 +2,49 @@ import wx from logbook import Logger import eos.db -from eos.saveddata.drone import Drone +from gui.fitCommands.helpers import DroneInfo from service.fit import Fit -from service.market import Market pyfalog = Logger(__name__) class FitRemoveProjectedDroneCommand(wx.Command): - """" - from sFit.project - """ - def __init__(self, fitID, position, amount=1): - wx.Command.__init__(self, True) + def __init__(self, fitID, droneInfo): + wx.Command.__init__(self, True, 'Remove Projected Drone') self.fitID = fitID - self.position = position - self.amountToRemove = amount - self.savedItemID = None - self.savedAmount = None - self.savedAmountActive = None - self.removedStack = None + self.droneInfo = droneInfo + self.savedDroneInfo = None def Do(self): - pyfalog.debug("Removing ({0}) onto: {1}".format(self.fitID, self.position)) + pyfalog.debug('Doing removal of projected drone {} from fit {}'.format(self.droneInfo, self.fitID)) fit = Fit.getInstance().getFit(self.fitID) - drone = fit.projectedDrones[self.position] - self.savedItemID = drone.itemID - self.savedAmount = drone.amount - self.savedAmountActive = drone.amountActive - - drone.amount -= self.amountToRemove - if drone.amountActive > 0: - drone.amountActive -= self.amountToRemove - + drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.droneInfo.itemID), None) + if drone is None: + pyfalog.warning('Unable to find projected drone for removal') + return False + self.savedDroneInfo = DroneInfo.fromDrone(drone) + drone.amount -= self.droneInfo.amount + # Remove stack if we have no items remaining if drone.amount == 0: - del fit.projectedDrones[self.position] - self.removedStack = True + fit.projectedDrones.remove(drone) else: - self.removedStack = False + if drone.amountActive > 0: + drone.amountActive -= self.droneInfo.amount eos.db.commit() return True def Undo(self): + pyfalog.debug('Undoing removal of projected drone {} from fit {}'.format(self.droneInfo, self.fitID)) 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 + # Change stack if we still have it + drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.savedDroneInfo.itemID), None) + if drone is not None: + drone.amount = self.savedDroneInfo.amount + drone.amountActive = self.savedDroneInfo.amountActive + return True + # Make new stack + from .fitAddProjectedDrone import FitAddProjectedDroneCommand + cmd = FitAddProjectedDroneCommand(self.fitID, self.savedDroneInfo) + return cmd.Do() diff --git a/gui/fitCommands/guiAddProjected.py b/gui/fitCommands/guiAddProjected.py index 43b604f5e..1f5b5672e 100644 --- a/gui/fitCommands/guiAddProjected.py +++ b/gui/fitCommands/guiAddProjected.py @@ -3,7 +3,7 @@ from service.fit import Fit import gui.mainFrame from gui import globalEvents as GE -from gui.fitCommands.helpers import ModuleInfo +from gui.fitCommands.helpers import ModuleInfo, DroneInfo from .calc.fitAddProjectedModule import FitAddProjectedModuleCommand from .calc.fitAddProjectedFit import FitAddProjectedFitCommand from .calc.fitAddProjectedFighter import FitAddProjectedFighterCommand @@ -31,7 +31,9 @@ class GuiAddProjectedCommand(wx.Command): item = eos.db.getItem(self.id, eager=("attributes", "group.category")) if item.category.name == "Drone": - result = self.internal_history.Submit(FitAddProjectedDroneCommand(self.fitID, self.id)) + result = self.internal_history.Submit(FitAddProjectedDroneCommand( + fitID=self.fitID, + droneInfo=DroneInfo(itemID=self.id, amount=1, amountActive=1))) elif item.category.name == "Fighter": result = self.internal_history.Submit(FitAddProjectedFighterCommand(self.fitID, self.id, None, None)) else: diff --git a/gui/fitCommands/guiRemoveProjected.py b/gui/fitCommands/guiRemoveProjected.py index 262d7a88d..c4107d677 100644 --- a/gui/fitCommands/guiRemoveProjected.py +++ b/gui/fitCommands/guiRemoveProjected.py @@ -9,6 +9,7 @@ from .calc.fitRemoveProjectedFighter import FitRemoveProjectedFighterCommand from logbook import Logger from .calc.fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand +from gui.fitCommands.helpers import DroneInfo from eos.saveddata.drone import Drone from eos.saveddata.module import Module from eos.saveddata.fighter import Fighter @@ -33,7 +34,7 @@ class GuiRemoveProjectedCommand(wx.Command): fit = self.sFit.getFit(fitID) if isinstance(thing, Drone): - self.data = fit.projectedDrones.index(thing) + self.data = DroneInfo(itemID=thing.itemID, amount=1, amountActive=1) self.type = 'drone' elif isinstance(thing, Module): self.type = 'module'