From 23a71e744892953f381b416e1c914671816d1e0a Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 30 Nov 2014 16:43:15 -0500 Subject: [PATCH] Implement service layer mode setter. Modes now have basic support and testing. Also decided to have two separate functions that return the mode items as Items or Modes. Returning them as Items makes it easier to check if provided modeID from user database is valid (since we cannot easily map the modeID to create a Mode), returning as Modes allows us to easily use them for setters. There's probably a better way to do this, but w/e --- eos/saveddata/fit.py | 2 +- eos/saveddata/ship.py | 12 +++++++-- gui/builtinContextMenus/tacticalMode.py | 36 ++++++++++++++----------- service/fit.py | 10 +++++++ utils/__init__.py | 0 5 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 utils/__init__.py diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index cb983d796..a358254ea 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -101,7 +101,7 @@ class Fit(object): self.extraAttributes.original = self.EXTRA_ATTRIBUTES self.ship = Ship(db.getItem(self.shipID)) if self.shipID is not None else None if self.ship is not None and self.modeID is not None: - self._mode = self.ship.checkMode(db.getItem(self.modeID)) + self._mode = self.ship.checkModeItem(db.getItem(self.modeID)) else: self._mode = None diff --git a/eos/saveddata/ship.py b/eos/saveddata/ship.py index 018570d0d..f1b9b6950 100644 --- a/eos/saveddata/ship.py +++ b/eos/saveddata/ship.py @@ -66,7 +66,7 @@ class Ship(ItemAttrShortcut, HandledItem): if effect.runTime == runTime and effect.isType("passive"): effect.handler(fit, self, ("ship",)) - def checkMode(self, item): + def checkModeItem(self, item): """ Checks if provided item is a valid mode. @@ -87,8 +87,16 @@ class Ship(ItemAttrShortcut, HandledItem): return Mode(item) return None + def getModes(self): + items = self.getModeItems() + return [Mode(item) for item in items] + def getModeItems(self): - """Gets valid modes for ship, returns None if not a t3 dessy""" + """ + Returns a list of valid mode items for ship. Note that this returns the + valid Item objects, not the Mode objects. Returns None if not a + t3 dessy + """ # @todo: is there a better way to determine this that isn't hardcoded groupIDs? if self.item.groupID != 1305: return None diff --git a/gui/builtinContextMenus/tacticalMode.py b/gui/builtinContextMenus/tacticalMode.py index 393379dcf..5927dab0e 100644 --- a/gui/builtinContextMenus/tacticalMode.py +++ b/gui/builtinContextMenus/tacticalMode.py @@ -2,7 +2,7 @@ import wx from gui.contextMenu import ContextMenu import gui.mainFrame import service -from gui.shipBrowser import Stage3Selected +import gui.globalEvents as GE class TacticalMode(ContextMenu): def __init__(self): @@ -11,37 +11,43 @@ class TacticalMode(ContextMenu): def display(self, srcContext, selection): sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() - self.ship = sFit.getFit(fitID).ship - self.modeItems = self.ship.getModeItems() + ship = sFit.getFit(fitID).ship + self.modes = ship.getModes() - return srcContext == "fittingShip" and self.modeItems is not None + return srcContext == "fittingShip" and self.modes is not None def getText(self, itmContext, selection): return "Tactical Modes" - def addMode(self, rootMenu, item): - label = item.name.rsplit()[-2] + def addMode(self, rootMenu, mode): + label = mode.item.name.rsplit()[-2] id = wx.NewId() - self.itemIds[id] = item + self.modeIds[id] = mode menuItem = wx.MenuItem(rootMenu, id, label, kind=wx.ITEM_RADIO) rootMenu.Bind(wx.EVT_MENU, self.handleMode, menuItem) return menuItem def getSubMenu(self, context, selection, rootMenu, i, pitem): self.context = context - self.itemIds = {} + self.modeIds = {} - m = wx.Menu() + sub = wx.Menu() - for item in self.modeItems: + for item in self.modes: menuItem = self.addMode(rootMenu, item) - m.AppendItem(menuItem) + sub.AppendItem(menuItem) - return m + return sub def handleMode(self, event): - item = self.itemIds[event.Id] - print item - # @todo fit service change mode + item = self.modeIds[event.Id] + if item is False or item not in self.modes: + event.Skip() + return + + sFit = service.Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + sFit.setMode(fitID, self.modeIds[event.Id]) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) TacticalMode.register() diff --git a/service/fit.py b/service/fit.py index 60e899faf..e731c3edf 100644 --- a/service/fit.py +++ b/service/fit.py @@ -719,6 +719,16 @@ class Fit(object): self.recalc(fit) + def setMode(self, fitID, mode): + if fitID is None: + return + + fit = eos.db.getFit(fitID) + fit.mode = mode + eos.db.commit() + + self.recalc(fit) + def setAsPattern(self, fitID, ammo): if fitID is None: return diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 000000000..e69de29bb