diff --git a/gui/builtinAdditionPanes/cargoView.py b/gui/builtinAdditionPanes/cargoView.py index a5b94f31b..2b385c72a 100644 --- a/gui/builtinAdditionPanes/cargoView.py +++ b/gui/builtinAdditionPanes/cargoView.py @@ -26,6 +26,7 @@ import gui.globalEvents as GE from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit from service.market import Market +import gui.fitCommands as cmd class CargoViewDrop(wx.DropTarget): @@ -80,9 +81,7 @@ class CargoView(d.Display): if data[0] == "fitting": self.swapModule(x, y, int(data[1])) elif data[0] == "market": - sFit = Fit.getInstance() - sFit.addCargo(self.mainFrame.getActiveFit(), int(data[1]), 1) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit())) + self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(self.mainFrame.getActiveFit(), int(data[1]))) def startDrag(self, event): row = event.GetIndex() diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py index b1d7bbe66..7144d6cb5 100644 --- a/gui/builtinAdditionPanes/implantView.py +++ b/gui/builtinAdditionPanes/implantView.py @@ -28,7 +28,7 @@ import gui.globalEvents as GE from eos.saveddata.fit import ImplantLocation from service.fit import Fit from service.market import Market - +import gui.fitCommands as cmd class ImplantView(wx.Panel): def __init__(self, parent): @@ -155,9 +155,7 @@ class ImplantDisplay(d.Display): event.Skip() return - trigger = sFit.addImplant(fitID, event.itemID) - if trigger: - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + if self.mainFrame.command.Submit(cmd.GuiAddImplantCommand(fitID, event.itemID)): self.mainFrame.additionsPane.select("Implants") event.Skip() @@ -175,10 +173,7 @@ class ImplantDisplay(d.Display): def removeImplant(self, implant): fitID = self.mainFrame.getActiveFit() - sFit = Fit.getInstance() - - sFit.removeImplant(fitID, self.original.index(implant)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, self.original.index(implant))) def click(self, event): event.Skip() diff --git a/gui/builtinContextMenus/amount.py b/gui/builtinContextMenus/amount.py index ed23e606a..eec575f29 100644 --- a/gui/builtinContextMenus/amount.py +++ b/gui/builtinContextMenus/amount.py @@ -9,7 +9,7 @@ from service.fit import Fit from eos.saveddata.cargo import Cargo as es_Cargo from eos.saveddata.fighter import Fighter as es_Fighter from service.settings import ContextMenuSettings - +import gui.fitCommands as cmd class ChangeAmount(ContextMenu): def __init__(self): @@ -45,7 +45,8 @@ class ChangeAmount(ContextMenu): cleanInput = re.sub(r'[^0-9.]', '', dlg.input.GetLineText(0).strip()) if isinstance(thing, es_Cargo): - sFit.addCargo(fitID, thing.item.ID, int(float(cleanInput)), replace=True) + self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(fitID, thing.item.ID, int(float(cleanInput)), replace=True)) + return # no need for post event here elif isinstance(thing, es_Fit): sFit.changeAmount(fitID, thing, int(float(cleanInput))) elif isinstance(thing, es_Fighter): diff --git a/gui/builtinContextMenus/cargoAmmo.py b/gui/builtinContextMenus/cargoAmmo.py index 12ebe552f..e80801975 100644 --- a/gui/builtinContextMenus/cargoAmmo.py +++ b/gui/builtinContextMenus/cargoAmmo.py @@ -4,7 +4,7 @@ import gui.globalEvents as GE import wx from service.settings import ContextMenuSettings from service.fit import Fit - +import gui.fitCommands as cmd class CargoAmmo(ContextMenu): def __init__(self): @@ -28,13 +28,10 @@ class CargoAmmo(ContextMenu): return "Add {0} to Cargo (x1000)".format(itmContext) def activate(self, fullContext, selection, i): - sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() - typeID = int(selection[0].ID) - sFit.addCargo(fitID, typeID, 1000) + self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(fitID, typeID, 1000)) self.mainFrame.additionsPane.select("Cargo") - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) CargoAmmo.register() diff --git a/gui/builtinContextMenus/itemRemove.py b/gui/builtinContextMenus/itemRemove.py index 9eb741dda..b3cb414b5 100644 --- a/gui/builtinContextMenus/itemRemove.py +++ b/gui/builtinContextMenus/itemRemove.py @@ -45,7 +45,8 @@ class ItemRemove(ContextMenu): elif srcContext == "fighterItem": sFit.removeFighter(fitID, fit.fighters.index(selection[0])) elif srcContext == "implantItem": - sFit.removeImplant(fitID, fit.implants.index(selection[0])) + 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])) elif srcContext == "cargoItem": diff --git a/gui/builtinContextMenus/metaSwap.py b/gui/builtinContextMenus/metaSwap.py index a5f6371e3..7956848f8 100644 --- a/gui/builtinContextMenus/metaSwap.py +++ b/gui/builtinContextMenus/metaSwap.py @@ -15,7 +15,7 @@ from eos.saveddata.drone import Drone from eos.saveddata.fighter import Fighter from eos.saveddata.implant import Implant from eos.saveddata.cargo import Cargo - +import gui.fitCommands as cmd class MetaSwap(ContextMenu): def __init__(self): @@ -183,16 +183,18 @@ class MetaSwap(ContextMenu): elif isinstance(selected_item, Implant): for idx, implant_stack in enumerate(fit.implants): if implant_stack is selected_item: - sFit.removeImplant(fitID, idx, False) - sFit.addImplant(fitID, item.ID, True) - break + self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, idx)) + self.mainFrame.command.Submit(cmd.GuiAddImplantCommand(fitID, item.ID)) + return elif isinstance(selected_item, Cargo): for idx, cargo_stack in enumerate(fit.cargo): if cargo_stack is selected_item: + # todo: make a command to change varieance of all items, or maybe per item type, which would + # utilize the two fitting commands that we need to remove then add? sFit.removeCargo(fitID, idx) - sFit.addCargo(fitID, item.ID, cargo_stack.amount, True) - break + self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(fitID, item.ID, cargo_stack.amount, True)) + return # don't need the post event wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py index 7e74e568e..c3507a7e6 100644 --- a/gui/fitCommands/__init__.py +++ b/gui/fitCommands/__init__.py @@ -6,4 +6,6 @@ from .moduleSwapOrClone import GuiModuleSwapOrCloneCommand from .guiRemoveCargo import GuiRemoveCargoCommand from .guiAddCargo import GuiAddCargoCommand from .fitAddCargo import FitAddCargoCommand -from .fitRemoveCargo import FitRemoveCargoCommand \ No newline at end of file +from .fitRemoveCargo import FitRemoveCargoCommand +from .guiRemoveImplant import GuiRemoveImplantCommand +from .guiAddImplant import GuiAddImplantCommand \ No newline at end of file diff --git a/gui/fitCommands/fitAddImplant.py b/gui/fitCommands/fitAddImplant.py new file mode 100644 index 000000000..91bc5be61 --- /dev/null +++ b/gui/fitCommands/fitAddImplant.py @@ -0,0 +1,41 @@ +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.implant import Implant + +class FitAddImplantCommand(wx.Command): + """" + from sFit.addImplant + """ + def __init__(self, fitID, itemID): + wx.Command.__init__(self, True, "Cargo add") + self.fitID = fitID + self.itemID = itemID + + def Do(self): + pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", self.fitID, self.itemID) + + fit = eos.db.getFit(self.fitID) + item = eos.db.getItem(self.itemID, eager="attributes") + try: + implant = Implant(item) + except ValueError: + pyfalog.warning("Invalid item: {0}", self.itemID) + return False + + fit.implants.append(implant) + self.new_index = fit.implants.index(implant) + return True + + def Undo(self): + from .fitRemoveImplant import FitRemoveImplantCommand # Avoid circular import + cmd = FitRemoveImplantCommand(self.fitID, self.new_index) + cmd.Do() + return True diff --git a/gui/fitCommands/fitRemoveImplant.py b/gui/fitCommands/fitRemoveImplant.py new file mode 100644 index 000000000..509bbd40d --- /dev/null +++ b/gui/fitCommands/fitRemoveImplant.py @@ -0,0 +1,38 @@ +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 FitRemoveImplantCommand(wx.Command): + """" + Fitting command that sets the amount for an item within the cargo. + + from sFit.removeImplant + """ + def __init__(self, fitID, position): + wx.Command.__init__(self, True, "Implant remove") + self.fitID = fitID + self.position = position + self.old_implant = 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 + fit.implants.remove(implant) + return True + + def Undo(self): + from .fitAddImplant import FitAddImplantCommand # Avoid circular import + cmd = FitAddImplantCommand(self.fitID, self.old_implant) + cmd.Do() + return True diff --git a/gui/fitCommands/guiAddCargo.py b/gui/fitCommands/guiAddCargo.py index 98491505c..dbff1360c 100644 --- a/gui/fitCommands/guiAddCargo.py +++ b/gui/fitCommands/guiAddCargo.py @@ -6,14 +6,14 @@ from gui import globalEvents as GE from .fitAddCargo import FitAddCargoCommand class GuiAddCargoCommand(wx.Command): - def __init__(self, fitID, itemID): + def __init__(self, fitID, itemID, amount=1, replace=False): wx.Command.__init__(self, True, "Cargo 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 = FitAddCargoCommand(fitID, itemID) + self.cmd = FitAddCargoCommand(fitID, itemID, amount, replace) def Do(self): if self.internal_history.Submit(self.cmd): diff --git a/gui/fitCommands/guiAddImplant.py b/gui/fitCommands/guiAddImplant.py new file mode 100644 index 000000000..b01023aa3 --- /dev/null +++ b/gui/fitCommands/guiAddImplant.py @@ -0,0 +1,29 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from .fitAddImplant import FitAddImplantCommand + +class GuiAddImplantCommand(wx.Command): + def __init__(self, fitID, itemID): + wx.Command.__init__(self, True, "Implant 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 = FitAddImplantCommand(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/guiRemoveImplant.py b/gui/fitCommands/guiRemoveImplant.py new file mode 100644 index 000000000..ebe906a35 --- /dev/null +++ b/gui/fitCommands/guiRemoveImplant.py @@ -0,0 +1,29 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from .fitRemoveImplant import FitRemoveImplantCommand + +class GuiRemoveImplantCommand(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 = FitRemoveImplantCommand(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/service/fit.py b/service/fit.py index 746990daf..c63ce4205 100644 --- a/service/fit.py +++ b/service/fit.py @@ -319,6 +319,7 @@ class Fit(object): fit.notes)) return fits + @deprecated def addImplant(self, fitID, itemID, recalc=True): pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", fitID, itemID) if fitID is None: @@ -337,6 +338,7 @@ class Fit(object): self.recalc(fit) return True + @deprecated def removeImplant(self, fitID, position, recalc=True): pyfalog.debug("Removing implant from position ({0}) for fit ID: {1}", position, fitID) if fitID is None: