Merge pull request #1913 from pyfa-org/market_metagroups

Market meta category options
This commit is contained in:
Anton Vorobyov
2019-04-08 10:21:02 +03:00
committed by GitHub
19 changed files with 353 additions and 251 deletions

View File

@@ -3,7 +3,6 @@ import gui.mainFrame
import gui.globalEvents as GE
# noinspection PyPackageRequirements
import wx
from gui.bitmap_loader import BitmapLoader
from service.fit import Fit
from service.settings import ContextMenuSettings
@@ -34,4 +33,5 @@ class FactorReload(ContextMenu):
sFit = Fit.getInstance()
return sFit.serviceFittingOptions["useGlobalForceReload"]
FactorReload.register()

View File

@@ -1,30 +0,0 @@
from gui.contextMenu import ContextMenu
import gui.mainFrame
# noinspection PyPackageRequirements
import wx
import gui.globalEvents as GE
from service.price import Price
from service.settings import ContextMenuSettings
class PriceClear(ContextMenu):
def __init__(self):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
self.settings = ContextMenuSettings.getInstance()
def display(self, srcContext, selection):
if not self.settings.get('priceClear'):
return False
return srcContext in ("priceViewFull", "priceViewMinimal")
def getText(self, itmContext, selection):
return "Reset Price Cache"
def activate(self, fullContext, selection, i):
sPrc = Price.getInstance()
sPrc.clearPriceCache()
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
PriceClear.register()

View File

@@ -1,50 +1,62 @@
from abc import abstractmethod, ABCMeta
import wx
import gui.globalEvents as GE
import gui.mainFrame
from gui.contextMenu import ContextMenu
from service.settings import PriceMenuSettings
from service.settings import MarketPriceSettings
class PriceOptions(ContextMenu):
class ItemGroupPrice(ContextMenu, metaclass=ABCMeta):
def __init__(self):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
self.settings = PriceMenuSettings.getInstance()
self.optionList = ["Ship", "Modules", "Drones", "Cargo", "Character"]
self.settings = MarketPriceSettings.getInstance()
@property
@abstractmethod
def label(self):
raise NotImplementedError()
@property
@abstractmethod
def optionName(self):
raise NotImplementedError()
def display(self, srcContext, selection):
return srcContext in ("priceViewFull", "priceViewMinimal")
def getText(self, itmContext, selection):
return "Include in total"
def addOption(self, menu, option):
label = option
id = ContextMenu.nextID()
self.optionIds[id] = option
menuItem = wx.MenuItem(menu, id, label, kind=wx.ITEM_CHECK)
menu.Bind(wx.EVT_MENU, self.handleMode, menuItem)
return menuItem
def getSubMenu(self, context, selection, rootMenu, i, pitem):
msw = True if "wxMSW" in wx.PlatformInfo else False
self.context = context
self.optionIds = {}
sub = wx.Menu()
for option in self.optionList:
menuItem = self.addOption(rootMenu if msw else sub, option)
sub.Append(menuItem)
menuItem.Check(self.settings.get(option.lower()))
return sub
def handleMode(self, event):
option = self.optionIds[event.Id]
self.settings.set(option.lower(), event.Int)
return self.label
def activate(self, fullContext, selection, i):
self.settings.set(self.optionName, not self.settings.get(self.optionName))
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
@property
def checked(self):
return self.settings.get(self.optionName)
PriceOptions.register()
class DronesPrice(ItemGroupPrice):
label = 'Drones'
optionName = 'drones'
class CargoPrice(ItemGroupPrice):
label = 'Cargo'
optionName = 'cargo'
class ImplantBoosterPrice(ItemGroupPrice):
label = 'Implants && Boosters'
optionName = 'character'
DronesPrice.register()
CargoPrice.register()
ImplantBoosterPrice.register()

View File

