Change booster removal commands to support multi-selection

This commit is contained in:
DarkPhoenix
2019-04-25 17:56:53 +03:00
parent 7b564f1f53
commit 29c29469c6
7 changed files with 69 additions and 48 deletions

View File

@@ -48,6 +48,7 @@ class BoosterViewDrop(wx.DropTarget):
class BoosterView(d.Display):
DEFAULT_COLS = [
"State",
"attr:boosterness",
@@ -162,8 +163,8 @@ class BoosterView(d.Display):
fitID = self.mainFrame.getActiveFit()
if booster in self.original:
position = self.original.index(booster)
self.mainFrame.command.Submit(cmd.GuiRemoveBoosterCommand(
fitID=fitID, position=position))
self.mainFrame.command.Submit(cmd.GuiRemoveBoostersCommand(
fitID=fitID, positions=[position]))
def click(self, event):
event.Skip()

View File

@@ -226,35 +226,33 @@ class ImplantDisplay(d.Display):
def click(self, event):
fitID = self.mainFrame.getActiveFit()
fit = Fit.getInstance().getFit(fitID)
if fit.implantLocation != ImplantLocation.FIT:
event.Skip()
return
mainRow, _ = self.HitTest(event.Position)
if mainRow != -1:
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
try:
mainImplant = self.implants[mainRow]
except IndexError:
return
if mainImplant in self.original:
mainPosition = self.original.index(mainImplant)
positions = []
for row in self.getSelectedRows():
try:
implant = self.implants[row]
except IndexError:
continue
if implant in self.original:
positions.append(self.original.index(implant))
if mainPosition not in positions:
positions = [mainPosition]
self.mainFrame.command.Submit(cmd.GuiToggleImplantStatesCommand(
fitID=fitID,
mainPosition=mainPosition,
positions=positions))
return
if fit.implantLocation == ImplantLocation.FIT:
mainRow, _ = self.HitTest(event.Position)
if mainRow != -1:
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
try:
mainImplant = self.implants[mainRow]
except IndexError:
return
if mainImplant in self.original:
mainPosition = self.original.index(mainImplant)
positions = []
for row in self.getSelectedRows():
try:
implant = self.implants[row]
except IndexError:
continue
if implant in self.original:
positions.append(self.original.index(implant))
if mainPosition not in positions:
positions = [mainPosition]
self.mainFrame.command.Submit(cmd.GuiToggleImplantStatesCommand(
fitID=fitID,
mainPosition=mainPosition,
positions=positions))
return
event.Skip()
def spawnMenu(self, event):

View File

@@ -108,7 +108,7 @@ class RemoveItem(ContextMenuCombined):
fit = Fit.getInstance().getFit(fitID)
if mainItem in fit.boosters:
position = fit.boosters.index(mainItem)
self.mainFrame.command.Submit(cmd.GuiRemoveBoosterCommand(
self.mainFrame.command.Submit(cmd.GuiRemoveBoostersCommand(
fitID=fitID, position=position))
def __handleCargo(self, mainItem, selection):

View File

@@ -1,6 +1,6 @@
from .gui.booster.add import GuiAddBoosterCommand
from .gui.booster.changeMeta import GuiChangeBoosterMetaCommand
from .gui.booster.remove import GuiRemoveBoosterCommand
from .gui.booster.remove import GuiRemoveBoostersCommand
from .gui.booster.sideEffectToggleState import GuiToggleBoosterSideEffectStateCommand
from .gui.booster.toggleState import GuiToggleBoosterStateCommand
from .gui.cargo.add import GuiAddCargoCommand

View File

@@ -11,11 +11,12 @@ pyfalog = Logger(__name__)
class CalcAddBoosterCommand(wx.Command):
def __init__(self, fitID, boosterInfo, position=None):
def __init__(self, fitID, boosterInfo, position=None, commit=True):
wx.Command.__init__(self, True, 'Add Booster')
self.fitID = fitID
self.newBoosterInfo = boosterInfo
self.newPosition = position
self.commit = commit
self.oldBoosterInfo = None
self.oldPosition = None
@@ -38,7 +39,11 @@ class CalcAddBoosterCommand(wx.Command):
fit.boosters.insert(self.newPosition, newBooster)
except HandledListActionError:
pyfalog.warning('Failed to insert to list')
cmd = CalcAddBoosterCommand(fitID=self.fitID, boosterInfo=self.oldBoosterInfo, position=self.oldPosition)
cmd = CalcAddBoosterCommand(
fitID=self.fitID,
boosterInfo=self.oldBoosterInfo,
position=self.oldPosition,
commit=self.commit)
cmd.Do()
return False
else:
@@ -46,19 +51,24 @@ class CalcAddBoosterCommand(wx.Command):
fit.boosters.append(newBooster)
except HandledListActionError:
pyfalog.warning('Failed to append to list')
cmd = CalcAddBoosterCommand(fitID=self.fitID, boosterInfo=self.oldBoosterInfo, position=self.oldPosition)
cmd = CalcAddBoosterCommand(
fitID=self.fitID,
boosterInfo=self.oldBoosterInfo,
position=self.oldPosition,
commit=self.commit)
cmd.Do()
return False
self.newPosition = fit.boosters.index(newBooster)
eos.db.commit()
if self.commit:
eos.db.commit()
return True
def Undo(self):
pyfalog.debug('Undo addition of booster {} to fit {}'.format(self.newBoosterInfo, self.fitID))
if self.oldBoosterInfo is not None and self.oldPosition is not None:
cmd = CalcAddBoosterCommand(fitID=self.fitID, boosterInfo=self.oldBoosterInfo, position=self.oldPosition)
cmd = CalcAddBoosterCommand(fitID=self.fitID, boosterInfo=self.oldBoosterInfo, position=self.oldPosition, commit=self.commit)
return cmd.Do()
from .remove import CalcRemoveBoosterCommand
cmd = CalcRemoveBoosterCommand(fitID=self.fitID, position=self.newPosition)
cmd = CalcRemoveBoosterCommand(fitID=self.fitID, position=self.newPosition, commit=self.commit)
return cmd.Do()

View File

@@ -11,10 +11,11 @@ pyfalog = Logger(__name__)
class CalcRemoveBoosterCommand(wx.Command):
def __init__(self, fitID, position):
def __init__(self, fitID, position, commit=True):
wx.Command.__init__(self, True, 'Remove Booster')
self.fitID = fitID
self.position = position
self.commit = commit
self.savedBoosterInfo = None
def Do(self):
@@ -23,11 +24,16 @@ class CalcRemoveBoosterCommand(wx.Command):
booster = fit.boosters[self.position]
self.savedBoosterInfo = BoosterInfo.fromBooster(booster)
fit.boosters.remove(booster)
eos.db.commit()
if self.commit:
eos.db.commit()
return True
def Undo(self):
pyfalog.debug('Undoing removal of booster {} on fit {}'.format(self.savedBoosterInfo, self.fitID))
from .add import CalcAddBoosterCommand
cmd = CalcAddBoosterCommand(fitID=self.fitID, boosterInfo=self.savedBoosterInfo, position=self.position)
cmd = CalcAddBoosterCommand(
fitID=self.fitID,
boosterInfo=self.savedBoosterInfo,
position=self.position,
commit=self.commit)
return cmd.Do()

View File

@@ -1,5 +1,6 @@
import wx
import eos.db
import gui.mainFrame
from gui import globalEvents as GE
from gui.fitCommands.calc.booster.remove import CalcRemoveBoosterCommand
@@ -7,23 +8,28 @@ from gui.fitCommands.helpers import InternalCommandHistory
from service.fit import Fit
class GuiRemoveBoosterCommand(wx.Command):
class GuiRemoveBoostersCommand(wx.Command):
def __init__(self, fitID, position):
wx.Command.__init__(self, True, 'Remove Booster')
def __init__(self, fitID, positions):
wx.Command.__init__(self, True, 'Remove Boosters')
self.internalHistory = InternalCommandHistory()
self.fitID = fitID
self.position = position
self.positions = positions
def Do(self):
cmd = CalcRemoveBoosterCommand(fitID=self.fitID, position=self.position)
success = self.internalHistory.submit(cmd)
results = []
for position in sorted(self.positions, reverse=True):
cmd = CalcRemoveBoosterCommand(fitID=self.fitID, position=position, commit=False)
results.append(self.internalHistory.submit(cmd))
success = any(results)
eos.db.commit()
Fit.getInstance().recalc(self.fitID)
wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitID=self.fitID))
return success
def Undo(self):
success = self.internalHistory.undoAll()
eos.db.commit()
Fit.getInstance().recalc(self.fitID)
wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitID=self.fitID))
return success