From ee7ad74432987c429e260d0170ff4b1c048f9858 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Sat, 3 Dec 2011 18:47:23 +0200 Subject: [PATCH 1/8] Added support for force reload --- .../pyfaGlobalPreferences.py | 16 ++++++++++++++++ service/fit.py | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gui/builtinPreferenceViews/pyfaGlobalPreferences.py b/gui/builtinPreferenceViews/pyfaGlobalPreferences.py index a12c8327f..160dc4434 100644 --- a/gui/builtinPreferenceViews/pyfaGlobalPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGlobalPreferences.py @@ -3,7 +3,10 @@ import service from gui.preferenceView import PreferenceView from gui import bitmapLoader + +import gui.mainFrame import service +import gui.globalEvents as GE class PFGlobalPref ( PreferenceView): @@ -11,6 +14,7 @@ class PFGlobalPref ( PreferenceView): def populatePanel( self, panel ): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() mainSizer = wx.BoxSizer( wx.VERTICAL ) self.stTitle = wx.StaticText( panel, wx.ID_ANY, self.title, wx.DefaultPosition, wx.DefaultSize, 0 ) @@ -28,6 +32,9 @@ class PFGlobalPref ( PreferenceView): self.cbGlobalDmgPattern = wx.CheckBox( panel, wx.ID_ANY, u"Use global damage pattern", wx.DefaultPosition, wx.DefaultSize, 0 ) mainSizer.Add( self.cbGlobalDmgPattern, 0, wx.ALL|wx.EXPAND, 5 ) + self.cbGlobalForceReload = wx.CheckBox( panel, wx.ID_ANY, u"Use force reload", wx.DefaultPosition, wx.DefaultSize, 0 ) + mainSizer.Add( self.cbGlobalForceReload, 0, wx.ALL|wx.EXPAND, 5 ) + defCharSizer = wx.BoxSizer( wx.HORIZONTAL ) self.stDefChar = wx.StaticText( panel, wx.ID_ANY, u"Default character:", wx.DefaultPosition, wx.DefaultSize, 0 ) @@ -52,18 +59,27 @@ class PFGlobalPref ( PreferenceView): self.sFit = service.Fit.getInstance() useGlobalChar = self.sFit.serviceFittingOptions["useGlobalCharacter"] useGlobalDmgPattern = self.sFit.serviceFittingOptions["useGlobalDamagePattern"] + useGlobalForceReload = self.sFit.serviceFittingOptions["useGlobalForceReload"] self.cbGlobalChar.SetValue(useGlobalChar) self.cbGlobalDmgPattern.SetValue(useGlobalDmgPattern) + self.cbGlobalForceReload.SetValue(useGlobalForceReload) self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange) self.cbGlobalDmgPattern.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalDmgPatternStateChange) + self.cbGlobalForceReload.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalForceReloadStateChange) self.chDefaultChar.Disable() panel.SetSizer( mainSizer ) panel.Layout() + def OnCBGlobalForceReloadStateChange(self, event): + self.sFit.serviceFittingOptions["useGlobalForceReload"] = self.cbGlobalForceReload.GetValue() + fitID = self.mainFrame.getActiveFit() + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + event.Skip() + def OnCBGlobalCharStateChange(self, event): self.sFit.serviceFittingOptions["useGlobalCharacter"] = self.cbGlobalChar.GetValue() event.Skip() diff --git a/service/fit.py b/service/fit.py index 5cc044d34..b52b1e969 100644 --- a/service/fit.py +++ b/service/fit.py @@ -81,7 +81,7 @@ class Fit(object): self.character = Character.getInstance().all0() self.dirtyFitIDs = set() - serviceFittingDefaultOptions = {"useGlobalCharacter": False, "useGlobalDamagePattern": False, "defaultCharacter": self.character.ID} + serviceFittingDefaultOptions = {"useGlobalCharacter": False, "useGlobalDamagePattern": False, "defaultCharacter": self.character.ID, "useGlobalForceReload": False} self.serviceFittingOptions = SettingsProvider.getInstance().getSettings("pyfaServiceFittingOptions", serviceFittingDefaultOptions) @@ -663,4 +663,5 @@ class Fit(object): def recalc(self, fit, withBoosters=False): fit.clear() + fit.forceReload = self.serviceFittingOptions["useGlobalForceReload"] fit.calculateModifiedAttributes(withBoosters=withBoosters, dirtyStorage=self.dirtyFitIDs) From 6aeb47f1312ad0a0d03acbea66e488e0a4b98e4e Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 9 Dec 2011 19:36:19 +0200 Subject: [PATCH 2/8] Implemented recently used modules category in market browser --- gui/marketBrowser.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 73b948689..85946c8f9 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -28,6 +28,8 @@ from gui import bitmapLoader ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() +RECENTLY_USED_MODULES = -2 + class MarketBrowser(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) @@ -128,15 +130,19 @@ class MarketTree(wx.TreeCtrl): # All market groups which were never expanded are dummies, here we assume # that all root market groups are expandable self.AppendItem(childId, "dummy") - self.SortChildren(self.root) + + # Add recently used modules node + rumIconId = self.addImage("market_small", "icons") + self.AppendItem(self.root, "Recently Used Modules", rumIconId, data = wx.TreeItemData(RECENTLY_USED_MODULES)) + # Bind our lookup method to when the tree gets expanded self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) - def addImage(self, iconFile): + def addImage(self, iconFile, location = "pack"): if iconFile is None: return -1 - return self.imageList.GetImageIndex(iconFile, "pack") + return self.imageList.GetImageIndex(iconFile, location) def expandLookup(self, event): """Process market tree expands""" @@ -201,6 +207,7 @@ class ItemView(d.Display): self.unfilteredStore = set() self.filteredStore = set() + self.recentlyUsedModules = set() self.sMarket = marketBrowser.sMarket self.searchMode = marketBrowser.searchMode @@ -225,6 +232,9 @@ class ItemView(d.Display): sel = self.GetFirstSelected() if sel == -1: return + + if self.mainFrame.getActiveFit(): + self.recentlyUsedModules.add(self.sMarket.getItem(self.active[sel].ID)) wx.PostEvent(self.mainFrame, ItemSelected(itemID=self.active[sel].ID)) def selectionMade(self, event=None, forcedMetaSelect=None): @@ -234,7 +244,7 @@ class ItemView(d.Display): if sel.IsOk(): # Get data field of the selected item (which is a marketGroup ID if anything was selected) seldata = self.marketView.GetPyData(sel) - if seldata is not None: + if seldata is not None and seldata != RECENTLY_USED_MODULES: # 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: @@ -246,8 +256,11 @@ class ItemView(d.Display): else: items = set() else: - # If method was called but selection wasn't actually made - items = set() + # 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.recentlyUsedModules + else: + items = set() # Fill store self.updateItemStore(items) # Set toggle buttons @@ -324,6 +337,7 @@ class ItemView(d.Display): self.filterItemStore() def populateSearch(self, items): + print items # If we're no longer searching, dump the results if self.marketBrowser.searchMode is False: return From 76adcac467f566f5765310d5581e5a1f25a2728c Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 9 Dec 2011 19:45:50 +0200 Subject: [PATCH 3/8] Added proper icons for market/ship browser tabs --- gui/mainFrame.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 5b6fb5aec..76ae8cd27 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -106,11 +106,14 @@ class MainFrame(wx.Frame): self.notebookBrowsers = gui.chromeTabs.PFNotebook(self.splitter, False) + marketImg = bitmapLoader.getImage("market_small", "icons") + shipBrowserImg = bitmapLoader.getImage("ship_small", "icons") + self.marketBrowser = MarketBrowser(self.notebookBrowsers) - self.notebookBrowsers.AddPage(self.marketBrowser, "Market", showClose = False) + self.notebookBrowsers.AddPage(self.marketBrowser, "Market", tabImage = marketImg, showClose = False) self.shipBrowser = ShipBrowser(self.notebookBrowsers) - self.notebookBrowsers.AddPage(self.shipBrowser, "Ships", showClose = False) + self.notebookBrowsers.AddPage(self.shipBrowser, "Ships", tabImage = shipBrowserImg, showClose = False) #======================================================================= # DISABLED FOR RC2 RELEASE From 1c4f711a98a675b775005d86a3fdeb5c14150e96 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 9 Dec 2011 19:50:33 +0200 Subject: [PATCH 4/8] Removed a debug print in marketBrowser - > populateSearch --- gui/marketBrowser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 85946c8f9..702cddc96 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -337,7 +337,6 @@ class ItemView(d.Display): self.filterItemStore() def populateSearch(self, items): - print items # If we're no longer searching, dump the results if self.marketBrowser.searchMode is False: return From b3b8e2e41a3e9de53cee7e8c2038e3654bae10e7 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 9 Dec 2011 19:57:18 +0200 Subject: [PATCH 5/8] Tweaked stats gauges animation duration, less duration less wtf lol cpu usage spent on animating some bars --- gui/pygauge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/pygauge.py b/gui/pygauge.py index 3c043e940..ba5b92a08 100644 --- a/gui/pygauge.py +++ b/gui/pygauge.py @@ -57,7 +57,7 @@ class PyGauge(wx.PyWindow): self._oldValue = 0 - self._animDuration = 700 + self._animDuration = 250 self._animStep = 0 self._period = 20 self._animValue = 0 From f1b5000685f43ca8b1fdb5669eb4845a36352a4a Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 9 Dec 2011 20:25:51 +0200 Subject: [PATCH 6/8] Fixed wh context menu handling --- gui/builtinContextMenus/whProjector.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py index a76c27c9a..02357445f 100644 --- a/gui/builtinContextMenus/whProjector.py +++ b/gui/builtinContextMenus/whProjector.py @@ -39,7 +39,13 @@ class WhProjector(ContextMenu): def handleSelection(self, event): - swObj, swName = self.idmap[event.Id] + #Skip events ids that aren't mapped + + swObj, swName = self.idmap.get(event.Id, (False, False)) + if not swObj and not swName: + event.Skip() + return + sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() sFit.project(fitID, swObj) From d7ecc0b30cf4efe3c2a45de3fb60cdb507c9a09a Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 9 Dec 2011 21:27:20 +0200 Subject: [PATCH 7/8] Use a permanent storage [settings -> pyfaMarketRecentlyUsedModules] for last used modules (20 modules max storage LRU gets deleted) --- gui/marketBrowser.py | 18 +++++++++++++++++- service/market.py | 7 +++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 702cddc96..85fa04eb7 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -29,6 +29,7 @@ from gui import bitmapLoader ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() RECENTLY_USED_MODULES = -2 +MAX_RECENTLY_USED_MODULES = 20 class MarketBrowser(wx.Panel): def __init__(self, parent): @@ -227,6 +228,10 @@ class ItemView(d.Display): # Make reverse map, used by sorter self.metaMap = self.makeReverseMetaMap() + # Fill up recently used modules set + for itemID in self.sMarket.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]: + self.recentlyUsedModules.add(self.sMarket.getItem(itemID)) + def itemActivated(self, event=None): # Check if something is selected, if so, spawn the menu for it sel = self.GetFirstSelected() @@ -234,9 +239,20 @@ class ItemView(d.Display): return if self.mainFrame.getActiveFit(): - self.recentlyUsedModules.add(self.sMarket.getItem(self.active[sel].ID)) + + self.storeRecentlyUsedMarketItem(self.active[sel].ID) + self.recentlyUsedModules = set() + for itemID in self.sMarket.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]: + self.recentlyUsedModules.add(self.sMarket.getItem(itemID)) + wx.PostEvent(self.mainFrame, ItemSelected(itemID=self.active[sel].ID)) + def storeRecentlyUsedMarketItem(self, itemID): + if len(self.sMarket.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]) > MAX_RECENTLY_USED_MODULES: + self.sMarket.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"].pop(0) + + self.sMarket.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"].append(itemID) + def selectionMade(self, event=None, forcedMetaSelect=None): self.marketBrowser.searchMode = False # Grab the threeview selection and check if it's fine diff --git a/service/market.py b/service/market.py index 2e33a8dce..cb57232e2 100644 --- a/service/market.py +++ b/service/market.py @@ -26,6 +26,8 @@ import Queue import eos.db import eos.types +from service.settings import SettingsProvider + try: from collections import OrderedDict except ImportError: @@ -127,6 +129,11 @@ class Market(): def __init__(self): self.priceCache = {} + #Init recently used module storage + serviceMarketRecentlyUsedModules = {"pyfaMarketRecentlyUsedModules": []} + + self.serviceMarketRecentlyUsedModules = SettingsProvider.getInstance().getSettings("pyfaMarketRecentlyUsedModules", serviceMarketRecentlyUsedModules) + # Start price fetcher self.priceWorkerThread = PriceWorkerThread() self.priceWorkerThread.daemon = True From 7f320144a101388f00b832f44c6449984a563472 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Sat, 10 Dec 2011 19:50:49 +0200 Subject: [PATCH 8/8] Show all recently used modules by default (no rtpe filtering) --- gui/marketBrowser.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 85fa04eb7..a979e275b 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -277,10 +277,17 @@ class ItemView(d.Display): items = self.recentlyUsedModules else: items = set() + # Fill store self.updateItemStore(items) - # Set toggle buttons - self.setToggles(forcedMetaSelect=forcedMetaSelect) + + # 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 is not RECENTLY_USED_MODULES: + self.setToggles(forcedMetaSelect=forcedMetaSelect) + else: + self.marketBrowser.searchMode = True + self.setToggles() + # Update filtered items self.filterItemStore()