From 56e09b85282e6278599261e9a3a94a21d0ef3ca4 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 21 Aug 2019 15:46:20 +0300 Subject: [PATCH] Add context menu which pastes clipboard into additions pane (not functional yet) --- gui/builtinContextMenus/__init__.py | 1 + gui/builtinContextMenus/additionsImport.py | 45 ++++++++++++++++++++++ service/port/eft.py | 18 +++++++++ 3 files changed, 64 insertions(+) create mode 100644 gui/builtinContextMenus/additionsImport.py diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index 49bf6a88d..8b2a93e3b 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -50,3 +50,4 @@ from gui.builtinContextMenus import graphDmgDroneMode # Additions panel menus from gui.builtinContextMenus import additionsExportSelection from gui.builtinContextMenus import additionsExportAll +from gui.builtinContextMenus import additionsImport diff --git a/gui/builtinContextMenus/additionsImport.py b/gui/builtinContextMenus/additionsImport.py new file mode 100644 index 000000000..e904728f7 --- /dev/null +++ b/gui/builtinContextMenus/additionsImport.py @@ -0,0 +1,45 @@ +import gui.mainFrame +from gui.contextMenu import ContextMenuUnconditional +from gui.utils.clipboard import fromClipboard +from service.fit import Fit +from service.port.eft import parseAdditions +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)} + + +class AdditionsImport(ContextMenuUnconditional): + + def __init__(self): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def display(self, callingWindow, srcContext): + if not ContextMenuSettings.getInstance().get('additionsCopyPaste'): + return False + if srcContext not in viewSpecMap: + return False + fit = Fit.getInstance().getFit(self.mainFrame.getActiveFit()) + if fit is None: + return False + if not fromClipboard(): + return False + + self.srcContext = srcContext + return True + + def getText(self, callingWindow, itmContext): + return 'Paste {}'.format(viewSpecMap[self.srcContext][0]) + + def activate(self, callingWindow, fullContext, i): + text = fromClipboard() + items = parseAdditions(text) + + +AdditionsImport.register() diff --git a/service/port/eft.py b/service/port/eft.py index df06da5dd..492abba9c 100644 --- a/service/port/eft.py +++ b/service/port/eft.py @@ -862,3 +862,21 @@ class AbstractFit: if itemSpec.item not in self.cargo: self.cargo[itemSpec.item] = Cargo(itemSpec.item) self.cargo[itemSpec.item].amount += itemSpec.amount + + +def parseAdditions(text): + items = [] + sMkt = Market.getInstance() + pattern = '^(?P[^,/\[\]]+?)( x(?P\d+?))?$' + for line in text.splitlines(): + line = line.strip() + m = re.match(pattern, line) + if not m: + continue + item = sMkt.getItem(m.group('typeName')) + if item is None: + continue + amount = m.group('amount') + amount = 1 if amount is None else int(amount) + items.append((item, amount)) + return items