From 5bf05ba7753125cbede1e0826920ae01706601b6 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 30 Sep 2019 02:47:12 +0300 Subject: [PATCH] Allow batch changes of projection range --- .../itemProjectionRange.py | 40 ++++----- gui/fitCommands/__init__.py | 5 +- .../gui/projectedChangeProjectionRange.py | 89 +++++++++++++++++++ .../projectedDrone/changeProjectionRange.py | 42 --------- .../projectedFighter/changeProjectionRange.py | 42 --------- .../gui/projectedFit/changeProjectionRange.py | 40 --------- .../projectedModule/changeProjectionRange.py | 43 --------- gui/fitCommands/gui/projectedRemove.py | 1 + 8 files changed, 108 insertions(+), 194 deletions(-) create mode 100644 gui/fitCommands/gui/projectedChangeProjectionRange.py delete mode 100644 gui/fitCommands/gui/projectedDrone/changeProjectionRange.py delete mode 100644 gui/fitCommands/gui/projectedFighter/changeProjectionRange.py delete mode 100644 gui/fitCommands/gui/projectedFit/changeProjectionRange.py delete mode 100644 gui/fitCommands/gui/projectedModule/changeProjectionRange.py diff --git a/gui/builtinContextMenus/itemProjectionRange.py b/gui/builtinContextMenus/itemProjectionRange.py index 4ad604548..bcf3a8118 100644 --- a/gui/builtinContextMenus/itemProjectionRange.py +++ b/gui/builtinContextMenus/itemProjectionRange.py @@ -5,11 +5,11 @@ import wx import gui.fitCommands as cmd import gui.mainFrame -from eos.saveddata.drone import Drone -from eos.saveddata.fighter import Fighter -from eos.saveddata.fit import Fit as es_Fit -from eos.saveddata.module import Module +from eos.saveddata.fighter import Fighter as EosFighter +from eos.saveddata.fit import Fit as EosFit +from eos.saveddata.module import Module as EosModule from gui.contextMenu import ContextMenuCombined +from gui.fitCommands.helpers import getSimilarFighters, getSimilarModPositions from service.fit import Fit @@ -32,7 +32,7 @@ class ChangeItemProjectionRange(ContextMenuCombined): def activate(self, callingWindow, fullContext, mainItem, selection, i): fitID = self.mainFrame.getActiveFit() - if isinstance(mainItem, es_Fit): + if isinstance(mainItem, EosFit): try: value = mainItem.getProjectionInfo(fitID).projectionRange except AttributeError: @@ -43,8 +43,6 @@ class ChangeItemProjectionRange(ContextMenuCombined): value /= 1000 with RangeChanger(self.mainFrame, value) as dlg: if dlg.ShowModal() == wx.ID_OK: - sFit = Fit.getInstance() - fit = sFit.getFit(fitID) cleanInput = re.sub(r'[^0-9.]', '', dlg.input.GetLineText(0).strip()) if cleanInput: try: @@ -55,22 +53,18 @@ class ChangeItemProjectionRange(ContextMenuCombined): else: newRange = None - if isinstance(mainItem, es_Fit): - self.mainFrame.command.Submit(cmd.GuiChangeProjectedFitProjectionRangeCommand( - fitID=fitID, projectedFitID=mainItem.ID, projectionRange=newRange)) - elif isinstance(mainItem, Module): - if mainItem in fit.projectedModules: - position = fit.projectedModules.index(mainItem) - self.mainFrame.command.Submit(cmd.GuiChangeProjectedModuleProjectionRangeCommand( - fitID=fitID, position=position, projectionRange=newRange)) - elif isinstance(mainItem, Drone): - self.mainFrame.command.Submit(cmd.GuiChangeProjectedDroneProjectionRangeCommand( - fitID=fitID, itemID=mainItem.itemID, projectionRange=newRange)) - elif isinstance(mainItem, Fighter): - if mainItem in fit.projectedFighters: - position = fit.projectedFighters.index(mainItem) - self.mainFrame.command.Submit(cmd.GuiChangeProjectedFighterProjectionRangeCommand( - fitID=fitID, position=position, projectionRange=newRange)) + fitID = self.mainFrame.getActiveFit() + items = selection + if wx.GetMouseState().GetModifiers() == wx.MOD_ALT: + if isinstance(mainItem, EosModule): + fit = Fit.getInstance().getFit(fitID) + positions = getSimilarModPositions(fit.projectedModules, mainItem) + items = [fit.projectedModules[p] for p in positions] + elif isinstance(mainItem, EosFighter): + fit = Fit.getInstance().getFit(fitID) + items = getSimilarFighters(fit.projectedFighters, mainItem) + self.mainFrame.command.Submit(cmd.GuiChangeProjectedItemsProjectionRangeCommand( + fitID=fitID, items=items, projectionRange=newRange)) ChangeItemProjectionRange.register() diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py index d09612d5d..ecef17781 100644 --- a/gui/fitCommands/__init__.py +++ b/gui/fitCommands/__init__.py @@ -56,23 +56,20 @@ from .gui.localModule.replace import GuiReplaceLocalModuleCommand from .gui.localModule.swap import GuiSwapLocalModulesCommand from .gui.localModuleCargo.cargoToLocalModule import GuiCargoToLocalModuleCommand from .gui.localModuleCargo.localModuleToCargo import GuiLocalModuleToCargoCommand +from .gui.projectedChangeProjectionRange import GuiChangeProjectedItemsProjectionRangeCommand from .gui.projectedChangeStates import GuiChangeProjectedItemStatesCommand from .gui.projectedDrone.add import GuiAddProjectedDroneCommand from .gui.projectedDrone.changeAmount import GuiChangeProjectedDroneAmountCommand from .gui.projectedDrone.changeMetas import GuiChangeProjectedDroneMetasCommand -from .gui.projectedDrone.changeProjectionRange import GuiChangeProjectedDroneProjectionRangeCommand from .gui.projectedFighter.abilityToggleState import GuiToggleProjectedFighterAbilityStateCommand from .gui.projectedFighter.add import GuiAddProjectedFighterCommand from .gui.projectedFighter.changeAmount import GuiChangeProjectedFighterAmountCommand from .gui.projectedFighter.changeMetas import GuiChangeProjectedFighterMetasCommand -from .gui.projectedFighter.changeProjectionRange import GuiChangeProjectedFighterProjectionRangeCommand from .gui.projectedFit.add import GuiAddProjectedFitsCommand from .gui.projectedFit.changeAmount import GuiChangeProjectedFitAmountCommand -from .gui.projectedFit.changeProjectionRange import GuiChangeProjectedFitProjectionRangeCommand from .gui.projectedModule.add import GuiAddProjectedModuleCommand from .gui.projectedModule.changeCharges import GuiChangeProjectedModuleChargesCommand from .gui.projectedModule.changeMetas import GuiChangeProjectedModuleMetasCommand -from .gui.projectedModule.changeProjectionRange import GuiChangeProjectedModuleProjectionRangeCommand from .gui.projectedModule.changeSpool import GuiChangeProjectedModuleSpoolCommand from .gui.projectedRemove import GuiRemoveProjectedItemsCommand from .gui.shipModeChange import GuiChangeShipModeCommand diff --git a/gui/fitCommands/gui/projectedChangeProjectionRange.py b/gui/fitCommands/gui/projectedChangeProjectionRange.py new file mode 100644 index 000000000..83cf6f6cf --- /dev/null +++ b/gui/fitCommands/gui/projectedChangeProjectionRange.py @@ -0,0 +1,89 @@ +import wx + +import eos.db +import gui.mainFrame +from eos.saveddata.drone import Drone as EosDrone +from eos.saveddata.fighter import Fighter as EosFighter +from eos.saveddata.fit import Fit as EosFit +from eos.saveddata.module import Module as EosModule +from gui import globalEvents as GE +from gui.fitCommands.calc.drone.projectedChangeProjectionRange import CalcChangeProjectedDroneProjectionRangeCommand +from gui.fitCommands.calc.fighter.projectedChangeProjectionRange import CalcChangeProjectedFighterProjectionRangeCommand +from gui.fitCommands.calc.module.projectedChangeProjectionRange import CalcChangeProjectedModuleProjectionRangeCommand +from gui.fitCommands.calc.projectedFit.changeProjectionRange import CalcChangeProjectedFitProjectionRangeCommand +from gui.fitCommands.helpers import InternalCommandHistory +from service.fit import Fit + + +class GuiChangeProjectedItemsProjectionRangeCommand(wx.Command): + + def __init__(self, fitID, items, projectionRange): + wx.Command.__init__(self, True, 'Change Projected Items Projection Range') + self.internalHistory = InternalCommandHistory() + self.fitID = fitID + self.projectionRange = projectionRange + self.pModPositions = [] + self.pDroneItemIDs = [] + self.pFighterPositions = [] + self.pFitIDs = [] + fit = Fit.getInstance().getFit(fitID) + for item in items: + if isinstance(item, EosModule): + if item in fit.projectedModules and not getattr(item, 'isExclusiveSystemEffect', False): + self.pModPositions.append(fit.projectedModules.index(item)) + elif isinstance(item, EosDrone): + self.pDroneItemIDs.append(item.itemID) + elif isinstance(item, EosFighter): + if item in fit.projectedFighters: + self.pFighterPositions.append(fit.projectedFighters.index(item)) + elif isinstance(item, EosFit): + self.pFitIDs.append(item.ID) + + def Do(self): + results = [] + needRecalc = True + for pModPosition in self.pModPositions: + cmd = CalcChangeProjectedModuleProjectionRangeCommand( + fitID=self.fitID, + position=pModPosition, + projectionRange=self.projectionRange) + results.append(self.internalHistory.submit(cmd)) + needRecalc = cmd.needsGuiRecalc + for pDroneItemID in self.pDroneItemIDs: + cmd = CalcChangeProjectedDroneProjectionRangeCommand( + fitID=self.fitID, + itemID=pDroneItemID, + projectionRange=self.projectionRange) + results.append(self.internalHistory.submit(cmd)) + for pFighterPosition in self.pFighterPositions: + cmd = CalcChangeProjectedFighterProjectionRangeCommand( + fitID=self.fitID, + position=pFighterPosition, + projectionRange=self.projectionRange) + results.append(self.internalHistory.submit(cmd)) + for pFitID in self.pFitIDs: + cmd = CalcChangeProjectedFitProjectionRangeCommand( + fitID=self.fitID, + projectedFitID=pFitID, + projectionRange=self.projectionRange) + results.append(self.internalHistory.submit(cmd)) + needRecalc = cmd.needsGuiRecalc + success = any(results) + sFit = Fit.getInstance() + 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,))) + return success + + def Undo(self): + success = self.internalHistory.undoAll() + eos.db.flush() + sFit = Fit.getInstance() + sFit.recalc(self.fitID) + sFit.fill(self.fitID) + eos.db.commit() + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) + return success diff --git a/gui/fitCommands/gui/projectedDrone/changeProjectionRange.py b/gui/fitCommands/gui/projectedDrone/changeProjectionRange.py deleted file mode 100644 index 183873dc5..000000000 --- a/gui/fitCommands/gui/projectedDrone/changeProjectionRange.py +++ /dev/null @@ -1,42 +0,0 @@ -import wx - -import eos.db -import gui.mainFrame -from gui import globalEvents as GE -from gui.fitCommands.calc.drone.projectedChangeProjectionRange import CalcChangeProjectedDroneProjectionRangeCommand -from gui.fitCommands.helpers import InternalCommandHistory -from service.fit import Fit - - -class GuiChangeProjectedDroneProjectionRangeCommand(wx.Command): - - def __init__(self, fitID, itemID, projectionRange): - wx.Command.__init__(self, True, 'Change Projected Drone Projection Range') - self.internalHistory = InternalCommandHistory() - self.fitID = fitID - self.itemID = itemID - self.projectionRange = projectionRange - - def Do(self): - cmd = CalcChangeProjectedDroneProjectionRangeCommand( - fitID=self.fitID, - itemID=self.itemID, - projectionRange=self.projectionRange) - success = self.internalHistory.submit(cmd) - eos.db.flush() - sFit = Fit.getInstance() - sFit.recalc(self.fitID) - sFit.fill(self.fitID) - eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) - return success - - def Undo(self): - success = self.internalHistory.undoAll() - eos.db.flush() - sFit = Fit.getInstance() - sFit.recalc(self.fitID) - sFit.fill(self.fitID) - eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) - return success diff --git a/gui/fitCommands/gui/projectedFighter/changeProjectionRange.py b/gui/fitCommands/gui/projectedFighter/changeProjectionRange.py deleted file mode 100644 index c122947ba..000000000 --- a/gui/fitCommands/gui/projectedFighter/changeProjectionRange.py +++ /dev/null @@ -1,42 +0,0 @@ -import wx - -import eos.db -import gui.mainFrame -from gui import globalEvents as GE -from gui.fitCommands.calc.fighter.projectedChangeProjectionRange import CalcChangeProjectedFighterProjectionRangeCommand -from gui.fitCommands.helpers import InternalCommandHistory -from service.fit import Fit - - -class GuiChangeProjectedFighterProjectionRangeCommand(wx.Command): - - def __init__(self, fitID, position, projectionRange): - wx.Command.__init__(self, True, 'Change Projected Fighter Projection Range') - self.internalHistory = InternalCommandHistory() - self.fitID = fitID - self.position = position - self.projectionRange = projectionRange - - def Do(self): - cmd = CalcChangeProjectedFighterProjectionRangeCommand( - fitID=self.fitID, - position=self.position, - projectionRange=self.projectionRange) - success = self.internalHistory.submit(cmd) - eos.db.flush() - sFit = Fit.getInstance() - sFit.recalc(self.fitID) - sFit.fill(self.fitID) - eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) - return success - - def Undo(self): - success = self.internalHistory.undoAll() - eos.db.flush() - sFit = Fit.getInstance() - sFit.recalc(self.fitID) - sFit.fill(self.fitID) - eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) - return success diff --git a/gui/fitCommands/gui/projectedFit/changeProjectionRange.py b/gui/fitCommands/gui/projectedFit/changeProjectionRange.py deleted file mode 100644 index 48b7257d7..000000000 --- a/gui/fitCommands/gui/projectedFit/changeProjectionRange.py +++ /dev/null @@ -1,40 +0,0 @@ -import wx - -import eos.db -import gui.mainFrame -from gui import globalEvents as GE -from gui.fitCommands.calc.projectedFit.changeProjectionRange import CalcChangeProjectedFitProjectionRangeCommand -from gui.fitCommands.helpers import InternalCommandHistory -from service.fit import Fit - - -class GuiChangeProjectedFitProjectionRangeCommand(wx.Command): - - def __init__(self, fitID, projectedFitID, projectionRange): - wx.Command.__init__(self, True, 'Change Projected Fit Projection Range') - self.internalHistory = InternalCommandHistory() - self.fitID = fitID - self.projectedFitID = projectedFitID - self.projectionRange = projectionRange - - def Do(self): - cmd = CalcChangeProjectedFitProjectionRangeCommand(fitID=self.fitID, projectedFitID=self.projectedFitID, projectionRange=self.projectionRange) - success = self.internalHistory.submit(cmd) - sFit = Fit.getInstance() - 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,))) - return success - - def Undo(self): - success = self.internalHistory.undoAll() - eos.db.flush() - sFit = Fit.getInstance() - sFit.recalc(self.fitID) - sFit.fill(self.fitID) - eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) - return success diff --git a/gui/fitCommands/gui/projectedModule/changeProjectionRange.py b/gui/fitCommands/gui/projectedModule/changeProjectionRange.py deleted file mode 100644 index 3d7c21a1f..000000000 --- a/gui/fitCommands/gui/projectedModule/changeProjectionRange.py +++ /dev/null @@ -1,43 +0,0 @@ -import wx - -import eos.db -import gui.mainFrame -from gui import globalEvents as GE -from gui.fitCommands.calc.module.projectedChangeProjectionRange import CalcChangeProjectedModuleProjectionRangeCommand -from gui.fitCommands.helpers import InternalCommandHistory -from service.fit import Fit - - -class GuiChangeProjectedModuleProjectionRangeCommand(wx.Command): - - def __init__(self, fitID, position, projectionRange): - wx.Command.__init__(self, True, 'Change Projected Module Projection Range') - self.internalHistory = InternalCommandHistory() - self.fitID = fitID - self.position = position - self.projectionRange = projectionRange - - def Do(self): - cmd = CalcChangeProjectedModuleProjectionRangeCommand( - fitID=self.fitID, - position=self.position, - projectionRange=self.projectionRange) - success = self.internalHistory.submit(cmd) - sFit = Fit.getInstance() - 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,))) - return success - - def Undo(self): - success = self.internalHistory.undoAll() - eos.db.flush() - sFit = Fit.getInstance() - sFit.recalc(self.fitID) - sFit.fill(self.fitID) - eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitIDs=(self.fitID,))) - return success diff --git a/gui/fitCommands/gui/projectedRemove.py b/gui/fitCommands/gui/projectedRemove.py index 5679e274f..cc70d4dcd 100644 --- a/gui/fitCommands/gui/projectedRemove.py +++ b/gui/fitCommands/gui/projectedRemove.py @@ -55,6 +55,7 @@ class GuiRemoveProjectedItemsCommand(wx.Command): for pFitID in self.pFitIDs: cmd = CalcRemoveProjectedFitCommand(fitID=self.fitID, projectedFitID=pFitID, amount=self.amount) results.append(self.internalHistory.submit(cmd)) + needRecalc = cmd.needsGuiRecalc success = any(results) sFit = Fit.getInstance() if needRecalc: