From c94384acb8ebf897f3aab0f879276ad90ffb492d Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 1 Oct 2019 22:22:10 +0300 Subject: [PATCH] Show amount of items hidden in additions tabs --- gui/additionsPane.py | 24 +++++++++++++- gui/builtinAdditionPanes/boosterView.py | 18 +++++++++++ gui/builtinAdditionPanes/cargoView.py | 15 +++++++++ gui/builtinAdditionPanes/commandView.py | 23 +++++++++++++ gui/builtinAdditionPanes/droneView.py | 24 ++++++++++++++ gui/builtinAdditionPanes/fighterView.py | 18 +++++++++++ gui/builtinAdditionPanes/implantView.py | 17 ++++++++++ gui/builtinAdditionPanes/projectedView.py | 32 +++++++++++++++++++ .../pyfaGeneralPreferences.py | 8 +++++ gui/chrome_tabs.py | 16 ++++++++-- gui/mainFrame.py | 2 +- service/fit.py | 1 + 12 files changed, 194 insertions(+), 4 deletions(-) diff --git a/gui/additionsPane.py b/gui/additionsPane.py index f9b48d50f..b31dad66b 100644 --- a/gui/additionsPane.py +++ b/gui/additionsPane.py @@ -20,6 +20,7 @@ # noinspection PyPackageRequirements import wx +import gui.globalEvents as GE from gui.bitmap_loader import BitmapLoader from gui.builtinAdditionPanes.boosterView import BoosterView from gui.builtinAdditionPanes.cargoView import CargoView @@ -35,9 +36,10 @@ from gui.toggle_panel import TogglePanel class AdditionsPane(TogglePanel): - def __init__(self, parent): + def __init__(self, parent, mainFrame): TogglePanel.__init__(self, parent, force_layout=1) + self.mainFrame = mainFrame self.SetLabel("Additions") pane = self.GetContentPanel() @@ -83,6 +85,8 @@ class AdditionsPane(TogglePanel): self.notes = NotesView(self.notebook) self.notebook.AddPage(self.notes, "Notes", image=notesImg, closeable=False) + self.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged) + self.notebook.SetSelection(0) PANES = ["Drones", "Fighters", "Cargo", "Implants", "Boosters", "Projected", "Command", "Notes"] @@ -106,3 +110,21 @@ class AdditionsPane(TogglePanel): self.parent.SetSashInvisible(False) self.parent.SetMinimumPaneSize(200) self.parent.SetSashPosition(self.old_pos, True) + + def OnFitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and activeFitID not in event.fitIDs: + return + self.updateExtraText() + + def updateExtraText(self): + refresh = False + for i in range(self.notebook.GetPageCount()): + page = self.notebook.GetPage(i) + if hasattr(page, 'getTabExtraText'): + refresh = True + self.notebook.SetPageTitleExtra(i, page.getTabExtraText() or '', refresh=False) + if refresh: + self.notebook.tabs_container.AdjustTabsSize() + self.notebook.Refresh() diff --git a/gui/builtinAdditionPanes/boosterView.py b/gui/builtinAdditionPanes/boosterView.py index 1a0f1aafb..4987ab4f9 100644 --- a/gui/builtinAdditionPanes/boosterView.py +++ b/gui/builtinAdditionPanes/boosterView.py @@ -226,3 +226,21 @@ class BoosterView(d.Display): continue boosters.append(booster) return boosters + + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Amount of active boosters + if opt == 1: + return ' ({})'.format(len([b for b in fit.boosters if b.active])) + # Total amount of boosters + elif opt == 2: + return ' ({})'.format(len(fit.boosters)) + else: + return None diff --git a/gui/builtinAdditionPanes/cargoView.py b/gui/builtinAdditionPanes/cargoView.py index 131a48008..bf0447f31 100644 --- a/gui/builtinAdditionPanes/cargoView.py +++ b/gui/builtinAdditionPanes/cargoView.py @@ -214,3 +214,18 @@ class CargoView(d.Display): continue cargos.append(cargo) return cargos + + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Total amount of cargo items + if opt in (1, 2): + return ' ({})'.format(len(fit.cargo)) + else: + return None diff --git a/gui/builtinAdditionPanes/commandView.py b/gui/builtinAdditionPanes/commandView.py index c6ee6d498..0ce10ba21 100644 --- a/gui/builtinAdditionPanes/commandView.py +++ b/gui/builtinAdditionPanes/commandView.py @@ -247,3 +247,26 @@ class CommandView(d.Display): self.mainFrame.command.Submit(cmd.GuiAddCommandFitsCommand( fitID=self.mainFrame.getActiveFit(), commandFitIDs=fitIDs)) + + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Amount of active command fits + if opt == 1: + amount = 0 + for commandFit in fit.commandFits: + info = commandFit.getCommandInfo(fitID) + if info is not None and info.active: + amount += 1 + return ' ({})'.format(amount) + # Total amount of command fits + elif opt == 2: + return ' ({})'.format(len(fit.commandFits)) + else: + return None diff --git a/gui/builtinAdditionPanes/droneView.py b/gui/builtinAdditionPanes/droneView.py index 6277011c4..d3514097b 100644 --- a/gui/builtinAdditionPanes/droneView.py +++ b/gui/builtinAdditionPanes/droneView.py @@ -337,3 +337,27 @@ class DroneView(Display): continue drones.append(drone) return drones + + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Amount of active drones + if opt == 1: + amount = 0 + for droneStack in fit.drones: + amount += droneStack.amountActive + return ' ({})'.format(int(amount)) + # Total amount of drones + elif opt == 2: + amount = 0 + for droneStack in fit.drones: + amount += droneStack.amount + return ' ({})'.format(int(amount)) + else: + return None diff --git a/gui/builtinAdditionPanes/fighterView.py b/gui/builtinAdditionPanes/fighterView.py index 61a3a2da0..35b2dff4a 100644 --- a/gui/builtinAdditionPanes/fighterView.py +++ b/gui/builtinAdditionPanes/fighterView.py @@ -117,6 +117,24 @@ class FighterView(wx.Panel): self.Refresh() + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Amount of active fighter squads + if opt == 1: + return ' ({})'.format(len([f for f in fit.fighters if f.active])) + # Total amount of fighter squads + elif opt == 2: + return ' ({})'.format(len(fit.fighters)) + else: + return None + class FighterDisplay(d.Display): diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py index 40ce9a0d8..ee4c4ef61 100644 --- a/gui/builtinAdditionPanes/implantView.py +++ b/gui/builtinAdditionPanes/implantView.py @@ -101,6 +101,23 @@ class ImplantView(wx.Panel): self.mainFrame.command.Submit(cmd.GuiChangeImplantLocationCommand( fitID=fitID, source=ImplantLocation.FIT if self.rbFit.GetValue() else ImplantLocation.CHARACTER)) + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Amount of active implants + if opt == 1: + return ' ({})'.format(len([i for i in fit.appliedImplants if i.active])) + # Total amount of implants + elif opt == 2: + return ' ({})'.format(len(fit.appliedImplants)) + else: + return None class ImplantDisplay(d.Display): diff --git a/gui/builtinAdditionPanes/projectedView.py b/gui/builtinAdditionPanes/projectedView.py index 6cea3ea3d..5aa3c8fc5 100644 --- a/gui/builtinAdditionPanes/projectedView.py +++ b/gui/builtinAdditionPanes/projectedView.py @@ -27,6 +27,7 @@ import gui.builtinAdditionPanes.droneView import gui.display as d import gui.fitCommands as cmd import gui.globalEvents as GE +from eos.const import FittingModuleState from eos.saveddata.drone import Drone as EosDrone from eos.saveddata.fighter import Fighter as EosFighter from eos.saveddata.fit import Fit as EosFit @@ -397,3 +398,34 @@ class ProjectedView(d.Display): fitID=self.mainFrame.getActiveFit(), projectedFitIDs=fitIDs, amount=1)) + + def getTabExtraText(self): + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return None + sFit = Fit.getInstance() + fit = sFit.getFit(fitID) + if fit is None: + return None + opt = sFit.serviceFittingOptions["additionsLabels"] + # Amount of active projected items + if opt == 1: + amount = 0 + for projectedFit in fit.projectedFits: + info = projectedFit.getProjectionInfo(fitID) + if info is not None and info.active: + amount += 1 + amount += len([m for m in fit.projectedModules if m.state > FittingModuleState.OFFLINE]) + amount += len([d for d in fit.projectedDrones if d.amountActive > 0]) + amount += len([f for f in fit.projectedFighters if f.active]) + return ' ({})'.format(amount) + # Total amount of projected items + elif opt == 2: + amount = 0 + amount += len(fit.projectedFits) + amount += len(fit.projectedModules) + amount += len(fit.projectedDrones) + amount += len(fit.projectedFighters) + return ' ({})'.format(amount) + else: + return None diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index 8d399b29e..27e0ad653 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -86,6 +86,10 @@ class PFGeneralPref(PreferenceView): 'When disabled, reloads charges just in selected modules. Action can be reversed by holding Ctrl or Alt key while changing charge.')) mainSizer.Add(self.cbReloadAll, 0, wx.ALL | wx.EXPAND, 5) + self.rbAddLabels = wx.RadioBox(panel, -1, "Extra info in Additions panel tab names", wx.DefaultPosition, wx.DefaultSize, ["None", "Quantity of active items", "Quantity of all items"], 1, wx.RA_SPECIFY_COLS) + mainSizer.Add(self.rbAddLabels, 0, wx.EXPAND | wx.TOP | wx.RIGHT | wx.BOTTOM, 10) + self.rbAddLabels.Bind(wx.EVT_RADIOBOX, self.OnAddLabelsChange) + self.sFit = Fit.getInstance() self.cbGlobalChar.SetValue(self.sFit.serviceFittingOptions["useGlobalCharacter"]) @@ -101,6 +105,7 @@ class PFGeneralPref(PreferenceView): self.cbOpenFitInNew.SetValue(self.sFit.serviceFittingOptions["openFitInNew"]) self.cbShowShipBrowserTooltip.SetValue(self.sFit.serviceFittingOptions["showShipBrowserTooltip"]) self.cbReloadAll.SetValue(self.sFit.serviceFittingOptions["ammoChangeAll"]) + self.rbAddLabels.SetSelection(self.sFit.serviceFittingOptions["additionsLabels"]) self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange) self.cbDefaultCharImplants.Bind(wx.EVT_CHECKBOX, self.OnCBDefaultCharImplantsStateChange) @@ -187,6 +192,9 @@ class PFGeneralPref(PreferenceView): def onCBReloadAll(self, event): self.sFit.serviceFittingOptions["ammoChangeAll"] = self.cbReloadAll.GetValue() + def OnAddLabelsChange(self, event): + self.sFit.serviceFittingOptions["additionsLabels"] = event.GetInt() + def getImage(self): return BitmapLoader.getBitmap("prefs_settings", "gui") diff --git a/gui/chrome_tabs.py b/gui/chrome_tabs.py index e0aa659b6..48c727bf2 100644 --- a/gui/chrome_tabs.py +++ b/gui/chrome_tabs.py @@ -296,7 +296,14 @@ class ChromeNotebook(wx.Panel): def SetPageTitle(self, i, text, refresh=True): tab = self.tabs_container.tabs[i] - tab.text = text + tab.baseText = text + if refresh: + self.tabs_container.AdjustTabsSize() + self.Refresh() + + def SetPageTitleExtra(self, i, text, refresh=True): + tab = self.tabs_container.tabs[i] + tab.extraText = text if refresh: self.tabs_container.AdjustTabsSize() self.Refresh() @@ -354,7 +361,8 @@ class _TabRenderer: height = max(height, self.min_height) self.disabled = False - self.text = text + self.baseText = text + self.extraText = '' self.tab_size = (width, height) self.closeable = closeable self.selected = False @@ -368,6 +376,10 @@ class _TabRenderer: self.position = (0, 0) # Not used internally for rendering - helper for tab container self.InitTab() + @property + def text(self): + return self.baseText + self.extraText + def SetPosition(self, position): self.position = position diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 9edea4e9a..896d24091 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -162,7 +162,7 @@ class MainFrame(wx.Frame): mainSizer.Add(self.browser_fitting_split, 1, wx.EXPAND | wx.LEFT, 2) self.fitMultiSwitch = MultiSwitch(self.fitting_additions_split) - self.additionsPane = AdditionsPane(self.fitting_additions_split) + self.additionsPane = AdditionsPane(self.fitting_additions_split, self) self.notebookBrowsers = ChromeNotebook(self.browser_fitting_split, False) diff --git a/service/fit.py b/service/fit.py index d8f3d72bf..9cb7a1ab6 100644 --- a/service/fit.py +++ b/service/fit.py @@ -92,6 +92,7 @@ class Fit: "showShipBrowserTooltip": True, "marketSearchDelay": 250, "ammoChangeAll": False, + "additionsLabels": 1, } self.serviceFittingOptions = SettingsProvider.getInstance().getSettings(