From 28cfaf1702a8f14116110b6452df887d1f02fcde Mon Sep 17 00:00:00 2001 From: Alexandros Kosiaris Date: Tue, 27 May 2014 17:00:31 +0300 Subject: [PATCH 1/4] Add mining yield view Add a panel for displaying the mining yield. Display miner and drone yield. Only create the frontend in this commit. --- eos/saveddata/fit.py | 35 ++++++ gui/builtinStatsViews/__init__.py | 2 +- gui/builtinStatsViews/miningyieldViewFull.py | 114 +++++++++++++++++++ gui/statsPane.py | 3 +- 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 gui/builtinStatsViews/miningyieldViewFull.py diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 8bb7a4ac1..30991b4e6 100755 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -734,8 +734,10 @@ class Fit(object): self.__extraDrains = [] self.__ehp = None self.__weaponDPS = None + self.__minerYield = None self.__weaponVolley = None self.__droneDPS = None + self.__droneYield = None self.__sustainableTank = None self.__effectiveSustainableTank = None self.__effectiveTank = None @@ -837,6 +839,24 @@ class Fit(object): def totalDPS(self): return self.droneDPS + self.weaponDPS + @property + def minerYield(self): + if self.__minerYield is None: + self.calculateMiningStats() + + return self.__minerYield + + @property + def droneYield(self): + if self.__droneYield is None: + self.calculateMiningStats() + + return self.__droneYield + + @property + def totalYield(self): + return self.droneYield + self.minerYield + @property def maxTargets(self): return min(self.extraAttributes["maxTargetsLockedFromSkills"], self.ship.getModifiedItemAttr("maxLockedTargets")) @@ -895,10 +915,12 @@ class Fit(object): def clear(self): self.__effectiveTank = None self.__weaponDPS = None + self.__minerYield = None self.__weaponVolley = None self.__effectiveSustainableTank = None self.__sustainableTank = None self.__droneDPS = None + self.__droneYield = None self.__ehp = None self.__calculated = False self.__capStable = None @@ -1418,6 +1440,19 @@ class Fit(object): else: return self.ship.getModifiedItemAttr("scanSpeed") / 1000.0 + def calculateMiningStats(self): + minerYield = 0 + droneYield = 0 + + for mod in self.modules: + minerYield += mod.miningStats + + for drone in self.drones: + droneYield += drone.miningStats + + self.__minerYield = minerYield + self.__droneYield = droneYield + def calculateWeaponStats(self): weaponDPS = 0 droneDPS = 0 diff --git a/gui/builtinStatsViews/__init__.py b/gui/builtinStatsViews/__init__.py index e4e7b9369..5f2ca646e 100644 --- a/gui/builtinStatsViews/__init__.py +++ b/gui/builtinStatsViews/__init__.py @@ -1,3 +1,3 @@ __all__ = ["resourcesViewFull", "resistancesViewFull", "rechargeViewFull", "firepowerViewFull", "capacitorViewFull", - "targetingMiscViewFull", "priceViewFull"] + "targetingMiscViewFull", "priceViewFull", "miningyieldViewFull"] diff --git a/gui/builtinStatsViews/miningyieldViewFull.py b/gui/builtinStatsViews/miningyieldViewFull.py new file mode 100644 index 000000000..f8d6fb097 --- /dev/null +++ b/gui/builtinStatsViews/miningyieldViewFull.py @@ -0,0 +1,114 @@ +#=============================================================================== +# Copyright (C) 2014 Alexandros Kosiaris +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +#=============================================================================== + +import wx +from gui.statsView import StatsView +from gui import builtinStatsViews +from gui import bitmapLoader +from gui.utils.numberFormatter import formatAmount + +class MiningYieldViewFull(StatsView): + name = "miningyieldViewFull" + def __init__(self, parent): + StatsView.__init__(self) + self.parent = parent + self._cachedValues = [] + def getHeaderText(self, fit): + return "Mining Yield" + + def getTextExtentW(self, text): + width, height = self.parent.GetTextExtent( text ) + return width + + def populatePanel(self, contentPanel, headerPanel): + contentSizer = contentPanel.GetSizer() + parent = self.panel = contentPanel + self.headerPanel = headerPanel + + panel = "full" + + sizerMiningYield = wx.GridSizer(1, 3) + contentSizer.Add( sizerMiningYield, 0, wx.EXPAND | wx.ALL, 0) + + counter = 0 + + for miningType, image in (("miner", "mining") , ("drone", "drones")): + baseBox = wx.BoxSizer(wx.HORIZONTAL) + sizerMiningYield.Add(baseBox, 1, wx.ALIGN_LEFT) + + baseBox.Add(bitmapLoader.getStaticBitmap("%s_big" % image, parent, "icons"), 0, wx.ALIGN_CENTER) + + box = wx.BoxSizer(wx.VERTICAL) + baseBox.Add(box, 0, wx.EXPAND) + + box.Add(wx.StaticText(parent, wx.ID_ANY, miningType.capitalize()), 0, wx.ALIGN_LEFT) + + hbox = wx.BoxSizer(wx.HORIZONTAL) + box.Add(hbox, 1, wx.EXPAND) + + lbl = wx.StaticText(parent, wx.ID_ANY, u"0.0 m\u00B3/s") + setattr(self, "label%sminingyield%s" % (panel.capitalize() ,miningType.capitalize()), lbl) + + hbox.Add(lbl, 0, wx.ALIGN_LEFT) + self._cachedValues.append(0) + counter += 1 + targetSizer = sizerMiningYield + + baseBox = wx.BoxSizer(wx.HORIZONTAL) + targetSizer.Add(baseBox, 0, wx.ALIGN_LEFT) + + baseBox.Add(bitmapLoader.getStaticBitmap("cargoBay_big", parent, "icons"), 0, wx.ALIGN_CENTER) + + box = wx.BoxSizer(wx.VERTICAL) + baseBox.Add(box, 0, wx.EXPAND) + + box.Add(wx.StaticText(parent, wx.ID_ANY, "Total"), 0, wx.ALIGN_LEFT) + + hbox = wx.BoxSizer(wx.HORIZONTAL) + box.Add(hbox, 1, wx.EXPAND) + + lbl = wx.StaticText(parent, wx.ID_ANY, u"0.0 m\u00B3/s") + setattr(self, "label%sminingyieldTotal" % panel.capitalize(), lbl) + hbox.Add(lbl, 0, wx.ALIGN_LEFT) + + self._cachedValues.append(0) + + def refreshPanel(self, fit): + #If we did anything intresting, we'd update our labels to reflect the new fit's stats here + + stats = (("labelFullminingyieldMiner", lambda: fit.minerYield, 3, 0, 0, u"%s m\u00B3/s",None), + ("labelFullminingyieldDrone", lambda: fit.droneYield, 3, 0, 0, u"%s m\u00B3/s", None), + ("labelFullminingyieldTotal", lambda: fit.totalYield, 3, 0, 0, u"%s m\u00B3/s", None)) + + counter = 0 + for labelName, value, prec, lowest, highest, valueFormat, altFormat in stats: + label = getattr(self, labelName) + value = value() if fit is not None else 0 + value = value if value is not None else 0 + if self._cachedValues[counter] != value: + valueStr = formatAmount(value, prec, lowest, highest) + label.SetLabel(valueFormat % valueStr) + tipStr = valueFormat % valueStr if altFormat is None else altFormat % value + label.SetToolTip(wx.ToolTip(tipStr)) + self._cachedValues[counter] = value + counter +=1 + self.panel.Layout() + self.headerPanel.Layout() + +MiningYieldViewFull.register() diff --git a/gui/statsPane.py b/gui/statsPane.py index 37331e875..5af8a0ac4 100644 --- a/gui/statsPane.py +++ b/gui/statsPane.py @@ -29,7 +29,8 @@ import gui.globalEvents as GE class StatsPane(wx.Panel): DEFAULT_VIEWS = ["resourcesViewFull", "resistancesViewFull" ,"rechargeViewFull", "firepowerViewFull", - "capacitorViewFull", "targetingmiscViewFull", "priceViewFull"] + "capacitorViewFull", "targetingmiscViewFull", + "priceViewFull", "miningyieldViewFull"] def fitChanged(self, event): cFit = service.Fit.getInstance() From d08b1c8284e2ff242d6f9e2e6b664982988b9513 Mon Sep 17 00:00:00 2001 From: Alexandros Kosiaris Date: Wed, 28 May 2014 16:19:44 +0300 Subject: [PATCH 2/4] Calculate mining yields for module/drone Following the weaponStats paradigm, add mining yield information throughout the drone/module modules --- eos/saveddata/drone.py | 24 ++++++++++++++++++++++++ eos/saveddata/module.py | 23 +++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index b07484848..bd5812c4b 100755 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -23,6 +23,7 @@ from sqlalchemy.orm import validates, reconstructor class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): DAMAGE_ATTRIBUTES = ("emDamage", "kineticDamage", "explosiveDamage", "thermalDamage") + MINING_ATTRIBUTES = ("miningAmount",) def __init__(self, item): if item.category.name != "Drone": @@ -34,6 +35,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.amount = 0 self.amountActive = 0 self.__dps = None + self.__miningyield = None self.projected = False self.__itemModifiedAttributes = ModifiedAttributeDict() self.itemModifiedAttributes.original = self.item.attributes @@ -41,6 +43,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): @reconstructor def init(self): self.__dps = None + self.__miningyield = None self.__item = None self.__charge = None @@ -97,6 +100,11 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if attr in self.itemModifiedAttributes or attr in self.chargeModifiedAttributes: return True + @property + def mines(self): + if "miningAmount" in self.itemModifiedAttributes: + return True + @property def hasAmmo(self): return self.charge is not None @@ -121,6 +129,21 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return self.__dps + @property + def miningStats(self): + if self.__miningyield == None: + if self.mines is True and self.amountActive > 0: + attr = "duration" + getter = self.getModifiedItemAttr + + cycleTime = self.getModifiedItemAttr(attr) + volley = sum(map(lambda d: getter(d), self.MINING_ATTRIBUTES)) * self.amountActive + self.__miningyield = volley / (cycleTime / 1000.0) + else: + self.__miningyield = 0 + + return self.__miningyield + @property def maxRange(self): attrs = ("shieldTransferRange", "powerTransferRange", @@ -158,6 +181,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): def clear(self): self.__dps = None + self.__miningyield = None self.itemModifiedAttributes.clear() self.chargeModifiedAttributes.clear() diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 433a43db5..9e8121f4d 100755 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -45,6 +45,7 @@ class Hardpoint(Enum): class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): """An instance of this class represents a module together with its charge and modified attributes""" DAMAGE_ATTRIBUTES = ("emDamage", "kineticDamage", "explosiveDamage", "thermalDamage") + MINING_ATTRIBUTES = ("miningAmount", ) def __init__(self, item): self.__item = item if item != None else 0 @@ -53,6 +54,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.projected = False self.state = State.ONLINE self.__dps = None + self.__miningyield = None self.__volley = None self.__reloadTime = None self.__reloadForce = None @@ -74,6 +76,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__charge = None self.__volley = None self.__dps = None + self.__miningyield = None self.__reloadTime = None self.__reloadForce = None self.__chargeCycles = None @@ -82,6 +85,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__item = 0 self.__charge = 0 self.__dps = 0 + self.__miningyield = 0 self.__volley = 0 self.__reloadTime = 0 self.__reloadForce = None @@ -330,6 +334,24 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return self.__dps, self.__volley + @property + def miningStats(self): + if self.__miningyield == None: + if self.isEmpty: + self.__miningyield = 0 + else: + if self.state >= State.ACTIVE: + volley = sum(map(lambda attr: self.getModifiedItemAttr(attr) or 0, self.MINING_ATTRIBUTES)) + if volley: + cycleTime = self.cycleTime + self.__miningyield = volley / (cycleTime / 1000.0) + else: + self.__miningyield = 0 + else: + self.__miningyield = 0 + + return self.__miningyield + @property def dps(self): return self.damageStats[0] @@ -552,6 +574,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): def clear(self): self.__dps = None + self.__miningyield = None self.__volley = None self.__reloadTime = None self.__reloadForce = None From bd60733bfe4973d1fa3a5ab2a834aba7da17bc1b Mon Sep 17 00:00:00 2001 From: Alexandros Kosiaris Date: Mon, 2 Jun 2014 19:46:45 +0300 Subject: [PATCH 3/4] Use a button to toggle between firepower/miningyield Introduce a button on both firepowerViewFull and miningyieldViewFull views that allows switching between the two. Work by destroying each view and recreating/populating on every button press. --- gui/builtinStatsViews/firepowerViewFull.py | 34 ++++++++++++++- gui/builtinStatsViews/miningyieldViewFull.py | 46 +++++++++++++++++--- gui/statsPane.py | 2 +- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/gui/builtinStatsViews/firepowerViewFull.py b/gui/builtinStatsViews/firepowerViewFull.py index 7db56074d..3d552435e 100644 --- a/gui/builtinStatsViews/firepowerViewFull.py +++ b/gui/builtinStatsViews/firepowerViewFull.py @@ -18,8 +18,9 @@ #=============================================================================== import wx +import service +import gui.mainFrame from gui.statsView import StatsView -from gui import builtinStatsViews from gui import bitmapLoader from gui.utils.numberFormatter import formatAmount @@ -43,7 +44,7 @@ class FirepowerViewFull(StatsView): panel = "full" - sizerFirepower = wx.FlexGridSizer(1, 3) + sizerFirepower = wx.FlexGridSizer(1, 4) sizerFirepower.AddGrowableCol(1) contentSizer.Add( sizerFirepower, 0, wx.EXPAND, 0) @@ -97,6 +98,35 @@ class FirepowerViewFull(StatsView): gridS.Add(lbl, 0, wx.ALIGN_LEFT) + image = bitmapLoader.getBitmap("mining_big", "icons") + miningyield = wx.BitmapButton(contentPanel, -1, image) + miningyield.SetToolTip(wx.ToolTip("Click to toggle to Mining Yield ")) + miningyield.Bind(wx.EVT_BUTTON, self.switchToMiningYieldView) + sizerFirepower.Add(miningyield, 0, wx.ALIGN_LEFT) + + self._cachedValues.append(0) + + def switchToMiningYieldView(self, event): + # Getting the active fit + mainFrame = gui.mainFrame.MainFrame.getInstance() + sFit = service.Fit.getInstance() + fit = sFit.getFit(mainFrame.getActiveFit()) + # Remove ourselves from statsPane's view list + self.parent.views.remove(self) + self._cachedValues = [] + # And no longer display us + self.panel.GetSizer().Clear(True) + self.panel.GetSizer().Layout() + # Get the new view + view = StatsView.getView("miningyieldViewFull")(self.parent) + view.populatePanel(self.panel, self.headerPanel) + # Populate us in statsPane's view list + self.parent.views.append(view) + # Get the TogglePanel + tp = self.panel.GetParent() + tp.SetLabel(view.getHeaderText(fit)) + view.refreshPanel(fit) + def refreshPanel(self, fit): #If we did anything intresting, we'd update our labels to reflect the new fit's stats here diff --git a/gui/builtinStatsViews/miningyieldViewFull.py b/gui/builtinStatsViews/miningyieldViewFull.py index f8d6fb097..9d9ec617a 100644 --- a/gui/builtinStatsViews/miningyieldViewFull.py +++ b/gui/builtinStatsViews/miningyieldViewFull.py @@ -18,8 +18,9 @@ #=============================================================================== import wx +import service +import gui.mainFrame from gui.statsView import StatsView -from gui import builtinStatsViews from gui import bitmapLoader from gui.utils.numberFormatter import formatAmount @@ -43,29 +44,31 @@ class MiningYieldViewFull(StatsView): panel = "full" - sizerMiningYield = wx.GridSizer(1, 3) - contentSizer.Add( sizerMiningYield, 0, wx.EXPAND | wx.ALL, 0) + sizerMiningYield = wx.FlexGridSizer(1, 4) + sizerMiningYield.AddGrowableCol(1) + + contentSizer.Add( sizerMiningYield, 0, wx.EXPAND, 0) counter = 0 for miningType, image in (("miner", "mining") , ("drone", "drones")): baseBox = wx.BoxSizer(wx.HORIZONTAL) - sizerMiningYield.Add(baseBox, 1, wx.ALIGN_LEFT) + sizerMiningYield.Add(baseBox, 1, wx.ALIGN_LEFT if counter == 0 else wx.ALIGN_CENTER_HORIZONTAL) baseBox.Add(bitmapLoader.getStaticBitmap("%s_big" % image, parent, "icons"), 0, wx.ALIGN_CENTER) box = wx.BoxSizer(wx.VERTICAL) - baseBox.Add(box, 0, wx.EXPAND) + baseBox.Add(box, 0, wx.ALIGN_CENTER) box.Add(wx.StaticText(parent, wx.ID_ANY, miningType.capitalize()), 0, wx.ALIGN_LEFT) hbox = wx.BoxSizer(wx.HORIZONTAL) - box.Add(hbox, 1, wx.EXPAND) + box.Add(hbox, 1, wx.ALIGN_CENTER) lbl = wx.StaticText(parent, wx.ID_ANY, u"0.0 m\u00B3/s") setattr(self, "label%sminingyield%s" % (panel.capitalize() ,miningType.capitalize()), lbl) - hbox.Add(lbl, 0, wx.ALIGN_LEFT) + hbox.Add(lbl, 0, wx.ALIGN_CENTER) self._cachedValues.append(0) counter += 1 targetSizer = sizerMiningYield @@ -89,6 +92,35 @@ class MiningYieldViewFull(StatsView): self._cachedValues.append(0) + image = bitmapLoader.getBitmap("turret_big", "icons") + firepower = wx.BitmapButton(contentPanel, -1, image) + firepower.SetToolTip(wx.ToolTip("Click to toggle to Firepower View")) + firepower.Bind(wx.EVT_BUTTON, self.switchToFirepowerView) + sizerMiningYield.Add(firepower, 0, wx.ALIGN_LEFT) + + self._cachedValues.append(0) + + def switchToFirepowerView(self, event): + # Getting the active fit + mainFrame = gui.mainFrame.MainFrame.getInstance() + sFit = service.Fit.getInstance() + fit = sFit.getFit(mainFrame.getActiveFit()) + # Remove ourselves from statsPane's view list + self.parent.views.remove(self) + self._cachedValues = [] + # And no longer display us + self.panel.GetSizer().Clear(True) + self.panel.GetSizer().Layout() + # Get the new view + view = StatsView.getView("firepowerViewFull")(self.parent) + view.populatePanel(self.panel, self.headerPanel) + # Populate us in statsPane's view list + self.parent.views.append(view) + # Get the TogglePanel + tp = self.panel.GetParent() + tp.SetLabel(view.getHeaderText(fit)) + view.refreshPanel(fit) + def refreshPanel(self, fit): #If we did anything intresting, we'd update our labels to reflect the new fit's stats here diff --git a/gui/statsPane.py b/gui/statsPane.py index 5af8a0ac4..7bac879fd 100644 --- a/gui/statsPane.py +++ b/gui/statsPane.py @@ -30,7 +30,7 @@ import gui.globalEvents as GE class StatsPane(wx.Panel): DEFAULT_VIEWS = ["resourcesViewFull", "resistancesViewFull" ,"rechargeViewFull", "firepowerViewFull", "capacitorViewFull", "targetingmiscViewFull", - "priceViewFull", "miningyieldViewFull"] + "priceViewFull",] def fitChanged(self, event): cFit = service.Fit.getInstance() From e2abc51bbf479e0ccda4806b4c75256612978ec3 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 12 Jun 2014 19:22:29 -0400 Subject: [PATCH 4/4] Use small icon with mining yield / firepower toggle button --- gui/builtinStatsViews/firepowerViewFull.py | 18 ++++++++++++------ gui/builtinStatsViews/miningyieldViewFull.py | 2 +- icons/mining_small.png | Bin 0 -> 799 bytes icons/turret_small.png | Bin 0 -> 777 bytes 4 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 icons/mining_small.png create mode 100644 icons/turret_small.png diff --git a/gui/builtinStatsViews/firepowerViewFull.py b/gui/builtinStatsViews/firepowerViewFull.py index 3d552435e..1b26b2662 100644 --- a/gui/builtinStatsViews/firepowerViewFull.py +++ b/gui/builtinStatsViews/firepowerViewFull.py @@ -46,7 +46,7 @@ class FirepowerViewFull(StatsView): sizerFirepower = wx.FlexGridSizer(1, 4) sizerFirepower.AddGrowableCol(1) - + contentSizer.Add( sizerFirepower, 0, wx.EXPAND, 0) counter = 0 @@ -98,11 +98,11 @@ class FirepowerViewFull(StatsView): gridS.Add(lbl, 0, wx.ALIGN_LEFT) - image = bitmapLoader.getBitmap("mining_big", "icons") - miningyield = wx.BitmapButton(contentPanel, -1, image) - miningyield.SetToolTip(wx.ToolTip("Click to toggle to Mining Yield ")) - miningyield.Bind(wx.EVT_BUTTON, self.switchToMiningYieldView) - sizerFirepower.Add(miningyield, 0, wx.ALIGN_LEFT) + image = bitmapLoader.getBitmap("mining_small", "icons") + self.miningyield = wx.BitmapButton(contentPanel, -1, image) + self.miningyield.SetToolTip(wx.ToolTip("Click to toggle to Mining Yield ")) + self.miningyield.Bind(wx.EVT_BUTTON, self.switchToMiningYieldView) + sizerFirepower.Add(self.miningyield, 0, wx.ALIGN_LEFT) self._cachedValues.append(0) @@ -134,6 +134,11 @@ class FirepowerViewFull(StatsView): ("labelFullDpsDrone", lambda: fit.droneDPS, 3, 0, 0, "%s DPS", None), ("labelFullVolleyTotal", lambda: fit.weaponVolley, 3, 0, 0, "%s", "Volley: %.1f"), ("labelFullDpsTotal", lambda: fit.totalDPS, 3, 0, 0, "%s", None)) + # See GH issue # + #if fit is not None and fit.totalYield > 0: + # self.miningyield.Show() + #else: + # self.miningyield.Hide() counter = 0 for labelName, value, prec, lowest, highest, valueFormat, altFormat in stats: @@ -147,6 +152,7 @@ class FirepowerViewFull(StatsView): label.SetToolTip(wx.ToolTip(tipStr)) self._cachedValues[counter] = value counter +=1 + self.panel.Layout() self.headerPanel.Layout() diff --git a/gui/builtinStatsViews/miningyieldViewFull.py b/gui/builtinStatsViews/miningyieldViewFull.py index 9d9ec617a..a83800d70 100644 --- a/gui/builtinStatsViews/miningyieldViewFull.py +++ b/gui/builtinStatsViews/miningyieldViewFull.py @@ -92,7 +92,7 @@ class MiningYieldViewFull(StatsView): self._cachedValues.append(0) - image = bitmapLoader.getBitmap("turret_big", "icons") + image = bitmapLoader.getBitmap("turret_small", "icons") firepower = wx.BitmapButton(contentPanel, -1, image) firepower.SetToolTip(wx.ToolTip("Click to toggle to Firepower View")) firepower.Bind(wx.EVT_BUTTON, self.switchToFirepowerView) diff --git a/icons/mining_small.png b/icons/mining_small.png new file mode 100644 index 0000000000000000000000000000000000000000..78357a000c74b0ca5d9b24be7116751700346879 GIT binary patch literal 799 zcmV+)1K|9LP)fE=5(G-mx(${Wn@M|d9?^au)2sSlBgCGUWEynBtds! zR8-Q1fhVS}NHRM?bht1mot6`HbE)avw49s!|F4U5R0KiM1Mkhld*pdu;2%H;0rRJv z)%XcTg~cG`JI#eN83t66004|y4#~TWh70xFxN~B?g5#2`Jzc&dN2?i?An>i7))7i+ z@Q0rA@I0lUAOKhZYFkhDl|V4)sIeUOUcOl8c27>seEGUK+fZM3W^FST0Fa&z%zIgY z%GAM?G*eb=S#4e8@sPA|=z3F=>X@aL6=f>rzRKOQUYjk_zwFnLP_TJ=)*}+Ikt{^N zzB~qHSvl&0y;bIt#O&0(wwBvMdXil1dpL?&Wh}{#@j^~R(yb@afjFIhMXO8H_w_zl z;xc&uhI1$LFBO&M?oh?X3yhq@`xjjy>T`*YN9FYCI~gf12~cfHIil0d-1%LKA&cci zjeFYT2LR4!+Om_^rJ3E%A>3(h3&be3{((8dMy_wx^`bdyOoHEdt$ zu-f|AfYd)XJqZ9{BLunO)9Y6Yj*o6vOomx{OLG*~{y`}#Q$Nzx-Z~)C;4_bBzQFg{ zrLYeUz8o8OHLg%m4ImnTp8!x481t$aR!GiB(HPr0tk(!3YD($U=0fAPt%cdAIi6R} zc$b*_z5Q1`p7}=rL;&*uhB*MslTPP|Qiw8*O*rlWkW)$}LP%o1LBBm-r&(urxI8U) zJNqQy&8l+a0PFyk*W4xmFaR(TLN)==6z8VapFMRjsE^l#0NenuA3z0wgs}X-_?ib0 z0f05;8xBqqYX_(-_5>{Y0%DBiRpVv1^2$`mo`d9D% dyQjnd#5ba$0yhd8nyvr<002ovPDHLkV1jF0YC-@2 literal 0 HcmV?d00001 diff --git a/icons/turret_small.png b/icons/turret_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e9047086b3ee6659715ace1609656bf7aad0ab33 GIT binary patch literal 777 zcmV+k1NQuhP)DJ>}o8uSL`^n|m|GUhSO3vd8PFc>uHv>LZe z@=i}!M{hhfTH7jjmglEy;;uL*J%sfz!t;T*uECGa27o*QpaKw12$^9RhG7UHl$FU# zqU2m*htb*$z$}-1(KgqlxJaEz*X3u+ZEn{903M*Z015$QQ%X4iz=iWo^NutC$_OFV z`zp70-EO%$tJ5R|REh`zki7tK7{Go2yMDO%1wse|AY*l=;mAPuUA}7f)?k`JKcm+r zc@&ZI+0w!_{*+}g_W)=Cq69;j&>m0#uFDOzrw#hl+|66cMTHCk|G^ZImz7RDjuF?W z!!zg)l2(9z