diff --git a/eos/saveddata/mode.py b/eos/saveddata/mode.py index 2b3108a9d..d505807b9 100644 --- a/eos/saveddata/mode.py +++ b/eos/saveddata/mode.py @@ -53,3 +53,8 @@ class Mode(ItemAttrShortcut, HandledItem): for effect in self.item.effects.itervalues(): if effect.runTime == runTime and effect.activeByDefault: effect.handler(fit, self, context=("module",)) + + def getValidCharges(self): + # Modes don't have charges, but it is queried for so return nothing. + validCharges = set() + return validCharges diff --git a/gui/builtinContextMenus/itemRemove.py b/gui/builtinContextMenus/itemRemove.py index c355d98b5..e111ec2d9 100644 --- a/gui/builtinContextMenus/itemRemove.py +++ b/gui/builtinContextMenus/itemRemove.py @@ -14,7 +14,8 @@ class ItemRemove(ContextMenu): "boosterItem", "projectedModule", "projectedCharge", "cargoItem", "projectedFit", "projectedDrone", - "fighterItem", "projectedFighter") + "fighterItem", "projectedFighter", + "fittingMode",) def getText(self, itmContext, selection): return "Remove {0}".format(itmContext if itmContext is not None else "Item") diff --git a/gui/builtinContextMenus/itemStats.py b/gui/builtinContextMenus/itemStats.py index d8d7e04ac..df059e782 100644 --- a/gui/builtinContextMenus/itemStats.py +++ b/gui/builtinContextMenus/itemStats.py @@ -18,7 +18,8 @@ class ItemStats(ContextMenu): "skillItem", "projectedModule", "projectedDrone", "projectedCharge", "itemStats", "fighterItem", - "implantItemChar", "projectedFighter") + "implantItemChar", "projectedFighter", + "fittingMode") def getText(self, itmContext, selection): return "{0} Stats".format(itmContext if itmContext is not None else "Item") @@ -29,6 +30,8 @@ class ItemStats(ContextMenu): fitID = self.mainFrame.getActiveFit() sFit = service.Fit.getInstance() stuff = sFit.getFit(fitID).ship + elif srcContext == "fittingMode": + stuff = selection[0].item else: stuff = selection[0] diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 348562e24..dd0f5338e 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -31,9 +31,12 @@ from gui.builtinViewColumns.state import State from gui.bitmapLoader import BitmapLoader import gui.builtinViews.emptyView from gui.utils.exportHtml import exportHtml +from logging import getLogger, Formatter import gui.globalEvents as GE +logger = getLogger(__name__) + #Tab spawning handler class FitSpawner(gui.multiSwitch.TabSpawner): def __init__(self, multiSwitch): @@ -339,7 +342,12 @@ class FittingView(d.Display): def removeModule(self, module): sFit = service.Fit.getInstance() fit = sFit.getFit(self.activeFitID) - populate = sFit.removeModule(self.activeFitID, fit.modules.index(module)) + try: + populate = sFit.removeModule(self.activeFitID, fit.modules.index(module)) + except ValueError: + # This module isn't in our list of modules, don't remove anything. Likely a special snowflake. + logger.debug("Failed attempt to remove %s from fit" % module.item.name) + populate = None if populate is not None: self.slotsChanged() @@ -441,12 +449,11 @@ class FittingView(d.Display): if fit.mode: # Modes are special snowflakes and need a little manual loving # We basically append the Mode rack and Mode to the modules - # while also marking their positions in the Blanks list + # while also marking the mode header position in the Blanks list if sFit.serviceFittingOptions["rackSlots"]: self.blanks.append(len(self.mods)) self.mods.append(Rack.buildRack(Slot.MODE)) - self.blanks.append(len(self.mods)) self.mods.append(fit.mode) else: self.mods = None @@ -488,12 +495,29 @@ class FittingView(d.Display): while sel != -1 and sel not in self.blanks: mod = self.mods[self.GetItemData(sel)] + + # Test if this is a mode, which is a special snowflake of a Module + if hasattr(mod, "_Mode__item"): + srcContext = "fittingMode" + # Skip the normal processing + mod.isEmpty = True + + itemContext = sMkt.getCategoryByItem(mod.item).name + fullContext = (srcContext, itemContext) + if not srcContext in tuple(fCtxt[0] for fCtxt in contexts): + contexts.append(fullContext) + + selection.append(mod) + + if not mod.isEmpty: srcContext = "fittingModule" itemContext = sMkt.getCategoryByItem(mod.item).name fullContext = (srcContext, itemContext) if not srcContext in tuple(fCtxt[0] for fCtxt in contexts): contexts.append(fullContext) + + if mod.charge is not None: srcContext = "fittingCharge" itemContext = sMkt.getCategoryByItem(mod.charge).name diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 61823ff3a..a2840f000 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -69,6 +69,12 @@ class ContextMenu(object): if m.display(srcContext, selection): amount += 1 texts = m.getText(itemContext, selection) + + # Check the selected item to see if it has special reasons for not showing the menu item + if srcContext == "fittingMode" and texts == "Remove Module": + # Don't show remove for modes, these are special modules that cannot be removed + continue + if isinstance(texts, basestring): texts = (texts,)