Rework projected drone fit commands

This commit is contained in:
DarkPhoenix
2019-04-13 16:25:49 +03:00
parent 5f8ccb9831
commit 7f870cf675
6 changed files with 101 additions and 87 deletions

View File

@@ -19,7 +19,7 @@ class FitAddCargoCommand(wx.Command):
def Do(self):
pyfalog.debug('Doing addition of cargo {} to fit {}'.format(self.cargoInfo, self.fitID))
fit = Fit.getInstance().getFit(self.fitID)
cargo = next((x for x in fit.cargo if x.itemID == self.cargoInfo.itemID), None)
cargo = next((c for c in fit.cargo if c.itemID == self.cargoInfo.itemID), None)
if cargo is None:
cargo = self.cargoInfo.toCargo()
try:

View File

@@ -3,6 +3,7 @@ from logbook import Logger
import eos.db
from eos.exception import HandledListActionError
from gui.fitCommands.helpers import DroneInfo
from service.fit import Fit
from service.market import Market
@@ -16,7 +17,8 @@ class FitAddDroneCommand(wx.Command):
wx.Command.__init__(self, True, 'Add Drone')
self.fitID = fitID
self.droneInfo = droneInfo
self.position = None
self.savedDroneInfo = None
self.savedPosition = None
def Do(self):
pyfalog.debug('Doing addition of drone {} to fit {}'.format(self.droneInfo, self.fitID))
@@ -25,15 +27,15 @@ class FitAddDroneCommand(wx.Command):
# If we're not adding any active drones, check if there's an inactive stack
# with enough space for new drones and use it
if self.droneInfo.amountActive == 0:
for d in fit.drones.find(item):
for drone in fit.drones.find(item):
if (
d is not None and d.amountActive == 0 and
d.amount + self.droneInfo.amount) <= max(5, fit.extraAttributes["maxActiveDrones"]
drone is not None and drone.amountActive == 0 and
drone.amount + self.droneInfo.amount) <= max(5, fit.extraAttributes["maxActiveDrones"]
):
drone = d
self.savedDroneInfo = DroneInfo.fromDrone(drone)
self.savedPosition = fit.drones.index(drone)
drone.amount += self.droneInfo.amount
eos.db.commit()
self.position = fit.drones.index(drone)
return True
# Do new stack otherwise
drone = self.droneInfo.toDrone()
@@ -49,11 +51,17 @@ class FitAddDroneCommand(wx.Command):
eos.db.commit()
return False
eos.db.commit()
self.position = fit.drones.index(drone)
self.savedPosition = fit.drones.index(drone)
return True
def Undo(self):
pyfalog.debug('Undoing addition of drone {} to fit {}'.format(self.droneInfo, self.fitID))
if self.savedDroneInfo is not None:
fit = Fit.getInstance().getFit(self.fitID)
drone = fit.drones[self.savedPosition]
drone.amount = self.savedDroneInfo.amount
drone.amountActive = self.savedDroneInfo.amountActive
return True
from .fitRemoveDrone import FitRemoveDroneCommand
cmd = FitRemoveDroneCommand(fitID=self.fitID, position=self.position, amount=self.droneInfo.amount)
cmd = FitRemoveDroneCommand(fitID=self.fitID, position=self.savedPosition, amount=self.droneInfo.amount)
return cmd.Do()

View File

@@ -1,46 +1,66 @@
import wx
import eos.db
from logbook import Logger
from eos.saveddata.drone import Drone
import eos.db
from eos.exception import HandledListActionError
from gui.fitCommands.helpers import DroneInfo
from service.fit import Fit
pyfalog = Logger(__name__)
class FitAddProjectedDroneCommand(wx.Command):
""""
from sFit.project
"""
def __init__(self, fitID, itemID):
wx.Command.__init__(self, True)
def __init__(self, fitID, droneInfo):
wx.Command.__init__(self, True, 'Add Projected Drone')
self.fitID = fitID
self.itemID = itemID
self.index = None
self.droneInfo = droneInfo
self.savedDroneInfo = None
def Do(self):
pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.itemID)
fit = eos.db.getFit(self.fitID)
item = eos.db.getItem(self.itemID)
drone = None
for d in fit.projectedDrones.find(item):
if d is None or d.amountActive == d.amount or d.amount >= 5:
drone = d
break
pyfalog.debug('Doing addition of projected drone {} to fit {}'.format(self.droneInfo, self.fitID))
fit = Fit.getInstance().getFit(self.fitID)
drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.droneInfo.itemID), None)
# Changing existing stack
if drone is not None:
self.savedDroneInfo = DroneInfo.fromDrone(drone)
# Ignore drone info's active amount parameter if we're adding to existing stack,
# and decide based on stack's state
drone.amount += self.droneInfo.amount
if drone.amountActive > 0:
drone.amountActive += self.droneInfo.amount
eos.db.commit()
return True
# Making new stack
drone = self.droneInfo.toDrone()
if drone is None:
drone = Drone(item)
if not drone.item.isType("projected"):
return False
return False
if not drone.item.isType('projected'):
pyfalog.debug('Drone is not projectable')
return False
try:
fit.projectedDrones.append(drone)
self.index = fit.projectedDrones.index(drone)
drone.amount += 1
drone.amountActive = drone.amount
except HandledListActionError:
pyfalog.warning('Failed to append to list')
eos.db.commit()
return False
eos.db.commit()
return True
def Undo(self):
from gui.fitCommands.calc.fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand # avoids circular import
cmd = FitRemoveProjectedDroneCommand(self.fitID, self.index)
cmd.Do()
return True
pyfalog.debug('Undoing addition of projected drone {} to fit {}'.format(self.droneInfo, self.fitID))
# Changing existing stack
if self.savedDroneInfo is not None:
fit = Fit.getInstance().getFit(self.fitID)
drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.savedDroneInfo.itemID), None)
if drone is None:
pyfalog.warning('Unable to find projected drone for modification')
return False
drone.amount = self.savedDroneInfo.amount
drone.amountActive = self.savedDroneInfo.amountActive
return True
# Removing new stack
from .fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand
cmd = FitRemoveProjectedDroneCommand(self.fitID, self.droneInfo)
return cmd.Do()

