From 0f4f8c636d72085b7d14c77e46e88d1ec72ced37 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 4 Aug 2018 22:10:14 -0400 Subject: [PATCH] Start working on projections --- gui/builtinAdditionPanes/projectedView.py | 19 ++--- gui/builtinContextMenus/project.py | 12 ++-- gui/builtinContextMenus/tabbedFits.py | 4 +- gui/builtinContextMenus/whProjector.py | 6 +- gui/builtinShipBrowser/fitItem.py | 5 +- gui/fitCommands/__init__.py | 3 +- gui/fitCommands/calc/fitAddProjectedModule.py | 49 +++++++++++++ .../calc/fitRemoveProjectedModule.py | 39 ++++++++++ gui/fitCommands/guiAddProjected.py | 71 +++++++++++++++++++ service/fit.py | 1 + 10 files changed, 184 insertions(+), 25 deletions(-) create mode 100644 gui/fitCommands/calc/fitAddProjectedModule.py create mode 100644 gui/fitCommands/calc/fitRemoveProjectedModule.py create mode 100644 gui/fitCommands/guiAddProjected.py diff --git a/gui/builtinAdditionPanes/projectedView.py b/gui/builtinAdditionPanes/projectedView.py index 24ca11f3a..4cb18abd8 100644 --- a/gui/builtinAdditionPanes/projectedView.py +++ b/gui/builtinAdditionPanes/projectedView.py @@ -32,6 +32,7 @@ from gui.contextMenu import ContextMenu from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit from service.market import Market +import gui.fitCommands as cmd pyfalog = Logger(__name__) @@ -100,6 +101,7 @@ class ProjectedView(d.Display): data[1] is typeID or index of data we want to manipulate """ sFit = Fit.getInstance() + fitID = self.mainFrame.getActiveFit() fit = sFit.getFit(self.mainFrame.getActiveFit()) if data[0] == "projected": @@ -109,12 +111,14 @@ class ProjectedView(d.Display): dstRow, _ = self.HitTest((x, y)) # Gather module information to get position module = fit.modules[int(data[1])] - sFit.project(fit.ID, module) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID)) + self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, module.itemID, 'item')) + # sFit.project(fit.ID, module) + # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID)) elif data[0] == "market": - sFit = Fit.getInstance() - sFit.project(fit.ID, int(data[1])) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID)) + # sFit = Fit.getInstance() + self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, int(data[1]), 'item')) + # sFit.project(fit.ID, int(data[1])) + # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID)) def kbEvent(self, event): keycode = event.GetKeyCode() @@ -131,10 +135,7 @@ class ProjectedView(d.Display): if type == "fit": activeFit = self.mainFrame.getActiveFit() if activeFit: - sFit = Fit.getInstance() - draggedFit = sFit.getFit(fitID) - sFit.project(activeFit, draggedFit) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) + self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(activeFit, fitID, 'fit')) def startDrag(self, event): row = event.GetIndex() diff --git a/gui/builtinContextMenus/project.py b/gui/builtinContextMenus/project.py index f06c29152..dbfa16724 100644 --- a/gui/builtinContextMenus/project.py +++ b/gui/builtinContextMenus/project.py @@ -5,7 +5,7 @@ import gui.globalEvents as GE import wx from service.fit import Fit from service.settings import ContextMenuSettings - +import gui.fitCommands as cmd class Project(ContextMenu): def __init__(self): @@ -35,10 +35,12 @@ class Project(ContextMenu): def activate(self, fullContext, selection, i): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() - trigger = sFit.project(fitID, selection[0]) - if trigger: - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) - self.mainFrame.additionsPane.select("Projected") + self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, selection[0].ID, 'item')) + + # trigger = sFit.project(fitID, selection[0]) + # if trigger: + # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + # self.mainFrame.additionsPane.select("Projected") Project.register() diff --git a/gui/builtinContextMenus/tabbedFits.py b/gui/builtinContextMenus/tabbedFits.py index d8b516027..689622c3b 100644 --- a/gui/builtinContextMenus/tabbedFits.py +++ b/gui/builtinContextMenus/tabbedFits.py @@ -51,7 +51,6 @@ class TabbedFits(ContextMenu): return m def handleSelection(self, event): - sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() fit = self.fitLookup[event.Id] @@ -59,8 +58,7 @@ class TabbedFits(ContextMenu): if self.context == 'commandView': self.mainFrame.command.Submit(cmd.GuiAddCommandCommand(fitID, fit.ID)) elif self.context == 'projected': - sFit.project(fitID, fit) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, fit.ID, 'fit')) TabbedFits.register() diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py index ac0bd5c1b..1ec8252e8 100644 --- a/gui/builtinContextMenus/whProjector.py +++ b/gui/builtinContextMenus/whProjector.py @@ -8,7 +8,7 @@ from service.fit import Fit from service.settings import ContextMenuSettings from itertools import chain import re - +import gui.fitCommands as cmd class WhProjector(ContextMenu): @@ -87,10 +87,8 @@ class WhProjector(ContextMenu): event.Skip() return - sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() - sFit.project(fitID, swObj) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, swObj.ID, 'item')) def buildMenu(self, data, local_menu, rootMenu, msw): for swType in sorted(data): diff --git a/gui/builtinShipBrowser/fitItem.py b/gui/builtinShipBrowser/fitItem.py index 73617a458..58aa0f553 100644 --- a/gui/builtinShipBrowser/fitItem.py +++ b/gui/builtinShipBrowser/fitItem.py @@ -202,9 +202,8 @@ class FitItem(SFItem.SFBrowserItem): if activeFit: sFit = Fit.getInstance() projectedFit = sFit.getFit(self.fitID) - sFit.project(activeFit, projectedFit) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) - self.mainFrame.additionsPane.select("Projected") + if self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(activeFit, projectedFit.ID, 'fit')): + self.mainFrame.additionsPane.select("Projected") def OnAddCommandFit(self, event): activeFit = self.mainFrame.getActiveFit() diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py index 7abbd4141..f253af60c 100644 --- a/gui/fitCommands/__init__.py +++ b/gui/fitCommands/__init__.py @@ -12,4 +12,5 @@ from .guiRemoveBooster import GuiRemoveBoosterCommand from .guiAddCommand import GuiAddCommandCommand from .guiRemoveCommand import GuiRemoveCommandCommand from .guiSetMode import GuiSetModeCommand -from .guiToggleCommand import GuiToggleCommandCommand \ No newline at end of file +from .guiToggleCommand import GuiToggleCommandCommand +from .guiAddProjected import GuiAddProjectedCommand \ No newline at end of file diff --git a/gui/fitCommands/calc/fitAddProjectedModule.py b/gui/fitCommands/calc/fitAddProjectedModule.py new file mode 100644 index 000000000..bf9ebf6c2 --- /dev/null +++ b/gui/fitCommands/calc/fitAddProjectedModule.py @@ -0,0 +1,49 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +#from .helpers import ModuleInfoCache +from eos.saveddata.module import Module, State +import eos.db +from logbook import Logger +from eos.saveddata.module import Module +from eos.saveddata.drone import Drone +from eos.saveddata.fighter import Fighter +pyfalog = Logger(__name__) + + +class FitAddProjectedModuleCommand(wx.Command): + """" + from sFit.project + """ + def __init__(self, fitID, itemID): + wx.Command.__init__(self, True) + self.fitID = fitID + self.itemID = itemID + self.new_index = 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, eager=("attributes", "group.category")) + + try: + module = Module(item) + except ValueError: + return False + + module.state = State.ACTIVE + if not module.canHaveState(module.state, fit): + module.state = State.OFFLINE + fit.projectedModules.append(module) + + eos.db.commit() + self.new_index = fit.projectedModules.index(module) + return True + + def Undo(self): + from gui.fitCommands.calc.fitRemoveProjectedModule import FitRemoveProjectedModuleCommand # avoids circular import + cmd = FitRemoveProjectedModuleCommand(self.fitID, self.new_index) + cmd.Do() + return True diff --git a/gui/fitCommands/calc/fitRemoveProjectedModule.py b/gui/fitCommands/calc/fitRemoveProjectedModule.py new file mode 100644 index 000000000..ffb398006 --- /dev/null +++ b/gui/fitCommands/calc/fitRemoveProjectedModule.py @@ -0,0 +1,39 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +#from .helpers import ModuleInfoCache +from eos.saveddata.module import Module, State +import eos.db +from logbook import Logger +from eos.saveddata.module import Module +from eos.saveddata.drone import Drone +from eos.saveddata.fighter import Fighter +pyfalog = Logger(__name__) + + +class FitRemoveProjectedModuleCommand(wx.Command): + """" + from sFit.project + """ + def __init__(self, fitID, position): + wx.Command.__init__(self, True) + self.fitID = fitID + self.position = position + self.removed_item = None + + def Do(self): + pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.position) + fit = eos.db.getFit(self.fitID) + self.removed_item = fit.projectedModules[self.position].itemID + del fit.projectedModules[self.position] + + eos.db.commit() + return True + + def Undo(self): + from gui.fitCommands.calc.fitAddProjectedModule import FitAddProjectedModuleCommand + cmd = FitAddProjectedModuleCommand(self.fitID, self.removed_item) + cmd.Do() + return True diff --git a/gui/fitCommands/guiAddProjected.py b/gui/fitCommands/guiAddProjected.py new file mode 100644 index 000000000..e483fb84f --- /dev/null +++ b/gui/fitCommands/guiAddProjected.py @@ -0,0 +1,71 @@ +import wx +from service.fit import Fit + +import gui.mainFrame +from gui import globalEvents as GE +from eos.saveddata.module import Module +from .calc.fitAddProjectedModule import FitAddProjectedModuleCommand +from logbook import Logger +import eos.db +pyfalog = Logger(__name__) + + +class GuiAddProjectedCommand(wx.Command): + def __init__(self, fitID, id, type='item'): + wx.Command.__init__(self, True, "Projected Add") + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + self.sFit = Fit.getInstance() + self.internal_history = wx.CommandProcessor() + self.fitID = fitID + self.id = id + self.type = type + + def Do(self): + result = False + # since we can project various types, we need to switch of the fit command. We can't do this switch easily in + # the fit command since each type might have a different kind of undo, easier to split it out + if self.type == 'item': + item = eos.db.getItem(self.id, eager=("attributes", "group.category")) + + if item.category.name == "Drone": + # @todo: this may need to be reworked once we visit drone commands + pyfalog.warn("DRONE PROJECTION NOT IMPLEMENTED") + # 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 + # + # if drone is None: + # drone = Drone(item) + # fit.projectedDrones.append(drone) + # + # drone.amount += 1 + elif item.category.name == "Fighter": + pyfalog.warn("FIGHTER PROJECTION NOT IMPLEMENTED") + # fighter = Fighter(item) + # fit.projectedFighters.append(fighter) + elif item.group.name in Module.SYSTEM_GROUPS: + pyfalog.warn("WH PROJECTION NOT IMPLEMENTED") + # module = Module(item) + # module.state = State.ONLINE + # fit.projectedModules.append(module) + else: + # attempt a regular module projection + result = self.internal_history.Submit(FitAddProjectedModuleCommand(self.fitID, self.id)) + elif self.type == 'fit': + pyfalog.warn("FIT PROJECTION NOT IMPLEMENTED") + + if result: + self.sFit.recalc(self.fitID) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + return False + + def Undo(self): + for _ in self.internal_history.Commands: + self.internal_history.Undo() + self.sFit.recalc(self.fitID) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + return True + diff --git a/service/fit.py b/service/fit.py index 238c5c58b..4916df143 100644 --- a/service/fit.py +++ b/service/fit.py @@ -397,6 +397,7 @@ class Fit(object): self.recalc(fit) return True + @deprecated def project(self, fitID, thing): pyfalog.debug("Projecting fit ({0}) onto: {1}", fitID, thing) if fitID is None: