diff --git a/gui/characterSelection.py b/gui/characterSelection.py index d4528d64d..f6bbca494 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -49,6 +49,10 @@ class CharacterSelection(wx.Panel): # cache current selection to fall back in case we choose to open char editor self.charCache = None + + # history for Shift-Tab navigation + self.charHistory = [] + self._updatingFromHistory = False self.charChoice = wx.Choice(self) mainSizer.Add(self.charChoice, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3) @@ -189,6 +193,13 @@ class CharacterSelection(wx.Panel): sFit = Fit.getInstance() sFit.changeChar(fitID, charID) self.charCache = self.charChoice.GetCurrentSelection() + + if not self._updatingFromHistory and charID is not None: + currentChar = self.getActiveCharacter() + if currentChar is not None: + if not self.charHistory or self.charHistory[-1] != currentChar: + self.charHistory.append(currentChar) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,))) def toggleRefreshButton(self): @@ -210,6 +221,29 @@ class CharacterSelection(wx.Panel): return True return False + + def selectPreviousChar(self): + currentChar = self.getActiveCharacter() + if currentChar is None: + return + + if not self.charHistory: + return + + if self.charHistory and self.charHistory[-1] == currentChar: + self.charHistory.pop() + + if not self.charHistory: + return + + prevChar = self.charHistory.pop() + if currentChar != prevChar: + self.charHistory.append(currentChar) + + self._updatingFromHistory = True + if self.selectChar(prevChar): + self.charChanged(None) + self._updatingFromHistory = False def fitChanged(self, event): """ @@ -222,7 +256,7 @@ class CharacterSelection(wx.Panel): self.charChoice.Enable(activeFitID is not None) choice = self.charChoice sFit = Fit.getInstance() - currCharID = choice.GetClientData(choice.GetCurrentSelection()) + currCharID = choice.GetClientData(choice.GetCurrentSelection()) if choice.GetCurrentSelection() != -1 else None fit = sFit.getFit(activeFitID) newCharID = fit.character.ID if fit is not None else None @@ -256,6 +290,9 @@ class CharacterSelection(wx.Panel): self.selectChar(sChar.all5ID()) elif currCharID != newCharID: + if currCharID is not None and not self._updatingFromHistory: + if not self.charHistory or self.charHistory[-1] != currCharID: + self.charHistory.append(currCharID) self.selectChar(newCharID) if not fit.calculated: self.charChanged(None) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index fcf533915..b8c546ee3 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -578,6 +578,7 @@ class MainFrame(wx.Frame): toggleShipMarketId = wx.NewId() ctabnext = wx.NewId() ctabprev = wx.NewId() + charPrevId = wx.NewId() # Close Page self.Bind(wx.EVT_MENU, self.CloseCurrentPage, id=self.closePageId) @@ -587,6 +588,7 @@ class MainFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.toggleShipMarket, id=toggleShipMarketId) self.Bind(wx.EVT_MENU, self.CTabNext, id=ctabnext) self.Bind(wx.EVT_MENU, self.CTabPrev, id=ctabprev) + self.Bind(wx.EVT_MENU, self.selectPreviousCharacter, id=charPrevId) actb = [(wx.ACCEL_CTRL, ord('T'), self.addPageId), (wx.ACCEL_CMD, ord('T'), self.addPageId), @@ -620,7 +622,10 @@ class MainFrame(wx.Frame): (wx.ACCEL_CMD, wx.WXK_PAGEDOWN, ctabnext), (wx.ACCEL_CMD, wx.WXK_PAGEUP, ctabprev), - (wx.ACCEL_CMD | wx.ACCEL_SHIFT, ord("Z"), wx.ID_REDO) + (wx.ACCEL_CMD | wx.ACCEL_SHIFT, ord("Z"), wx.ID_REDO), + + # Shift+Tab for previous character + (wx.ACCEL_SHIFT, wx.WXK_TAB, charPrevId) ] # Ctrl/Cmd+# for addition pane selection @@ -746,6 +751,9 @@ class MainFrame(wx.Frame): def CTabPrev(self, event): self.fitMultiSwitch.PrevPage() + + def selectPreviousCharacter(self, event): + self.charSelection.selectPreviousChar() def HAddPage(self, event): self.fitMultiSwitch.AddPage()