@@ -23,13 +23,12 @@ class ItemView(Display):
def __init__(self, parent, marketBrowser):
Display.__init__(self, parent)
pyfalog.debug("Initialize ItemView")
marketBrowser.Bind(wx.EVT_TREE_SEL_CHANGED, self.selectionMade)
marketBrowser.Bind(wx.EVT_TREE_SEL_CHANGED, self.treeSelectionChanged)
self.unfilteredStore = set()
self.filteredStore = set()
self.recentlyUsedModules = set()
self.sMkt = marketBrowser.sMkt
self.searchMode = marketBrowser.searchMode
self.sFit = Fit.getInstance()
self.marketBrowser = marketBrowser
@@ -98,8 +97,11 @@ class ItemView(Display):
self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"].append(itemID)
def selectionMade(self, event=None):
self.marketBrowser.searchMode = False
def treeSelectionChanged(self, event=None):
self.selectionMade('tree')
def selectionMade(self, context):
self.marketBrowser.mode = 'normal'
# Grab the threeview selection and check if it's fine
sel = self.marketView.GetSelection()
if sel.IsOk():
@@ -127,26 +129,47 @@ class ItemView(Display):
self.updateItemStore(items)
# 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()
else:
self.marketBrowser.searchMode = True
self.setToggles()
if seldata == RECENTLY_USED_MODULES:
self.marketBrowser.mode = 'recent'
# Update filtered items
self.setToggles()
if context == 'tree' and self.marketBrowser.settings.get('marketMGMarketSelectMode') == 1:
for btn in self.marketBrowser.metaButtons:
if not btn.GetValue():
btn.setUserSelection(True)
self.filterItemStore()
def updateItemStore(self, items):
self.unfilteredStore = items
def filterItemStore(self):
filteredItems = self.filterItems()
if len(filteredItems) == 0 and len(self.unfilteredStore) > 0:
setting = self.marketBrowser.settings.get('marketMGEmptyMode')
# Enable leftmost available
if setting == 1:
for btn in self.marketBrowser.metaButtons:
if btn.IsEnabled() and not btn.userSelected:
btn.setUserSelection(True)
break
filteredItems = self.filterItems()
# Enable all
elif setting == 2:
for btn in self.marketBrowser.metaButtons:
if btn.IsEnabled() and not btn.userSelected:
btn.setUserSelection(True)
filteredItems = self.filterItems()
self.filteredStore = filteredItems
self.update(list(self.filteredStore))
def filterItems(self):
sMkt = self.sMkt
selectedMetas = set()
for btn in self.marketBrowser.metaButtons:
if btn.GetValue():
if btn.userSelected:
selectedMetas.update(sMkt.META_MAP[btn.metaName])
self.filteredStore = sMkt.filterItemsByMeta(self.unfilteredStore, selectedMetas)
self.update(list(self.filteredStore))
filteredItems = sMkt.filterItemsByMeta(self.unfilteredStore, selectedMetas)
return filteredItems
def setToggles(self):
metaIDs = set()
@@ -169,10 +192,10 @@ class ItemView(Display):
realsearch = search.replace("*", "")
# Re-select market group if search query has zero length
if len(realsearch) == 0:
self.selectionMade()
self.selectionMade('search')
return
self.marketBrowser.searchMode = True
self.marketBrowser.mode = 'search'
self.sMkt.searchItems(search, self.populateSearch)
def clearSearch(self, event=None):
@@ -182,14 +205,15 @@ class ItemView(Display):
if event:
self.marketBrowser.search.Clear()
self.marketBrowser.searchMode = False
self.updateItemStore(set())
self.setToggles()
self.filterItemStore()
if self.marketBrowser.mode == 'search':
self.marketBrowser.mode = 'normal'
self.updateItemStore(set())
self.setToggles()
self.filterItemStore()
def populateSearch(self, items):
# If we're no longer searching, dump the results
if self.marketBrowser.searchMode is False:
if self.marketBrowser.mode != 'search':
return
self.updateItemStore(items)
self.setToggles()
@@ -220,7 +244,7 @@ class ItemView(Display):
item = self.active[sel]
sMkt = self.sMkt
sourceContext = "marketItemGroup" if self.marketBrowser.searchMode is False else "marketItemMisc"
sourceContext = "marketItemMisc" if self.marketBrowser.mode in ("search", "recent") else "marketItemGroup"
itemContext = sMkt.getCategoryByItem(item).name
menu = ContextMenu.getMenu((item,), (sourceContext, itemContext))

View File

@@ -9,6 +9,7 @@ pyfalog = Logger(__name__)
class MarketTree(wx.TreeCtrl):
def __init__(self, parent, marketBrowser):
wx.TreeCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT)
pyfalog.debug("Initialize marketTree")
@@ -72,7 +73,6 @@ class MarketTree(wx.TreeCtrl):
def jump(self, item):
"""Open market group and meta tab of given item"""
self.marketBrowser.searchMode = False
sMkt = self.sMkt
mg = sMkt.getMarketGroupByItem(item)
@@ -96,4 +96,3 @@ class MarketTree(wx.TreeCtrl):
self.Expand(item)
self.SelectItem(item)
self.marketBrowser.itemView.selectionMade()

View File

@@ -16,7 +16,7 @@ class MetaButton(wx.ToggleButton):
def setMetaAvailable(self, isAvailable):
self.Enable(isAvailable)
# need to also SetValue(False) for windows because Enabled=False AND SetValue(True) looks enabled.
if not isAvailable:
if not isAvailable and "wxMSW" in wx.PlatformInfo:
self.SetValue(False)
def reset(self):

View File

@@ -7,5 +7,6 @@ __all__ = [
"pyfaLoggingPreferences",
"pyfaEnginePreferences",
"pyfaEsiPreferences",
"pyfaStatViewPreferences"]
"pyfaStatViewPreferences",
"pyfaMarketPreferences"]

View File

