Files
pyfa/gui/fitCommands/calc/fitReplaceModule.py
2019-04-10 01:22:41 +03:00

105 lines
3.6 KiB
Python

import wx
from logbook import Logger
import eos.db
from eos.saveddata.module import Module
from gui.fitCommands.helpers import ModuleInfoCache, stateLimit
pyfalog = Logger(__name__)
class FitReplaceModuleCommand(wx.Command):
""""
Fitting command that changes an existing module into another.
from sFit.changeModule
"""
def __init__(self, fitID, position, newItemID, newBaseItemID, newMutaplasmidID, newMutations, newState, newCharge):
wx.Command.__init__(self, True, "Change Module")
self.fitID = fitID
self.position = position
self.newItemID = newItemID
self.newBaseItemID = newBaseItemID
self.newMutaplasmidID = newMutaplasmidID
self.newMutations = newMutations
self.newState = newState
self.newCharge = newCharge
self.oldModuleInfo = None
def Do(self):
fit = eos.db.getFit(self.fitID)
mod = fit.modules[self.position]
if not mod.isEmpty:
self.oldModuleInfo = ModuleInfoCache(
mod.modPosition,
mod.item.ID,
mod.state,
mod.charge,
mod.baseItemID,
mod.mutaplasmidID,
{m.attrID: m.value for m in mod.mutators.values()})
newState = self.newState if self.newState is not None else getattr(self.oldModuleInfo, 'state', None)
newCharge = self.newCharge if self.newCharge is not None else getattr(self.oldModuleInfo, 'charge', None)
return self.changeModule(self.newItemID, self.newBaseItemID, self.newMutaplasmidID, self.newMutations, newState, newCharge)
def Undo(self):
if self.oldModuleInfo is None:
fit = eos.db.getFit(self.fitID)
fit.modules.toDummy(self.position)
return True
self.changeModule(
self.oldModuleInfo.itemID,
self.oldModuleInfo.baseID,
self.oldModuleInfo.mutaplasmidID,
self.oldModuleInfo.mutations,
self.oldModuleInfo.state,
self.oldModuleInfo.charge)
return True
def changeModule(self, itemID, baseItemID, mutaplasmidID, mutations, state, charge):
fit = eos.db.getFit(self.fitID)
oldMod = fit.modules[self.position]
pyfalog.debug("Changing module on position ({0}) for fit ID: {1}", self.position, self.fitID)
item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
if baseItemID and mutaplasmidID:
baseItem = eos.db.getItem(baseItemID, eager=("attributes", "group.category"))
mutaplasmid = eos.db.getDynamicItem(mutaplasmidID)
else:
baseItem = None
mutaplasmid = None
try:
newMod = Module(item, baseItem, mutaplasmid)
except ValueError:
pyfalog.warning("Invalid item: {0}", itemID)
return False
if newMod.slot != oldMod.slot:
return False
for attrID, mutator in newMod.mutators.items():
if attrID in mutations:
mutator.value = mutations[attrID]
# Dummy it out in case the next bit fails
fit.modules.toDummy(self.position)
if not newMod.fits(fit):
self.Undo()
return False
newMod.owner = fit
fit.modules.toModule(self.position, newMod)
desiredState = stateLimit(newMod.item) if state is None else state
if newMod.isValidState(desiredState):
newMod.state = desiredState
if charge is not None:
newMod.charge = charge
eos.db.commit()
return True