diff --git a/config.py b/config.py index 59c4fae55..7f347eb3c 100644 --- a/config.py +++ b/config.py @@ -1,10 +1,12 @@ import os import sys import yaml +import wx from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \ StreamHandler, TimedRotatingFileHandler, WARNING import hashlib +from eos.const import Slot from cryptography.fernet import Fernet @@ -47,6 +49,13 @@ LOGLEVEL_MAP = { "debug": DEBUG, } +slotColourMap = { + Slot.LOW: wx.Colour(250, 235, 204), # yellow = low slots + Slot.MED: wx.Colour(188, 215, 241), # blue = mid slots + Slot.HIGH: wx.Colour(235, 204, 209), # red = high slots + Slot.RIG: '', + Slot.SUBSYSTEM: '' +} def getClientSecret(): return clientHash diff --git a/eos/const.py b/eos/const.py new file mode 100644 index 000000000..95dd8a888 --- /dev/null +++ b/eos/const.py @@ -0,0 +1,26 @@ +from eos.enum import Enum + + + +class Slot(Enum): + # These are self-explanatory + LOW = 1 + MED = 2 + HIGH = 3 + RIG = 4 + SUBSYSTEM = 5 + # not a real slot, need for pyfa display rack separation + MODE = 6 + # system effects. They are projected "modules" and pyfa assumes all modules + # have a slot. In this case, make one up. + SYSTEM = 7 + # used for citadel services + SERVICE = 8 + # fighter 'slots'. Just easier to put them here... + F_LIGHT = 10 + F_SUPPORT = 11 + F_HEAVY = 12 + # fighter 'slots' (for structures) + FS_LIGHT = 13 + FS_SUPPORT = 14 + FS_HEAVY = 15 diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index c4c2f0b00..25b15e147 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -23,6 +23,7 @@ from logbook import Logger from sqlalchemy.orm import reconstructor, validates import eos.db +from eos.const import Slot from eos.effectHandlerHelpers import HandledCharge, HandledItem from eos.enum import Enum from eos.modifiedAttributeDict import ChargeAttrShortcut, ItemAttrShortcut, ModifiedAttributeDict @@ -42,30 +43,6 @@ class State(Enum): OVERHEATED = 2 -class Slot(Enum): - # These are self-explanatory - LOW = 1 - MED = 2 - HIGH = 3 - RIG = 4 - SUBSYSTEM = 5 - # not a real slot, need for pyfa display rack separation - MODE = 6 - # system effects. They are projected "modules" and pyfa assumes all modules - # have a slot. In this case, make one up. - SYSTEM = 7 - # used for citadel services - SERVICE = 8 - # fighter 'slots'. Just easier to put them here... - F_LIGHT = 10 - F_SUPPORT = 11 - F_HEAVY = 12 - # fighter 'slots' (for structures) - FS_LIGHT = 13 - FS_SUPPORT = 14 - FS_HEAVY = 15 - - ProjectedMap = { State.OVERHEATED: State.ACTIVE, State.ACTIVE: State.OFFLINE, @@ -185,7 +162,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__itemModifiedAttributes.original = self.__item.attributes self.__itemModifiedAttributes.overrides = self.__item.overrides self.__hardpoint = self.__calculateHardpoint(self.__item) - self.__slot = self.__calculateSlot(self.__item) + self.__slot = self.calculateSlot(self.__item) # Instantiate / remove mutators if this is a mutated module if self.__baseItem: @@ -755,7 +732,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return Hardpoint.NONE @staticmethod - def __calculateSlot(item): + def calculateSlot(item): effectSlotMap = { "rigSlot" : Slot.RIG, "loPower" : Slot.LOW, @@ -772,7 +749,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if item.group.name in Module.SYSTEM_GROUPS: return Slot.SYSTEM - raise ValueError("Passed item does not fit in any known slot") + return None @validates("ID", "itemID", "ammoID") def validator(self, key, val): diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 82454502a..258c8800f 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -1,6 +1,7 @@ import wx from logbook import Logger +from eos.saveddata.module import Module import gui.builtinMarketBrowser.pfSearchBox as SBox from gui.builtinMarketBrowser.events import ItemSelected, MAX_RECENTLY_USED_MODULES, RECENTLY_USED_MODULES from gui.contextMenu import ContextMenu @@ -8,6 +9,7 @@ from gui.display import Display from gui.utils.staticHelpers import DragDropHelper from service.attribute import Attribute from service.fit import Fit +from config import slotColourMap pyfalog = Logger(__name__) @@ -28,6 +30,7 @@ class ItemView(Display): self.recentlyUsedModules = set() self.sMkt = marketBrowser.sMkt self.searchMode = marketBrowser.searchMode + self.sFit = Fit.getInstance() self.marketBrowser = marketBrowser self.marketView = marketBrowser.marketView @@ -266,3 +269,9 @@ class ItemView(Display): revmap[mgid] = i i += 1 return revmap + + def columnBackground(self, colItem, item): + if self.sFit.serviceFittingOptions["colorFitBySlot"]: + return slotColourMap.get(Module.calculateSlot(item)) or self.GetBackgroundColour() + else: + return self.GetBackgroundColour() diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index 51d32ab5d..8b1c0f27a 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -162,9 +162,16 @@ class PFGeneralPref(PreferenceView): 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. self.sFit.serviceFittingOptions["colorFitBySlot"] = self.cbFitColorSlots.GetValue() fitID = self.mainFrame.getActiveFit() self.sFit.refreshFit(fitID) + + iView = self.mainFrame.marketBrowser.itemView + if iView.active: + iView.update(iView.active) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) event.Skip() diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index a0aea6043..372ea6a2e 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -40,6 +40,7 @@ from gui.contextMenu import ContextMenu from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit from service.market import Market +from config import slotColourMap pyfalog = Logger(__name__) @@ -629,14 +630,8 @@ class FittingView(d.Display): else: event.Skip() - slotColourMap = {1: wx.Colour(250, 235, 204), # yellow = low slots - 2: wx.Colour(188, 215, 241), # blue = mid slots - 3: wx.Colour(235, 204, 209), # red = high slots - 4: '', - 5: ''} - def slotColour(self, slot): - return self.slotColourMap.get(slot) or self.GetBackgroundColour() + return slotColourMap.get(slot) or self.GetBackgroundColour() def refresh(self, stuff): """ diff --git a/gui/display.py b/gui/display.py index 8ee42692e..8a4e36a0b 100644 --- a/gui/display.py +++ b/gui/display.py @@ -206,15 +206,18 @@ class Display(wx.ListCtrl): colItem = self.GetItem(item, i) oldText = colItem.GetText() oldImageId = colItem.GetImage() + oldColour = colItem.GetBackgroundColour(); newText = col.getText(st) if newText is False: col.delayedText(st, self, colItem) newText = "\u21bb" + newColour = self.columnBackground(colItem, st); newImageId = col.getImageId(st) colItem.SetText(newText) colItem.SetImage(newImageId) + colItem.SetBackgroundColour(newColour) mask = 0 @@ -228,6 +231,9 @@ class Display(wx.ListCtrl): if mask: colItem.SetMask(mask) self.SetItem(colItem) + else: + if newColour != oldColour: + self.SetItem(colItem) self.SetItemData(item, id_) @@ -257,3 +263,6 @@ class Display(wx.ListCtrl): def getColumn(self, point): row, _, col = self.HitTestSubItem(point) return col + + def columnBackground(self, colItem, item): + return colItem.GetBackgroundColour()