@@ -21,8 +21,6 @@ class PFGeneralPref(PreferenceView):
self.openFitsSettings = SettingsProvider.getInstance().getSettings("pyfaPrevOpenFits",
{"enabled": False, "pyfaOpenFits": []})
helpCursor = wx.Cursor(wx.CURSOR_QUESTION_ARROW)
mainSizer = wx.BoxSizer(wx.VERTICAL)
self.stTitle = wx.StaticText(panel, wx.ID_ANY, self.title, wx.DefaultPosition, wx.DefaultSize, 0)
@@ -66,13 +64,9 @@ class PFGeneralPref(PreferenceView):
labelSizer.Add(self.cbRackLabels, 0, wx.ALL | wx.EXPAND, 5)
mainSizer.Add(labelSizer, 0, wx.LEFT | wx.EXPAND, 30)
self.cbShowTooltip = wx.CheckBox(panel, wx.ID_ANY, "Show tab tooltips", wx.DefaultPosition, wx.DefaultSize, 0)
self.cbShowTooltip = wx.CheckBox(panel, wx.ID_ANY, "Show fitting tab tooltips", wx.DefaultPosition, wx.DefaultSize, 0)
mainSizer.Add(self.cbShowTooltip, 0, wx.ALL | wx.EXPAND, 5)
self.cbMarketShortcuts = wx.CheckBox(panel, wx.ID_ANY, "Show market shortcuts", wx.DefaultPosition,
wx.DefaultSize, 0)
mainSizer.Add(self.cbMarketShortcuts, 0, wx.ALL | wx.EXPAND, 5)
self.cbGaugeAnimation = wx.CheckBox(panel, wx.ID_ANY, "Animate gauges", wx.DefaultPosition, wx.DefaultSize, 0)
mainSizer.Add(self.cbGaugeAnimation, 0, wx.ALL | wx.EXPAND, 5)
@@ -84,38 +78,6 @@ class PFGeneralPref(PreferenceView):
wx.DefaultPosition, wx.DefaultSize, 0)
mainSizer.Add(self.cbShowShipBrowserTooltip, 0, wx.ALL | wx.EXPAND, 5)
priceSizer = wx.BoxSizer(wx.HORIZONTAL)
self.stDefaultSystem = wx.StaticText(panel, wx.ID_ANY, "Default Market Prices:", wx.DefaultPosition, wx.DefaultSize, 0)
self.stDefaultSystem.Wrap(-1)
priceSizer.Add(self.stDefaultSystem, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.stDefaultSystem.SetCursor(helpCursor)
self.stDefaultSystem.SetToolTip(
wx.ToolTip('The source you choose will be tried first, but subsequent sources will be used if the preferred '
'source fails. The system you choose is absolute and requests will not be made against other systems.'))
self.chPriceSource = wx.Choice(panel, choices=sorted(Price.sources.keys()))
self.chPriceSystem = wx.Choice(panel, choices=list(Price.systemsList.keys()))
priceSizer.Add(self.chPriceSource, 1, wx.ALL | wx.EXPAND, 5)
priceSizer.Add(self.chPriceSystem, 1, wx.ALL | wx.EXPAND, 5)
mainSizer.Add(priceSizer, 0, wx.ALL | wx.EXPAND, 0)
delayTimer = wx.BoxSizer(wx.HORIZONTAL)
self.stMarketDelay = wx.StaticText(panel, wx.ID_ANY, "Market Search Delay (ms):", wx.DefaultPosition, wx.DefaultSize, 0)
self.stMarketDelay.Wrap(-1)
self.stMarketDelay.SetCursor(helpCursor)
self.stMarketDelay.SetToolTip(
wx.ToolTip('The delay between a keystroke and the market search. Can help reduce lag when typing fast in the market search box.'))
delayTimer.Add(self.stMarketDelay, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.intDelay = IntCtrl(panel, max=1000, limited=True)
delayTimer.Add(self.intDelay, 0, wx.ALL, 5)
mainSizer.Add(delayTimer, 0, wx.ALL | wx.EXPAND, 0)
self.sFit = Fit.getInstance()
self.cbGlobalChar.SetValue(self.sFit.serviceFittingOptions["useGlobalCharacter"])
@@ -127,13 +89,9 @@ class PFGeneralPref(PreferenceView):
self.cbCompactSkills.SetValue(self.sFit.serviceFittingOptions["compactSkills"] or False)
self.cbReopenFits.SetValue(self.openFitsSettings["enabled"])
self.cbShowTooltip.SetValue(self.sFit.serviceFittingOptions["showTooltip"] or False)
self.cbMarketShortcuts.SetValue(self.sFit.serviceFittingOptions["showMarketShortcuts"] or False)
self.cbGaugeAnimation.SetValue(self.sFit.serviceFittingOptions["enableGaugeAnimation"])
self.cbOpenFitInNew.SetValue(self.sFit.serviceFittingOptions["openFitInNew"])
self.chPriceSource.SetStringSelection(self.sFit.serviceFittingOptions["priceSource"])
self.chPriceSystem.SetStringSelection(self.sFit.serviceFittingOptions["priceSystem"])
self.cbShowShipBrowserTooltip.SetValue(self.sFit.serviceFittingOptions["showShipBrowserTooltip"])
self.intDelay.SetValue(self.sFit.serviceFittingOptions["marketSearchDelay"])
self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange)
self.cbDefaultCharImplants.Bind(wx.EVT_CHECKBOX, self.OnCBDefaultCharImplantsStateChange)
@@ -144,23 +102,15 @@ class PFGeneralPref(PreferenceView):
self.cbCompactSkills.Bind(wx.EVT_CHECKBOX, self.onCBCompactSkills)
self.cbReopenFits.Bind(wx.EVT_CHECKBOX, self.onCBReopenFits)
self.cbShowTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowTooltip)
self.cbMarketShortcuts.Bind(wx.EVT_CHECKBOX, self.onCBShowShortcuts)
self.cbGaugeAnimation.Bind(wx.EVT_CHECKBOX, self.onCBGaugeAnimation)
self.cbOpenFitInNew.Bind(wx.EVT_CHECKBOX, self.onCBOpenFitInNew)
self.chPriceSource.Bind(wx.EVT_CHOICE, self.onPricesSourceSelection)
self.chPriceSystem.Bind(wx.EVT_CHOICE, self.onPriceSelection)
self.cbShowShipBrowserTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowShipBrowserTooltip)
self.intDelay.Bind(wx.lib.intctrl.EVT_INT, self.onMarketDelayChange)
self.cbRackLabels.Enable(self.sFit.serviceFittingOptions["rackSlots"] or False)
panel.SetSizer(mainSizer)
panel.Layout()
def onMarketDelayChange(self, event):
self.sFit.serviceFittingOptions["marketSearchDelay"] = self.intDelay.GetValue()
event.Skip()
def onCBGlobalColorBySlot(self, event):
# todo: maybe create a SettingChanged event that we can fire, and have other things hook into, instead of having the preference panel itself handle the
# updating of things related to settings.
@@ -215,9 +165,6 @@ class PFGeneralPref(PreferenceView):
def onCBShowTooltip(self, event):
self.sFit.serviceFittingOptions["showTooltip"] = self.cbShowTooltip.GetValue()
def onCBShowShortcuts(self, event):
self.sFit.serviceFittingOptions["showMarketShortcuts"] = self.cbMarketShortcuts.GetValue()
def onCBGaugeAnimation(self, event):
self.sFit.serviceFittingOptions["enableGaugeAnimation"] = self.cbGaugeAnimation.GetValue()
@@ -230,19 +177,5 @@ class PFGeneralPref(PreferenceView):
def getImage(self):
return BitmapLoader.getBitmap("prefs_settings", "gui")
def onPriceSelection(self, event):
system = self.chPriceSystem.GetString(self.chPriceSystem.GetSelection())
self.sFit.serviceFittingOptions["priceSystem"] = system
fitID = self.mainFrame.getActiveFit()
self.sFit.refreshFit(fitID)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
event.Skip()
def onPricesSourceSelection(self, event):
source = self.chPriceSource.GetString(self.chPriceSource.GetSelection())
self.sFit.serviceFittingOptions["priceSource"] = source
PFGeneralPref.register()

