Allow batch changes of projection range

This commit is contained in:
DarkPhoenix
2019-09-30 02:47:12 +03:00
parent c073b1fa2a
commit 5bf05ba775
8 changed files with 108 additions and 194 deletions

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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: