From 9605efe6439e6cab1fd8a46459ac4878fedaaa2f Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 21 Aug 2019 16:47:48 +0300 Subject: [PATCH] Support actual item pasting functionality --- gui/builtinContextMenus/additionsImport.py | 19 +++++--- gui/fitCommands/__init__.py | 5 ++ gui/fitCommands/gui/booster/imprt.py | 42 +++++++++++++++++ gui/fitCommands/gui/cargo/imprt.py | 37 +++++++++++++++ gui/fitCommands/gui/implant/imprt.py | 54 ++++++++++++++++++++++ gui/fitCommands/gui/localDrone/imprt.py | 45 ++++++++++++++++++ gui/fitCommands/gui/localFighter/imprt.py | 42 +++++++++++++++++ 7 files changed, 238 insertions(+), 6 deletions(-) create mode 100644 gui/fitCommands/gui/booster/imprt.py create mode 100644 gui/fitCommands/gui/cargo/imprt.py create mode 100644 gui/fitCommands/gui/implant/imprt.py create mode 100644 gui/fitCommands/gui/localDrone/imprt.py create mode 100644 gui/fitCommands/gui/localFighter/imprt.py diff --git a/gui/builtinContextMenus/additionsImport.py b/gui/builtinContextMenus/additionsImport.py index e904728f7..d0e6ccba8 100644 --- a/gui/builtinContextMenus/additionsImport.py +++ b/gui/builtinContextMenus/additionsImport.py @@ -1,4 +1,5 @@ import gui.mainFrame +from gui import fitCommands as cmd from gui.contextMenu import ContextMenuUnconditional from gui.utils.clipboard import fromClipboard from service.fit import Fit @@ -7,12 +8,12 @@ from service.settings import ContextMenuSettings viewSpecMap = { - 'droneItemMisc': ('Drones', None), - 'fighterItemMisc': ('Fighters', None), - 'cargoItemMisc': ('Cargo Items', None), - 'implantItemMisc': ('Implants', None), - 'implantItemMiscChar': ('Implants', None), - 'boosterItemMisc': ('Boosters', None)} + 'droneItemMisc': ('Drones', lambda i: i.isDrone, cmd.GuiImportLocalDronesCommand), + 'fighterItemMisc': ('Fighters', lambda i: i.isFighter, cmd.GuiImportLocalFightersCommand), + 'cargoItemMisc': ('Cargo Items', lambda i: not i.isAbyssal, cmd.GuiImportCargosCommand), + 'implantItemMisc': ('Implants', lambda i: i.isImplant, cmd.GuiImportImplantsCommand), + 'implantItemMiscChar': ('Implants', lambda i: i.isImplant, cmd.GuiImportImplantsCommand), + 'boosterItemMisc': ('Boosters', lambda i: i.isBooster, cmd.GuiImportBoostersCommand)} class AdditionsImport(ContextMenuUnconditional): @@ -40,6 +41,12 @@ class AdditionsImport(ContextMenuUnconditional): def activate(self, callingWindow, fullContext, i): text = fromClipboard() items = parseAdditions(text) + filterFunc = viewSpecMap[self.srcContext][1] + items = [(i.ID, a) for i, a in items if filterFunc(i)] + if not items: + return + command = viewSpecMap[self.srcContext][2] + self.mainFrame.command.Submit(command(self.mainFrame.getActiveFit(), items)) AdditionsImport.register() diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py index 78fce1b7f..2bf839a22 100644 --- a/gui/fitCommands/__init__.py +++ b/gui/fitCommands/__init__.py @@ -1,11 +1,13 @@ from .gui.booster.add import GuiAddBoosterCommand from .gui.booster.changeMeta import GuiChangeBoosterMetaCommand +from .gui.booster.imprt import GuiImportBoostersCommand from .gui.booster.remove import GuiRemoveBoostersCommand from .gui.booster.sideEffectToggleState import GuiToggleBoosterSideEffectStateCommand from .gui.booster.toggleStates import GuiToggleBoosterStatesCommand from .gui.cargo.add import GuiAddCargoCommand from .gui.cargo.changeAmount import GuiChangeCargoAmountCommand from .gui.cargo.changeMetas import GuiChangeCargoMetasCommand +from .gui.cargo.imprt import GuiImportCargosCommand from .gui.cargo.remove import GuiRemoveCargosCommand from .gui.commandFit.add import GuiAddCommandFitsCommand from .gui.commandFit.remove import GuiRemoveCommandFitsCommand @@ -16,6 +18,7 @@ from .gui.fitSystemSecurity import GuiChangeFitSystemSecurityCommand from .gui.implant.add import GuiAddImplantCommand from .gui.implant.changeLocation import GuiChangeImplantLocationCommand from .gui.implant.changeMeta import GuiChangeImplantMetaCommand +from .gui.implant.imprt import GuiImportImplantsCommand from .gui.implant.remove import GuiRemoveImplantsCommand from .gui.implant.setAdd import GuiAddImplantSetCommand from .gui.implant.toggleStates import GuiToggleImplantStatesCommand @@ -24,6 +27,7 @@ from .gui.localDrone.add import GuiAddLocalDroneCommand from .gui.localDrone.changeAmount import GuiChangeLocalDroneAmountCommand from .gui.localDrone.changeMetas import GuiChangeLocalDroneMetasCommand from .gui.localDrone.clone import GuiCloneLocalDroneCommand +from .gui.localDrone.imprt import GuiImportLocalDronesCommand from .gui.localDrone.remove import GuiRemoveLocalDronesCommand from .gui.localDrone.stackSplit import GuiSplitLocalDroneStackCommand from .gui.localDrone.stacksMerge import GuiMergeLocalDroneStacksCommand @@ -32,6 +36,7 @@ from .gui.localFighter.abilityToggleState import GuiToggleLocalFighterAbilitySta from .gui.localFighter.add import GuiAddLocalFighterCommand from .gui.localFighter.changeAmount import GuiChangeLocalFighterAmountCommand from .gui.localFighter.changeMetas import GuiChangeLocalFighterMetasCommand +from .gui.localFighter.imprt import GuiImportLocalFightersCommand from .gui.localFighter.remove import GuiRemoveLocalFightersCommand from .gui.localFighter.toggleStates import GuiToggleLocalFighterStatesCommand from .gui.localModule.add import GuiAddLocalModuleCommand diff --git a/gui/fitCommands/gui/booster/imprt.py b/gui/fitCommands/gui/booster/imprt.py new file mode 100644 index 000000000..c6851fed9 --- /dev/null +++ b/gui/fitCommands/gui/booster/imprt.py @@ -0,0 +1,42 @@ +import wx + +import eos.db +import gui.mainFrame +from gui import globalEvents as GE +from gui.fitCommands.calc.booster.add import CalcAddBoosterCommand +from gui.fitCommands.helpers import BoosterInfo, InternalCommandHistory +from service.fit import Fit + + +class GuiImportBoostersCommand(wx.Command): + + def __init__(self, fitID, boosters): + wx.Command.__init__(self, True, 'Import Boosters') + self.internalHistory = InternalCommandHistory() + self.fitID = fitID + self.boosters = set(b[0] for b in boosters) + + def Do(self): + if not self.boosters: + return False + commands = [] + for itemID in self.boosters: + commands.append(CalcAddBoosterCommand(fitID=self.fitID, boosterInfo=BoosterInfo(itemID=itemID))) + success = self.internalHistory.submitBatch(*commands) + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success + + def Undo(self): + success = self.internalHistory.undoAll() + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success diff --git a/gui/fitCommands/gui/cargo/imprt.py b/gui/fitCommands/gui/cargo/imprt.py new file mode 100644 index 000000000..54ff49b9a --- /dev/null +++ b/gui/fitCommands/gui/cargo/imprt.py @@ -0,0 +1,37 @@ +import wx + +import eos.db +import gui.mainFrame +from gui import globalEvents as GE +from gui.fitCommands.calc.cargo.add import CalcAddCargoCommand +from gui.fitCommands.helpers import CargoInfo, InternalCommandHistory + + +class GuiImportCargosCommand(wx.Command): + + def __init__(self, fitID, cargos): + wx.Command.__init__(self, True, 'Import Cargos') + self.internalHistory = InternalCommandHistory() + self.fitID = fitID + self.cargos = {} + for itemID, amount in cargos: + if itemID not in self.cargos: + self.cargos[itemID] = 0 + self.cargos[itemID] += amount + + def Do(self): + if not self.cargos: + return False + commands = [] + for itemID, amount in self.cargos.items(): + commands.append(CalcAddCargoCommand(fitID=self.fitID, cargoInfo=CargoInfo(itemID=itemID, amount=amount))) + success = self.internalHistory.submitBatch(*commands) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success + + def Undo(self): + success = self.internalHistory.undoAll() + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success diff --git a/gui/fitCommands/gui/implant/imprt.py b/gui/fitCommands/gui/implant/imprt.py new file mode 100644 index 000000000..71bdc3c50 --- /dev/null +++ b/gui/fitCommands/gui/implant/imprt.py @@ -0,0 +1,54 @@ +import wx + +import eos.db +import gui.mainFrame +from eos.const import ImplantLocation +from gui import globalEvents as GE +from gui.fitCommands.calc.implant.add import CalcAddImplantCommand +from gui.fitCommands.calc.implant.changeLocation import CalcChangeImplantLocationCommand +from gui.fitCommands.helpers import ImplantInfo, InternalCommandHistory +from service.fit import Fit + + +class GuiImportImplantsCommand(wx.Command): + + def __init__(self, fitID, implants): + wx.Command.__init__(self, True, 'Import Implants') + self.internalHistory = InternalCommandHistory() + self.fitID = fitID + self.implants = set(i[0] for i in implants) + + def Do(self): + if not self.implants: + return False + sFit = Fit.getInstance() + fit = sFit.getFit(self.fitID) + if fit.implantSource != ImplantLocation.FIT: + cmd = CalcChangeImplantLocationCommand(fitID=self.fitID, source=ImplantLocation.FIT) + successSource = self.internalHistory.submit(cmd) + else: + successSource = False + commands = [] + for itemID in self.implants: + commands.append(CalcAddImplantCommand(fitID=self.fitID, implantInfo=ImplantInfo(itemID=itemID))) + successImplants = self.internalHistory.submitBatch(*commands) + # Acceptable behavior when we already have passed implant and just switch source, or + # when we have source and add implant, but not if we do not change anything + success = successSource or successImplants + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success + + def Undo(self): + success = self.internalHistory.undoAll() + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success diff --git a/gui/fitCommands/gui/localDrone/imprt.py b/gui/fitCommands/gui/localDrone/imprt.py new file mode 100644 index 000000000..c07f7e7b0 --- /dev/null +++ b/gui/fitCommands/gui/localDrone/imprt.py @@ -0,0 +1,45 @@ +import wx + +import eos.db +import gui.mainFrame +from gui import globalEvents as GE +from gui.fitCommands.calc.drone.localAdd import CalcAddLocalDroneCommand +from gui.fitCommands.helpers import DroneInfo, InternalCommandHistory +from service.fit import Fit + + +class GuiImportLocalDronesCommand(wx.Command): + + def __init__(self, fitID, drones): + wx.Command.__init__(self, True, 'Import Local Drones') + self.internalHistory = InternalCommandHistory() + self.fitID = fitID + self.drones = drones + + def Do(self): + if not self.drones: + return False + commands = [] + for itemID, amount in self.drones: + commands.append(CalcAddLocalDroneCommand( + fitID=self.fitID, + droneInfo=DroneInfo(itemID=itemID, amount=amount, amountActive=0), + forceNewStack=True)) + success = self.internalHistory.submitBatch(*commands) + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success + + def Undo(self): + success = self.internalHistory.undoAll() + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success diff --git a/gui/fitCommands/gui/localFighter/imprt.py b/gui/fitCommands/gui/localFighter/imprt.py new file mode 100644 index 000000000..fa42ceaed --- /dev/null +++ b/gui/fitCommands/gui/localFighter/imprt.py @@ -0,0 +1,42 @@ +import wx + +import eos.db +import gui.mainFrame +from gui import globalEvents as GE +from gui.fitCommands.calc.fighter.localAdd import CalcAddLocalFighterCommand +from gui.fitCommands.helpers import FighterInfo, InternalCommandHistory +from service.fit import Fit + + +class GuiImportLocalFightersCommand(wx.Command): + + def __init__(self, fitID, fighters): + wx.Command.__init__(self, True, 'Import Local Fighters') + self.internalHistory = InternalCommandHistory() + self.fitID = fitID + self.fighters = fighters + + def Do(self): + if not self.fighters: + return False + commands = [] + for itemID, amount in self.fighters: + commands.append(CalcAddLocalFighterCommand(fitID=self.fitID, fighterInfo=FighterInfo(itemID=itemID, amount=amount, state=False))) + success = self.internalHistory.submitBatch(*commands) + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success + + def Undo(self): + success = self.internalHistory.undoAll() + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success