View File

@@ -0,0 +1,159 @@
# noinspection PyPackageRequirements
import wx
from wx.lib.intctrl import IntCtrl
from gui.preferenceView import PreferenceView
from gui.bitmap_loader import BitmapLoader
import gui.mainFrame
import gui.globalEvents as GE
from service.settings import MarketPriceSettings
from service.fit import Fit
from service.price import Price
class PFMarketPref(PreferenceView):
title = "Market & Prices"
def __init__(self):
self.priceSettings = MarketPriceSettings.getInstance()
def populatePanel(self, panel):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
self.sFit = Fit.getInstance()
helpCursor = wx.Cursor(wx.CURSOR_QUESTION_ARROW)
mainSizer = wx.BoxSizer(wx.VERTICAL)
self.stTitle = wx.StaticText(panel, wx.ID_ANY, "Market && Prices", wx.DefaultPosition, wx.DefaultSize, 0)
self.stTitle.Wrap(-1)
self.stTitle.SetFont(wx.Font(12, 70, 90, 90, False, wx.EmptyString))
mainSizer.Add(self.stTitle, 0, wx.ALL, 5)
self.m_staticline1 = wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
delayTimer = wx.BoxSizer(wx.HORIZONTAL)
self.stMarketDelay = wx.StaticText(panel, wx.ID_ANY, "Market Search Delay (ms):", wx.DefaultPosition, wx.DefaultSize, 0)
self.stMarketDelay.Wrap(-1)
self.stMarketDelay.SetCursor(helpCursor)
self.stMarketDelay.SetToolTip(wx.ToolTip('The delay between a keystroke and the market search. Can help reduce lag when typing fast in the market search box.'))
delayTimer.Add(self.stMarketDelay, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.intDelay = IntCtrl(panel, max=1000, limited=True)
delayTimer.Add(self.intDelay, 0, wx.ALL, 5)
mainSizer.Add(delayTimer, 0, wx.EXPAND | wx.TOP | wx.RIGHT, 10)
self.intDelay.SetValue(self.sFit.serviceFittingOptions["marketSearchDelay"])
self.intDelay.Bind(wx.lib.intctrl.EVT_INT, self.onMarketDelayChange)
self.cbMarketShortcuts = wx.CheckBox(panel, wx.ID_ANY, "Show market shortcuts", wx.DefaultPosition, wx.DefaultSize, 0)
mainSizer.Add(self.cbMarketShortcuts, 0, wx.EXPAND | wx.TOP | wx.RIGHT, 10)
self.cbMarketShortcuts.SetValue(self.sFit.serviceFittingOptions["showMarketShortcuts"] or False)
self.cbMarketShortcuts.Bind(wx.EVT_CHECKBOX, self.onCBShowShortcuts)
priceSizer = wx.BoxSizer(wx.HORIZONTAL)
self.stDefaultSystem = wx.StaticText(panel, wx.ID_ANY, "Default Market Prices:", wx.DefaultPosition, wx.DefaultSize, 0)
self.stDefaultSystem.Wrap(-1)
priceSizer.Add(self.stDefaultSystem, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.stDefaultSystem.SetCursor(helpCursor)
self.stDefaultSystem.SetToolTip(wx.ToolTip(
'The source you choose will be tried first, but subsequent sources will be used if the preferred source fails. '
'The system you choose will also be tried first, and if no data is available, global price will be used.'))
self.chPriceSource = wx.Choice(panel, choices=sorted(Price.sources.keys()))
self.chPriceSystem = wx.Choice(panel, choices=list(Price.systemsList.keys()))
priceSizer.Add(self.chPriceSource, 1, wx.ALL | wx.EXPAND, 5)
priceSizer.Add(self.chPriceSystem, 1, wx.ALL | wx.EXPAND, 5)
mainSizer.Add(priceSizer, 0, wx.EXPAND | wx.TOP | wx.RIGHT, 10)
self.chPriceSource.SetStringSelection(self.sFit.serviceFittingOptions["priceSource"])
self.chPriceSource.Bind(wx.EVT_CHOICE, self.onPricesSourceSelection)
self.chPriceSystem.SetStringSelection(self.sFit.serviceFittingOptions["priceSystem"])
self.chPriceSystem.Bind(wx.EVT_CHOICE, self.onPriceSelection)
self.tbTotalPriceBox = wx.StaticBoxSizer(wx.VERTICAL, panel, "Total Price Includes")
self.tbTotalPriceDrones = wx.CheckBox(panel, -1, "Drones", wx.DefaultPosition, wx.DefaultSize, 1)
self.tbTotalPriceDrones.SetValue(self.priceSettings.get("drones"))
self.tbTotalPriceDrones.Bind(wx.EVT_CHECKBOX, self.OnTotalPriceDroneChange)
self.tbTotalPriceBox.Add(self.tbTotalPriceDrones, 0, wx.LEFT | wx.RIGHT | wx.TOP, 5)
self.tbTotalPriceCargo = wx.CheckBox(panel, -1, "Cargo", wx.DefaultPosition, wx.DefaultSize, 1)
self.tbTotalPriceCargo.SetValue(self.priceSettings.get("cargo"))
self.tbTotalPriceCargo.Bind(wx.EVT_CHECKBOX, self.OnTotalPriceCargoChange)
self.tbTotalPriceBox.Add(self.tbTotalPriceCargo, 0, wx.LEFT | wx.RIGHT, 5)
self.tbTotalPriceCharacter = wx.CheckBox(panel, -1, "Implants && Boosters", wx.DefaultPosition, wx.DefaultSize, 1)
self.tbTotalPriceCharacter.SetValue(self.priceSettings.get("character"))
self.tbTotalPriceCharacter.Bind(wx.EVT_CHECKBOX, self.OnTotalPriceCharacterChange)
self.tbTotalPriceBox.Add(self.tbTotalPriceCharacter, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
mainSizer.Add(self.tbTotalPriceBox, 0, wx.EXPAND | wx.TOP | wx.RIGHT, 10)
self.rbMarketSearch = wx.RadioBox(panel, -1, "Market Search && Recent Items", wx.DefaultPosition, wx.DefaultSize, ["No changes to meta buttons", "Enable all meta buttons for a duration of search / recents", "Enable all meta buttons"], 1, wx.RA_SPECIFY_COLS)
self.rbMarketSearch.SetSelection(self.priceSettings.get('marketMGSearchMode'))
mainSizer.Add(self.rbMarketSearch, 0, wx.RIGHT | wx.TOP | wx.EXPAND, 10)
self.rbMarketSearch.Bind(wx.EVT_RADIOBOX, self.OnMarketSearchChange)
self.rbMarketEmpty = wx.RadioBox(panel, -1, "Market Group Selection", wx.DefaultPosition, wx.DefaultSize, ["No changes to meta buttons", "Enable all meta buttons"], 1, wx.RA_SPECIFY_COLS)
self.rbMarketEmpty.SetSelection(self.priceSettings.get('marketMGMarketSelectMode'))
mainSizer.Add(self.rbMarketEmpty, 0, wx.EXPAND | wx.TOP | wx.RIGHT, 10)
self.rbMarketEmpty.Bind(wx.EVT_RADIOBOX, self.OnMarketGroupSelectionChange)
self.rbMarketEmpty = wx.RadioBox(panel, -1, "Empty Market View", wx.DefaultPosition, wx.DefaultSize, ["No changes to meta buttons", "Enable leftmost available meta button", "Enable all available meta buttons"], 1, wx.RA_SPECIFY_COLS)
self.rbMarketEmpty.SetSelection(self.priceSettings.get('marketMGEmptyMode'))
mainSizer.Add(self.rbMarketEmpty, 0, wx.EXPAND | wx.TOP | wx.RIGHT, 10)
self.rbMarketEmpty.Bind(wx.EVT_RADIOBOX, self.OnMarketEmptyChange)
self.rbMarketJump = wx.RadioBox(panel, -1, "Item Market Group Jump", wx.DefaultPosition, wx.DefaultSize, ["No changes to meta buttons", "Enable item's meta button", "Enable item's meta button, disable others", "Enable all meta buttons"], 1, wx.RA_SPECIFY_COLS)
self.rbMarketJump.SetSelection(self.priceSettings.get('marketMGJumpMode'))
mainSizer.Add(self.rbMarketJump, 0, wx.EXPAND | wx.TOP | wx.RIGHT | wx.BOTTOM, 10)
self.rbMarketJump.Bind(wx.EVT_RADIOBOX, self.OnMarketJumpChange)
panel.SetSizer(mainSizer)
panel.Layout()
def onMarketDelayChange(self, event):
self.sFit.serviceFittingOptions["marketSearchDelay"] = self.intDelay.GetValue()
event.Skip()
def onCBShowShortcuts(self, event):
self.sFit.serviceFittingOptions["showMarketShortcuts"] = self.cbMarketShortcuts.GetValue()
def getImage(self):
return BitmapLoader.getBitmap("settings_market", "gui")
def onPriceSelection(self, event):
system = self.chPriceSystem.GetString(self.chPriceSystem.GetSelection())
self.sFit.serviceFittingOptions["priceSystem"] = system
fitID = self.mainFrame.getActiveFit()
self.sFit.refreshFit(fitID)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
event.Skip()
def onPricesSourceSelection(self, event):
source = self.chPriceSource.GetString(self.chPriceSource.GetSelection())
self.sFit.serviceFittingOptions["priceSource"] = source
def OnTotalPriceDroneChange(self, event):
self.priceSettings.set('drones', event.GetInt())
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
def OnTotalPriceCargoChange(self, event):
self.priceSettings.set('cargo', event.GetInt())
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
def OnTotalPriceCharacterChange(self, event):
self.priceSettings.set('character', event.GetInt())
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
def OnMarketJumpChange(self, event):
self.priceSettings.set('marketMGJumpMode', event.GetInt())
def OnMarketEmptyChange(self, event):
self.priceSettings.set('marketMGEmptyMode', event.GetInt())
def OnMarketSearchChange(self, event):
self.priceSettings.set('marketMGSearchMode', event.GetInt())
def OnMarketGroupSelectionChange(self, event):
self.priceSettings.set('marketMGMarketSelectMode', event.GetInt())
PFMarketPref.register()

View File

@@ -99,20 +99,6 @@ class PFStatViewPref(PreferenceView):
self.rbOutgoing.SetSelection(self.settings.get('outgoing'))
rbSizerRow3.Add(self.rbOutgoing, 1, wx.TOP | wx.RIGHT, 5)
self.rbOutgoing.Bind(wx.EVT_RADIOBOX, self.OnOutgoingChange)
# We don't have views for these.....yet
'''
self.rbMining = wx.RadioBox(panel, -1, "Mining", wx.DefaultPosition, wx.DefaultSize,
['None', 'Minimal', 'Full'], 1, wx.RA_SPECIFY_COLS)
self.rbMining.SetSelection(self.settings.get('miningyield'))
rbSizerRow3.Add(self.rbMining, 1, wx.ALL, 5)
self.rbMining.Bind(wx.EVT_RADIOBOX, self.OnMiningYieldChange)
self.rbDrones = wx.RadioBox(panel, -1, "Drones", wx.DefaultPosition, wx.DefaultSize,
['None', 'Minimal', 'Full'], 1, wx.RA_SPECIFY_COLS)
self.rbDrones.SetSelection(self.settings.get('drones'))
rbSizerRow3.Add(self.rbDrones, 1, wx.ALL, 5)
self.rbDrones.Bind(wx.EVT_RADIOBOX, self.OnDroneChange)
'''
mainSizer.Add(rbSizerRow3, 1, wx.ALL | wx.EXPAND, 0)

View File

@@ -23,7 +23,7 @@ from gui.statsView import StatsView
from gui.bitmap_loader import BitmapLoader
from gui.utils.numberFormatter import formatAmount
from service.price import Fit, Price
from service.settings import PriceMenuSettings
from service.settings import MarketPriceSettings
class PriceViewFull(StatsView):
@@ -32,7 +32,7 @@ class PriceViewFull(StatsView):
def __init__(self, parent):
StatsView.__init__(self)
self.parent = parent
self.settings = PriceMenuSettings.getInstance()
self.settings = MarketPriceSettings.getInstance()
def getHeaderText(self, fit):
return "Price"
@@ -125,11 +125,8 @@ class PriceViewFull(StatsView):
implant_price += implant.item.price.price
total_price = 0
if self.settings.get("ship"):
total_price += ship_price
if self.settings.get("modules"):
total_price += module_price
total_price += ship_price
total_price += module_price
if self.settings.get("drones"):
total_price += drone_price + fighter_price
if self.settings.get("cargo"):
@@ -138,23 +135,22 @@ class PriceViewFull(StatsView):
total_price += booster_price + implant_price
self.labelPriceShip.SetLabel("%s ISK" % formatAmount(ship_price, 3, 3, 9, currency=True))
self.labelPriceShip.SetToolTip(wx.ToolTip('{:,.2f}'.format(ship_price)))
self.labelPriceShip.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(ship_price)))
self.labelPriceFittings.SetLabel("%s ISK" % formatAmount(module_price, 3, 3, 9, currency=True))
self.labelPriceFittings.SetToolTip(wx.ToolTip('{:,.2f}'.format(module_price)))
self.labelPriceTotal.SetLabel("%s ISK" % formatAmount(total_price, 3, 3, 9, currency=True))
self.labelPriceTotal.SetToolTip(wx.ToolTip('{:,.2f}'.format(total_price)))
self.labelPriceFittings.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(module_price)))
self.labelPriceDrones.SetLabel("%s ISK" % formatAmount(drone_price + fighter_price, 3, 3, 9, currency=True))
self.labelPriceDrones.SetToolTip(wx.ToolTip('{:,.2f}'.format(drone_price + fighter_price)))
self.labelPriceDrones.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(drone_price + fighter_price)))
self.labelPriceCargobay.SetLabel("%s ISK" % formatAmount(cargo_price, 3, 3, 9, currency=True))
self.labelPriceCargobay.SetToolTip(wx.ToolTip('{:,.2f}'.format(cargo_price)))
self.labelPriceCargobay.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(cargo_price)))
self.labelPriceCharacter.SetLabel(
"%s ISK" % formatAmount(booster_price + implant_price, 3, 3, 9, currency=True))
self.labelPriceCharacter.SetToolTip(wx.ToolTip('{:,.2f}'.format(booster_price + implant_price)))
self.labelPriceCharacter.SetLabel("%s ISK" % formatAmount(booster_price + implant_price, 3, 3, 9, currency=True))
self.labelPriceCharacter.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(booster_price + implant_price)))
self.labelPriceTotal.SetLabel("%s ISK" % formatAmount(total_price, 3, 3, 9, currency=True))
self.labelPriceTotal.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(total_price)))
def processPrices(self, prices):
self.refreshPanelPrices(self.fit)

