From 735827a25bb3857ccc56a52e3df7b72600b284dc Mon Sep 17 00:00:00 2001 From: Karl Werner Date: Sat, 6 Jul 2024 12:12:48 +0200 Subject: [PATCH 1/4] proof of concept --- gui/builtinMarketBrowser/events.py | 2 ++ gui/builtinMarketBrowser/itemView.py | 23 ++++++++++++++++------- gui/builtinMarketBrowser/marketTree.py | 3 ++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gui/builtinMarketBrowser/events.py b/gui/builtinMarketBrowser/events.py index 30dfd1e4d..f99c888c7 100644 --- a/gui/builtinMarketBrowser/events.py +++ b/gui/builtinMarketBrowser/events.py @@ -5,3 +5,5 @@ import wx.lib.newevent ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() RECENTLY_USED_MODULES = -2 + +CHARGES_FOR_FIT = -3 diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index a86bfdfbc..101417ca2 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -4,13 +4,14 @@ from logbook import Logger import gui.builtinMarketBrowser.pfSearchBox as SBox from config import slotColourMap, slotColourMapDark from eos.saveddata.module import Module -from gui.builtinMarketBrowser.events import ItemSelected, RECENTLY_USED_MODULES +from gui.builtinMarketBrowser.events import ItemSelected, RECENTLY_USED_MODULES, CHARGES_FOR_FIT from gui.contextMenu import ContextMenu from gui.display import Display from gui.utils.staticHelpers import DragDropHelper from gui.utils.dark import isDark from service.fit import Fit from service.market import Market +from service.ammo import Ammo pyfalog = Logger(__name__) @@ -91,7 +92,19 @@ class ItemView(Display): if sel.IsOk(): # Get data field of the selected item (which is a marketGroup ID if anything was selected) seldata = self.marketView.GetItemData(sel) - if seldata is not None and seldata != RECENTLY_USED_MODULES: + if seldata == RECENTLY_USED_MODULES: + items = self.sMkt.getRecentlyUsed() + elif seldata == CHARGES_FOR_FIT: + fitId = self.mainFrame.getActiveFit() + items = set() + if fitId is not None: + fit = self.sFit.getFit(fitId) + items = set() + for mod in fit.modules: + charges = Ammo.getInstance().getModuleFlatAmmo(mod) + for charge in charges: + items.add(charge) + elif seldata is not None: # If market group treeview item doesn't have children (other market groups or dummies), # then it should have items in it and we want to request them if self.marketView.ItemHasChildren(sel) is False: @@ -103,11 +116,7 @@ class ItemView(Display): else: items = set() else: - # If method was called but selection wasn't actually made or we have a hit on recently used modules - if seldata == RECENTLY_USED_MODULES: - items = self.sMkt.getRecentlyUsed() - else: - items = set() + items = set() # Fill store self.updateItemStore(items) diff --git a/gui/builtinMarketBrowser/marketTree.py b/gui/builtinMarketBrowser/marketTree.py index c20e8c962..3719b618b 100644 --- a/gui/builtinMarketBrowser/marketTree.py +++ b/gui/builtinMarketBrowser/marketTree.py @@ -1,7 +1,7 @@ import wx from gui.cachingImageList import CachingImageList -from gui.builtinMarketBrowser.events import RECENTLY_USED_MODULES +from gui.builtinMarketBrowser.events import RECENTLY_USED_MODULES, CHARGES_FOR_FIT from logbook import Logger @@ -35,6 +35,7 @@ class MarketTree(wx.TreeCtrl): # Add recently used modules node rumIconId = self.addImage("market_small", "gui") self.AppendItem(self.root, _t("Recently Used Items"), rumIconId, data=RECENTLY_USED_MODULES) + self.AppendItem(self.root, "Charges For Active Fit", rumIconId, data=CHARGES_FOR_FIT) # Bind our lookup method to when the tree gets expanded self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) From f38c61da515d6c49c84ef33ec9f8286e4c9c2e88 Mon Sep 17 00:00:00 2001 From: Karl Werner Date: Sat, 6 Jul 2024 15:52:18 +0200 Subject: [PATCH 2/4] update on fit change, new icon --- gui/builtinMarketBrowser/itemView.py | 39 ++++++++++++++++++++------ gui/builtinMarketBrowser/marketTree.py | 3 +- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 101417ca2..a0f7aa06d 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -2,6 +2,7 @@ import wx from logbook import Logger import gui.builtinMarketBrowser.pfSearchBox as SBox +import gui.globalEvents as GE from config import slotColourMap, slotColourMapDark from eos.saveddata.module import Module from gui.builtinMarketBrowser.events import ItemSelected, RECENTLY_USED_MODULES, CHARGES_FOR_FIT @@ -52,6 +53,8 @@ class ItemView(Display): self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemActivated) self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) + self.mainFrame.Bind(GE.FIT_CHANGED, self.selectedFittingChanged) + self.active = [] def delaySearch(self, evt): @@ -95,15 +98,7 @@ class ItemView(Display): if seldata == RECENTLY_USED_MODULES: items = self.sMkt.getRecentlyUsed() elif seldata == CHARGES_FOR_FIT: - fitId = self.mainFrame.getActiveFit() - items = set() - if fitId is not None: - fit = self.sFit.getFit(fitId) - items = set() - for mod in fit.modules: - charges = Ammo.getInstance().getModuleFlatAmmo(mod) - for charge in charges: - items.add(charge) + items = self.getChargesForActiveFit() elif seldata is not None: # If market group treeview item doesn't have children (other market groups or dummies), # then it should have items in it and we want to request them @@ -132,6 +127,32 @@ class ItemView(Display): btn.setUserSelection(True) self.filterItemStore() + def getChargesForActiveFit(self): + fitId = self.mainFrame.getActiveFit() + + # no active fit => no charges + if fitId is None: + return set() + + sAmmo = Ammo.getInstance() + fit = self.sFit.getFit(fitId) + items = set() + for mod in fit.modules: + charges = sAmmo.getModuleFlatAmmo(mod) + for charge in charges: + items.add(charge) + return items + + def selectedFittingChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and activeFitID not in event.fitIDs: + return + + items = self.getChargesForActiveFit() + self.updateItemStore(items) + self.filterItemStore() + def updateItemStore(self, items): self.unfilteredStore = items diff --git a/gui/builtinMarketBrowser/marketTree.py b/gui/builtinMarketBrowser/marketTree.py index 3719b618b..b130ac1f9 100644 --- a/gui/builtinMarketBrowser/marketTree.py +++ b/gui/builtinMarketBrowser/marketTree.py @@ -35,7 +35,8 @@ class MarketTree(wx.TreeCtrl): # Add recently used modules node rumIconId = self.addImage("market_small", "gui") self.AppendItem(self.root, _t("Recently Used Items"), rumIconId, data=RECENTLY_USED_MODULES) - self.AppendItem(self.root, "Charges For Active Fit", rumIconId, data=CHARGES_FOR_FIT) + cffIconId = self.addImage("damagePattern_small", "gui") + self.AppendItem(self.root, _t("Charges For Active Fit"), cffIconId, data=CHARGES_FOR_FIT) # Bind our lookup method to when the tree gets expanded self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) From 6a7cdda91a3626aac8e3dd79aaa63c65c14509b8 Mon Sep 17 00:00:00 2001 From: Karl Werner Date: Sat, 6 Jul 2024 16:01:58 +0200 Subject: [PATCH 3/4] add comments --- gui/builtinMarketBrowser/itemView.py | 12 ++++++++++-- gui/builtinMarketBrowser/marketTree.py | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index a0f7aa06d..b6a4b4085 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -34,6 +34,7 @@ class ItemView(Display): self.filteredStore = set() self.sMkt = marketBrowser.sMkt self.sFit = Fit.getInstance() + self.sAmmo = Ammo.getInstance() self.marketBrowser = marketBrowser self.marketView = marketBrowser.marketView @@ -53,6 +54,7 @@ class ItemView(Display): self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemActivated) self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) + # the "charges for active fitting" needs to listen to fitting changes self.mainFrame.Bind(GE.FIT_CHANGED, self.selectedFittingChanged) self.active = [] @@ -134,22 +136,28 @@ class ItemView(Display): if fitId is None: return set() - sAmmo = Ammo.getInstance() fit = self.sFit.getFit(fitId) + + # use a set so we only add one entry for each charge items = set() for mod in fit.modules: - charges = sAmmo.getModuleFlatAmmo(mod) + charges = self.sAmmo.getModuleFlatAmmo(mod) for charge in charges: items.add(charge) return items def selectedFittingChanged(self, event): + # skip the event so the other handlers also get called event.Skip() activeFitID = self.mainFrame.getActiveFit() + + # if it was not the active fitting that was changed, do not do anything if activeFitID is not None and activeFitID not in event.fitIDs: return items = self.getChargesForActiveFit() + + # update the UI self.updateItemStore(items) self.filterItemStore() diff --git a/gui/builtinMarketBrowser/marketTree.py b/gui/builtinMarketBrowser/marketTree.py index b130ac1f9..9c6fb7375 100644 --- a/gui/builtinMarketBrowser/marketTree.py +++ b/gui/builtinMarketBrowser/marketTree.py @@ -35,6 +35,7 @@ class MarketTree(wx.TreeCtrl): # Add recently used modules node rumIconId = self.addImage("market_small", "gui") self.AppendItem(self.root, _t("Recently Used Items"), rumIconId, data=RECENTLY_USED_MODULES) + # Add charges for active fitting node cffIconId = self.addImage("damagePattern_small", "gui") self.AppendItem(self.root, _t("Charges For Active Fit"), cffIconId, data=CHARGES_FOR_FIT) From ce9ce17ad25ac16623d27d4f789bf7b056413b27 Mon Sep 17 00:00:00 2001 From: Karl Werner Date: Sun, 7 Jul 2024 14:41:16 +0200 Subject: [PATCH 4/4] use mode to limit refresh --- gui/builtinMarketBrowser/itemView.py | 12 +++++++++--- gui/marketBrowser.py | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index b6a4b4085..d317532bc 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -55,7 +55,7 @@ class ItemView(Display): self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) # the "charges for active fitting" needs to listen to fitting changes - self.mainFrame.Bind(GE.FIT_CHANGED, self.selectedFittingChanged) + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.active = [] @@ -121,6 +121,9 @@ class ItemView(Display): # Set toggle buttons / use search mode flag if recently used modules category is selected (in order to have all modules listed and not filtered) if seldata == RECENTLY_USED_MODULES: self.marketBrowser.mode = 'recent' + + if seldata == CHARGES_FOR_FIT: + self.marketBrowser.mode = 'charges' self.setToggles() if context == 'tree' and self.marketBrowser.settings.get('marketMGMarketSelectMode') == 1: @@ -146,11 +149,14 @@ class ItemView(Display): items.add(charge) return items - def selectedFittingChanged(self, event): + def fitChanged(self, event): # skip the event so the other handlers also get called event.Skip() - activeFitID = self.mainFrame.getActiveFit() + if self.marketBrowser.mode != 'charges': + return + + activeFitID = self.mainFrame.getActiveFit() # if it was not the active fitting that was changed, do not do anything if activeFitID is not None and activeFitID not in event.fitIDs: return diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index ec9ce83ec..e6956f9a1 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -146,7 +146,7 @@ class MarketBrowser(wx.Panel): setting = self.settings.get('marketMGSearchMode') # We turn on all meta buttons for the duration of search/recents if setting == 1: - if newMode in ('search', 'recent'): + if newMode in ('search', 'recent', 'charges'): for btn in self.metaButtons: btn.setUserSelection(True) if newMode == 'normal':