From 578b04182675d6095eb2714556a9fa49a051054a Mon Sep 17 00:00:00 2001 From: Skybladev2 Date: Sun, 7 Jun 2026 15:57:15 +0300 Subject: [PATCH 1/4] add Omega icon to modules --- gui/builtinMarketBrowser/itemView.py | 3 +- gui/builtinViewColumns/omega.py | 54 ++++++++++++++++++++++++++++ gui/builtinViews/fittingView.py | 1 + gui/viewColumn.py | 1 + 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 gui/builtinViewColumns/omega.py diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index d317532bc8..b22cefd339 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -20,7 +20,8 @@ class ItemView(Display): - DEFAULT_COLS = ["Base Icon", + DEFAULT_COLS = ["Omega", + "Base Icon", "Base Name", "attr:power,,,True", "attr:cpu,,,True"] diff --git a/gui/builtinViewColumns/omega.py b/gui/builtinViewColumns/omega.py new file mode 100644 index 0000000000..0ab3d2f5b3 --- /dev/null +++ b/gui/builtinViewColumns/omega.py @@ -0,0 +1,54 @@ +# noinspection PyPackageRequirements +import wx + +import eos.db +from eos.saveddata.module import Module, Rack +from eos.saveddata.drone import Drone +from gui.viewColumn import ViewColumn + + +_alpha_skill_caps = None + + +def _get_alpha_skill_caps(): + global _alpha_skill_caps + if _alpha_skill_caps is None: + _alpha_skill_caps = {} + alpha_clone = eos.db.getAlphaClone(1) + if alpha_clone is not None: + for skill_entry in alpha_clone.skills: + _alpha_skill_caps[skill_entry.typeID] = skill_entry.level + return _alpha_skill_caps + + +class Omega(ViewColumn): + name = "Omega" + + def __init__(self, fittingView, params): + ViewColumn.__init__(self, fittingView) + self.size = 16 + self.maxsize = self.size + self.mask = wx.LIST_MASK_IMAGE + self.columnText = "\u03A9" + + def getImageId(self, stuff): + if isinstance(stuff, (Module, Drone)): + if stuff.isEmpty: + return -1 + item = stuff.item + else: + item = getattr(stuff, "item", stuff) + if item is None: + return -1 + if item.getAttribute("cloneGradeRestriction", 0) > 0: + return self.fittingView.imageList.GetImageIndex(25874, "icons") + caps = _get_alpha_skill_caps() + if caps: + for skill_item, required_level in item.requiredSkills.items(): + max_alpha_level = caps.get(skill_item.ID) + if max_alpha_level is None or required_level > max_alpha_level: + return self.fittingView.imageList.GetImageIndex(25874, "icons") + return -1 + + +Omega.register() diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index b0bdbf8634..2455d20de4 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -138,6 +138,7 @@ def OnData(self, x, y, t): class FittingView(d.Display): DEFAULT_COLS = ["State", + "Omega", "Ammo Icon", "Base Icon", "Base Name", diff --git a/gui/viewColumn.py b/gui/viewColumn.py index 9eb7cd8112..b195c91d54 100644 --- a/gui/viewColumn.py +++ b/gui/viewColumn.py @@ -86,6 +86,7 @@ def delayedText(self, display, colItem): heat, maxRange, misc, + omega, price, projectionRange, propertyDisplay, From 30dcce30c7c581a05fb52704d2850e30caf9f98b Mon Sep 17 00:00:00 2001 From: Skybladev2 Date: Sun, 7 Jun 2026 21:57:46 +0300 Subject: [PATCH 2/4] fix column width change --- gui/builtinViewColumns/omega.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/builtinViewColumns/omega.py b/gui/builtinViewColumns/omega.py index 0ab3d2f5b3..e364fbd559 100644 --- a/gui/builtinViewColumns/omega.py +++ b/gui/builtinViewColumns/omega.py @@ -26,8 +26,7 @@ class Omega(ViewColumn): def __init__(self, fittingView, params): ViewColumn.__init__(self, fittingView) - self.size = 16 - self.maxsize = self.size + self.size = 20 self.mask = wx.LIST_MASK_IMAGE self.columnText = "\u03A9" From 5edcede64a26587557af7a1622dbdc9cb8646839 Mon Sep 17 00:00:00 2001 From: Skybladev2 Date: Mon, 8 Jun 2026 09:46:04 +0300 Subject: [PATCH 3/4] make add omega icon to hulls + make omega attr persistent --- db_update.py | 21 +++++++++++++++++++++ gui/builtinShipBrowser/shipItem.py | 14 +++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/db_update.py b/db_update.py index 93edcd41d5..0495cce15b 100644 --- a/db_update.py +++ b/db_update.py @@ -649,6 +649,27 @@ def _hardcodeAttribs(typeID, attrMap): else: attr.value = value + def processCloneGradeRestrictions(): + print('processing clone grade restrictions') + alpha_caps = {} + for clone in eos.db.gamedata_session.query(eos.gamedata.AlphaClone).all(): + for skill in clone.skills: + alpha_caps[skill.typeID] = skill.level + for item in eos.db.gamedata_session.query(eos.gamedata.Item).all(): + if not item.reqskills: + continue + try: + reqskills = json.loads(item.reqskills) + except (ValueError, TypeError): + continue + for skill_type_id, required_level in reqskills.items(): + max_alpha_level = alpha_caps.get(int(skill_type_id)) + if max_alpha_level is None or required_level > max_alpha_level: + _hardcodeAttribs(item.ID, {"cloneGradeRestriction": 1}) + break + + processCloneGradeRestrictions() + def _hardcodeEffects(typeID, effectMap, clearEffects=True): item = eos.db.gamedata_session.query(eos.gamedata.Item).filter(eos.gamedata.Item.ID == typeID).one() if clearEffects: diff --git a/gui/builtinShipBrowser/shipItem.py b/gui/builtinShipBrowser/shipItem.py index daff6b5d08..c82eaf633c 100644 --- a/gui/builtinShipBrowser/shipItem.py +++ b/gui/builtinShipBrowser/shipItem.py @@ -93,6 +93,10 @@ def __init__(self, parent, shipID=None, shipFittingInfo=("Test", "TestTrait", 2) self.marketInstance = Market.getInstance() self.baseItem = self.marketInstance.getItem(self.shipID) + self.omegaBmp = None + if self.baseItem.getAttribute("cloneGradeRestriction", 0) > 0: + self.omegaBmp = BitmapLoader.getBitmap("25874", "icons") + # ===================================================================== # DISABLED - it will be added as an option in PREFERENCES @@ -211,7 +215,12 @@ def UpdateElementsPos(self, mdc): self.raceBmpx = self.shipEffx + self.shipEffBk.GetWidth() + self.padding self.raceBmpy = (rect.height - self.raceBmp.GetHeight()) / 2 - self.textStartx = self.raceBmpx + self.raceBmp.GetWidth() + self.padding + self.omegaBmpx = self.raceBmpx + self.raceBmp.GetWidth() + self.padding + omegaWidth = self.omegaBmp.GetWidth() if self.omegaBmp else 0 + omegaHeight = self.omegaBmp.GetHeight() if self.omegaBmp else 0 + self.omegaBmpy = (rect.height - omegaHeight) / 2 + + self.textStartx = self.omegaBmpx + omegaWidth + self.padding self.shipNamey = (rect.height - self.shipBmp.GetHeight()) / 2 @@ -254,6 +263,9 @@ def DrawItem(self, mdc): mdc.DrawBitmap(self.raceDropShadowBmp, round(self.raceBmpx + 1), round(self.raceBmpy + 1)) mdc.DrawBitmap(self.raceBmp, round(self.raceBmpx), round(self.raceBmpy)) + if self.omegaBmp: + mdc.DrawBitmap(self.omegaBmp, round(self.omegaBmpx), round(self.omegaBmpy)) + shipName, shipTrait, fittings = self.shipFittingInfo if fittings < 1: From c616457e852aec91be39c0352839f4b7e9651b15 Mon Sep 17 00:00:00 2001 From: Skybladev2 Date: Tue, 7 Jul 2026 21:36:39 +0300 Subject: [PATCH 4/4] make Omega icons disabled by default --- gui/builtinMarketBrowser/itemView.py | 10 +++++++ .../pyfaGeneralPreferences.py | 29 +++++++++++++++++++ gui/builtinShipBrowser/shipItem.py | 8 +++-- gui/builtinViews/fittingView.py | 10 +++++++ gui/display.py | 4 +-- service/fit.py | 1 + 6 files changed, 57 insertions(+), 5 deletions(-) diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index b22cefd339..20f67b0921 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -6,6 +6,7 @@ from config import slotColourMap, slotColourMapDark from eos.saveddata.module import Module from gui.builtinMarketBrowser.events import ItemSelected, RECENTLY_USED_MODULES, CHARGES_FOR_FIT +from gui.builtinViewColumns.omega import Omega as OmegaCol from gui.contextMenu import ContextMenu from gui.display import Display from gui.utils.staticHelpers import DragDropHelper @@ -59,6 +60,15 @@ def __init__(self, parent, marketBrowser): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.active = [] + self.updateOmegaColumn() + + def updateOmegaColumn(self): + show = Fit.getInstance().serviceFittingOptions["showOmegaIcons"] + omega_idx = self.getColIndex(OmegaCol) + if show and omega_idx is None: + self.insertColumnBySpec(0, "Omega") + elif not show and omega_idx is not None: + self.removeColumn(self.activeColumns[omega_idx]) def delaySearch(self, evt): sFit = Fit.getInstance() diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index 40c17083b2..afb5becb95 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -141,6 +141,14 @@ def langDisplay(langInfo): wx.DefaultPosition, wx.DefaultSize, 0) mainSizer.Add(self.cbShowShipBrowserTooltip, 0, wx.ALL | wx.EXPAND, 5) + self.cbShowOmegaIcons = wx.CheckBox(panel, wx.ID_ANY, _t("Show Omega icons for hulls and modules"), + wx.DefaultPosition, wx.DefaultSize, 0) + if "wxGTK" not in wx.PlatformInfo: + self.cbShowOmegaIcons.SetCursor(helpCursor) + self.cbShowOmegaIcons.SetToolTip(wx.ToolTip( + _t('Shows icons for items that require Omega clone access.'))) + mainSizer.Add(self.cbShowOmegaIcons, 0, wx.ALL | wx.EXPAND, 5) + self.cbReloadAll = wx.CheckBox(panel, wx.ID_ANY, _t("Change charge in all modules of the same type"), wx.DefaultPosition, wx.DefaultSize, 0) if "wxGTK" not in wx.PlatformInfo: @@ -176,6 +184,7 @@ def langDisplay(langInfo): self.cbGaugeAnimation.SetValue(self.sFit.serviceFittingOptions["enableGaugeAnimation"]) self.cbOpenFitInNew.SetValue(self.sFit.serviceFittingOptions["openFitInNew"]) self.cbShowShipBrowserTooltip.SetValue(self.sFit.serviceFittingOptions["showShipBrowserTooltip"]) + self.cbShowOmegaIcons.SetValue(self.sFit.serviceFittingOptions["showOmegaIcons"]) self.cbReloadAll.SetValue(self.sFit.serviceFittingOptions["ammoChangeAll"]) self.cbExpMutants.SetValue(self.sFit.serviceFittingOptions["expandedMutantNames"]) self.rbAddLabels.SetSelection(self.sFit.serviceFittingOptions["additionsLabels"]) @@ -192,6 +201,7 @@ def langDisplay(langInfo): self.cbGaugeAnimation.Bind(wx.EVT_CHECKBOX, self.onCBGaugeAnimation) self.cbOpenFitInNew.Bind(wx.EVT_CHECKBOX, self.onCBOpenFitInNew) self.cbShowShipBrowserTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowShipBrowserTooltip) + self.cbShowOmegaIcons.Bind(wx.EVT_CHECKBOX, self.onCBShowOmegaIcons) self.cbReloadAll.Bind(wx.EVT_CHECKBOX, self.onCBReloadAll) self.cbExpMutants.Bind(wx.EVT_CHECKBOX, self.onCBExpMutants) @@ -273,6 +283,25 @@ def onCBOpenFitInNew(self, event): def onCBShowShipBrowserTooltip(self, event): self.sFit.serviceFittingOptions["showShipBrowserTooltip"] = self.cbShowShipBrowserTooltip.GetValue() + def onCBShowOmegaIcons(self, event): + self.sFit.serviceFittingOptions["showOmegaIcons"] = self.cbShowOmegaIcons.GetValue() + + from gui.builtinViews.fittingView import FittingView + for page in self.mainFrame.fitMultiSwitch._pages: + if isinstance(page, FittingView): + page.updateOmegaColumn() + + iView = self.mainFrame.marketBrowser.itemView + iView.updateOmegaColumn() + if iView.active: + iView.update(iView.active) + + fitID = self.mainFrame.getActiveFit() + if fitID is not None: + wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,))) + + event.Skip() + def onCBReloadAll(self, event): self.sFit.serviceFittingOptions["ammoChangeAll"] = self.cbReloadAll.GetValue() diff --git a/gui/builtinShipBrowser/shipItem.py b/gui/builtinShipBrowser/shipItem.py index c82eaf633c..e7c03db83c 100644 --- a/gui/builtinShipBrowser/shipItem.py +++ b/gui/builtinShipBrowser/shipItem.py @@ -94,8 +94,6 @@ def __init__(self, parent, shipID=None, shipFittingInfo=("Test", "TestTrait", 2) self.baseItem = self.marketInstance.getItem(self.shipID) self.omegaBmp = None - if self.baseItem.getAttribute("cloneGradeRestriction", 0) > 0: - self.omegaBmp = BitmapLoader.getBitmap("25874", "icons") # ===================================================================== # DISABLED - it will be added as an option in PREFERENCES @@ -215,9 +213,13 @@ def UpdateElementsPos(self, mdc): self.raceBmpx = self.shipEffx + self.shipEffBk.GetWidth() + self.padding self.raceBmpy = (rect.height - self.raceBmp.GetHeight()) / 2 - self.omegaBmpx = self.raceBmpx + self.raceBmp.GetWidth() + self.padding + sFit = Fit.getInstance() + self.omegaBmp = None + if sFit.serviceFittingOptions["showOmegaIcons"] and self.baseItem.getAttribute("cloneGradeRestriction", 0) > 0: + self.omegaBmp = BitmapLoader.getBitmap("25874", "icons") omegaWidth = self.omegaBmp.GetWidth() if self.omegaBmp else 0 omegaHeight = self.omegaBmp.GetHeight() if self.omegaBmp else 0 + self.omegaBmpx = self.raceBmpx + self.raceBmp.GetWidth() + self.padding self.omegaBmpy = (rect.height - omegaHeight) / 2 self.textStartx = self.omegaBmpx + omegaWidth + self.padding diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 2455d20de4..468e071dc0 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -35,6 +35,7 @@ from gui.bitmap_loader import BitmapLoader from gui.builtinMarketBrowser.events import ITEM_SELECTED from gui.builtinShipBrowser.events import EVT_FIT_SELECTED, FitSelected +from gui.builtinViewColumns.omega import Omega as OmegaCol from gui.builtinViewColumns.state import State from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED from gui.contextMenu import ContextMenu @@ -154,6 +155,7 @@ class FittingView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent, size=(0, 0), style=wx.BORDER_NONE) + self.updateOmegaColumn() self.Show(False) self.parent = parent self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) @@ -185,6 +187,14 @@ def __init__(self, parent): pyfalog.debug("------------------ new fitting view -------------------") pyfalog.debug(self) + def updateOmegaColumn(self): + show = Fit.getInstance().serviceFittingOptions["showOmegaIcons"] + omega_idx = self.getColIndex(OmegaCol) + if show and omega_idx is None: + self.insertColumnBySpec(1, "Omega") + elif not show and omega_idx is not None: + self.removeColumn(self.activeColumns[omega_idx]) + def OnLeaveWindow(self, event): self.SetToolTip(None) self.hoveredRow = None diff --git a/gui/display.py b/gui/display.py index 907060f245..c2297d96bb 100644 --- a/gui/display.py +++ b/gui/display.py @@ -88,7 +88,7 @@ def HitTestSubItem(self, pt): # noinspection PyPropertyAccess def addColumn(self, i, col): - self.activeColumns.append(col) + self.activeColumns.insert(i, col) info = wx.ListItem() info.SetMask(col.mask | wx.LIST_MASK_FORMAT) if col.imageId not in (None, -1): @@ -124,7 +124,7 @@ def insertColumnBySpec(self, i, colSpec): col = ViewColumn.getColumn(colSpec)(self, None) self.addColumn(i, col) - self.columnsMinWidth.append(self.GetColumnWidth(i)) + self.columnsMinWidth.insert(i, self.GetColumnWidth(i)) def removeColumn(self, col): i = self.getColIndex(type(col)) diff --git a/service/fit.py b/service/fit.py index 4e3a1aa7bc..83b7e2ad51 100644 --- a/service/fit.py +++ b/service/fit.py @@ -94,6 +94,7 @@ def __init__(self): "ammoChangeAll": False, "additionsLabels": 1, "expandedMutantNames": False, + "showOmegaIcons": False, } self.serviceFittingOptions = SettingsProvider.getInstance().getSettings(