View File

@@ -23,7 +23,7 @@ from gui.statsView import StatsView
from gui.bitmap_loader import BitmapLoader
from gui.utils.numberFormatter import formatAmount
from service.price import Fit, Price
from service.settings import PriceMenuSettings
from service.settings import MarketPriceSettings
class PriceViewMinimal(StatsView):
@@ -32,7 +32,7 @@ class PriceViewMinimal(StatsView):
def __init__(self, parent):
StatsView.__init__(self)
self.parent = parent
self.settings = PriceMenuSettings.getInstance()
self.settings = MarketPriceSettings.getInstance()
def getHeaderText(self, fit):
return "Price"
@@ -121,11 +121,8 @@ class PriceViewMinimal(StatsView):
fitting_price = module_price
total_price = 0
if self.settings.get("ship"):
total_price += ship_price
if self.settings.get("modules"):
total_price += module_price
total_price += ship_price
total_price += module_price
if self.settings.get("drones"):
total_price += drone_price + fighter_price
if self.settings.get("cargo"):
@@ -134,13 +131,13 @@ class PriceViewMinimal(StatsView):
total_price += booster_price + implant_price
self.labelPriceShip.SetLabel("%s ISK" % formatAmount(ship_price, 3, 3, 9, currency=True))
self.labelPriceShip.SetToolTip(wx.ToolTip('{:,.2f}'.format(ship_price)))
self.labelPriceShip.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(ship_price)))
self.labelPriceFittings.SetLabel("%s ISK" % formatAmount(fitting_price, 3, 3, 9, currency=True))
self.labelPriceFittings.SetToolTip(wx.ToolTip('{:,.2f}'.format(fitting_price)))
self.labelPriceFittings.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(fitting_price)))
self.labelPriceTotal.SetLabel("%s ISK" % formatAmount(total_price, 3, 3, 9, currency=True))
self.labelPriceTotal.SetToolTip(wx.ToolTip('{:,.2f}'.format(total_price)))
self.labelPriceTotal.SetToolTip(wx.ToolTip('{:,.2f} ISK'.format(total_price)))
def processPrices(self, prices):
self.refreshPanelPrices(self.fit)

