diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 1994c48f3..b1f5ae3cf 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -100,7 +100,10 @@ class Fit(object): self.extraAttributes = ModifiedAttributeDict(self) self.extraAttributes.original = self.EXTRA_ATTRIBUTES self.ship = Ship(db.getItem(self.shipID)) if self.shipID is not None else None - self.mode = Mode(db.getItem(self.mode)) if self.mode is not None else None + if self.ship is not None and self.mode is not None: + self.mode = self.ship.checkMode(Mode(self.mode)) + else: + self.mode = None @property def targetResists(self): diff --git a/eos/saveddata/mode.py b/eos/saveddata/mode.py index 6bf1ecf6d..83d0c0bc2 100644 --- a/eos/saveddata/mode.py +++ b/eos/saveddata/mode.py @@ -24,8 +24,6 @@ class Mode(ItemAttrShortcut, HandledItem): def __init__(self, item): self.__item = item - self.itemID = item.ID if item is not None else None - self.__itemModifiedAttributes = ModifiedAttributeDict() if not isinstance(item, int): @@ -57,10 +55,6 @@ class Mode(ItemAttrShortcut, HandledItem): def fits(self, fit): raise NotImplementedError() - # @ todo: rework to get valid modes (probably put in fit object, not mode) - def getValidModes(self): - raise NotImplementedError() - def clear(self): self.itemModifiedAttributes.clear() diff --git a/eos/saveddata/ship.py b/eos/saveddata/ship.py index 05cd99c02..51ec92425 100644 --- a/eos/saveddata/ship.py +++ b/eos/saveddata/ship.py @@ -19,6 +19,7 @@ from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut from eos.effectHandlerHelpers import HandledItem +from eos.saveddata.mode import Mode class Ship(ItemAttrShortcut, HandledItem): def __init__(self, item): @@ -65,6 +66,41 @@ class Ship(ItemAttrShortcut, HandledItem): if effect.runTime == runTime and effect.isType("passive"): effect.handler(fit, self, ("ship",)) + def checkMode(self, mode): + """ + Checks if provided mode is valid. + + If ship has modes, and current mode is not valid, return forced mode + else if mode is valid, return Mode + else if ship does not have modes, return None + """ + modes = self.getValidModes() + if modes != None: + if mode == None or mode not in modes: + # We have a tact dessy, but mode is None or not valid. Force new mode + return modes[0] + elif mode in modes: + # We have a valid mode + return mode + return None + + def getValidModes(self): + """Gets valid modes for ship, 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 + + modeGroupID = 1306 + import eos.db + + modes = [] + g = eos.db.getGroup(modeGroupID, eager=("items.icon", "items.attributes")) + for item in g.items: + if item.raceID == self.item.raceID: + modes.append(Mode(item)) + + return modes + def __deepcopy__(self, memo): copy = Ship(self.item) return copy diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index da6d02c28..ac7c30edd 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -14,6 +14,7 @@ __all__ = [ "whProjector", "cargo", "shipJump", + "tacticalMode", "targetResists", "priceClear" ] diff --git a/gui/builtinContextMenus/tacticalMode.py b/gui/builtinContextMenus/tacticalMode.py new file mode 100644 index 000000000..12d149aa2 --- /dev/null +++ b/gui/builtinContextMenus/tacticalMode.py @@ -0,0 +1,47 @@ +import wx +from gui.contextMenu import ContextMenu +import gui.mainFrame +import service +from gui.shipBrowser import Stage3Selected + +class TacticalMode(ContextMenu): + def __init__(self): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def display(self, srcContext, selection): + sFit = service.Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + self.ship = sFit.getFit(fitID).ship + self.modes = self.ship.getValidModes() + + if not srcContext in ("fittingShip") or self.modes is None: + return False + + return True + + def getText(self, itmContext, selection): + return "Modes" + + def handleModeChange(self, event): + mode = self.modeIds[event.Id] + print mode + # @todo fit service change mode + + def addMode(self, menu, mode): + label = mode.item.name.rsplit()[-2] + id = wx.NewId() + self.modeIds[id] = mode + menuItem = wx.MenuItem(menu, id, label, kind=wx.ITEM_CHECK) + menu.Bind(wx.EVT_MENU, self.handleModeChange, menuItem) + return menuItem + + def getSubMenu(self, context, selection, menu, i, pitem): + sub = wx.Menu() + self.modeIds = {} + # Items that have a parent + for mode in self.modes: + sub.AppendItem(self.addMode(sub, mode)) + + return sub + +TacticalMode.register() diff --git a/gui/itemStats.py b/gui/itemStats.py index b721b75b6..e0ac0f08e 100644 --- a/gui/itemStats.py +++ b/gui/itemStats.py @@ -22,9 +22,9 @@ import re import gui.mainFrame import bitmapLoader import sys -import wx.lib.mixins.listctrl as listmix +import wx.lib.mixins.listctrl as listmix import wx.html -from eos.types import Ship, Module, Skill, Booster, Implant, Drone +from eos.types import Ship, Module, Skill, Booster, Implant, Drone, Mode from gui.utils.numberFormatter import formatAmount import service import config @@ -535,7 +535,7 @@ class ItemEffects (wx.Panel): class ItemAffectedBy (wx.Panel): - ORDER = [Ship, Module, Drone, Implant, Booster, Skill] + ORDER = [Ship, Mode, Module, Drone, Implant, Booster, Skill] def __init__(self, parent, stuff, item): wx.Panel.__init__ (self, parent) self.stuff = stuff