From fcc53d3f214c74f8fd2c00c4fee2cfe220568288 Mon Sep 17 00:00:00 2001 From: Ryan Holmes Date: Fri, 3 Aug 2018 16:10:27 -0400 Subject: [PATCH] Add commands for booster and command fits --- eos/db/saveddata/fit.py | 2 +- eos/saveddata/fit.py | 4 +- gui/builtinAdditionPanes/boosterView.py | 10 ++--- gui/builtinAdditionPanes/commandView.py | 11 ++--- gui/builtinContextMenus/itemRemove.py | 3 +- gui/builtinContextMenus/metaSwap.py | 12 +++--- gui/fitCommands/__init__.py | 4 ++ gui/fitCommands/calc/fitAddBooster.py | 42 +++++++++++++++++++ gui/fitCommands/calc/fitAddCommand.py | 53 ++++++++++++++++++++++++ gui/fitCommands/calc/fitRemoveBooster.py | 32 ++++++++++++++ gui/fitCommands/calc/fitRemoveCommand.py | 43 +++++++++++++++++++ gui/fitCommands/guiAddBooster.py | 29 +++++++++++++ gui/fitCommands/guiAddCommand.py | 29 +++++++++++++ gui/fitCommands/guiAddModule.py | 1 + gui/fitCommands/guiRemoveBooster.py | 29 +++++++++++++ gui/fitCommands/guiRemoveCommand.py | 29 +++++++++++++ service/fit.py | 8 +++- 17 files changed, 318 insertions(+), 23 deletions(-) create mode 100644 gui/fitCommands/calc/fitAddBooster.py create mode 100644 gui/fitCommands/calc/fitAddCommand.py create mode 100644 gui/fitCommands/calc/fitRemoveBooster.py create mode 100644 gui/fitCommands/calc/fitRemoveCommand.py create mode 100644 gui/fitCommands/guiAddBooster.py create mode 100644 gui/fitCommands/guiAddCommand.py create mode 100644 gui/fitCommands/guiRemoveBooster.py create mode 100644 gui/fitCommands/guiRemoveCommand.py diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index 0ae4509e2..9701d5d6b 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -138,7 +138,7 @@ es_Fit._Fit__projectedFits = association_proxy( creator=lambda sourceID, source_fit: ProjectedFit(sourceID, source_fit) ) -es_Fit._Fit__commandFits = association_proxy( +es_Fit.commandFitDict = association_proxy( "boostedOf", # look at the boostedOf association... "booster_fit", # .. and return the booster fit creator=lambda boosterID, booster_fit: CommandFit(boosterID, booster_fit) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 8f5cc2b36..7b9e79e6c 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -262,7 +262,7 @@ class Fit(object): @property def commandFits(self): - return [fit for fit in list(self.__commandFits.values()) if not fit.isInvalid] + return [fit for fit in list(self.commandFitDict.values()) if not fit.isInvalid] def getProjectionInfo(self, fitID): return self.projectedOnto.get(fitID, None) @@ -1605,7 +1605,7 @@ class Fit(object): eos.db.saveddata_session.refresh(fit) for fit in self.commandFits: - copy_ship.__commandFits[fit.ID] = fit + copy_ship.commandFitDict[fit.ID] = fit forceUpdateSavedata(fit) copyCommandInfo = fit.getCommandInfo(copy_ship.ID) originalCommandInfo = fit.getCommandInfo(self.ID) diff --git a/gui/builtinAdditionPanes/boosterView.py b/gui/builtinAdditionPanes/boosterView.py index 8923f83de..ef9c88f2d 100644 --- a/gui/builtinAdditionPanes/boosterView.py +++ b/gui/builtinAdditionPanes/boosterView.py @@ -26,7 +26,7 @@ from gui.builtinViewColumns.state import State from gui.contextMenu import ContextMenu from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit - +import gui.fitCommands as cmd class BoosterViewDrop(wx.DropTarget): def __init__(self, dropFn, *args, **kwargs): @@ -134,9 +134,7 @@ class BoosterView(d.Display): event.Skip() return - trigger = sFit.addBooster(fitID, event.itemID) - if trigger: - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + if self.mainFrame.command.Submit(cmd.GuiAddBoosterCommand(fitID, event.itemID)): self.mainFrame.additionsPane.select("Boosters") event.Skip() @@ -150,9 +148,7 @@ class BoosterView(d.Display): def removeBooster(self, booster): fitID = self.mainFrame.getActiveFit() - sFit = Fit.getInstance() - sFit.removeBooster(fitID, self.origional.index(booster)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, self.origional.index(booster))) def click(self, event): event.Skip() diff --git a/gui/builtinAdditionPanes/commandView.py b/gui/builtinAdditionPanes/commandView.py index 2bfa700c9..52cda66cb 100644 --- a/gui/builtinAdditionPanes/commandView.py +++ b/gui/builtinAdditionPanes/commandView.py @@ -30,7 +30,7 @@ from gui.builtinViewColumns.state import State from gui.contextMenu import ContextMenu from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit - +import gui.fitCommands as cmd class DummyItem(object): def __init__(self, txt): @@ -111,10 +111,11 @@ class CommandView(d.Display): if type == "fit": activeFit = self.mainFrame.getActiveFit() if activeFit: - sFit = Fit.getInstance() - draggedFit = sFit.getFit(fitID) - sFit.addCommandFit(activeFit, draggedFit) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) + # sFit = Fit.getInstance() + # draggedFit = sFit.getFit(fitID) + # sFit.addCommandFit(activeFit, draggedFit) + # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) + self.mainFrame.command.Submit(cmd.GuiAddCommandCommand(activeFit, fitID)) def startDrag(self, event): row = event.GetIndex() diff --git a/gui/builtinContextMenus/itemRemove.py b/gui/builtinContextMenus/itemRemove.py index b3cb414b5..60a0d36d1 100644 --- a/gui/builtinContextMenus/itemRemove.py +++ b/gui/builtinContextMenus/itemRemove.py @@ -48,7 +48,8 @@ class ItemRemove(ContextMenu): self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, fit.implants.index(selection[0]))) return # the command takes care of the PostEvent elif srcContext == "boosterItem": - sFit.removeBooster(fitID, fit.boosters.index(selection[0])) + self.mainFrame.command.Submit(cmd.GuiRemoveBoosterCommand(fitID, fit.boosters.index(selection[0]))) + return # the command takes care of the PostEvent elif srcContext == "cargoItem": self.mainFrame.command.Submit(cmd.GuiRemoveCargoCommand(fitID, selection[0].itemID)) return # the command takes care of the PostEvent diff --git a/gui/builtinContextMenus/metaSwap.py b/gui/builtinContextMenus/metaSwap.py index 7956848f8..871ebad68 100644 --- a/gui/builtinContextMenus/metaSwap.py +++ b/gui/builtinContextMenus/metaSwap.py @@ -140,6 +140,7 @@ class MetaSwap(ContextMenu): if isinstance(selected_item, Module): pos = fit.modules.index(selected_item) sFit.changeModule(fitID, pos, item.ID) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) elif isinstance(selected_item, Drone): drone_count = None @@ -152,6 +153,7 @@ class MetaSwap(ContextMenu): if drone_count: sFit.addDrone(fitID, item.ID, drone_count, True) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) elif isinstance(selected_item, Fighter): fighter_count = None @@ -172,12 +174,13 @@ class MetaSwap(ContextMenu): break sFit.addFighter(fitID, item.ID, True) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) elif isinstance(selected_item, Booster): for idx, booster_stack in enumerate(fit.boosters): if booster_stack is selected_item: - sFit.removeBooster(fitID, idx, False) - sFit.addBooster(fitID, item.ID, True) + self.mainFrame.command.Submit(cmd.GuiRemoveBoosterCommand(fitID, idx)) + self.mainFrame.command.Submit(cmd.GuiAddBoosterCommand(fitID, item.ID)) break elif isinstance(selected_item, Implant): @@ -185,7 +188,7 @@ class MetaSwap(ContextMenu): if implant_stack is selected_item: self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, idx)) self.mainFrame.command.Submit(cmd.GuiAddImplantCommand(fitID, item.ID)) - return + break elif isinstance(selected_item, Cargo): for idx, cargo_stack in enumerate(fit.cargo): @@ -194,9 +197,8 @@ class MetaSwap(ContextMenu): # utilize the two fitting commands that we need to remove then add? sFit.removeCargo(fitID, idx) self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(fitID, item.ID, cargo_stack.amount, True)) - return # don't need the post event + break - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) MetaSwap.register() diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py index 89a74b369..1102eaf08 100644 --- a/gui/fitCommands/__init__.py +++ b/gui/fitCommands/__init__.py @@ -7,3 +7,7 @@ from .guiRemoveCargo import GuiRemoveCargoCommand from .guiAddCargo import GuiAddCargoCommand from .guiRemoveImplant import GuiRemoveImplantCommand from .guiAddImplant import GuiAddImplantCommand +from .guiAddBooster import GuiAddBoosterCommand +from .guiRemoveBooster import GuiRemoveBoosterCommand +from .guiAddCommand import GuiAddCommandCommand +from .guiRemoveCommand import GuiRemoveCommandCommand \ No newline at end of file diff --git a/gui/fitCommands/calc/fitAddBooster.py b/gui/fitCommands/calc/fitAddBooster.py new file mode 100644 index 000000000..356a742da --- /dev/null +++ b/gui/fitCommands/calc/fitAddBooster.py @@ -0,0 +1,42 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +#from .helpers import ModuleInfoCache +from eos.saveddata.module import Module, State +import eos.db +from logbook import Logger +pyfalog = Logger(__name__) +from eos.saveddata.booster import Booster + +class FitAddBoosterCommand(wx.Command): + """" + from sFit.addBooster + """ + def __init__(self, fitID, itemID): + wx.Command.__init__(self, True) + self.fitID = fitID + self.itemID = itemID + self.new_index = None + + def Do(self): + pyfalog.debug("Adding booster ({0}) to fit ID: {1}", self.itemID, self.fitID) + + fit = eos.db.getFit(self.fitID) + item = eos.db.getItem(self.itemID, eager="attributes") + try: + booster = Booster(item) + except ValueError: + pyfalog.warning("Invalid item: {0}", self.itemID) + return False + + fit.boosters.append(booster) + self.new_index = fit.boosters.index(booster) + return True + + def Undo(self): + from .fitRemoveBooster import FitRemoveBoosterCommand # Avoid circular import + cmd = FitRemoveBoosterCommand(self.fitID, self.new_index) + cmd.Do() + return True diff --git a/gui/fitCommands/calc/fitAddCommand.py b/gui/fitCommands/calc/fitAddCommand.py new file mode 100644 index 000000000..61dbc68b7 --- /dev/null +++ b/gui/fitCommands/calc/fitAddCommand.py @@ -0,0 +1,53 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +#from .helpers import ModuleInfoCache +from eos.saveddata.module import Module, State +import eos.db +from logbook import Logger +pyfalog = Logger(__name__) + + +class FitAddCommandCommand(wx.Command): # well that's an unfrtunate name + """" + from sFit.addCommand + """ + def __init__(self, fitID, commandFitID): + wx.Command.__init__(self, True) + self.fitID = fitID + self.commandFitID = commandFitID + + def Do(self): + pyfalog.debug("Projecting command fit ({0}) onto: {1}", self.fitID, self.commandFitID) + fit = eos.db.getFit(self.fitID) + command = eos.db.getFit(self.commandFitID) + + if not command: + # if redoing when the command fit has been deleted, simply fail this command + return False + + if command in fit.commandFits: + return + + fit.commandFitDict[command.ID] = command + + # this bit is required -- see GH issue # 83 + eos.db.saveddata_session.flush() + eos.db.saveddata_session.refresh(command) + + eos.db.commit() + return True + + def Undo(self): + command = eos.db.getFit(self.commandFitID) + + if not command: + # can't find the command fit, it must have been deleted. Just skip this undo + return True + + from .fitRemoveCommand import FitRemoveCommandCommand + cmd = FitRemoveCommandCommand(self.fitID, self.commandFitID) + cmd.Do() + return True diff --git a/gui/fitCommands/calc/fitRemoveBooster.py b/gui/fitCommands/calc/fitRemoveBooster.py new file mode 100644 index 000000000..f22b6fb8e --- /dev/null +++ b/gui/fitCommands/calc/fitRemoveBooster.py @@ -0,0 +1,32 @@ +import wx + +#from .helpers import ModuleInfoCache +import eos.db +from logbook import Logger +pyfalog = Logger(__name__) + + +class FitRemoveBoosterCommand(wx.Command): + """" + from sFit.removeBooster + """ + def __init__(self, fitID, position): + wx.Command.__init__(self, True, "Implant remove") + self.fitID = fitID + self.position = position + self.old = None + + def Do(self): + pyfalog.debug("Removing booster from position ({0}) for fit ID: {1}", self.position, self.fitID) + + fit = eos.db.getFit(self.fitID) + booster = fit.boosters[self.position] + self.old = booster.itemID + fit.boosters.remove(booster) + return True + + def Undo(self): + from .fitAddBooster import FitAddBoosterCommand # Avoid circular import + cmd = FitAddBoosterCommand(self.fitID, self.old) + cmd.Do() + return True diff --git a/gui/fitCommands/calc/fitRemoveCommand.py b/gui/fitCommands/calc/fitRemoveCommand.py new file mode 100644 index 000000000..57052aa1e --- /dev/null +++ b/gui/fitCommands/calc/fitRemoveCommand.py @@ -0,0 +1,43 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +#from .helpers import ModuleInfoCache +from eos.saveddata.module import Module, State +import eos.db +from logbook import Logger +pyfalog = Logger(__name__) + + +class FitRemoveCommandCommand(wx.Command): # well that's an unfrtunate name + """" + from sFit.removeCommand + """ + def __init__(self, fitID, commandFitID): + wx.Command.__init__(self, True) + self.fitID = fitID + self.commandFitID = commandFitID + + def Do(self): + pyfalog.debug("Removing command projection from fit ({0}) for: {1}", self.fitID, self.commandFitID) + fit = eos.db.getFit(self.fitID) + command = eos.db.getFit(self.commandFitID) + if not command: + return False + del fit.commandFitDict[command.ID] + + eos.db.commit() + return True + + def Undo(self): + command = eos.db.getFit(self.commandFitID) + + if not command: + # can't find the command fit, it must have been deleted. Just skip this undo + return True + + from .fitAddCommand import FitAddCommandCommand + cmd = FitAddCommandCommand(self.fitID, self.commandFitID) + cmd.Do() + return True diff --git a/gui/fitCommands/guiAddBooster.py b/gui/fitCommands/guiAddBooster.py new file mode 100644 index 000000000..392ce3034 --- /dev/null +++ b/gui/fitCommands/guiAddBooster.py @@ -0,0 +1,29 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from .calc.fitAddBooster import FitAddBoosterCommand + +class GuiAddBoosterCommand(wx.Command): + def __init__(self, fitID, itemID): + wx.Command.__init__(self, True, "Booster Add") + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + self.sFit = Fit.getInstance() + self.internal_history = wx.CommandProcessor() + self.fitID = fitID + # can set his up no to not have to set variables on our object + self.cmd = FitAddBoosterCommand(fitID, itemID) + + def Do(self): + if self.internal_history.Submit(self.cmd): + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + return False + + def Undo(self): + for x in self.internal_history.Commands: + self.internal_history.Undo() + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + diff --git a/gui/fitCommands/guiAddCommand.py b/gui/fitCommands/guiAddCommand.py new file mode 100644 index 000000000..995bc545a --- /dev/null +++ b/gui/fitCommands/guiAddCommand.py @@ -0,0 +1,29 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from .calc.fitAddCommand import FitAddCommandCommand + +class GuiAddCommandCommand(wx.Command): + def __init__(self, fitID, commandFitID): + wx.Command.__init__(self, True, "") + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + self.sFit = Fit.getInstance() + self.internal_history = wx.CommandProcessor() + self.fitID = fitID + # can set his up no to not have to set variables on our object + self.cmd = FitAddCommandCommand(fitID, commandFitID) + + def Do(self): + if self.internal_history.Submit(self.cmd): + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + return False + + def Undo(self): + for x in self.internal_history.Commands: + self.internal_history.Undo() + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + diff --git a/gui/fitCommands/guiAddModule.py b/gui/fitCommands/guiAddModule.py index 5abf52651..12d26d6ac 100644 --- a/gui/fitCommands/guiAddModule.py +++ b/gui/fitCommands/guiAddModule.py @@ -1,6 +1,7 @@ import wx import gui.mainFrame +from service.fit import Fit from gui import globalEvents as GE from .calc.fitAddModule import FitAddModuleCommand from .calc.fitReplaceModule import FitReplaceModuleCommand diff --git a/gui/fitCommands/guiRemoveBooster.py b/gui/fitCommands/guiRemoveBooster.py new file mode 100644 index 000000000..92578b0b8 --- /dev/null +++ b/gui/fitCommands/guiRemoveBooster.py @@ -0,0 +1,29 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from .calc.fitRemoveBooster import FitRemoveBoosterCommand + +class GuiRemoveBoosterCommand(wx.Command): + def __init__(self, fitID, position): + wx.Command.__init__(self, True, "") + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + self.sFit = Fit.getInstance() + self.internal_history = wx.CommandProcessor() + self.fitID = fitID + # can set his up no to not have to set variables on our object + self.cmd = FitRemoveBoosterCommand(fitID, position) + + def Do(self): + if self.internal_history.Submit(self.cmd): + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + return False + + def Undo(self): + for x in self.internal_history.Commands: + self.internal_history.Undo() + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + diff --git a/gui/fitCommands/guiRemoveCommand.py b/gui/fitCommands/guiRemoveCommand.py new file mode 100644 index 000000000..d2c13c749 --- /dev/null +++ b/gui/fitCommands/guiRemoveCommand.py @@ -0,0 +1,29 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from .calc.fitRemoveCommand import FitRemoveCommandCommand + +class GuiRemoveCommandCommand(wx.Command): + def __init__(self, fitID, commandFitID): + wx.Command.__init__(self, True, "") + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + self.sFit = Fit.getInstance() + self.internal_history = wx.CommandProcessor() + self.fitID = fitID + # can set his up no to not have to set variables on our object + self.cmd = FitRemoveCommandCommand(fitID, commandFitID) + + def Do(self): + if self.internal_history.Submit(self.cmd): + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + return False + + def Undo(self): + for x in self.internal_history.Commands: + self.internal_history.Undo() + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + diff --git a/service/fit.py b/service/fit.py index 016f5989a..e5ff9b21c 100644 --- a/service/fit.py +++ b/service/fit.py @@ -365,6 +365,7 @@ class Fit(object): self.recalc(fit) return True + @deprecated def addBooster(self, fitID, itemID, recalc=True): pyfalog.debug("Adding booster ({0}) to fit ID: {1}", itemID, fitID) if fitID is None: @@ -383,6 +384,7 @@ class Fit(object): self.recalc(fit) return True + @deprecated def removeBooster(self, fitID, position, recalc=True): pyfalog.debug("Removing booster from position ({0}) for fit ID: {1}", position, fitID) if fitID is None: @@ -451,6 +453,7 @@ class Fit(object): self.recalc(fit) return True + @deprecated def addCommandFit(self, fitID, thing): pyfalog.debug("Projecting command fit ({0}) onto: {1}", fitID, thing) if fitID is None: @@ -461,7 +464,7 @@ class Fit(object): if thing in fit.commandFits: return - fit.__commandFits[thing.ID] = thing + fit.commandFitDict[thing.ID] = thing # this bit is required -- see GH issue # 83 eos.db.saveddata_session.flush() @@ -539,10 +542,11 @@ class Fit(object): eos.db.commit() self.recalc(fit) + @deprecated def removeCommand(self, fitID, thing): pyfalog.debug("Removing command projection from fit ({0}) for: {1}", fitID, thing) fit = eos.db.getFit(fitID) - del fit.__commandFits[thing.ID] + del fit.commandFitDict[thing.ID] eos.db.commit() self.recalc(fit)