From 2ea3394845569b9247e445de9d32ed2faa85f156 Mon Sep 17 00:00:00 2001 From: Tony Cook Date: Fri, 15 Feb 2019 19:04:50 +1100 Subject: [PATCH 1/5] make the item list colour per slot if colorFitBySlot set attempts to resolve #1839 --- gui/builtinMarketBrowser/itemView.py | 12 ++++++++++++ gui/builtinPreferenceViews/pyfaGeneralPreferences.py | 2 ++ gui/display.py | 9 +++++++++ 3 files changed, 23 insertions(+) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 82454502a..44e55f1a2 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -28,6 +28,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 +267,14 @@ class ItemView(Display): revmap[mgid] = i i += 1 return revmap + + slotColourMap = { 'loPower' : wx.Colour(250, 235, 204), + 'medPower': wx.Colour(188, 215, 241), + 'hiPower' : wx.Colour(235, 204, 209) } + + def columnBackground(self, colItem, item): + if self.sFit.serviceFittingOptions["colorFitBySlot"]: + for effectName in self.slotColourMap: + if effectName in item.effects: + return self.slotColourMap[effectName] + return wx.Colour(255, 255, 255) diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index 51d32ab5d..ef45d54ac 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -166,6 +166,8 @@ class PFGeneralPref(PreferenceView): fitID = self.mainFrame.getActiveFit() self.sFit.refreshFit(fitID) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + iView = self.mainFrame.marketBrowser.itemView; + iView.update(iView.active) event.Skip() def onCBGlobalRackSlots(self, event): 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() From af17a4f1c9c32b00dd5dece8548faa66b9559fc4 Mon Sep 17 00:00:00 2001 From: Tony Cook Date: Fri, 1 Mar 2019 19:24:39 +1100 Subject: [PATCH 2/5] make slot a property for item and use that for the item list bg --- eos/gamedata.py | 16 ++++++++++++++++ gui/builtinMarketBrowser/itemView.py | 12 ++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/eos/gamedata.py b/eos/gamedata.py index 5ec2a1e14..c00c145a9 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -240,6 +240,7 @@ class Item(EqBase): self.__assistive = None self.__overrides = None self.__priceObj = None + self.__slot = None @property def attributes(self): @@ -479,6 +480,21 @@ class Item(EqBase): def isCharge(self): return self.category.name == "Charge" + effectSlots = { 'loPower' : 1, + 'medPower' : 2, + 'hiPower' : 3, + 'rigSlot' : 4, + 'subSystem': 5 } + @property + def slot(self): + if self.__slot is None: + self.__slot = 0 + for effectName in self.effectSlots: + if effectName in self.effects: + self.__slot = self.effectSlots[effectName] + break + return self.__slot; + def __repr__(self): return "Item(ID={}, name={}) at {}".format( self.ID, self.name, hex(id(self)) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 44e55f1a2..83be7e22f 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -268,13 +268,13 @@ class ItemView(Display): i += 1 return revmap - slotColourMap = { 'loPower' : wx.Colour(250, 235, 204), - 'medPower': wx.Colour(188, 215, 241), - 'hiPower' : wx.Colour(235, 204, 209) } + slotColourMap = { 1: wx.Colour(250, 235, 204), + 2: wx.Colour(188, 215, 241), + 3: wx.Colour(235, 204, 209) } def columnBackground(self, colItem, item): if self.sFit.serviceFittingOptions["colorFitBySlot"]: - for effectName in self.slotColourMap: - if effectName in item.effects: - return self.slotColourMap[effectName] + slot = item.slot; + if slot in self.slotColourMap: + return self.slotColourMap[slot] return wx.Colour(255, 255, 255) From 9bdb4ea9677c11eb212bfdb2ca3642a03d20fee5 Mon Sep 17 00:00:00 2001 From: Tony Cook Date: Fri, 1 Mar 2019 19:47:04 +1100 Subject: [PATCH 3/5] move the item slot colours to config and use it from there --- config.py | 6 ++++++ gui/builtinMarketBrowser/itemView.py | 13 +++++-------- gui/builtinViews/fittingView.py | 9 ++------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/config.py b/config.py index 4e1234e90..fd5ba387c 100644 --- a/config.py +++ b/config.py @@ -1,6 +1,7 @@ import os import sys import yaml +import wx from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \ StreamHandler, TimedRotatingFileHandler, WARNING @@ -47,6 +48,11 @@ LOGLEVEL_MAP = { "debug": DEBUG, } +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 getClientSecret(): return clientHash diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 83be7e22f..7f26a9055 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -8,6 +8,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__) @@ -268,13 +269,9 @@ class ItemView(Display): i += 1 return revmap - slotColourMap = { 1: wx.Colour(250, 235, 204), - 2: wx.Colour(188, 215, 241), - 3: wx.Colour(235, 204, 209) } - def columnBackground(self, colItem, item): if self.sFit.serviceFittingOptions["colorFitBySlot"]: - slot = item.slot; - if slot in self.slotColourMap: - return self.slotColourMap[slot] - return wx.Colour(255, 255, 255) + slot = item.slot + return slotColourMap.get(slot) or self.GetBackgroundColour() + else: + return self.GetBackgroundColour() 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): """ From f8e6474b39576d8906e12a304405bbe2df4022d5 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 2 Mar 2019 17:21:46 -0500 Subject: [PATCH 4/5] Some slight tweaks to work done by @tonycoz for #1839 --- config.py | 13 +++++++----- eos/const.py | 26 +++++++++++++++++++++++ eos/gamedata.py | 16 -------------- eos/saveddata/module.py | 31 ++++------------------------ gui/builtinMarketBrowser/itemView.py | 4 ++-- 5 files changed, 40 insertions(+), 50 deletions(-) create mode 100644 eos/const.py diff --git a/config.py b/config.py index 7d8f310f2..7f347eb3c 100644 --- a/config.py +++ b/config.py @@ -6,6 +6,7 @@ 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 @@ -48,11 +49,13 @@ LOGLEVEL_MAP = { "debug": DEBUG, } -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: '' } +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/gamedata.py b/eos/gamedata.py index 7c08d6d18..1abb3f69b 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -240,7 +240,6 @@ class Item(EqBase): self.__assistive = None self.__overrides = None self.__priceObj = None - self.__slot = None @property def attributes(self): @@ -480,21 +479,6 @@ class Item(EqBase): def isCharge(self): return self.category.name == "Charge" - effectSlots = { 'loPower' : 1, - 'medPower' : 2, - 'hiPower' : 3, - 'rigSlot' : 4, - 'subSystem': 5 } - @property - def slot(self): - if self.__slot is None: - self.__slot = 0 - for effectName in self.effectSlots: - if effectName in self.effects: - self.__slot = self.effectSlots[effectName] - break - return self.__slot; - def __repr__(self): return "Item(ID={}, name={}) at {}".format( self.ID, self.name, hex(id(self)) 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 7f26a9055..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 @@ -271,7 +272,6 @@ class ItemView(Display): def columnBackground(self, colItem, item): if self.sFit.serviceFittingOptions["colorFitBySlot"]: - slot = item.slot - return slotColourMap.get(slot) or self.GetBackgroundColour() + return slotColourMap.get(Module.calculateSlot(item)) or self.GetBackgroundColour() else: return self.GetBackgroundColour() From 114d72e23fa88b04b5e86bfc98263771e9eb9cc8 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 2 Mar 2019 17:35:30 -0500 Subject: [PATCH 5/5] Fix bug for when updating preferences before loading anything into ItemView --- gui/builtinPreferenceViews/pyfaGeneralPreferences.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index ef45d54ac..8b1c0f27a 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -162,12 +162,17 @@ 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)) - iView = self.mainFrame.marketBrowser.itemView; - iView.update(iView.active) event.Skip() def onCBGlobalRackSlots(self, event):