Files
pyfa/gui/fitCommands/gui/projectedChangeStates.py

103 lines
4.6 KiB
Python

import wx
import eos.db
import gui.mainFrame
from eos.const import FittingModuleState
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.projectedChangeState import CalcChangeProjectedDroneStateCommand
from gui.fitCommands.calc.fighter.projectedChangeState import CalcChangeProjectedFighterStateCommand
from gui.fitCommands.calc.module.projectedChangeStates import CalcChangeProjectedModuleStatesCommand
from gui.fitCommands.calc.projectedFit.changeState import CalcChangeProjectedFitStateCommand
from gui.fitCommands.helpers import InternalCommandHistory
from service.fit import Fit
class GuiChangeProjectedItemStatesCommand(wx.Command):
def __init__(self, fitID, mainItem, items, click):
wx.Command.__init__(self, True, 'Change Projected Item States')
self.internalHistory = InternalCommandHistory()
self.fitID = fitID
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:
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)
self.proposedState = None
if click == 'right' and isinstance(mainItem, EosModule):
self.proposedState = 'overheat'
elif click == 'left':
if isinstance(mainItem, EosModule):
modProposedState = EosModule.getProposedState(mainItem, click)
self.proposedState = 'inactive' if modProposedState == FittingModuleState.OFFLINE else 'active'
elif isinstance(mainItem, EosDrone):
self.proposedState = 'active' if mainItem.amountActive == 0 else 'inactive'
elif isinstance(mainItem, EosFighter):
self.proposedState = 'inactive' if mainItem.active else 'active'
elif isinstance(mainItem, EosFit):
projectionInfo = mainItem.getProjectionInfo(self.fitID)
if projectionInfo is not None:
self.proposedState = 'inactive' if projectionInfo.active else 'active'
def Do(self):
if self.proposedState is None:
return False
results = []
if self.pModPositions:
cmd = CalcChangeProjectedModuleStatesCommand(
fitID=self.fitID,
positions=self.pModPositions,
proposedState=self.proposedState)
results.append(self.internalHistory.submit(cmd))
for pDroneItemID in self.pDroneItemIDs:
cmd = CalcChangeProjectedDroneStateCommand(
fitID=self.fitID,
itemID=pDroneItemID,
state=False if self.proposedState == 'inactive' else True)
results.append(self.internalHistory.submit(cmd))
for pFighterPosition in self.pFighterPositions:
cmd = CalcChangeProjectedFighterStateCommand(
fitID=self.fitID,
position=pFighterPosition,
state=False if self.proposedState == 'inactive' else True)
results.append(self.internalHistory.submit(cmd))
for pFitID in self.pFitIDs:
cmd = CalcChangeProjectedFitStateCommand(
fitID=self.fitID,
projectedFitID=pFitID,
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)
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