From 5777103d21d3b28a851f3384a850ed89d8425a13 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Thu, 25 Apr 2019 16:29:04 +0300 Subject: [PATCH] Allow batch implant state switching --- gui/builtinAdditionPanes/implantView.py | 92 +++++++++++++-------- gui/builtinViews/implantEditor.py | 1 + gui/fitCommands/__init__.py | 2 +- gui/fitCommands/gui/implant/toggleStates.py | 4 +- 4 files changed, 61 insertions(+), 38 deletions(-) diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py index 44cc5452b..567932ffe 100644 --- a/gui/builtinAdditionPanes/implantView.py +++ b/gui/builtinAdditionPanes/implantView.py @@ -49,6 +49,7 @@ class ImplantViewDrop(wx.DropTarget): class ImplantView(wx.Panel): + def __init__(self, parent): wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, style=wx.TAB_TRAVERSAL) self.mainFrame = gui.mainFrame.MainFrame.getInstance() @@ -99,6 +100,7 @@ class ImplantView(wx.Panel): class ImplantDisplay(d.Display): + DEFAULT_COLS = [ "State", "attr:implantness", @@ -108,13 +110,13 @@ class ImplantDisplay(d.Display): ] def __init__(self, parent): - d.Display.__init__(self, parent, style=wx.LC_SINGLE_SEL | wx.BORDER_NONE) + d.Display.__init__(self, parent, style=wx.BORDER_NONE) self.lastFitId = None self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.mainFrame.Bind(ITEM_SELECTED, self.addItem) - self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) + self.Bind(wx.EVT_LEFT_DCLICK, self.onLeftDoubleClick) self.Bind(wx.EVT_LEFT_DOWN, self.click) self.Bind(wx.EVT_KEY_UP, self.kbEvent) self.SetDropTarget(ImplantViewDrop(self.handleListDrag)) @@ -137,16 +139,16 @@ class ImplantDisplay(d.Display): self.mainFrame.additionsPane.select("Implants") def kbEvent(self, event): - event.Skip() keycode = event.GetKeyCode() - if keycode in (wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE): - row = self.GetFirstSelected() - if row != -1: - try: - implant = self.implants[self.GetItemData(row)] - except IndexError: - return - self.removeImplant(implant) + mstate = wx.GetMouseState() + if keycode == wx.WXK_ESCAPE and not mstate.cmdDown and not mstate.altDown and not mstate.shiftDown: + self.unselectAll() + if keycode == 65 and mstate.cmdDown and not mstate.altDown and not mstate.shiftDown: + self.selectAll() + if keycode == wx.WXK_DELETE or keycode == wx.WXK_NUMPAD_DELETE: + implants = self.getSelectedImplants() + self.removeImplants(implants) + event.Skip() def fitChanged(self, event): sFit = Fit.getInstance() @@ -199,11 +201,7 @@ class ImplantDisplay(d.Display): event.Skip() - def removeItem(self, event): - # Character implants can't be changed here... - if self.Parent.source == ImplantLocation.CHARACTER: - return - + def onLeftDoubleClick(self, event): row, _ = self.HitTest(event.Position) if row != -1: col = self.getColumn(event.Position) @@ -212,36 +210,50 @@ class ImplantDisplay(d.Display): implant = self.implants[self.GetItemData(row)] except IndexError: return - self.removeImplant(implant) + self.removeImplants([implant]) - def removeImplant(self, implant): + def removeImplants(self, implants): fitID = self.mainFrame.getActiveFit() - sFit = Fit.getInstance() - fit = sFit.getFit(fitID) - if fit.implantLocation == ImplantLocation.FIT and implant in self.original: - position = self.original.index(implant) - self.mainFrame.command.Submit(cmd.GuiRemoveImplantsCommand(fitID=fitID, positions=[position])) + fit = Fit.getInstance().getFit(fitID) + if fit.implantLocation != ImplantLocation.FIT: + return + positions = [] + for implant in implants: + if implant in self.original: + positions.append(self.original.index(implant)) + self.mainFrame.command.Submit(cmd.GuiRemoveImplantsCommand(fitID=fitID, positions=positions)) def click(self, event): - event.Skip() - - # Character implants can't be changed here... - if self.Parent.source == ImplantLocation.CHARACTER: + fitID = self.mainFrame.getActiveFit() + fit = Fit.getInstance().getFit(fitID) + if fit.implantLocation != ImplantLocation.FIT: + event.Skip() return - - row, _ = self.HitTest(event.Position) - if row != -1: + mainRow, _ = self.HitTest(event.Position) + if mainRow != -1: col = self.getColumn(event.Position) if col == self.getColIndex(State): fitID = self.mainFrame.getActiveFit() try: - implant = self.implants[self.GetItemData(row)] + mainImplant = self.implants[mainRow] except IndexError: return - if implant in self.original: - position = self.original.index(implant) - self.mainFrame.command.Submit(cmd.GuiToggleImplantStateCommand( - fitID=fitID, mainPosition=position, positions=[position])) + if mainImplant in self.original: + mainPosition = self.original.index(mainImplant) + positions = [] + for row in self.getSelectedRows(): + try: + implant = self.implants[row] + except IndexError: + continue + if implant in self.original: + positions.append(self.original.index(implant)) + self.mainFrame.command.Submit(cmd.GuiToggleImplantStatesCommand( + fitID=fitID, + mainPosition=mainPosition, + positions=positions)) + return + event.Skip() def spawnMenu(self, event): sel = self.GetFirstSelected() @@ -271,3 +283,13 @@ class ImplantDisplay(d.Display): menu = ContextMenu.getMenu(None, [], context) if menu is not None: self.PopupMenu(menu) + + def getSelectedImplants(self): + implants = [] + for row in self.getSelectedRows(): + try: + implant = self.implants[self.GetItemData(row)] + except IndexError: + continue + implants.append(implant) + return implants diff --git a/gui/builtinViews/implantEditor.py b/gui/builtinViews/implantEditor.py index 603d00c4b..be93599f2 100644 --- a/gui/builtinViews/implantEditor.py +++ b/gui/builtinViews/implantEditor.py @@ -11,6 +11,7 @@ from service.market import Market class BaseImplantEditorView(wx.Panel): + def addMarketViewImage(self, iconFile): if iconFile is None: return -1 diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py index 794403054..c55f3ba9c 100644 --- a/gui/fitCommands/__init__.py +++ b/gui/fitCommands/__init__.py @@ -16,7 +16,7 @@ from .gui.implant.changeLocation import GuiChangeImplantLocationCommand from .gui.implant.changeMeta import GuiChangeImplantMetaCommand from .gui.implant.remove import GuiRemoveImplantsCommand from .gui.implant.setAdd import GuiAddImplantSetCommand -from .gui.implant.toggleStates import GuiToggleImplantStateCommand +from .gui.implant.toggleStates import GuiToggleImplantStatesCommand from .gui.itemsRebase import GuiRebaseItemsCommand from .gui.localDrone.add import GuiAddLocalDroneCommand from .gui.localDrone.changeAmount import GuiChangeLocalDroneAmountCommand diff --git a/gui/fitCommands/gui/implant/toggleStates.py b/gui/fitCommands/gui/implant/toggleStates.py index e824d90b1..03939276f 100644 --- a/gui/fitCommands/gui/implant/toggleStates.py +++ b/gui/fitCommands/gui/implant/toggleStates.py @@ -7,10 +7,10 @@ from gui.fitCommands.helpers import InternalCommandHistory from service.fit import Fit -class GuiToggleImplantStateCommand(wx.Command): +class GuiToggleImplantStatesCommand(wx.Command): def __init__(self, fitID, mainPosition, positions): - wx.Command.__init__(self, True, 'Toggle Implant State') + wx.Command.__init__(self, True, 'Toggle Implant States') self.internalHistory = InternalCommandHistory() self.fitID = fitID self.mainPosition = mainPosition