diff --git a/gui/boosterView.py b/gui/boosterView.py index d2ed4593e..141d74daf 100644 --- a/gui/boosterView.py +++ b/gui/boosterView.py @@ -114,6 +114,9 @@ class BoosterView(d.Display): if sel != -1: cFit = service.Fit.getInstance() fit = cFit.getFit(self.mainFrame.getActiveFit()) + item = fit.boosters[sel] - menu = ContextMenu.getMenu((fit.boosters[sel],), "booster") + srcContext = "boosterItem" + itemContext = "Booster" + menu = ContextMenu.getMenu((item,), (srcContext, itemContext)) self.PopupMenu(menu) diff --git a/gui/builtinContextMenus/ammoPattern.py b/gui/builtinContextMenus/ammoPattern.py index dbccefc08..1a236ddac 100644 --- a/gui/builtinContextMenus/ammoPattern.py +++ b/gui/builtinContextMenus/ammoPattern.py @@ -3,15 +3,14 @@ import gui.mainFrame import service import wx import gui.globalEvents as GE -from gui import bitmapLoader class AmmoPattern(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - if context not in ("item", "itemSearch") or self.mainFrame.getActiveFit() is None: + def display(self, srcContext, selection): + if srcContext not in ("marketItemGroup", "marketItemMisc") or self.mainFrame.getActiveFit() is None: return False item = selection[0] @@ -21,10 +20,10 @@ class AmmoPattern(ContextMenu): return False - def getText(self, context, selection): - return "Set as Damage Pattern" + def getText(self, itmContext, selection): + return "Set {0} as Damage Pattern".format(itmContext if itmContext is not None else "Item") - def activate(self, context, selection, i): + def activate(self, fullContext, selection, i): item = selection[0] fit = self.mainFrame.getActiveFit() sFit = service.Fit.getInstance() diff --git a/gui/builtinContextMenus/damagePattern.py b/gui/builtinContextMenus/damagePattern.py index 3e60fc662..1cde95a54 100644 --- a/gui/builtinContextMenus/damagePattern.py +++ b/gui/builtinContextMenus/damagePattern.py @@ -9,10 +9,10 @@ class DamagePattern(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - return context in ("resistancesViewFull",) and self.mainFrame.getActiveFit() is not None + def display(self, srcContext, selection): + return srcContext in ("resistancesViewFull",) and self.mainFrame.getActiveFit() is not None - def getText(self, context, selection): + def getText(self, itmContext, selection): sDP = service.DamagePattern.getInstance() self.patterns = sDP.getDamagePatternList() self.patterns.sort( key=lambda p: (p.name in ["Selected Ammo", @@ -20,7 +20,7 @@ class DamagePattern(ContextMenu): m = map(lambda p: p.name, self.patterns) return m - def activate(self, context, selection, i): + def activate(self, fullContext, selection, i): sDP = service.DamagePattern.getInstance() sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() diff --git a/gui/builtinContextMenus/droneSplit.py b/gui/builtinContextMenus/droneSplit.py index 517760d82..f4d2b5a44 100644 --- a/gui/builtinContextMenus/droneSplit.py +++ b/gui/builtinContextMenus/droneSplit.py @@ -9,14 +9,15 @@ class DroneSplit(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - return context in ("drone", "projectedDrone") and selection[0].amount > 1 + def display(self, srcContext, selection): + return srcContext in ("droneItem", "projectedDrone") and selection[0].amount > 1 - def getText(self, context, selection): - return "Split stack" + def getText(self, itmContext, selection): + return "Split {0} Stack".format(itmContext) - def activate(self, context, selection, i): - dlg = DroneSpinner(self.mainFrame, selection[0], context) + def activate(self, fullContext, selection, i): + srcContext = fullContext[0] + dlg = DroneSpinner(self.mainFrame, selection[0], srcContext) dlg.ShowModal() dlg.Destroy() @@ -50,7 +51,7 @@ class DroneSpinner(wx.Dialog): sFit = service.Fit.getInstance() mainFrame = gui.mainFrame.MainFrame.getInstance() fitID = mainFrame.getActiveFit() - if self.context == "drone": + if self.context == "droneItem": sFit.splitDroneStack(fitID, self.drone, self.spinner.GetValue()) else: sFit.splitProjectedDroneStack(fitID, self.drone, self.spinner.GetValue()) diff --git a/gui/builtinContextMenus/factorReload.py b/gui/builtinContextMenus/factorReload.py index 7a033fc77..5923469f8 100644 --- a/gui/builtinContextMenus/factorReload.py +++ b/gui/builtinContextMenus/factorReload.py @@ -9,13 +9,13 @@ class FactorReload(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - return context in ("firepowerViewFull",) and self.mainFrame.getActiveFit() is not None + def display(self, srcContext, selection): + return srcContext in ("firepowerViewFull",) and self.mainFrame.getActiveFit() is not None - def getText(self, context, selection): + def getText(self, itmContext, selection): return "Factor in Reload Time" - def activate(self, context, selection, i): + def activate(self, fullContext, selection, i): sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() sFit.toggleFactorReload(fitID) diff --git a/gui/builtinContextMenus/itemStats.py b/gui/builtinContextMenus/itemStats.py index f42b09c53..c8ccfc9be 100644 --- a/gui/builtinContextMenus/itemStats.py +++ b/gui/builtinContextMenus/itemStats.py @@ -8,28 +8,23 @@ class ItemStats(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - return context in ("item", "ship", "module", "ammo", "skill", - "itemSearch", "drone", "implant", "booster", - "projectedModule", "projectedDrone", "projectedAmmo") + def display(self, srcContext, selection): + return srcContext in ("marketItemGroup", "marketItemMisc", "fittingModule", "fittingCharge", "fittingShip", + "droneItem", "implantItem", "boosterItem", "skillItem", "projectedModule", "projectedDrone", "projectedCharge") - def getText(self, context, selection): - return "%s stats" % (context.capitalize() if context not in self.REPLACES else self.REPLACES[context]) + def getText(self, itmContext, selection): + return "{0} Stats".format(itmContext if itmContext is not None else "Item") - REPLACES = {"itemSearch": "Item", - "projectedModule": "Module", - "projectedDrone": "Drone", - "projectedAmmo": "Ammo"} - - def activate(self, context, selection, i): - if context == "ship": + def activate(self, fullContext, selection, i): + srcContext = fullContext[0] + if srcContext == "fittingShip": fitID = self.mainFrame.getActiveFit() cFit = service.Fit.getInstance() stuff = cFit.getFit(fitID).ship else: stuff = selection[0] - if context == "module" and stuff.isEmpty: + if srcContext == "fittingModule" and stuff.isEmpty: return mstate = wx.GetMouseState() @@ -39,7 +34,7 @@ class ItemStats(ContextMenu): reuse = True if self.mainFrame.GetActiveStatsWindow() == None and reuse: - dlg=ItemStatsDialog(stuff, context.capitalize() if context not in self.REPLACES else self.REPLACES[context]) + ItemStatsDialog(stuff, fullContext) elif reuse: lastWnd = self.mainFrame.GetActiveStatsWindow() @@ -50,10 +45,10 @@ class ItemStats(ContextMenu): else: size = wx.DefaultSize pos = wx.DefaultPosition - dlg=ItemStatsDialog(stuff, context.capitalize() if context not in self.REPLACES else self.REPLACES[context], pos, size, maximized) + ItemStatsDialog(stuff, fullContext, pos, size, maximized) lastWnd.closeEvent(None) else: - dlg=ItemStatsDialog(stuff, context.capitalize() if context not in self.REPLACES else self.REPLACES[context]) + ItemStatsDialog(stuff, fullContext) ItemStats.register() diff --git a/gui/builtinContextMenus/marketJump.py b/gui/builtinContextMenus/marketJump.py index ea652b981..c86e42c13 100644 --- a/gui/builtinContextMenus/marketJump.py +++ b/gui/builtinContextMenus/marketJump.py @@ -7,21 +7,19 @@ class MarketJump(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - return context in ("module", "ammo", "itemSearch", "drone", "implant", "booster", "projectedModule", "projectedDrone") \ - and (not selection[0].isEmpty if context == "module" else True) + def display(self, srcContext, selection): + return srcContext in ("marketItemMisc", "fittingModule", "fittingCharge", "droneItem", + "implantItem", "boosterItem", "projectedModule", "projectedDrone", "projectedCharge") \ + and (not selection[0].isEmpty if srcContext == "fittingModule" else True) - REPLACES = {"itemSearch": "Item", - "projectedModule": "Module", - "projectedDrone": "Drone"} + def getText(self, itmContext, selection): + return "{0} Market Group".format(itmContext if itmContext is not None else "Item") - def getText(self, context, selection): - return "Jump to %s Market Group" % (context.capitalize() if context not in self.REPLACES else self.REPLACES[context]) - - def activate(self, context, selection, i): - if context in ("module", "drone", "implant", "booster", "projectedModule", "projectedDrone"): + def activate(self, fullContext, selection, i): + srcContext = fullContext[0] + if srcContext in ("fittingModule", "droneItem", "implantItem", "boosterItem", "projectedModule", "projectedDrone"): item = selection[0].item - elif context in ("ammo", "projectedAmmo"): + elif srcContext in ("fittingCharge", "projectedCharge"): item = selection[0].charge else: item = selection[0] diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py index 7d36f4c47..df3bf7874 100644 --- a/gui/builtinContextMenus/moduleAmmoPicker.py +++ b/gui/builtinContextMenus/moduleAmmoPicker.py @@ -10,11 +10,11 @@ class ModuleAmmoPicker(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - if self.mainFrame.getActiveFit() is None or context not in ("module", "projectedModule"): + def display(self, srcContext, selection): + if self.mainFrame.getActiveFit() is None or srcContext not in ("fittingModule", "projectedModule"): return False - modules = selection if context == "module" else (selection[0],) + modules = selection if srcContext == "fittingModule" else (selection[0],) validCharges = None for mod in modules: @@ -33,10 +33,10 @@ class ModuleAmmoPicker(ContextMenu): self.charges = list(validCharges) return len(self.charges) > 0 - def getText(self, context, selection): - return "Ammo" + def getText(self, itmContext, selection): + return "Charge" - def activate(self, context, selection, i): + def activate(self, fullContext, selection, i): pass DAMAGE_TYPES = ("em", "explosive", "kinetic", "thermal") diff --git a/gui/builtinContextMenus/project.py b/gui/builtinContextMenus/project.py index 8d8ee98cb..535be8063 100644 --- a/gui/builtinContextMenus/project.py +++ b/gui/builtinContextMenus/project.py @@ -8,17 +8,17 @@ class Project(ContextMenu): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() - def display(self, context, selection): - if context not in ("item", "itemSearch") or self.mainFrame.getActiveFit() is None: + def display(self, srcContext, selection): + if srcContext not in ("marketItemGroup", "marketItemMisc") or self.mainFrame.getActiveFit() is None: return False item = selection[0] return item.isType("projected") - def getText(self, context, selection): - return "Project onto Fit" + def getText(self, itmContext, selection): + return "Project {0} onto Fit".format(itmContext) - def activate(self, context, selection, i): + def activate(self, fullContext, selection, i): sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() sFit.project(fitID, selection[0]) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 30eac83ee..7b2ad63d7 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -343,22 +343,26 @@ class FittingView(d.Display): def spawnMenu(self): if self.activeFitID is None: return - cFit = service.Fit.getInstance() + sMkt = service.Market.getInstance() selection = [] sel = self.GetFirstSelected() contexts = set() while sel != -1: mod = self.mods[self.GetItemData(sel)] if not mod.isEmpty: - contexts.add("module") - if mod.charge is not None and "ammo" not in contexts: - contexts.add("ammo") + srcContext = "fittingModule" + itemContext = sMkt.getCategoryByItem(mod.item).name + contexts.add((srcContext, itemContext)) + if mod.charge is not None: + srcContext = "fittingCharge" + itemContext = sMkt.getCategoryByItem(mod.charge).name + contexts.add((srcContext, itemContext)) selection.append(mod) sel = self.GetNextSelected(sel) - contexts.add("ship") + contexts.add(("fittingShip", "Ship")) menu = ContextMenu.getMenu(selection, *contexts) self.PopupMenu(menu) diff --git a/gui/characterEditor.py b/gui/characterEditor.py index ce3d69776..c605f7815 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -300,8 +300,11 @@ class SkillTreeView (wx.Panel): tree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) tree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.scheduleMenu) - self.statsMenu = ContextMenu.getMenu(None, "skill") - self.levelChangeMenu = ContextMenu.getMenu(None, "skill") or wx.Menu() + srcContext = "skillItem" + itemContext = "Skill" + context = (srcContext, itemContext) + self.statsMenu = ContextMenu.getMenu(None, context) + self.levelChangeMenu = ContextMenu.getMenu(None, context) or wx.Menu() self.levelChangeMenu.AppendSeparator() self.levelIds = {} @@ -428,12 +431,12 @@ class ImplantsTreeView (wx.Panel): self.SetSizer(pmainSizer) # Populate the market tree - cMarket = service.Market.getInstance() - for id, name, iconFile, more in cMarket.getImplantTree(): - iconId = self.addMarketViewImage(iconFile) - childId = self.availableImplantsTree.AppendItem(root, name, iconId, data=wx.TreeItemData(id)) - if more: - self.availableImplantsTree.AppendItem(childId, "dummy") + sMkt = service.Market.getInstance() + for mktGrp in sMkt.getImplantTree(): + iconId = self.addMarketViewImage(sMkt.getIconByMarketGroup(mktGrp)) + childId = self.availableImplantsTree.AppendItem(root, mktGrp.name, iconId, data=wx.TreeItemData(mktGrp.ID)) + if sMkt.marketGroupHasTypesCheck(mktGrp) is False: + self.availableImplantsTree.AppendItem(childId, "dummy") self.availableImplantsTree.SortChildren(self.availableRoot) diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 2c15a3fb2..9f0a8d7bd 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -26,30 +26,35 @@ class ContextMenu(object): ContextMenu.menus.append(cls) @classmethod - def getMenu(cls, selection, *contexts): + def getMenu(cls, selection, *fullContexts): menu = wx.Menu() menu.info = {} menu.selection = selection empty = True menu.Bind(wx.EVT_MENU, cls.handler) - for i, context in enumerate(contexts): + for i, fullContext in enumerate(fullContexts): amount = 0 + srcContext = fullContext[0] + try: + itmContext = fullContext[1] + except IndexError: + itmContext = None for menuHandler in cls.menus: m = menuHandler() - if m.display(context, selection): + if m.display(srcContext, selection): amount += 1 - texts = m.getText(context, selection) + texts = m.getText(itmContext, selection) if isinstance(texts, basestring): texts = (texts,) - bitmap = m.getBitmap(context, selection) + bitmap = m.getBitmap(srcContext, selection) multiple = not isinstance(bitmap, wx.Bitmap) for it, text in enumerate(texts): id = wx.NewId() item = wx.MenuItem(menu, id, text) - menu.info[id] = (m, context, it) + menu.info[id] = (m, fullContext, it) - sub = m.getSubMenu(context, selection, menu, it) + sub = m.getSubMenu(srcContext, selection, menu, it) if sub is not None: item.SetSubMenu(sub) @@ -65,7 +70,7 @@ class ContextMenu(object): empty = False - if amount > 0 and i != len(contexts) - 1: + if amount > 0 and i != len(fullContexts) - 1: menu.AppendSeparator() return menu if empty is False else None diff --git a/gui/droneView.py b/gui/droneView.py index 7fd7497ab..032a91f77 100644 --- a/gui/droneView.py +++ b/gui/droneView.py @@ -93,9 +93,9 @@ class DroneView(d.Display): 'Fighter Bombers', 'Combat Utility Drones', 'Electronic Warfare Drones', 'Logistic Drones', 'Mining Drones') def droneKey(self, drone): - cMarket = service.Market.getInstance() + sMarket = service.Market.getInstance() - groupName = cMarket.getMarketGroupName(drone.item) + groupName = sMarket.getMarketGroupByItem(drone.item).name return (self.DRONE_ORDER.index(groupName), drone.item.name) @@ -174,8 +174,10 @@ class DroneView(d.Display): def spawnMenu(self): sel = self.GetFirstSelected() if sel != -1: - cFit = service.Fit.getInstance() - fit = cFit.getFit(self.mainFrame.getActiveFit()) + drone = self.drones[sel] - menu = ContextMenu.getMenu((self.drones[sel],), "drone") + sMkt = service.Market.getInstance() + sourceContext = "droneItem" + itemContext = sMkt.getCategoryByItem(drone.item).name + menu = ContextMenu.getMenu((drone,), (sourceContext, itemContext)) self.PopupMenu(menu) diff --git a/gui/implantView.py b/gui/implantView.py index 7fcbd8562..6cca6cac4 100644 --- a/gui/implantView.py +++ b/gui/implantView.py @@ -126,6 +126,11 @@ class ImplantView(d.Display): if sel != -1: cFit = service.Fit.getInstance() fit = cFit.getFit(self.mainFrame.getActiveFit()) + implant = fit.implants[sel] - menu = ContextMenu.getMenu((fit.implants[sel],), "implant") + sMkt = service.Market.getInstance() + sourceContext = "implantItem" + itemContext = sMkt.getCategoryByItem(implant.item).name + + menu = ContextMenu.getMenu((implant,), (sourceContext, itemContext)) self.PopupMenu(menu) diff --git a/gui/itemStats.py b/gui/itemStats.py index 4a89623cb..31fac7c65 100644 --- a/gui/itemStats.py +++ b/gui/itemStats.py @@ -30,7 +30,7 @@ import service class ItemStatsDialog(wx.Dialog): counter = 0 - def __init__(self, victim, context = None, pos = wx.DefaultPosition, size = wx.DefaultSize, maximized = False): + def __init__(self, victim, fullContext=None, pos = wx.DefaultPosition, size = wx.DefaultSize, maximized = False): wx.Dialog.__init__(self, gui.mainFrame.MainFrame.getInstance(), wx.ID_ANY, title="Item stats", pos = pos, size = size, @@ -44,25 +44,30 @@ class ItemStatsDialog(wx.Dialog): self.Destroy() return - item = getattr(victim, "item", None) if context.lower() not in ("projectedammo", "ammo") else getattr(victim, "charge", None) + srcContext = fullContext[0] + try: + itmContext = fullContext[1] + except IndexError: + itmContext = None + item = getattr(victim, "item", None) if srcContext.lower() not in ("projectedcharge", "fittingcharge") else getattr(victim, "charge", None) if item is None: sMarket = service.Market.getInstance() item = sMarket.getItem(victim.ID) victim = None - self.context = context + self.context = itmContext if item.icon is not None: before,sep,after = item.icon.iconFile.rpartition("_") iconFile = "%s%s%s" % (before,sep,"0%s" % after if len(after) < 2 else after) itemImg = bitmapLoader.getBitmap(iconFile, "pack") if itemImg is not None: self.SetIcon(wx.IconFromBitmap(itemImg)) - self.SetTitle("%s: %s" % ("%s stats" % context.capitalize() if context is not None else "Stats", item.name)) + self.SetTitle("%s: %s" % ("%s Stats" % itmContext if itmContext is not None else "Stats", item.name)) self.SetMinSize((300, 200)) self.SetSize((500, 300)) self.SetMaxSize((500, -1)) self.mainSizer = wx.BoxSizer(wx.VERTICAL) - self.container = ItemStatsContainer(self, victim, item, context) + self.container = ItemStatsContainer(self, victim, item, itmContext) self.mainSizer.Add(self.container, 1, wx.EXPAND) self.SetSizer(self.mainSizer) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index a1aecf6ed..6edb67199 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -330,7 +330,11 @@ class ItemView(d.Display): item = self.active[sel] - menu = ContextMenu.getMenu((item,), "item" if self.marketBrowser.searchMode is False else "itemSearch") + sMkt = self.sMarket + sourceContext = "marketItemGroup" if self.marketBrowser.searchMode is False else "marketItemMisc" + itemContext = sMkt.getCategoryByItem(item).name + + menu = ContextMenu.getMenu((item,), (sourceContext, itemContext)) self.PopupMenu(menu) def populate(self, stuff): diff --git a/gui/projectedView.py b/gui/projectedView.py index 28e2ad3c7..ba0b7becb 100644 --- a/gui/projectedView.py +++ b/gui/projectedView.py @@ -165,17 +165,26 @@ class ProjectedView(d.Display): col = self.getColumn(event.Position) if col == self.getColIndex(State): fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() - cFit.toggleProjected(fitID, item, "right" if event.Button == 3 else "left") + sFit = service.Fit.getInstance() + sFit.toggleProjected(fitID, item, "right" if event.Button == 3 else "left") wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) elif event.Button == 3: + sMkt = service.Market.getInstance() if isinstance(item, eos.types.Drone): - context = ("projectedDrone",) + srcContext = "projectedDrone" + itemContext = sMkt.getCategoryByItem(item.item).name + context = ((srcContext, itemContext),) elif isinstance(item, eos.types.Module): + modSrcContext = "projectedModule" + modItemContext = sMkt.getCategoryByItem(item.item).name + modFullContext = (modSrcContext, modItemContext) if item.charge is not None: - context = ("projectedModule", "projectedAmmo") + chgSrcContext = "projectedCharge" + chgItemContext = sMkt.getCategoryByItem(item.charge).name + chgFullContext = (chgSrcContext, chgItemContext) + context = (modFullContext, chgFullContext) else: - context = ("projectedModule",) + context = (modFullContext,) else: context = ("projectedFit",) diff --git a/gui/statsPane.py b/gui/statsPane.py index ac8a43ae2..a3dcc795f 100644 --- a/gui/statsPane.py +++ b/gui/statsPane.py @@ -90,7 +90,7 @@ class StatsPane(wx.Panel): def contextHandler(self, contentPanel): viewName = contentPanel.viewName def handler(event): - menu = ContextMenu.getMenu(None, viewName) + menu = ContextMenu.getMenu(None, (viewName,)) if menu is not None: contentPanel.PopupMenu(menu) diff --git a/service/market.py b/service/market.py index afb48ada7..78b6875c3 100644 --- a/service/market.py +++ b/service/market.py @@ -590,7 +590,8 @@ class Market(): def getImplantTree(self): """Return implant market group children""" - return self.getMarketGroupChildren(27) + img = self.getMarketGroup(27) + return self.getMarketGroupChildren(img) def filterItemsByMeta(self, items, metas): """Filter items by meta lvl"""