From 6fceda5f27741aa3fb0145b6e9561406619df420 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Thu, 22 Aug 2019 08:47:45 +0300 Subject: [PATCH] Ensure right-clicked item is selected on Mac in Display list panels --- graphs/gui/lists.py | 8 ++++++-- gui/builtinAdditionPanes/boosterView.py | 4 +++- gui/builtinAdditionPanes/cargoView.py | 4 +++- gui/builtinAdditionPanes/commandView.py | 4 +++- gui/builtinAdditionPanes/droneView.py | 2 ++ gui/builtinAdditionPanes/fighterView.py | 4 +++- gui/builtinAdditionPanes/implantView.py | 4 +++- gui/builtinAdditionPanes/projectedView.py | 4 +++- gui/builtinMarketBrowser/itemView.py | 10 ++++++---- gui/builtinShipBrowser/shipItem.py | 1 + gui/builtinViews/fittingView.py | 8 +++----- gui/display.py | 16 ++++++++++++++++ 12 files changed, 52 insertions(+), 17 deletions(-) diff --git a/graphs/gui/lists.py b/graphs/gui/lists.py index f46fe7671..a4ba0b947 100644 --- a/graphs/gui/lists.py +++ b/graphs/gui/lists.py @@ -296,8 +296,10 @@ class SourceWrapperList(BaseWrapperList): self._wrappers.append(SourceWrapper(item=item, colorID=colorID)) def spawnMenu(self, event): - selection = self.getSelectedWrappers() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedWrappers() mainItem = self.getWrapper(clickedPos) itemContext = None if mainItem is None else 'Fit' @@ -347,8 +349,10 @@ class TargetWrapperList(BaseWrapperList): self._wrappers.append(TargetWrapper(item=item, lightnessID=lightnessID, lineStyleID=lineStyleID)) def spawnMenu(self, event): - selection = self.getSelectedWrappers() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedWrappers() mainItem = self.getWrapper(clickedPos) itemContext = None if mainItem is None else 'Target' diff --git a/gui/builtinAdditionPanes/boosterView.py b/gui/builtinAdditionPanes/boosterView.py index 0a3fea2ec..1a0f1aafb 100644 --- a/gui/builtinAdditionPanes/boosterView.py +++ b/gui/builtinAdditionPanes/boosterView.py @@ -199,8 +199,10 @@ class BoosterView(d.Display): event.Skip() def spawnMenu(self, event): - selection = self.getSelectedBoosters() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedBoosters() mainBooster = None if clickedPos != -1: try: diff --git a/gui/builtinAdditionPanes/cargoView.py b/gui/builtinAdditionPanes/cargoView.py index a416d865a..131a48008 100644 --- a/gui/builtinAdditionPanes/cargoView.py +++ b/gui/builtinAdditionPanes/cargoView.py @@ -187,8 +187,10 @@ class CargoView(d.Display): self.mainFrame.command.Submit(cmd.GuiRemoveCargosCommand(fitID=fitID, itemIDs=itemIDs)) def spawnMenu(self, event): - selection = self.getSelectedCargos() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedCargos() mainCargo = None if clickedPos != -1: try: diff --git a/gui/builtinAdditionPanes/commandView.py b/gui/builtinAdditionPanes/commandView.py index 451b450bf..c6ee6d498 100644 --- a/gui/builtinAdditionPanes/commandView.py +++ b/gui/builtinAdditionPanes/commandView.py @@ -185,8 +185,10 @@ class CommandView(d.Display): event.Skip() def spawnMenu(self, event): - selection = self.getSelectedCommandFits() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedCommandFits() mainCommandFit = None if clickedPos != -1: try: diff --git a/gui/builtinAdditionPanes/droneView.py b/gui/builtinAdditionPanes/droneView.py index 64ec15557..6277011c4 100644 --- a/gui/builtinAdditionPanes/droneView.py +++ b/gui/builtinAdditionPanes/droneView.py @@ -311,6 +311,8 @@ class DroneView(Display): def spawnMenu(self, event): clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + mainDrone = None if clickedPos != -1: try: diff --git a/gui/builtinAdditionPanes/fighterView.py b/gui/builtinAdditionPanes/fighterView.py index 7347e6616..61a3a2da0 100644 --- a/gui/builtinAdditionPanes/fighterView.py +++ b/gui/builtinAdditionPanes/fighterView.py @@ -348,8 +348,10 @@ class FighterDisplay(d.Display): event.Skip() def spawnMenu(self, event): - selection = self.getSelectedFighters() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedFighters() mainFighter = None if clickedPos != -1: try: diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py index 4583faa8c..40ce9a0d8 100644 --- a/gui/builtinAdditionPanes/implantView.py +++ b/gui/builtinAdditionPanes/implantView.py @@ -262,8 +262,10 @@ class ImplantDisplay(d.Display): event.Skip() def spawnMenu(self, event): - selection = self.getSelectedImplants() clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + + selection = self.getSelectedImplants() mainImplant = None if clickedPos != -1: try: diff --git a/gui/builtinAdditionPanes/projectedView.py b/gui/builtinAdditionPanes/projectedView.py index 0cb59d535..0a78b182f 100644 --- a/gui/builtinAdditionPanes/projectedView.py +++ b/gui/builtinAdditionPanes/projectedView.py @@ -283,6 +283,9 @@ class ProjectedView(d.Display): event.Skip() def spawnMenu(self, event): + clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + fitID = self.mainFrame.getActiveFit() if fitID is None: return @@ -290,7 +293,6 @@ class ProjectedView(d.Display): if self.getColumn(self.screenToClientFixed(event.Position)) == self.getColIndex(State): return - clickedPos = self.getRowByAbs(event.Position) mainItem = self.get(clickedPos) contexts = [] diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index c8ec7577c..5e020704d 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -15,6 +15,7 @@ pyfalog = Logger(__name__) class ItemView(Display): + DEFAULT_COLS = ["Base Icon", "Base Name", "attr:power,,,True", @@ -219,13 +220,14 @@ class ItemView(Display): return catname, mktgrpid, parentname, metatab, metalvl, item.name def contextMenu(self, event): + clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + # Check if something is selected, if so, spawn the menu for it - sel = self.GetFirstSelected() - if sel == -1: + if clickedPos == -1: return - item = self.active[sel] - + item = self.active[clickedPos] sMkt = self.sMkt sourceContext = "marketItemMisc" if self.marketBrowser.mode in ("search", "recent") else "marketItemGroup" itemContext = sMkt.getCategoryByItem(item).name diff --git a/gui/builtinShipBrowser/shipItem.py b/gui/builtinShipBrowser/shipItem.py index e9806fef0..21ed999d7 100644 --- a/gui/builtinShipBrowser/shipItem.py +++ b/gui/builtinShipBrowser/shipItem.py @@ -18,6 +18,7 @@ pyfalog = Logger(__name__) class ShipItem(SFItem.SFBrowserItem): + def __init__(self, parent, shipID=None, shipFittingInfo=("Test", "TestTrait", 2), itemData=None, graphicID=None, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(0, 40), style=0): diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 38350851e..349afbafb 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -624,6 +624,9 @@ class FittingView(d.Display): pyfalog.error("Caught dead object") def spawnMenu(self, event): + clickedPos = self.getRowByAbs(event.Position) + self.ensureSelection(clickedPos) + if self.activeFitID is None or self.getColumn(self.screenToClientFixed(event.Position)) == self.getColIndex(State): return @@ -636,7 +639,6 @@ class FittingView(d.Display): selection.append(mod) fit = Fit.getInstance().getFit(self.activeFitID) - clickedPos = self.getRowByAbs(event.Position) mainMod = None if clickedPos != -1: try: @@ -647,10 +649,6 @@ class FittingView(d.Display): if mod is not None and (mod in fit.modules or mod is fit.mode): mainMod = mod - if mainMod is not None and mainMod not in selection: - self.unselectAll() - self.Select(clickedPos) - sMkt = Market.getInstance() contexts = [] if isinstance(mainMod, Module) and not mainMod.isEmpty: diff --git a/gui/display.py b/gui/display.py index 92cf39454..38f920e60 100644 --- a/gui/display.py +++ b/gui/display.py @@ -298,3 +298,19 @@ class Display(wx.ListCtrl): def getWidthProportion(self): propWidth = sum(c.proportionWidth for c in self.activeColumns) return propWidth + + def ensureSelection(self, clickedPos): + """ + On mac, when right-click on any item happens, it doesn't get selected. + This method ensures that selection actually happens. + """ + if 'wxMac' in wx.PlatformInfo: + if clickedPos != -1: + selectedPoss = self.getSelectedRows() + if clickedPos not in selectedPoss: + self.unselectAll() + self.Select(clickedPos) + # Change focus only when we manipulate selection + focusedPos = self.GetFocusedItem() + if clickedPos != focusedPos: + self.Focus(clickedPos)