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) 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/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 diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 73b948689..a979e275b 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -28,6 +28,9 @@ 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): wx.Panel.__init__(self, parent) @@ -128,15 +131,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 +208,7 @@ class ItemView(d.Display): self.unfilteredStore = set() self.filteredStore = set() + self.recentlyUsedModules = set() self.sMarket = marketBrowser.sMarket self.searchMode = marketBrowser.searchMode @@ -220,13 +228,31 @@ 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() if sel == -1: return + + if self.mainFrame.getActiveFit(): + + 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 @@ -234,7 +260,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,12 +272,22 @@ 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 - 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() 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 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) 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