View File

@@ -208,7 +208,6 @@ from gui.builtinContextMenus import ( # noqa: E402,F401
changeAffectingSkills,
tacticalMode,
targetResists,
priceClear,
priceOptions,
amount,
cargoAmmo,

View File

@@ -20,12 +20,12 @@
# noinspection PyPackageRequirements
import wx
from service.market import Market
from gui.builtinMarketBrowser.searchBox import SearchBox
from gui.builtinMarketBrowser.itemView import ItemView
from gui.builtinMarketBrowser.metaButton import MetaButton
from gui.builtinMarketBrowser.marketTree import MarketTree
from service.market import Market
from service.settings import MarketPriceSettings
from logbook import Logger
@@ -33,8 +33,11 @@ pyfalog = Logger(__name__)
class MarketBrowser(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
pyfalog.debug("Initialize marketBrowser")
vbox = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(vbox)
@@ -46,9 +49,11 @@ class MarketBrowser(wx.Panel):
self.splitter = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
vbox.Add(self.splitter, 1, wx.EXPAND)
# Grab market service instance and create child objects
# Grab service stuff and create child objects
self.sMkt = Market.getInstance()
self.searchMode = False
self.settings = MarketPriceSettings.getInstance()
self.__mode = 'normal'
self.__normalBtnMap = {}
self.marketView = MarketTree(self.splitter, self)
self.itemView = ItemView(self.splitter, self)
@@ -97,4 +102,60 @@ class MarketBrowser(wx.Panel):
self.itemView.filterItemStore()
def jump(self, item):
self.mode = 'normal'
self.marketView.jump(item)
setting = self.settings.get('marketMGJumpMode')
itemMetaCat = self.sMkt.META_MAP_REVERSE[self.sMkt.getMetaGroupIdByItem(item)]
# Enable item meta category
if setting == 1:
btn = getattr(self, itemMetaCat)
if not btn.GetValue():
btn.setUserSelection(True)
# Enable item meta category, disable others
elif setting == 2:
tgtBtn = getattr(self, itemMetaCat)
if not tgtBtn.GetValue():
tgtBtn.setUserSelection(True)
for btn in self.metaButtons:
if btn is tgtBtn:
continue
if btn.GetValue:
btn.setUserSelection(False)
# Enable all meta categories
elif setting == 3:
for btn in self.metaButtons:
if not btn.GetValue():
btn.setUserSelection(True)
self.itemView.selectionMade('jump')
@property
def mode(self):
return self.__mode
@mode.setter
def mode(self, newMode):
oldMode = self.__mode
if newMode == oldMode:
return
# Store meta button states when switching from normal
if oldMode == 'normal':
self.__normalBtnMap.clear()
for btn in self.metaButtons:
self.__normalBtnMap[btn] = btn.userSelected
if newMode == 'search':
self.marketView.UnselectAll()
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'):
for btn in self.metaButtons:
btn.setUserSelection(True)
if newMode == 'normal':
for btn, state in self.__normalBtnMap.items():
btn.setUserSelection(state)
# We turn on all meta buttons permanently
if setting == 2:
for btn in self.metaButtons:
btn.setUserSelection(True)
self.__mode = newMode

View File

@@ -66,12 +66,10 @@ class PreferenceDialog(wx.Dialog):
self.listbook.AddPage(page, prefView.title, imageId=imgID)
minHeight = 550
bestFit = self.GetBestVirtualSize()
if minHeight > bestFit[1]:
self.SetSize(650, minHeight)
else:
self.SetSize(650, bestFit[1])
width = max(bestFit[0], 800 if "wxGTK" in wx.PlatformInfo else 650)
height = max(bestFit[1], 550)
self.SetSize(width, height)
self.Layout()

View File

@@ -46,6 +46,7 @@ from gui.builtinPreferenceViews import ( # noqa: E402, F401
pyfaEsiPreferences,
pyfaContextMenuPreferences,
pyfaStatViewPreferences,
pyfaMarketPreferences,
pyfaUpdatePreferences,
pyfaEnginePreferences,
pyfaDatabasePreferences,

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -316,6 +316,7 @@ class Market(object):
("faction", frozenset((4, 3))),
("complex", frozenset((6,))),
("officer", frozenset((5,)))])
self.META_MAP_REVERSE = {sv: k for k, v in self.META_MAP.items() for sv in v}
self.SEARCH_CATEGORIES = (
"Drone",
"Module",

View File

@@ -48,37 +48,6 @@ class SettingsProvider(object):
if not os.path.exists(self.BASE_PATH):
os.mkdir(self.BASE_PATH)
# def getSettings(self, area, defaults=None):
# # type: (basestring, dict) -> service.Settings
# # NOTE: needed to change for tests
# settings_obj = self.settings.get(area)
#
# if settings_obj is None and hasattr(self, 'BASE_PATH'):
# canonical_path = os.path.join(self.BASE_PATH, area)
#
# if not os.path.exists(canonical_path):
# info = {}
# if defaults:
# for item in defaults:
# info[item] = defaults[item]
#
# else:
# try:
# f = open(canonical_path, "rb")
# info = cPickle.load(f)
# for item in defaults:
# if item not in info:
# info[item] = defaults[item]
#
# except:
# info = {}
# if defaults:
# for item in defaults:
# info[item] = defaults[item]
#
# self.settings[area] = settings_obj = Settings(canonical_path, info)
#
# return settings_obj
def getSettings(self, area, defaults=None):
# type: (basestring, dict) -> service.Settings
# NOTE: needed to change for tests
@@ -438,12 +407,6 @@ class StatViewSettings(object):
"outgoing" : 2,
}
# We don't have these....yet
'''
"miningyield": 2,
"drones": 2
'''
self.serviceStatViewDefaultSettings = SettingsProvider.getInstance().getSettings("pyfaServiceStatViewSettings", serviceStatViewDefaultSettings)
def get(self, type):
@@ -453,13 +416,13 @@ class StatViewSettings(object):
self.serviceStatViewDefaultSettings[type] = value
class PriceMenuSettings(object):
class MarketPriceSettings(object):
_instance = None
@classmethod
def getInstance(cls):
if cls._instance is None:
cls._instance = PriceMenuSettings()
cls._instance = MarketPriceSettings()
return cls._instance
@@ -468,11 +431,13 @@ class PriceMenuSettings(object):
# 0 - Do not add to total
# 1 - Add to total
PriceMenuDefaultSettings = {
"ship" : 1,
"modules" : 1,
"drones" : 0,
"cargo" : 0,
"character" : 0
"drones" : 1,
"cargo" : 1,
"character" : 0,
"marketMGJumpMode": 0,
"marketMGEmptyMode": 1,
"marketMGSearchMode": 0,
"marketMGMarketSelectMode": 0
}
self.PriceMenuDefaultSettings = SettingsProvider.getInstance().getSettings("pyfaPriceMenuSettings",