Support actual item pasting functionality

This commit is contained in:
DarkPhoenix
2019-08-21 16:47:48 +03:00
parent 56e09b8528
commit 9605efe643
7 changed files with 238 additions and 6 deletions

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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