From 8a4caeaa2d752090e483f2fe00cf5bde2f578d2e Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 12 Aug 2019 04:08:54 +0300 Subject: [PATCH] Avoid doing unnecessary recalcs --- gui/fitCommands/calc/module/changeCharges.py | 22 ++++++++++---- gui/fitCommands/calc/module/localAdd.py | 27 +++++++++-------- .../calc/module/localChangeStates.py | 2 +- gui/fitCommands/calc/module/localClone.py | 11 ++++++- gui/fitCommands/calc/module/localRemove.py | 30 +++++++++++++------ gui/fitCommands/calc/module/localReplace.py | 25 +++++++++++----- gui/fitCommands/calc/module/projectedAdd.py | 29 +++++++++++++----- .../calc/module/projectedChangeStates.py | 9 ++++++ .../calc/module/projectedRemove.py | 26 +++++++++++----- gui/fitCommands/calc/projectedFit/add.py | 9 ++++++ .../calc/projectedFit/changeState.py | 9 ++++++ gui/fitCommands/calc/projectedFit/remove.py | 9 ++++++ gui/fitCommands/gui/itemsRebase.py | 4 ++- gui/fitCommands/gui/localModule/add.py | 5 ++-- .../gui/localModule/changeCharges.py | 5 ++-- .../gui/localModule/changeMetas.py | 5 ++-- .../gui/localModule/changeStates.py | 4 +-- gui/fitCommands/gui/localModule/clone.py | 5 ++-- gui/fitCommands/gui/localModule/fillAdd.py | 6 ++-- gui/fitCommands/gui/localModule/fillClone.py | 5 ++-- .../gui/localModule/mutatedConvert.py | 5 ++-- .../gui/localModule/mutatedImport.py | 5 ++-- .../gui/localModule/mutatedRevert.py | 5 ++-- gui/fitCommands/gui/localModule/remove.py | 5 ++-- gui/fitCommands/gui/localModule/replace.py | 8 +++-- gui/fitCommands/gui/projectedChangeStates.py | 7 +++-- gui/fitCommands/gui/projectedModule/add.py | 5 ++-- .../gui/projectedModule/changeCharges.py | 5 ++-- .../gui/projectedModule/changeMetas.py | 8 +++-- gui/fitCommands/gui/projectedRemove.py | 7 +++-- service/port/efs.py | 18 +++++++---- 31 files changed, 233 insertions(+), 92 deletions(-) diff --git a/gui/fitCommands/calc/module/changeCharges.py b/gui/fitCommands/calc/module/changeCharges.py index ae9278260..95d7e658c 100644 --- a/gui/fitCommands/calc/module/changeCharges.py +++ b/gui/fitCommands/calc/module/changeCharges.py @@ -11,12 +11,13 @@ pyfalog = Logger(__name__) class CalcChangeModuleChargesCommand(wx.Command): - def __init__(self, fitID, projected, chargeMap, ignoreRestriction=False): + def __init__(self, fitID, projected, chargeMap, ignoreRestrictions=False, recalc=True): wx.Command.__init__(self, True, 'Change Module Charges') self.fitID = fitID self.projected = projected self.chargeMap = chargeMap - self.ignoreRestriction = ignoreRestriction + self.ignoreRestriction = ignoreRestrictions + self.recalc = recalc self.savedChargeMap = None self.savedStateCheckChanges = None @@ -48,8 +49,9 @@ class CalcChangeModuleChargesCommand(wx.Command): mod.charge = chargeItem if not changes: return False - sFit.recalc(fit) - self.savedStateCheckChanges = sFit.checkStates(fit, None) + if self.recalc: + sFit.recalc(fit) + self.savedStateCheckChanges = sFit.checkStates(fit, None) return True def Undo(self): @@ -58,8 +60,18 @@ class CalcChangeModuleChargesCommand(wx.Command): fitID=self.fitID, projected=self.projected, chargeMap=self.savedChargeMap, - ignoreRestriction=True) + ignoreRestrictions=True, + recalc=False) if not cmd.Do(): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/localAdd.py b/gui/fitCommands/calc/module/localAdd.py index 7bc29d8e1..e029fbeea 100644 --- a/gui/fitCommands/calc/module/localAdd.py +++ b/gui/fitCommands/calc/module/localAdd.py @@ -39,14 +39,7 @@ class CalcAddLocalModuleCommand(wx.Command): fitID=self.fitID, position=fit.modules.index(oldMod), newModInfo=self.newModInfo) - if not self.subsystemCmd.Do(): - return False - # Need to flush because checkStates sometimes relies on module->fit - # relationship via .owner attribute, which is handled by SQLAlchemy - eos.db.flush() - sFit.recalc(fit) - self.savedStateCheckChanges = sFit.checkStates(fit, newMod) - return True + return self.subsystemCmd.Do() if not newMod.fits(fit): pyfalog.warning('Module does not fit') return False @@ -66,15 +59,23 @@ class CalcAddLocalModuleCommand(wx.Command): pyfalog.debug('Undoing addition of local module {} to fit {}'.format(self.newModInfo, self.fitID)) # We added a subsystem module, which actually ran the replace command. Run the undo for that guy instead if self.subsystemCmd is not None: - if not self.subsystemCmd.Undo(): - return False - restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) - return True + return self.subsystemCmd.Undo() if self.savedPosition is None: return False from .localRemove import CalcRemoveLocalModulesCommand - cmd = CalcRemoveLocalModulesCommand(fitID=self.fitID, positions=[self.savedPosition]) + cmd = CalcRemoveLocalModulesCommand(fitID=self.fitID, positions=[self.savedPosition], recalc=False) if not cmd.Do(): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.subsystemCmd is not None: + return self.subsystemCmd.needsGuiRecalc + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/localChangeStates.py b/gui/fitCommands/calc/module/localChangeStates.py index edc2ce2d4..f471783e9 100644 --- a/gui/fitCommands/calc/module/localChangeStates.py +++ b/gui/fitCommands/calc/module/localChangeStates.py @@ -63,7 +63,7 @@ class CalcChangeLocalModuleStatesCommand(wx.Command): return True @property - def recalcNeeded(self): + def needsGuiRecalc(self): if self.savedStateCheckChanges is None: return True for container in self.savedStateCheckChanges: diff --git a/gui/fitCommands/calc/module/localClone.py b/gui/fitCommands/calc/module/localClone.py index d6c8a7bdc..4ba3a4e26 100644 --- a/gui/fitCommands/calc/module/localClone.py +++ b/gui/fitCommands/calc/module/localClone.py @@ -44,8 +44,17 @@ class CalcCloneLocalModuleCommand(wx.Command): def Undo(self): pyfalog.debug('Undoing cloning of local module from position {} to position {} for fit ID {}'.format(self.srcPosition, self.dstPosition, self.fitID)) from .localRemove import CalcRemoveLocalModulesCommand - cmd = CalcRemoveLocalModulesCommand(fitID=self.fitID, positions=[self.dstPosition]) + cmd = CalcRemoveLocalModulesCommand(fitID=self.fitID, positions=[self.dstPosition], recalc=False) if not cmd.Do(): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/localRemove.py b/gui/fitCommands/calc/module/localRemove.py index 673f2c639..1b2fb13d9 100644 --- a/gui/fitCommands/calc/module/localRemove.py +++ b/gui/fitCommands/calc/module/localRemove.py @@ -12,10 +12,11 @@ pyfalog = Logger(__name__) class CalcRemoveLocalModulesCommand(wx.Command): - def __init__(self, fitID, positions): + def __init__(self, fitID, positions, recalc=True): wx.Command.__init__(self, True, 'Remove Module') self.fitID = fitID self.positions = positions + self.recalc = recalc self.savedSubInfos = None self.savedModInfos = None self.savedStateCheckChanges = None @@ -39,12 +40,12 @@ class CalcRemoveLocalModulesCommand(wx.Command): if len(self.savedSubInfos) == 0 and len(self.savedModInfos) == 0: return False - # Need to flush because checkStates sometimes relies on module->fit - # relationship via .owner attribute, which is handled by SQLAlchemy - eos.db.flush() - sFit.recalc(fit) - self.savedStateCheckChanges = sFit.checkStates(fit, None) - # If no modules were removed, report that command was not completed + if self.recalc: + # Need to flush because checkStates sometimes relies on module->fit + # relationship via .owner attribute, which is handled by SQLAlchemy + eos.db.flush() + sFit.recalc(fit) + self.savedStateCheckChanges = sFit.checkStates(fit, None) return True def Undo(self): @@ -60,7 +61,8 @@ class CalcRemoveLocalModulesCommand(wx.Command): fitID=self.fitID, position=position, newModInfo=modInfo, - ignoreRestrictions=True) + ignoreRestrictions=True, + recalc=False) results.append(cmd.Do()) sFit.recalc(fit) for position, modInfo in self.savedModInfos.items(): @@ -68,9 +70,19 @@ class CalcRemoveLocalModulesCommand(wx.Command): fitID=self.fitID, position=position, newModInfo=modInfo, - ignoreRestrictions=True) + ignoreRestrictions=True, + recalc=False) results.append(cmd.Do()) if not any(results): return False restoreCheckedStates(fit, self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/localReplace.py b/gui/fitCommands/calc/module/localReplace.py index 676749aef..8ac67a028 100644 --- a/gui/fitCommands/calc/module/localReplace.py +++ b/gui/fitCommands/calc/module/localReplace.py @@ -11,7 +11,7 @@ pyfalog = Logger(__name__) class CalcReplaceLocalModuleCommand(wx.Command): - def __init__(self, fitID, position, newModInfo, unloadInvalidCharges=False, ignoreRestrictions=False): + def __init__(self, fitID, position, newModInfo, unloadInvalidCharges=False, ignoreRestrictions=False, recalc=True): wx.Command.__init__(self, True, 'Replace Module') self.fitID = fitID self.position = position @@ -19,6 +19,7 @@ class CalcReplaceLocalModuleCommand(wx.Command): self.oldModInfo = None self.unloadInvalidCharges = unloadInvalidCharges self.ignoreRestrictions = ignoreRestrictions + self.recalc = recalc self.savedStateCheckChanges = None self.unloadedCharge = None @@ -56,11 +57,12 @@ class CalcReplaceLocalModuleCommand(wx.Command): pyfalog.warning('Failed to replace in list') self.Undo() return False - # Need to flush because checkStates sometimes relies on module->fit - # relationship via .owner attribute, which is handled by SQLAlchemy - eos.db.flush() - sFit.recalc(fit) - self.savedStateCheckChanges = sFit.checkStates(fit, newMod) + if self.recalc: + # Need to flush because checkStates sometimes relies on module->fit + # relationship via .owner attribute, which is handled by SQLAlchemy + eos.db.flush() + sFit.recalc(fit) + self.savedStateCheckChanges = sFit.checkStates(fit, newMod) return True def Undo(self): @@ -70,7 +72,7 @@ class CalcReplaceLocalModuleCommand(wx.Command): # Remove if there was no module if self.oldModInfo is None: from .localRemove import CalcRemoveLocalModulesCommand - cmd = CalcRemoveLocalModulesCommand(fitID=self.fitID, positions=[self.position]) + cmd = CalcRemoveLocalModulesCommand(fitID=self.fitID, positions=[self.position], recalc=False) if not cmd.Do(): return False restoreCheckedStates(fit, self.savedStateCheckChanges) @@ -87,3 +89,12 @@ class CalcReplaceLocalModuleCommand(wx.Command): return False restoreCheckedStates(fit, self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/projectedAdd.py b/gui/fitCommands/calc/module/projectedAdd.py index 6465b6398..564c6d4f3 100644 --- a/gui/fitCommands/calc/module/projectedAdd.py +++ b/gui/fitCommands/calc/module/projectedAdd.py @@ -12,12 +12,13 @@ pyfalog = Logger(__name__) class CalcAddProjectedModuleCommand(wx.Command): - def __init__(self, fitID, modInfo, position=None, ignoreRestrictions=False): + def __init__(self, fitID, modInfo, position=None, ignoreRestrictions=False, recalc=True): wx.Command.__init__(self, True) self.fitID = fitID self.newModInfo = modInfo self.newPosition = position self.ignoreRestrictions = ignoreRestrictions + self.recalc = recalc self.oldModInfo = None self.oldPosition = None self.savedStateCheckChanges = None @@ -46,11 +47,12 @@ class CalcAddProjectedModuleCommand(wx.Command): return False self.newPosition = fit.projectedModules.index(newMod) - # Need to flush because checkStates sometimes relies on module->fit - # relationship via .owner attribute, which is handled by SQLAlchemy - eos.db.flush() - sFit.recalc(fit) - self.savedStateCheckChanges = sFit.checkStates(fit, newMod) + if self.recalc: + # Need to flush because checkStates sometimes relies on module->fit + # relationship via .owner attribute, which is handled by SQLAlchemy + eos.db.flush() + sFit.recalc(fit) + self.savedStateCheckChanges = sFit.checkStates(fit, newMod) return True def Undo(self): @@ -60,7 +62,8 @@ class CalcAddProjectedModuleCommand(wx.Command): fitID=self.fitID, modInfo=self.oldModInfo, position=self.oldPosition, - ignoreRestrictions=True) + ignoreRestrictions=True, + recalc=False) if not cmd.Do(): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) @@ -68,8 +71,18 @@ class CalcAddProjectedModuleCommand(wx.Command): from .projectedRemove import CalcRemoveProjectedModuleCommand cmd = CalcRemoveProjectedModuleCommand( fitID=self.fitID, - position=self.newPosition) + position=self.newPosition, + recalc=False) if not cmd.Do(): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/projectedChangeStates.py b/gui/fitCommands/calc/module/projectedChangeStates.py index 8f742b1c1..7047adab5 100644 --- a/gui/fitCommands/calc/module/projectedChangeStates.py +++ b/gui/fitCommands/calc/module/projectedChangeStates.py @@ -57,3 +57,12 @@ class CalcChangeProjectedModuleStatesCommand(wx.Command): mod.state = state restoreCheckedStates(fit, self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/module/projectedRemove.py b/gui/fitCommands/calc/module/projectedRemove.py index a561f7f43..424002f61 100644 --- a/gui/fitCommands/calc/module/projectedRemove.py +++ b/gui/fitCommands/calc/module/projectedRemove.py @@ -11,10 +11,11 @@ pyfalog = Logger(__name__) class CalcRemoveProjectedModuleCommand(wx.Command): - def __init__(self, fitID, position): + def __init__(self, fitID, position, recalc=True): wx.Command.__init__(self, True) self.fitID = fitID self.position = position + self.recalc = recalc self.savedModInfo = None self.savedStateCheckChanges = None @@ -26,11 +27,12 @@ class CalcRemoveProjectedModuleCommand(wx.Command): self.savedModInfo = ModuleInfo.fromModule(mod) del fit.projectedModules[self.position] - # Need to flush because checkStates sometimes relies on module->fit - # relationship via .owner attribute, which is handled by SQLAlchemy - eos.db.flush() - sFit.recalc(fit) - self.savedStateCheckChanges = sFit.checkStates(fit, None) + if self.recalc: + # Need to flush because checkStates sometimes relies on module->fit + # relationship via .owner attribute, which is handled by SQLAlchemy + eos.db.flush() + sFit.recalc(fit) + self.savedStateCheckChanges = sFit.checkStates(fit, None) return True def Undo(self): @@ -40,8 +42,18 @@ class CalcRemoveProjectedModuleCommand(wx.Command): fitID=self.fitID, modInfo=self.savedModInfo, position=self.position, - ignoreRestrictions=True) + ignoreRestrictions=True, + recalc=False) if not cmd.Do(): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/projectedFit/add.py b/gui/fitCommands/calc/projectedFit/add.py index d77d32c0b..576be31e2 100644 --- a/gui/fitCommands/calc/projectedFit/add.py +++ b/gui/fitCommands/calc/projectedFit/add.py @@ -88,3 +88,12 @@ class CalcAddProjectedFitCommand(wx.Command): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/projectedFit/changeState.py b/gui/fitCommands/calc/projectedFit/changeState.py index b9311fb3b..c7e140e99 100644 --- a/gui/fitCommands/calc/projectedFit/changeState.py +++ b/gui/fitCommands/calc/projectedFit/changeState.py @@ -54,3 +54,12 @@ class CalcChangeProjectedFitStateCommand(wx.Command): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/calc/projectedFit/remove.py b/gui/fitCommands/calc/projectedFit/remove.py index 56194cb41..8153e7dc3 100644 --- a/gui/fitCommands/calc/projectedFit/remove.py +++ b/gui/fitCommands/calc/projectedFit/remove.py @@ -79,3 +79,12 @@ class CalcRemoveProjectedFitCommand(wx.Command): return False restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) return True + + @property + def needsGuiRecalc(self): + if self.savedStateCheckChanges is None: + return True + for container in self.savedStateCheckChanges: + if len(container) > 0: + return True + return False diff --git a/gui/fitCommands/gui/itemsRebase.py b/gui/fitCommands/gui/itemsRebase.py index d524e599d..bf2912882 100644 --- a/gui/fitCommands/gui/itemsRebase.py +++ b/gui/fitCommands/gui/itemsRebase.py @@ -22,6 +22,7 @@ class GuiRebaseItemsCommand(wx.Command): def Do(self): sFit = Fit.getInstance() fit = sFit.getFit(self.fitID) + # Here we assume that item attribs do not change and item state will not change for mod in fit.modules: if mod.itemID in self.rebaseMap: cmd = CalcRebaseItemCommand( @@ -34,7 +35,8 @@ class GuiRebaseItemsCommand(wx.Command): cmd = CalcChangeModuleChargesCommand( fitID=self.fitID, projected=False, - chargeMap={fit.modules.index(mod): self.rebaseMap[mod.chargeID]}) + chargeMap={fit.modules.index(mod): self.rebaseMap[mod.chargeID]}, + recalc=False) self.internalHistory.submit(cmd) for containerName in ('drones', 'fighters', 'implants', 'boosters'): container = getattr(fit, containerName) diff --git a/gui/fitCommands/gui/localModule/add.py b/gui/fitCommands/gui/localModule/add.py index 85e6ebd83..980dea2ce 100644 --- a/gui/fitCommands/gui/localModule/add.py +++ b/gui/fitCommands/gui/localModule/add.py @@ -22,9 +22,10 @@ class GuiAddLocalModuleCommand(wx.Command): cmd = CalcAddLocalModuleCommand(fitID=self.fitID, newModInfo=ModuleInfo(itemID=self.itemID)) success = self.internalHistory.submit(cmd) Market.getInstance().storeRecentlyUsed(self.itemID) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() wx.PostEvent( diff --git a/gui/fitCommands/gui/localModule/changeCharges.py b/gui/fitCommands/gui/localModule/changeCharges.py index ad43155bb..787d282ad 100644 --- a/gui/fitCommands/gui/localModule/changeCharges.py +++ b/gui/fitCommands/gui/localModule/changeCharges.py @@ -20,9 +20,10 @@ class GuiChangeLocalModuleChargesCommand(wx.Command): def Do(self): cmd = CalcChangeModuleChargesCommand(fitID=self.fitID, projected=False, chargeMap={p: self.chargeItemID for p in self.positions}) success = self.internalHistory.submit(cmd) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/localModule/changeMetas.py b/gui/fitCommands/gui/localModule/changeMetas.py index b2e94ad33..816b9eaef 100644 --- a/gui/fitCommands/gui/localModule/changeMetas.py +++ b/gui/fitCommands/gui/localModule/changeMetas.py @@ -42,8 +42,9 @@ class GuiChangeLocalModuleMetasCommand(wx.Command): if not commands: return False success = self.internalHistory.submitBatch(*commands) - eos.db.flush() - sFit.recalc(self.fitID) + if commands[-1].needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() events = [] diff --git a/gui/fitCommands/gui/localModule/changeStates.py b/gui/fitCommands/gui/localModule/changeStates.py index 5f966d451..26875824c 100644 --- a/gui/fitCommands/gui/localModule/changeStates.py +++ b/gui/fitCommands/gui/localModule/changeStates.py @@ -26,9 +26,9 @@ class GuiChangeLocalModuleStatesCommand(wx.Command): positions=self.positions, click=self.click) success = self.internalHistory.submit(cmd) - eos.db.flush() sFit = Fit.getInstance() - if cmd.recalcNeeded: + if cmd.needsGuiRecalc: + eos.db.flush() sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() diff --git a/gui/fitCommands/gui/localModule/clone.py b/gui/fitCommands/gui/localModule/clone.py index 57b33ac7f..054f03d8a 100644 --- a/gui/fitCommands/gui/localModule/clone.py +++ b/gui/fitCommands/gui/localModule/clone.py @@ -25,9 +25,10 @@ class GuiCloneLocalModuleCommand(wx.Command): sFit = Fit.getInstance() cmd = CalcCloneLocalModuleCommand(fitID=self.fitID, srcPosition=self.srcPosition, dstPosition=self.dstPosition) success = self.internalHistory.submit(cmd) - eos.db.flush() fit = sFit.getFit(self.fitID) - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() self.savedItemID = fit.modules[self.srcPosition].itemID diff --git a/gui/fitCommands/gui/localModule/fillAdd.py b/gui/fitCommands/gui/localModule/fillAdd.py index 32bd7f662..3019c5b0c 100644 --- a/gui/fitCommands/gui/localModule/fillAdd.py +++ b/gui/fitCommands/gui/localModule/fillAdd.py @@ -27,9 +27,11 @@ class GuiFillWithNewLocalModulesCommand(wx.Command): break added_modules += 1 Market.getInstance().storeRecentlyUsed(self.itemID) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + # Only last command decides if we need to recalc here or not + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() success = added_modules > 0 diff --git a/gui/fitCommands/gui/localModule/fillClone.py b/gui/fitCommands/gui/localModule/fillClone.py index a7c48ec30..fba327ddf 100644 --- a/gui/fitCommands/gui/localModule/fillClone.py +++ b/gui/fitCommands/gui/localModule/fillClone.py @@ -30,8 +30,9 @@ class GuiFillWithClonedLocalModulesCommand(wx.Command): if not self.internalHistory.submit(cmd): break added_modules += 1 - eos.db.flush() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() success = added_modules > 0 diff --git a/gui/fitCommands/gui/localModule/mutatedConvert.py b/gui/fitCommands/gui/localModule/mutatedConvert.py index 598e6d0ba..b8cb99909 100644 --- a/gui/fitCommands/gui/localModule/mutatedConvert.py +++ b/gui/fitCommands/gui/localModule/mutatedConvert.py @@ -39,8 +39,9 @@ class GuiConvertMutatedLocalModuleCommand(wx.Command): spoolType=mod.spoolType, spoolAmount=mod.spoolAmount)) success = self.internalHistory.submit(cmd) - eos.db.flush() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/localModule/mutatedImport.py b/gui/fitCommands/gui/localModule/mutatedImport.py index 972a47e53..a90fd53b1 100644 --- a/gui/fitCommands/gui/localModule/mutatedImport.py +++ b/gui/fitCommands/gui/localModule/mutatedImport.py @@ -24,9 +24,10 @@ class GuiImportLocalMutatedModuleCommand(wx.Command): def Do(self): cmd = CalcAddLocalModuleCommand(fitID=self.fitID, newModInfo=self.newModInfo) success = self.internalHistory.submit(cmd) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() wx.PostEvent( diff --git a/gui/fitCommands/gui/localModule/mutatedRevert.py b/gui/fitCommands/gui/localModule/mutatedRevert.py index d5bd41aff..d97439bd7 100644 --- a/gui/fitCommands/gui/localModule/mutatedRevert.py +++ b/gui/fitCommands/gui/localModule/mutatedRevert.py @@ -34,8 +34,9 @@ class GuiRevertMutatedLocalModuleCommand(wx.Command): spoolType=mod.spoolType, spoolAmount=mod.spoolAmount)) success = self.internalHistory.submit(cmd) - eos.db.flush() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/localModule/remove.py b/gui/fitCommands/gui/localModule/remove.py index 0146c6bdb..e98ecb2b5 100644 --- a/gui/fitCommands/gui/localModule/remove.py +++ b/gui/fitCommands/gui/localModule/remove.py @@ -30,8 +30,9 @@ class GuiRemoveLocalModuleCommand(wx.Command): for position in sorted(container, reverse=True): modInfo = container[position] sMkt.storeRecentlyUsed(modInfo.itemID) - eos.db.flush() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() wx.PostEvent( diff --git a/gui/fitCommands/gui/localModule/replace.py b/gui/fitCommands/gui/localModule/replace.py index 56340d5ab..f6c5836ae 100644 --- a/gui/fitCommands/gui/localModule/replace.py +++ b/gui/fitCommands/gui/localModule/replace.py @@ -21,17 +21,21 @@ class GuiReplaceLocalModuleCommand(wx.Command): def Do(self): results = [] + needRecalc = None for position in self.positions: cmd = CalcReplaceLocalModuleCommand( fitID=self.fitID, position=position, newModInfo=ModuleInfo(itemID=self.itemID)) results.append(self.internalHistory.submit(cmd)) + # Last command decides if we need it or not + needRecalc = cmd.needsGuiRecalc success = any(results) Market.getInstance().storeRecentlyUsed(self.itemID) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if needRecalc: + eos.db.flush() + sFit.recalc(self.fitID) self.savedRemovedDummies = sFit.fill(self.fitID) eos.db.commit() wx.PostEvent( diff --git a/gui/fitCommands/gui/projectedChangeStates.py b/gui/fitCommands/gui/projectedChangeStates.py index d35bbe985..996ba0b30 100644 --- a/gui/fitCommands/gui/projectedChangeStates.py +++ b/gui/fitCommands/gui/projectedChangeStates.py @@ -58,12 +58,14 @@ class GuiChangeProjectedItemStatesCommand(wx.Command): if self.proposedState is None: return False results = [] + needRecalc = True if self.pModPositions: cmd = CalcChangeProjectedModuleStatesCommand( fitID=self.fitID, positions=self.pModPositions, proposedState=self.proposedState) results.append(self.internalHistory.submit(cmd)) + needRecalc = cmd.needsGuiRecalc for pDroneItemID in self.pDroneItemIDs: cmd = CalcChangeProjectedDroneStateCommand( fitID=self.fitID, @@ -83,9 +85,10 @@ class GuiChangeProjectedItemStatesCommand(wx.Command): state=False if self.proposedState == 'inactive' else True) results.append(self.internalHistory.submit(cmd)) success = any(results) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if needRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/projectedModule/add.py b/gui/fitCommands/gui/projectedModule/add.py index b90c526a8..d314418a1 100644 --- a/gui/fitCommands/gui/projectedModule/add.py +++ b/gui/fitCommands/gui/projectedModule/add.py @@ -19,9 +19,10 @@ class GuiAddProjectedModuleCommand(wx.Command): def Do(self): cmd = CalcAddProjectedModuleCommand(fitID=self.fitID, modInfo=ModuleInfo(itemID=self.itemID)) success = self.internalHistory.submit(cmd) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/projectedModule/changeCharges.py b/gui/fitCommands/gui/projectedModule/changeCharges.py index 9930d1f4b..140fd4ef4 100644 --- a/gui/fitCommands/gui/projectedModule/changeCharges.py +++ b/gui/fitCommands/gui/projectedModule/changeCharges.py @@ -20,9 +20,10 @@ class GuiChangeProjectedModuleChargesCommand(wx.Command): def Do(self): cmd = CalcChangeModuleChargesCommand(fitID=self.fitID, projected=True, chargeMap={p: self.chargeItemID for p in self.positions}) success = self.internalHistory.submit(cmd) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if cmd.needsGuiRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/projectedModule/changeMetas.py b/gui/fitCommands/gui/projectedModule/changeMetas.py index 0fddc8bde..7d20b6d36 100644 --- a/gui/fitCommands/gui/projectedModule/changeMetas.py +++ b/gui/fitCommands/gui/projectedModule/changeMetas.py @@ -22,6 +22,7 @@ class GuiChangeProjectedModuleMetasCommand(wx.Command): sFit = Fit.getInstance() fit = sFit.getFit(self.fitID) results = [] + needRecalc = None for position in sorted(self.positions, reverse=True): module = fit.projectedModules[position] if module.itemID == self.newItemID: @@ -31,9 +32,12 @@ class GuiChangeProjectedModuleMetasCommand(wx.Command): cmdRemove = CalcRemoveProjectedModuleCommand(fitID=self.fitID, position=position) cmdAdd = CalcAddProjectedModuleCommand(fitID=self.fitID, modInfo=info) results.append(self.internalHistory.submitBatch(cmdRemove, cmdAdd)) + # Only last add command counts + needRecalc = cmdAdd.needsGuiRecalc success = any(results) - eos.db.flush() - sFit.recalc(self.fitID) + if needRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/gui/fitCommands/gui/projectedRemove.py b/gui/fitCommands/gui/projectedRemove.py index 196455b47..5679e274f 100644 --- a/gui/fitCommands/gui/projectedRemove.py +++ b/gui/fitCommands/gui/projectedRemove.py @@ -41,9 +41,11 @@ class GuiRemoveProjectedItemsCommand(wx.Command): def Do(self): results = [] + needRecalc = True for pModPosition in sorted(self.pModPositions, reverse=True): cmd = CalcRemoveProjectedModuleCommand(fitID=self.fitID, position=pModPosition) results.append(self.internalHistory.submit(cmd)) + needRecalc = cmd.needsGuiRecalc for pDroneItemID in self.pDroneItemIDs: cmd = CalcRemoveProjectedDroneCommand(fitID=self.fitID, itemID=pDroneItemID, amount=self.amount) results.append(self.internalHistory.submit(cmd)) @@ -54,9 +56,10 @@ class GuiRemoveProjectedItemsCommand(wx.Command): cmd = CalcRemoveProjectedFitCommand(fitID=self.fitID, projectedFitID=pFitID, amount=self.amount) results.append(self.internalHistory.submit(cmd)) success = any(results) - eos.db.flush() sFit = Fit.getInstance() - sFit.recalc(self.fitID) + if needRecalc: + eos.db.flush() + sFit.recalc(self.fitID) sFit.fill(self.fitID) eos.db.commit() wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) diff --git a/service/port/efs.py b/service/port/efs.py index 7d52046b0..1ccbf21f7 100755 --- a/service/port/efs.py +++ b/service/port/efs.py @@ -67,13 +67,17 @@ class EfsPort: if propID is None: return None - CalcAddLocalModuleCommand(fitID, ModuleInfo(itemID=propID)).Do() - sFit.recalc(fit) + cmd = CalcAddLocalModuleCommand(fitID, ModuleInfo(itemID=propID)) + cmd.Do() + if cmd.needsGuiRecalc: + sFit.recalc(fit) fit = eos.db.getFit(fitID) mwdPropSpeed = fit.maxSpeed mwdPosition = list(filter(lambda mod: mod.item and mod.item.ID == propID, fit.modules))[0].position - CalcRemoveLocalModulesCommand(fitID, [mwdPosition]).Do() - sFit.recalc(fit) + cmd = CalcRemoveLocalModulesCommand(fitID, [mwdPosition]) + cmd.Do() + if cmd.needsGuiRecalc: + sFit.recalc(fit) fit = eos.db.getFit(fitID) return mwdPropSpeed @@ -136,13 +140,15 @@ class EfsPort: CalcChangeModuleChargesCommand( fit.ID, projected=False, - chargeMap={mod.position: None}).Do() + chargeMap={mod.position: None}, + recalc=False).Do() sFit.recalc(fit) stats["unloadedCapacitorNeed"] = mod.getModifiedItemAttr("capacitorNeed") CalcChangeModuleChargesCommand( fit.ID, projected=False, - chargeMap={mod.position: c.typeID}).Do() + chargeMap={mod.position: c.typeID}, + recalc=False).Do() sFit.recalc(fit) elif mod.item.group.name == "Capacitor Booster": # The capacitorNeed is negative, which provides the boost.