diff --git a/gui/builtinContextMenus/ammoToDmgPattern.py b/gui/builtinContextMenus/ammoToDmgPattern.py index ffb58827c..8f5ece07b 100644 --- a/gui/builtinContextMenus/ammoToDmgPattern.py +++ b/gui/builtinContextMenus/ammoToDmgPattern.py @@ -19,6 +19,9 @@ class AmmoToDmgPattern(ContextMenu): if srcContext not in ("marketItemGroup", "marketItemMisc") or self.mainFrame.getActiveFit() is None: return False + if mainItem is None: + return False + for attr in ("emDamage", "thermalDamage", "explosiveDamage", "kineticDamage"): if mainItem.getAttribute(attr) is not None: return True @@ -26,13 +29,12 @@ class AmmoToDmgPattern(ContextMenu): return False def getText(self, itmContext, mainItem, selection): - return "Set {0} as Damage Pattern".format(itmContext if itmContext is not None else "Item") + return "Set {} as Damage Pattern".format(itmContext if itmContext is not None else "Item") def activate(self, fullContext, mainItem, selection, i): - fit = self.mainFrame.getActiveFit() - sFit = Fit.getInstance() - sFit.setAsPattern(fit, mainItem) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit)) + fitID = self.mainFrame.getActiveFit() + Fit.getInstance().setAsPattern(fitID, mainItem) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def getBitmap(self, context, mainItem, selection): return None diff --git a/gui/builtinContextMenus/boosterSideEffects.py b/gui/builtinContextMenus/boosterSideEffects.py index 726a408c0..d50eef78e 100644 --- a/gui/builtinContextMenus/boosterSideEffects.py +++ b/gui/builtinContextMenus/boosterSideEffects.py @@ -15,12 +15,12 @@ class BoosterSideEffect(ContextMenu): self.settings = ContextMenuSettings.getInstance() def display(self, srcContext, mainItem, selection): - # if not self.settings.get('fighterAbilities'): - # return False - if self.mainFrame.getActiveFit() is None or srcContext not in "boosterItem": return False + if mainItem is None: + return False + self.booster = mainItem for effect in self.booster.sideEffects: diff --git a/gui/builtinContextMenus/cargoAdd.py b/gui/builtinContextMenus/cargoAdd.py index 5a856ec3e..c54826ca6 100644 --- a/gui/builtinContextMenus/cargoAdd.py +++ b/gui/builtinContextMenus/cargoAdd.py @@ -14,6 +14,9 @@ class AddToCargo(ContextMenu): if srcContext not in ("marketItemGroup", "marketItemMisc"): return False + if mainItem is None: + return False + sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() fit = sFit.getFit(fitID) diff --git a/gui/builtinContextMenus/cargoAddAmmo.py b/gui/builtinContextMenus/cargoAddAmmo.py index 08ca05081..a5de99086 100644 --- a/gui/builtinContextMenus/cargoAddAmmo.py +++ b/gui/builtinContextMenus/cargoAddAmmo.py @@ -13,11 +13,13 @@ class AddToCargoAmmo(ContextMenu): if srcContext not in ("marketItemGroup", "marketItemMisc") or self.mainFrame.getActiveFit() is None: return False - for selected_item in selection: - if selected_item.category.ID in ( - 8, # Charge - ): - return True + if mainItem is None: + return False + + if mainItem.category.ID != 8: + return False + + return True def getText(self, itmContext, mainItem, selection): return "Add {0} to Cargo (x1000)".format(itmContext) diff --git a/gui/builtinContextMenus/droneAddStack.py b/gui/builtinContextMenus/droneAddStack.py index cbd8b4605..d73350803 100644 --- a/gui/builtinContextMenus/droneAddStack.py +++ b/gui/builtinContextMenus/droneAddStack.py @@ -19,6 +19,9 @@ class DroneAddStack(ContextMenu): if self.mainFrame.getActiveFit() is None: return False + if mainItem is None: + return False + if mainItem.category.name != 'Drone': return False diff --git a/gui/builtinContextMenus/droneSplitStack.py b/gui/builtinContextMenus/droneSplitStack.py index 564f27e9f..5b3e2aa69 100644 --- a/gui/builtinContextMenus/droneSplitStack.py +++ b/gui/builtinContextMenus/droneSplitStack.py @@ -16,10 +16,16 @@ class DroneSplitStack(ContextMenu): self.settings = ContextMenuSettings.getInstance() def display(self, srcContext, mainItem, selection): - return srcContext == "droneItem" and mainItem.amount > 1 + if srcContext != "droneItem": + return False + + if mainItem is None: + return False + + return mainItem.amount > 1 def getText(self, itmContext, mainItem, selection): - return "Split {0} Stack".format(itmContext) + return "Split {} Stack".format(itmContext) def activate(self, fullContext, mainItem, selection, i): dlg = DroneStackSplit(self.mainFrame, mainItem.amount) diff --git a/gui/builtinContextMenus/fighterAbilities.py b/gui/builtinContextMenus/fighterAbilities.py index 22d1a65fb..4950f84b8 100644 --- a/gui/builtinContextMenus/fighterAbilities.py +++ b/gui/builtinContextMenus/fighterAbilities.py @@ -18,6 +18,9 @@ class FighterAbilities(ContextMenu): if self.mainFrame.getActiveFit() is None or srcContext not in ("fighterItem", "projectedFighter"): return False + if mainItem is None: + return False + self.fighter = mainItem self.isProjected = True if srcContext == "projectedFighter" else False return True diff --git a/gui/builtinContextMenus/fitOpenNewTab.py b/gui/builtinContextMenus/fitOpenNewTab.py index 0e9114f25..118dc8ba7 100644 --- a/gui/builtinContextMenus/fitOpenNewTab.py +++ b/gui/builtinContextMenus/fitOpenNewTab.py @@ -15,6 +15,10 @@ class OpenFitInNewTab(ContextMenu): def display(self, srcContext, mainItem, selection): if srcContext not in ("projectedFit", "commandFit"): return False + + if mainItem is None: + return False + currentFitID = self.mainFrame.getActiveFit() selectedFitID = mainItem.ID if currentFitID == selectedFitID: diff --git a/gui/builtinContextMenus/implantSetAdd.py b/gui/builtinContextMenus/implantSetAdd.py index 4a3c1ceff..ef9525430 100644 --- a/gui/builtinContextMenus/implantSetAdd.py +++ b/gui/builtinContextMenus/implantSetAdd.py @@ -34,7 +34,7 @@ class addImplantSet(ContextMenu): way of doing this. However, we use this context menu within the Character Editor to apply implant sets to a character, so we need to access the character editor. - It is for these reasons that I hijack the selection parameter when calling the menu and pass a pointer to the + It is for these reasons that I hijack the mainItem parameter when calling the menu and pass a pointer to the Character Editor. This way we can use it to get current editing character ID and apply the implants. It would probably be better to have a function on the MainFrame to get the currently open Character Editor (as diff --git a/gui/builtinContextMenus/itemAmountChange.py b/gui/builtinContextMenus/itemAmountChange.py index 1c4b572ca..84bc35c31 100644 --- a/gui/builtinContextMenus/itemAmountChange.py +++ b/gui/builtinContextMenus/itemAmountChange.py @@ -20,7 +20,13 @@ class ChangeItemAmount(ContextMenu): self.settings = ContextMenuSettings.getInstance() def display(self, srcContext, mainItem, selection): - return srcContext in ("droneItem", "projectedDrone", "cargoItem", "projectedFit", "fighterItem", "projectedFighter") + if srcContext not in ("droneItem", "projectedDrone", "cargoItem", "projectedFit", "fighterItem", "projectedFighter"): + return False + + if mainItem is None: + return False + + return True def getText(self, itmContext, mainItem, selection): return "Change {0} Quantity".format(itmContext) diff --git a/gui/builtinContextMenus/itemFill.py b/gui/builtinContextMenus/itemFill.py index 71c852d05..0192439b7 100644 --- a/gui/builtinContextMenus/itemFill.py +++ b/gui/builtinContextMenus/itemFill.py @@ -13,12 +13,19 @@ class FillWithItem(ContextMenu): def display(self, srcContext, mainItem, selection): if not self.settings.get('moduleFill'): return False + if srcContext not in ('marketItemGroup', 'marketItemMisc'): return False + if self.mainFrame.getActiveFit() is None: return False + + if mainItem is None: + return False + if mainItem.category.name != 'Module': return False + return True def getText(self, itmContext, mainItem, selection): diff --git a/gui/builtinContextMenus/itemMarketJump.py b/gui/builtinContextMenus/itemMarketJump.py index f6a6128f8..505310f5b 100644 --- a/gui/builtinContextMenus/itemMarketJump.py +++ b/gui/builtinContextMenus/itemMarketJump.py @@ -21,6 +21,9 @@ class JumpToMarketItem(ContextMenu): if srcContext not in validContexts or mainItem is None: return False + if mainItem is None or getattr(mainItem, "isEmpty", False): + return False + sMkt = Market.getInstance() item = getattr(mainItem, "item", mainItem) isMutated = getattr(mainItem, "isMutated", False) diff --git a/gui/builtinContextMenus/itemProject.py b/gui/builtinContextMenus/itemProject.py index bd568a317..08dac1ecd 100644 --- a/gui/builtinContextMenus/itemProject.py +++ b/gui/builtinContextMenus/itemProject.py @@ -17,6 +17,9 @@ class ProjectItem(ContextMenu): if srcContext not in ("marketItemGroup", "marketItemMisc") or self.mainFrame.getActiveFit() is None: return False + if mainItem is None: + return False + sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() fit = sFit.getFit(fitID) diff --git a/gui/builtinContextMenus/itemRemove.py b/gui/builtinContextMenus/itemRemove.py index 30ec5bed5..5d85c7659 100644 --- a/gui/builtinContextMenus/itemRemove.py +++ b/gui/builtinContextMenus/itemRemove.py @@ -13,12 +13,20 @@ class RemoveItem(ContextMenu): self.settings = ContextMenuSettings.getInstance() def display(self, srcContext, mainItem, selection): - return srcContext in ("fittingModule", "droneItem", - "implantItem", "boosterItem", - "projectedModule", "cargoItem", - "projectedFit", "projectedDrone", - "fighterItem", "projectedFighter", - "commandFit") + if srcContext not in ( + "fittingModule", "droneItem", + "implantItem", "boosterItem", + "projectedModule", "cargoItem", + "projectedFit", "projectedDrone", + "fighterItem", "projectedFighter", + "commandFit" + ): + return False + + if mainItem is None and len(selection) == 0: + return False + + return True def getText(self, itmContext, mainItem, selection): return 'Remove {}{}'.format( @@ -27,6 +35,8 @@ class RemoveItem(ContextMenu): def activate(self, fullContext, mainItem, selection, i): + mainItem = selection[0] if mainItem is None else mainItem + srcContext = fullContext[0] sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() diff --git a/gui/builtinContextMenus/itemStats.py b/gui/builtinContextMenus/itemStats.py index 5bdde1798..da66230ee 100644 --- a/gui/builtinContextMenus/itemStats.py +++ b/gui/builtinContextMenus/itemStats.py @@ -14,19 +14,27 @@ class ItemStats(ContextMenu): self.settings = ContextMenuSettings.getInstance() def display(self, srcContext, mainItem, selection): - return srcContext in ("marketItemGroup", "marketItemMisc", - "fittingModule", "fittingCharge", - "fittingShip", "baseShip", - "cargoItem", "droneItem", - "implantItem", "boosterItem", - "skillItem", "projectedModule", - "projectedDrone", "projectedCharge", - "itemStats", "fighterItem", - "implantItemChar", "projectedFighter", - "fittingMode") + if srcContext not in ( + "marketItemGroup", "marketItemMisc", + "fittingModule", "fittingCharge", + "fittingShip", "baseShip", + "cargoItem", "droneItem", + "implantItem", "boosterItem", + "skillItem", "projectedModule", + "projectedDrone", "projectedCharge", + "itemStats", "fighterItem", + "implantItemChar", "projectedFighter", + "fittingMode" + ): + return False + + if (mainItem is None or getattr(mainItem, "isEmpty", False)) and srcContext != "fittingShip": + return False + + return True def getText(self, itmContext, mainItem, selection): - return "{0} Stats".format(itmContext if itmContext is not None else "Item") + return "{} Stats".format(itmContext if itmContext is not None else "Item") def activate(self, fullContext, mainItem, selection, i): srcContext = fullContext[0] diff --git a/gui/builtinContextMenus/itemVariationChange.py b/gui/builtinContextMenus/itemVariationChange.py index d27eef91b..723087b03 100644 --- a/gui/builtinContextMenus/itemVariationChange.py +++ b/gui/builtinContextMenus/itemVariationChange.py @@ -31,6 +31,9 @@ class ChangeItemToVariation(ContextMenu): ): return False + if (mainItem is None or getattr(mainItem, 'isEmpty', False)) and len(selection) == 0: + return False + # Check if list of variations is same for all of selection # If not - don't show the menu mkt = Market.getInstance() diff --git a/gui/builtinContextMenus/moduleAmmoChange.py b/gui/builtinContextMenus/moduleAmmoChange.py index 1cc2f760f..8883c708b 100644 --- a/gui/builtinContextMenus/moduleAmmoChange.py +++ b/gui/builtinContextMenus/moduleAmmoChange.py @@ -25,12 +25,13 @@ class ChangeModuleAmmo(ContextMenu): if self.mainFrame.getActiveFit() is None or srcContext not in ("fittingModule", "projectedModule"): return False - modules = selection if srcContext == "fittingModule" else (mainItem,) + if len(selection) == 0: + return False validCharges = None checkedTypes = set() - for mod in modules: + for mod in selection: # loop through modules and gather list of valid charges if mod.item.ID in checkedTypes: continue @@ -45,13 +46,15 @@ class ChangeModuleAmmo(ContextMenu): if validCharges is not None and validCharges != currCharges: return False + validCharges = currCharges self.module = mod if validCharges is None: return False - self.modules = modules + self.mainItem = mainItem + self.selection = selection self.charges = list([charge for charge in validCharges if Market.getInstance().getPublicityByItem(charge)]) self.context = srcContext return len(self.charges) > 0 @@ -241,7 +244,7 @@ class ChangeModuleAmmo(ContextMenu): modContainer = fit.projectedModules else: return - selectedModule = self.modules[0] + selectedModule = self.selection[0] if self.mainItem is None else self.mainItem positions = getSimilarModPositions(modContainer, selectedModule) self.mainFrame.command.Submit(command( fitID=fitID, @@ -258,7 +261,7 @@ class ChangeModuleAmmo(ContextMenu): return positions = [] for position, mod in enumerate(modContainer): - if mod in self.modules: + if mod in self.selection: positions.append(position) self.mainFrame.command.Submit(command( fitID=fitID, diff --git a/gui/builtinContextMenus/moduleFill.py b/gui/builtinContextMenus/moduleFill.py index 3eeb10d6d..a6d0503e4 100644 --- a/gui/builtinContextMenus/moduleFill.py +++ b/gui/builtinContextMenus/moduleFill.py @@ -13,6 +13,10 @@ class FillWithModule(ContextMenu): def display(self, srcContext, mainItem, selection): if not self.settings.get('moduleFill'): return False + + if mainItem is None or mainItem.isEmpty: + return False + return srcContext == "fittingModule" def getText(self, itmContext, mainItem, selection): diff --git a/gui/builtinContextMenus/moduleMutations.py b/gui/builtinContextMenus/moduleMutations.py index 6bc7502cb..1199ee6f5 100644 --- a/gui/builtinContextMenus/moduleMutations.py +++ b/gui/builtinContextMenus/moduleMutations.py @@ -15,13 +15,12 @@ class ChangeModuleMutation(ContextMenu): self.eventIDs = {} def display(self, srcContext, mainItem, selection): - - # if not self.settings.get('ammoPattern'): - # return False - if srcContext != "fittingModule" or self.mainFrame.getActiveFit() is None: return False + if mainItem is None or mainItem.isEmpty: + return False + if len(mainItem.item.mutaplasmids) == 0 and not mainItem.isMutated: return False diff --git a/gui/builtinContextMenus/moduleSpool.py b/gui/builtinContextMenus/moduleSpool.py index 78d4e7f2a..4d2ec9a49 100644 --- a/gui/builtinContextMenus/moduleSpool.py +++ b/gui/builtinContextMenus/moduleSpool.py @@ -24,6 +24,9 @@ class ChangeModuleSpool(ContextMenu): if srcContext not in ('fittingModule', 'projectedModule') or self.mainFrame.getActiveFit() is None: return False + if mainItem is None or mainItem.isEmpty: + return False + self.mod = mainItem self.context = srcContext diff --git a/gui/builtinContextMenus/skillAffectors.py b/gui/builtinContextMenus/skillAffectors.py index 9c8bc1769..14197d2d8 100644 --- a/gui/builtinContextMenus/skillAffectors.py +++ b/gui/builtinContextMenus/skillAffectors.py @@ -20,13 +20,23 @@ class ChangeAffectingSkills(ContextMenu): if not self.settings.get('changeAffectingSkills'): return False - if self.mainFrame.getActiveFit() is None or srcContext not in ( - "fittingModule", "fittingCharge", "fittingShip", "droneItem", "fighterItem"): + if srcContext not in ( + "fittingModule", "fittingCharge", + "fittingShip", "droneItem", + "fighterItem" + ): return False + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return False + + if mainItem is None or getattr(mainItem, "isEmpty", False): + return + self.sChar = Character.getInstance() self.sFit = Fit.getInstance() - fit = self.sFit.getFit(self.mainFrame.getActiveFit()) + fit = self.sFit.getFit(fitID) self.charID = fit.character.ID @@ -34,7 +44,6 @@ class ChangeAffectingSkills(ContextMenu): # return False if srcContext == "fittingShip": - fitID = self.mainFrame.getActiveFit() sFit = Fit.getInstance() self.stuff = sFit.getFit(fitID).ship cont = sFit.getFit(fitID).ship.itemModifiedAttributes