View File

@@ -2,66 +2,49 @@ import wx
from logbook import Logger
import eos.db
from eos.saveddata.drone import Drone
from gui.fitCommands.helpers import DroneInfo
from service.fit import Fit
from service.market import Market
pyfalog = Logger(__name__)
class FitRemoveProjectedDroneCommand(wx.Command):
""""
from sFit.project
"""
def __init__(self, fitID, position, amount=1):
wx.Command.__init__(self, True)
def __init__(self, fitID, droneInfo):
wx.Command.__init__(self, True, 'Remove Projected Drone')
self.fitID = fitID
self.position = position
self.amountToRemove = amount
self.savedItemID = None
self.savedAmount = None
self.savedAmountActive = None
self.removedStack = None
self.droneInfo = droneInfo
self.savedDroneInfo = None
def Do(self):
pyfalog.debug("Removing ({0}) onto: {1}".format(self.fitID, self.position))
pyfalog.debug('Doing removal of projected drone {} from fit {}'.format(self.droneInfo, self.fitID))
fit = Fit.getInstance().getFit(self.fitID)
drone = fit.projectedDrones[self.position]
self.savedItemID = drone.itemID
self.savedAmount = drone.amount
self.savedAmountActive = drone.amountActive
drone.amount -= self.amountToRemove
if drone.amountActive > 0:
drone.amountActive -= self.amountToRemove
drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.droneInfo.itemID), None)
if drone is None:
pyfalog.warning('Unable to find projected drone for removal')
return False
self.savedDroneInfo = DroneInfo.fromDrone(drone)
drone.amount -= self.droneInfo.amount
# Remove stack if we have no items remaining
if drone.amount == 0:
del fit.projectedDrones[self.position]
self.removedStack = True
fit.projectedDrones.remove(drone)
else:
self.removedStack = False
if drone.amountActive > 0:
drone.amountActive -= self.droneInfo.amount
eos.db.commit()
return True
def Undo(self):
pyfalog.debug('Undoing removal of projected drone {} from fit {}'.format(self.droneInfo, self.fitID))
fit = Fit.getInstance().getFit(self.fitID)
if self.removedStack:
droneItem = Market.getInstance().getItem(self.savedItemID, eager=("attributes", "group.category"))
try:
drone = Drone(droneItem)
except ValueError:
pyfalog.warning("Invalid drone: {}", droneItem)
return False
if not drone.fits(fit):
return False
drone.amount = self.savedAmount
drone.amountActive = self.savedAmountActive
fit.projectedDrones.insert(self.position, drone)
else:
drone = fit.projectedDrones[self.position]
drone.amount = self.savedAmount
drone.amountActive = self.savedAmountActive
eos.db.commit()
return True
# Change stack if we still have it
drone = next((pd for pd in fit.projectedDrones if pd.itemID == self.savedDroneInfo.itemID), None)
if drone is not None:
drone.amount = self.savedDroneInfo.amount
drone.amountActive = self.savedDroneInfo.amountActive
return True
# Make new stack
from .fitAddProjectedDrone import FitAddProjectedDroneCommand
cmd = FitAddProjectedDroneCommand(self.fitID, self.savedDroneInfo)
return cmd.Do()

View File

@@ -3,7 +3,7 @@ from service.fit import Fit
import gui.mainFrame
from gui import globalEvents as GE
from gui.fitCommands.helpers import ModuleInfo
from gui.fitCommands.helpers import ModuleInfo, DroneInfo
from .calc.fitAddProjectedModule import FitAddProjectedModuleCommand
from .calc.fitAddProjectedFit import FitAddProjectedFitCommand
from .calc.fitAddProjectedFighter import FitAddProjectedFighterCommand
@@ -31,7 +31,9 @@ class GuiAddProjectedCommand(wx.Command):
item = eos.db.getItem(self.id, eager=("attributes", "group.category"))
if item.category.name == "Drone":
result = self.internal_history.Submit(FitAddProjectedDroneCommand(self.fitID, self.id))
result = self.internal_history.Submit(FitAddProjectedDroneCommand(
fitID=self.fitID,
droneInfo=DroneInfo(itemID=self.id, amount=1, amountActive=1)))
elif item.category.name == "Fighter":
result = self.internal_history.Submit(FitAddProjectedFighterCommand(self.fitID, self.id, None, None))
else:

View File

@@ -9,6 +9,7 @@ from .calc.fitRemoveProjectedFighter import FitRemoveProjectedFighterCommand
from logbook import Logger
from .calc.fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand
from gui.fitCommands.helpers import DroneInfo
from eos.saveddata.drone import Drone
from eos.saveddata.module import Module
from eos.saveddata.fighter import Fighter
@@ -33,7 +34,7 @@ class GuiRemoveProjectedCommand(wx.Command):
fit = self.sFit.getFit(fitID)
if isinstance(thing, Drone):
self.data = fit.projectedDrones.index(thing)
self.data = DroneInfo(itemID=thing.itemID, amount=1, amountActive=1)
self.type = 'drone'
elif isinstance(thing, Module):
self.type = 'module'