diff --git a/gui/boosterView.py b/gui/boosterView.py index a1848daca..410247bbe 100644 --- a/gui/boosterView.py +++ b/gui/boosterView.py @@ -50,12 +50,9 @@ class BoosterView(d.Display): def kbEvent(self,event): keycode = event.GetKeyCode() if keycode == wx.WXK_DELETE or keycode == wx.WXK_NUMPAD_DELETE: - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() row = self.GetFirstSelected() if row != -1: - cFit.removeBooster(fitID, self.GetItemData(row)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.removeBooster(self.boosters[self.GetItemData(row)]) event.Skip() @@ -71,7 +68,8 @@ class BoosterView(d.Display): sFit = service.Fit.getInstance() fit = sFit.getFit(event.fitID) - stuff = fit.boosters if fit is not None else None + self.origional = fit.boosters if fit is not None else None + self.boosters = stuff = fit.boosters[:] if fit is not None else None if event.fitID != self.lastFitId: self.lastFitId = event.fitID @@ -102,10 +100,13 @@ class BoosterView(d.Display): if row != -1: col = self.getColumn(event.Position) if col != self.getColIndex(State): - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() - cFit.removeBooster(fitID, self.GetItemData(row)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.removeBooster(self.boosters[self.GetItemData(row)]) + + def removeBooster(self, booster): + fitID = self.mainFrame.getActiveFit() + cFit = service.Fit.getInstance() + cFit.removeBooster(fitID, self.origional.index(booster)) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def click(self, event): event.Skip() diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index 1497d7452..b8df36a70 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -1,2 +1,2 @@ -__all__ = ["moduleAmmoPicker", "itemStats", "damagePattern", "marketJump", "droneSplit", +__all__ = ["itemRemove", "moduleAmmoPicker", "itemStats", "damagePattern", "marketJump", "droneSplit", "ammoPattern", "project", "factorReload", "whProjector"] diff --git a/gui/builtinContextMenus/itemRemove.py b/gui/builtinContextMenus/itemRemove.py new file mode 100644 index 000000000..08c445851 --- /dev/null +++ b/gui/builtinContextMenus/itemRemove.py @@ -0,0 +1,44 @@ +from gui.contextMenu import ContextMenu +import gui.mainFrame +import service +import wx +import gui.globalEvents as GE + +class ItemRemove(ContextMenu): + def __init__(self): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def display(self, srcContext, selection): + return srcContext in ("fittingModule", "fittingCharge", "droneItem", "implantItem", "boosterItem", "projectedModule", "projectedCharge", + "projectedFit", "projectedDrone") + + def getText(self, itmContext, selection): + return "Remove {0}".format(itmContext if itmContext is not None else "Item") + + def activate(self, fullContext, selection, i): + srcContext = fullContext[0] + sFit = service.Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + cFit = sFit.getFit(fitID) + + if srcContext == "fittingModule": + for module in selection: + if module is not None: + sFit.removeModule(fitID,cFit.modules.index(module)) + elif srcContext in ("fittingCharge" , "projectedCharge"): + sFit.setAmmo(fitID, None, selection) + elif srcContext == "droneItem": + sFit.removeDrone(fitID, cFit.drones.index(selection[0])) + elif srcContext == "implantItem": + sFit.removeImplant(fitID, cFit.implants.index(selection[0])) + elif srcContext == "boosterItem": + sFit.removeBooster(fitID, cFit.boosters.index(selection[0])) + else: + sFit.removeProjected(fitID, selection[0]) + + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + + + + +ItemRemove.register() diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py index 02357445f..146139aa8 100644 --- a/gui/builtinContextMenus/whProjector.py +++ b/gui/builtinContextMenus/whProjector.py @@ -9,7 +9,7 @@ class WhProjector(ContextMenu): self.mainFrame = gui.mainFrame.MainFrame.getInstance() def display(self, srcContext, selection): - return srcContext in ("projectedDrone", "projectedModule", "projectedCharge", "projectedFit", "projectedNone") + return srcContext == "projected" def getText(self, itmContext, selection): return "Add System Effects" diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 23e06cf23..f079adbfa 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -227,15 +227,10 @@ class FittingView(d.Display): row = self.GetFirstSelected() firstSel = row while row != -1: - cFit = service.Fit.getInstance() - populate = cFit.removeModule(self.activeFitID, self.mods[self.GetItemData(row)].position) + self.removeModule(self.mods[row]) self.Select(row,0) row = self.GetNextSelected(row) - if populate is not None: - self.Select(firstSel) - if populate: self.slotsChanged() - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID)) - + event.Skip() def fitRemoved(self, event): @@ -305,16 +300,19 @@ class FittingView(d.Display): if row != -1: col = self.getColumn(event.Position) if col != self.getColIndex(State): - cFit = service.Fit.getInstance() - fit = cFit.getFit(self.activeFitID) - populate = cFit.removeModule(self.activeFitID, fit.modules.index(self.mods[self.GetItemData(row)])) - - if populate is not None: - if populate: self.slotsChanged() - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID)) + self.removeModule(self.mods[row]) else: if "wxMSW" in wx.PlatformInfo: self.click(event) + + def removeModule(self, module): + cFit = service.Fit.getInstance() + fit = cFit.getFit(self.activeFitID) + populate = cFit.removeModule(self.activeFitID, fit.modules.index(module)) + + if populate is not None: + if populate: self.slotsChanged() + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID)) def swapItems(self, x, y, itemID): mstate = wx.GetMouseState() diff --git a/gui/display.py b/gui/display.py index 4f65da4f4..0cfc28854 100644 --- a/gui/display.py +++ b/gui/display.py @@ -78,7 +78,7 @@ class Display(wx.ListCtrl): """ Return a tuple indicating which (item, subItem) the given pt (client coordinates) is over. - This uses the buildin version on Windows, and poor mans replacement on other platforms. + This uses the built-in version on Windows, and poor mans replacement on other platforms. """ # The buildin version works on Windows @@ -124,7 +124,7 @@ class Display(wx.ListCtrl): bottomItem = topItem + self.GetCountPerPage() if bottomItem >= self.GetItemCount(): - bottomItem = self.GetItemCount() - 1 + bottomItem = self.GetItemCount() - 1 topRect = self.GetItemRect(topItem, wx.LIST_RECT_LABEL) bottomRect = self.GetItemRect(bottomItem, wx.LIST_RECT_BOUNDS) diff --git a/gui/droneView.py b/gui/droneView.py index c063aba42..21a54ec49 100644 --- a/gui/droneView.py +++ b/gui/droneView.py @@ -107,11 +107,8 @@ class DroneView(d.Display): row = self.GetFirstSelected() firstSel = row if row != -1: - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() drone = self.drones[self.GetItemData(row)] - cFit.removeDrone(fitID, self.original.index(drone)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.removeDrone(drone) event.Skip() @@ -197,11 +194,14 @@ class DroneView(d.Display): if row != -1: col = self.getColumn(event.Position) if col != self.getColIndex(State): - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() drone = self.drones[self.GetItemData(row)] - cFit.removeDrone(fitID, self.original.index(drone)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.removeDrone(drone) + + def removeDrone(self, drone): + fitID = self.mainFrame.getActiveFit() + cFit = service.Fit.getInstance() + cFit.removeDrone(fitID, self.original.index(drone)) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def click(self, event): event.Skip() diff --git a/gui/implantView.py b/gui/implantView.py index 9b7569da2..663375cd3 100644 --- a/gui/implantView.py +++ b/gui/implantView.py @@ -48,12 +48,9 @@ class ImplantView(d.Display): def kbEvent(self,event): keycode = event.GetKeyCode() if keycode == wx.WXK_DELETE or keycode == wx.WXK_NUMPAD_DELETE: - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() row = self.GetFirstSelected() if row != -1: - cFit.removeImplant(fitID, self.GetItemData(row)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.removeImplant(self.implants[self.GetItemData(row)]) event.Skip() def fitChanged(self, event): @@ -100,11 +97,13 @@ class ImplantView(d.Display): if row != -1: col = self.getColumn(event.Position) if col != self.getColIndex(State): - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() - implant = self.implants[self.GetItemData(row)] - cFit.removeImplant(fitID, self.original.index(implant)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + self.removeImplant(self.implants[self.GetItemData(row)]) + + def removeImplant(self, implant): + fitID = self.mainFrame.getActiveFit() + cFit = service.Fit.getInstance() + cFit.removeImplant(fitID, self.original.index(implant)) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def click(self, event): event.Skip() diff --git a/gui/projectedView.py b/gui/projectedView.py index 87851e396..d8a4b9483 100644 --- a/gui/projectedView.py +++ b/gui/projectedView.py @@ -59,6 +59,11 @@ class ProjectedView(d.Display): self.Bind(wx.EVT_KEY_UP, self.kbEvent) self.droneView = gui.droneView.DroneView + + if "__WXGTK__" in wx.PlatformInfo: + self.Bind(wx.EVT_RIGHT_UP, self.scheduleMenu) + else: + self.Bind(wx.EVT_RIGHT_DOWN, self.scheduleMenu) self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) self.SetDropTarget(ProjectedViewDrop(self.mergeDrones)) @@ -182,36 +187,47 @@ class ProjectedView(d.Display): 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): - 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: - chgSrcContext = "projectedCharge" - chgItemContext = sMkt.getCategoryByItem(item.charge).name - chgFullContext = (chgSrcContext, chgItemContext) - context = (modFullContext, chgFullContext) - else: - context = (modFullContext,) + + def scheduleMenu(self, event): + event.Skip() + if self.getColumn(event.Position) != self.getColIndex(State): + wx.CallAfter(self.spawnMenu) + + def spawnMenu(self): + sel = self.GetFirstSelected() + menu = None + if sel != -1: + item = self.get(sel) + sMkt = service.Market.getInstance() + if isinstance(item, eos.types.Drone): + 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: + chgSrcContext = "projectedCharge" + chgItemContext = sMkt.getCategoryByItem(item.charge).name + chgFullContext = (chgSrcContext, chgItemContext) + context = (modFullContext, chgFullContext) else: - context = (("projectedFit",),) - menu = ContextMenu.getMenu((item,), *context) - if menu is not None: - self.PopupMenu(menu) - elif row == -1 and event.Button == 3: + context = (modFullContext,) + else: + fitSrcContext = "projectedFit" + fitItemContext = item.name + context = ((fitSrcContext,fitItemContext),) + context = context + (("projected",),) + menu = ContextMenu.getMenu((item,), *context) + elif sel == -1: fitID = self.mainFrame.getActiveFit() if fitID is None: return - context = (("projectedNone",),) + context = (("projected",),) menu = ContextMenu.getMenu([], *context) - if menu is not None: - self.PopupMenu(menu) + if menu is not None: + self.PopupMenu(menu) def remove(self, event): row, _ = self.HitTest(event.Position)