diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 41397f9f28..6a4442dd8f 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -137,9 +137,15 @@ def build(self): self.ecmProjectedStr = 1 self.commandBonuses = {} - @property - def hasDpsData(self): - return len(self.__weaponDpsMap) > 0 + def clearFactorReloadDependentData(self): + # Here we clear all data known to rely on cycle parameters + # (which, in turn, relies on factor reload flag) + self.__weaponDpsMap.clear() + self.__remoteRepMap.clear() + self.__capStable = None + self.__capState = None + self.__capUsed = None + self.__capRecharge = None @property def targetResists(self): diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 65d37fd8e5..65bf971a2d 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -507,13 +507,6 @@ def getBaseRemoteReps(module): rrAmount = module.getModifiedItemAttr("powerTransferAmount", 0) else: return None, 0 - if rrAmount: - cycleParams = self.getCycleParameters() - if cycleParams is None: - return None, 0 - rrAmount *= 1 / (cycleParams.averageTime / 1000) - if module.item.group.name == "Ancillary Remote Armor Repairer" and module.charge: - rrAmount *= module.getModifiedItemAttr("chargedArmorDamageMultiplier", 1) return rrType, rrAmount @@ -522,6 +515,14 @@ def getBaseRemoteReps(module): rrType, rrAmount = self.__baseRemoteReps + if rrAmount: + cycleParams = self.getCycleParameters() + if cycleParams is None: + return None, 0 + rrAmount *= 1 / (cycleParams.averageTime / 1000) + if self.item.group.name == "Ancillary Remote Armor Repairer" and self.charge: + rrAmount *= self.getModifiedItemAttr("chargedArmorDamageMultiplier", 1) + if rrType and rrAmount and self.item.group.name == "Mutadaptive Remote Armor Repairer": spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self) spoolBoost = calculateSpoolup( diff --git a/gui/builtinAdditionPanes/boosterView.py b/gui/builtinAdditionPanes/boosterView.py index 323f958f4c..84a1503dcb 100644 --- a/gui/builtinAdditionPanes/boosterView.py +++ b/gui/builtinAdditionPanes/boosterView.py @@ -99,6 +99,11 @@ def kbEvent(self, event): event.Skip() def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -108,7 +113,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return self.original = fit.boosters if fit is not None else None @@ -127,7 +131,6 @@ def fitChanged(self, event): self.unselectAll() self.update(self.boosters) - event.Skip() def addItem(self, event): item = Market.getInstance().getItem(event.itemID, eager='group') diff --git a/gui/builtinAdditionPanes/cargoView.py b/gui/builtinAdditionPanes/cargoView.py index edffecb302..55b3e62de7 100644 --- a/gui/builtinAdditionPanes/cargoView.py +++ b/gui/builtinAdditionPanes/cargoView.py @@ -135,6 +135,11 @@ def swapModule(self, x, y, modIdx): copy=wx.GetMouseState().GetModifiers() == wx.MOD_CONTROL)) def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -144,7 +149,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return self.original = fit.cargo if fit is not None else None @@ -164,7 +168,6 @@ def fitChanged(self, event): self.populate(self.cargo) self.refresh(self.cargo) - event.Skip() def onLeftDoubleClick(self, event): row, _ = self.HitTest(event.Position) diff --git a/gui/builtinAdditionPanes/commandView.py b/gui/builtinAdditionPanes/commandView.py index 74481f2744..332dae394f 100644 --- a/gui/builtinAdditionPanes/commandView.py +++ b/gui/builtinAdditionPanes/commandView.py @@ -124,6 +124,11 @@ def fitSort(fit): return fit.name def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -135,7 +140,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return if event.fitID != self.lastFitId: @@ -150,8 +154,6 @@ def fitChanged(self, event): self.refreshContents(fit) - event.Skip() - def refreshContents(self, fit): stuff = [] if fit is not None: diff --git a/gui/builtinAdditionPanes/droneView.py b/gui/builtinAdditionPanes/droneView.py index bb65ec0f4a..e3ffb4a037 100644 --- a/gui/builtinAdditionPanes/droneView.py +++ b/gui/builtinAdditionPanes/droneView.py @@ -199,6 +199,11 @@ def droneKey(self, drone): drone.item.name) def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -208,7 +213,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return self.original = fit.drones if fit is not None else None @@ -228,7 +232,6 @@ def fitChanged(self, event): self.unselectAll() self.update(self.drones) - event.Skip() def addItem(self, event): item = Market.getInstance().getItem(event.itemID, eager='group.category') diff --git a/gui/builtinAdditionPanes/fighterView.py b/gui/builtinAdditionPanes/fighterView.py index f29f78316a..79d7daa679 100644 --- a/gui/builtinAdditionPanes/fighterView.py +++ b/gui/builtinAdditionPanes/fighterView.py @@ -88,8 +88,12 @@ def __init__(self, parent): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) def fitChanged(self, event): - sFit = Fit.getInstance() + event.Skip() activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + + sFit = Fit.getInstance() fit = sFit.getFit(activeFitID) if fit: @@ -113,8 +117,6 @@ def fitChanged(self, event): self.Refresh() - event.Skip() - class FighterDisplay(d.Display): @@ -242,6 +244,11 @@ def fighterKey(self, fighter): return orderPos, abilityEffectIDs, fighter.item.name def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -251,7 +258,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return self.original = fit.fighters if fit is not None else None @@ -271,7 +277,6 @@ def fitChanged(self, event): self.unselectAll() self.update(self.fighters) - event.Skip() def addItem(self, event): item = Market.getInstance().getItem(event.itemID, eager='group.category') diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py index 586d10fa38..d882128937 100644 --- a/gui/builtinAdditionPanes/implantView.py +++ b/gui/builtinAdditionPanes/implantView.py @@ -78,8 +78,12 @@ def __init__(self, parent): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) def fitChanged(self, event): - sFit = Fit.getInstance() + event.Skip() activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + + sFit = Fit.getInstance() fit = sFit.getFit(activeFitID) if fit: self.source = fit.implantSource @@ -91,8 +95,6 @@ def fitChanged(self, event): self.rbFit.Enable(fit is not None) self.rbChar.Enable(fit is not None) - event.Skip() - def OnRadioSelect(self, event): fitID = self.mainFrame.getActiveFit() if fitID is not None: @@ -152,6 +154,11 @@ def kbEvent(self, event): event.Skip() def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -161,7 +168,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return self.original = fit.appliedImplants if fit is not None else None @@ -180,7 +186,6 @@ def fitChanged(self, event): self.unselectAll() self.update(self.implants) - event.Skip() def addItem(self, event): item = Market.getInstance().getItem(event.itemID, eager='group.category') diff --git a/gui/builtinAdditionPanes/notesView.py b/gui/builtinAdditionPanes/notesView.py index 755fef64d3..3a713d7c9a 100644 --- a/gui/builtinAdditionPanes/notesView.py +++ b/gui/builtinAdditionPanes/notesView.py @@ -30,6 +30,11 @@ def OnKeyDown(self, event): event.Skip() def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) @@ -43,14 +48,11 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.lastFitId = None - event.Skip() return elif event.fitID != self.lastFitId: self.lastFitId = event.fitID self.editNotes.SetValue(fit.notes or "") - event.Skip() - def onText(self, event): # delay the save so we're not writing to sqlite on every keystroke self.saveTimer.Stop() # cancel the existing timer diff --git a/gui/builtinAdditionPanes/projectedView.py b/gui/builtinAdditionPanes/projectedView.py index 0336dfd1b4..2a7adf4408 100644 --- a/gui/builtinAdditionPanes/projectedView.py +++ b/gui/builtinAdditionPanes/projectedView.py @@ -168,6 +168,11 @@ def fitSort(fit): return fit.name def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) # pyfalog.debug('ProjectedView::fitChanged: {}', repr(fit)) @@ -178,7 +183,6 @@ def fitChanged(self, event): if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None - event.Skip() return @@ -195,8 +199,6 @@ def fitChanged(self, event): self.refreshContents(fit) - event.Skip() - def refreshContents(self, fit): stuff = [] if fit is not None: diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 6d876eec92..0966b1b8af 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -604,8 +604,11 @@ def slotsChanged(self): self.populate(self.mods) def fitChanged(self, event): + event.Skip() if not self: - event.Skip() + return + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: return try: if self.activeFitID is not None and self.activeFitID == event.fitID: @@ -619,8 +622,6 @@ def fitChanged(self, event): self.Show(self.activeFitID is not None and self.activeFitID == event.fitID) except RuntimeError: pyfalog.error("Caught dead object") - finally: - event.Skip() def spawnMenu(self, event): if self.activeFitID is None or self.getColumn(self.screenToClientFixed(event.Position)) == self.getColIndex(State): diff --git a/gui/characterSelection.py b/gui/characterSelection.py index da75ef87f7..e0e7efb7f7 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -214,6 +214,10 @@ def fitChanged(self, event): """ When fit is changed, or new fit is selected """ + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return self.charChoice.Enable(event.fitID is not None) choice = self.charChoice sFit = Fit.getInstance() @@ -257,8 +261,6 @@ def fitChanged(self, event): self.toggleRefreshButton() - event.Skip() - def exportSkills(self, evt): skillsMap = self._buildSkillsTooltipCondensed(self.reqs, skillsMap={}) diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 2da10be26a..6aad398a35 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -176,6 +176,10 @@ def __init__(self, mainFrame): self.mainFrame.Bind(EVT_FIT_RENAMED, self.fitRenamed) def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return enable = event.fitID is not None self.Enable(wx.ID_SAVEAS, enable) self.Enable(wx.ID_COPY, enable) @@ -203,8 +207,6 @@ def fitChanged(self, event): else: self.ignoreRestrictionItem.SetItemLabel("Disable Fitting Re&strictions") - event.Skip() - def fitRenamed(self, event): self.refreshUndo() event.Skip() diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index ed490194ea..7251e12441 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -97,11 +97,14 @@ def RefreshContent(self): self.navpanel.gotoStage(stage, stageData) def RefreshList(self, event): - stage = self.GetActiveStage() + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return + stage = self.GetActiveStage() if stage in (3, 4, 5): self.lpane.RefreshList(True) - event.Skip() def SizeRefreshList(self, event): self.Layout() diff --git a/gui/statsPane.py b/gui/statsPane.py index 74d7192095..51d4d8264b 100644 --- a/gui/statsPane.py +++ b/gui/statsPane.py @@ -69,11 +69,14 @@ class StatsPane(wx.Panel): pyfalog.error("Unknown setting for view: {0}", aView) def fitChanged(self, event): + event.Skip() + activeFitID = self.mainFrame.getActiveFit() + if activeFitID is not None and event.fitID is not None and event.fitID != activeFitID: + return sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) for view in self.views: view.refreshPanel(fit) - event.Skip() def __init__(self, parent): wx.Panel.__init__(self, parent) diff --git a/service/fit.py b/service/fit.py index eae984f8f5..0f6e31bf2d 100644 --- a/service/fit.py +++ b/service/fit.py @@ -249,8 +249,9 @@ def toggleFactorReload(self, value=None): for fit in set(self._loadedFits): if fit is None: continue - if fit.hasDpsData: - self.recalc(fit) + if fit.calculated: + fit.factorReload = self.serviceFittingOptions['useGlobalForceReload'] + fit.clearFactorReloadDependentData() fitIDs.add(fit.ID) return fitIDs @@ -477,7 +478,6 @@ def recalc(self, fit): fit.factorReload = self.serviceFittingOptions["useGlobalForceReload"] fit.clear() - fit.calculateModifiedAttributes() pyfalog.info("=" * 10 + "recalc time: " + str(time() - start_time) + "=" * 10)