diff --git a/graphs/data/fitShieldRegen/graph.py b/graphs/data/fitShieldRegen/graph.py index 56c9927f7..c5bb9945c 100644 --- a/graphs/data/fitShieldRegen/graph.py +++ b/graphs/data/fitShieldRegen/graph.py @@ -18,6 +18,7 @@ # ============================================================================= +import gui.mainFrame from graphs.data.base import FitGraph, XDef, YDef, Input from .getter import ( Time2ShieldAmountGetter, Time2ShieldRegenGetter, @@ -29,24 +30,29 @@ class FitShieldRegenGraph(FitGraph): # UI stuff internalName = 'shieldRegenGraph' name = 'Shield Regeneration' - xDefs = [ - XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')), - XDef(handle='shieldAmount', unit='EHP', label='Shield amount', mainInput=('shieldAmount', '%')), - XDef(handle='shieldAmount', unit='HP', label='Shield amount', mainInput=('shieldAmount', '%')), - XDef(handle='shieldAmount', unit='%', label='Shield amount', mainInput=('shieldAmount', '%'))] - yDefs = [ - YDef(handle='shieldAmount', unit='EHP', label='Shield amount'), - YDef(handle='shieldAmount', unit='HP', label='Shield amount'), - YDef(handle='shieldRegen', unit='EHP/s', label='Shield regen'), - YDef(handle='shieldRegen', unit='HP/s', label='Shield regen')] inputs = [ Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=120, defaultRange=(0, 300), mainOnly=True), Input(handle='shieldAmount', unit='%', label='Shield amount', iconID=1384, defaultValue=25, defaultRange=(0, 100), mainOnly=True)] srcExtraCols = ('ShieldAmount', 'ShieldTime') + usesHpEffectivity = True + + @property + def xDefs(self): + return [ + XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')), + XDef(handle='shieldAmount', unit='EHP' if self.isEffective else 'HP', label='Shield amount', mainInput=('shieldAmount', '%')), + XDef(handle='shieldAmount', unit='%', label='Shield amount', mainInput=('shieldAmount', '%'))] + + @property + def yDefs(self): + return [ + YDef(handle='shieldAmount', unit='EHP' if self.isEffective else 'HP', label='Shield amount'), + YDef(handle='shieldRegen', unit='EHP/s' if self.isEffective else 'HP/s', label='Shield regen')] # Calculation stuff _normalizers = { ('shieldAmount', '%'): lambda v, src, tgt: v / 100 * src.item.ship.getModifiedItemAttr('shieldCapacity'), + # Needed only for "x mark" support, to convert EHP x into normalized value ('shieldAmount', 'EHP'): lambda v, src, tgt: v / src.item.damagePattern.effectivify(src.item, 1, 'shield')} _limiters = { 'shieldAmount': lambda src, tgt: (0, src.item.ship.getModifiedItemAttr('shieldCapacity'))} @@ -59,3 +65,7 @@ class FitShieldRegenGraph(FitGraph): ('shieldAmount', '%'): lambda v, src, tgt: v * 100 / src.item.ship.getModifiedItemAttr('shieldCapacity'), ('shieldAmount', 'EHP'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item, v, 'shield'), ('shieldRegen', 'EHP/s'): lambda v, src, tgt: src.item.damagePattern.effectivify(src.item, v, 'shield')} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.isEffective = gui.mainFrame.MainFrame.getInstance().statsPane.nameViewMap['resistancesViewFull'].showEffective diff --git a/graphs/gui/frame.py b/graphs/gui/frame.py index 94a29b50a..68487b0ad 100644 --- a/graphs/gui/frame.py +++ b/graphs/gui/frame.py @@ -88,6 +88,7 @@ class GraphFrame(AuxiliaryFrame): self.mainFrame.Bind(GE.TARGET_PROFILE_REMOVED, self.OnProfileRemoved) self.mainFrame.Bind(RESIST_MODE_CHANGED, self.OnResistModeChanged) self.mainFrame.Bind(GE.GRAPH_OPTION_CHANGED, self.OnGraphOptionChanged) + self.mainFrame.Bind(GE.EFFECTIVE_HP_TOGGLED, self.OnEffectiveHpToggled) self.Layout() self.UpdateWindowSize() @@ -171,6 +172,23 @@ class GraphFrame(AuxiliaryFrame): self.clearCache(reason=GraphCacheCleanupReason.optionChanged) self.draw() + def OnEffectiveHpToggled(self, event): + event.Skip() + currentView = self.getView() + # Redraw graph if needed + if currentView.usesHpEffectivity: + currentView.isEffective = event.effective + self.ctrlPanel.refreshAxeLabels(restoreSelection=True) + self.clearCache(reason=GraphCacheCleanupReason.hpEffectivityChanged) + self.draw() + # Even if graph is not selected, keep it updated + for idx in range(self.graphSelection.GetCount()): + view = self.getView(idx=idx) + if view is currentView: + continue + if view.usesHpEffectivity: + view.isEffective = event.effective + def OnGraphSwitched(self, event): view = self.getView() GraphSettings.getInstance().set('selectedGraph', view.internalName) @@ -189,10 +207,13 @@ class GraphFrame(AuxiliaryFrame): self.mainFrame.Unbind(GE.TARGET_PROFILE_REMOVED, handler=self.OnProfileRemoved) self.mainFrame.Unbind(RESIST_MODE_CHANGED, handler=self.OnResistModeChanged) self.mainFrame.Unbind(GE.GRAPH_OPTION_CHANGED, handler=self.OnGraphOptionChanged) + self.mainFrame.Unbind(GE.EFFECTIVE_HP_TOGGLED, handler=self.OnEffectiveHpToggled) event.Skip() - def getView(self): - return self.graphSelection.GetClientData(self.graphSelection.GetSelection()) + def getView(self, idx=None): + if idx is None: + idx = self.graphSelection.GetSelection() + return self.graphSelection.GetClientData(idx) def clearCache(self, reason, extraData=None): self.getView().clearCache(reason, extraData) diff --git a/gui/builtinStatsViews/rechargeViewFull.py b/gui/builtinStatsViews/rechargeViewFull.py index 011164677..da95159c2 100644 --- a/gui/builtinStatsViews/rechargeViewFull.py +++ b/gui/builtinStatsViews/rechargeViewFull.py @@ -46,10 +46,10 @@ class RechargeViewFull(StatsView): return width def toggleEffective(self, event): + event.Skip() self.effective = event.effective sFit = Fit.getInstance() self.refreshPanel(sFit.getFit(self.mainFrame.getActiveFit())) - event.Skip() def populatePanel(self, contentPanel, headerPanel): contentSizer = contentPanel.GetSizer() diff --git a/gui/builtinStatsViews/resistancesViewFull.py b/gui/builtinStatsViews/resistancesViewFull.py index 52e6cfcf8..65e1c448d 100644 --- a/gui/builtinStatsViews/resistancesViewFull.py +++ b/gui/builtinStatsViews/resistancesViewFull.py @@ -162,6 +162,7 @@ class ResistancesViewFull(StatsView): wx.PostEvent(self.mainFrame, GE.EffectiveHpToggled(effective=self.stEHPs.GetLabel() == "HP")) def ehpSwitch(self, event): + event.Skip() self.showEffective = event.effective fitID = self.mainFrame.getActiveFit() wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,))) diff --git a/service/const.py b/service/const.py index 05054f303..4e5bfd9b8 100644 --- a/service/const.py +++ b/service/const.py @@ -130,6 +130,7 @@ class GraphCacheCleanupReason(IntEnum): inputChanged = autoId() optionChanged = autoId() resistModeChanged = autoId() + hpEffectivityChanged = autoId() @unique