From bc883685ecde045235bb2bbd0cde43ac72cf10bb Mon Sep 17 00:00:00 2001 From: cncfanatics Date: Tue, 19 Oct 2010 10:31:52 +0200 Subject: [PATCH] Implement basic ammo switching context menu. (still needs much polishing) --- eos | 2 +- gui/builtinContextMenus/__init__.py | 2 +- gui/builtinContextMenus/moduleAmmoPicker.py | 63 +++++++++++++++++++++ gui/contextMenu.py | 12 +++- gui/display.py | 7 ++- gui/fittingView.py | 9 +++ gui/mainFrame.py | 4 ++ 7 files changed, 94 insertions(+), 5 deletions(-) create mode 100755 gui/builtinContextMenus/moduleAmmoPicker.py diff --git a/eos b/eos index 7c9a59ca2..04fd4f2d8 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 7c9a59ca2a2d33a33be3400efa1692343fa1f57e +Subproject commit 04fd4f2d85db7ac5a63882488ad6784b7a31f005 diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index 8f1564754..7964c4ee4 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -1 +1 @@ -__all__ = ["itemStats", "damagePattern"] \ No newline at end of file +__all__ = ["itemStats", "damagePattern", "moduleAmmoPicker"] diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py new file mode 100755 index 000000000..5fad938c3 --- /dev/null +++ b/gui/builtinContextMenus/moduleAmmoPicker.py @@ -0,0 +1,63 @@ +from gui.contextMenu import ContextMenu +import gui.mainFrame +import service +import gui.fittingView +import wx +from gui import bitmapLoader + +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 != "module": + return False + + modules = self.mainFrame.getFittingView().getSelectedMods() + validCharges = None + for mod in modules: + currCharges = mod.getValidCharges() + if validCharges is not None and validCharges != currCharges: + return False + + validCharges = currCharges + + self.charges = validCharges + return True + + def getText(self, context, selection): + return "Ammo" + + def activate(self, context, selection, i): + pass + + def getSubMenu(self, context, selection, menu, i): + menu.Bind(wx.EVT_MENU, self.handleAmmoSwitch) + m = wx.Menu() + self.chargeIds = {} + for charge in self.charges: + id = wx.NewId() + self.chargeIds[id] = charge + item = wx.MenuItem(m, id, charge.name) + item.charge = charge + if charge.icon is not None: + bitmap = bitmapLoader.getBitmap(charge.icon.iconFile, "pack") + if bitmap is not None: + item.SetBitmap(bitmap) + m.AppendItem(item) + + return m + + def handleAmmoSwitch(self, event): + charge = self.chargeIds.get(event.Id) + if charge is None: + event.Skip() + return + + sFit = service.Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + modules = map(lambda mod: mod.position, self.mainFrame.getFittingView().getSelectedMods()) + sFit.setAmmo(fitID, charge.ID, modules) + wx.PostEvent(self.mainFrame, gui.fittingView.FitChanged(fitID=fitID)) + +ModuleAmmoPicker.register() diff --git a/gui/contextMenu.py b/gui/contextMenu.py index ece205d8e..34724f834 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -49,6 +49,10 @@ class ContextMenu(object): item = wx.MenuItem(menu, id, text) menu.info[id] = (m, context, it) + sub = m.getSubMenu(context, selection, menu, it) + if sub is not None: + item.SetSubMenu(sub) + if bitmap is not None: if multiple: bp = bitmap[it] @@ -77,12 +81,17 @@ class ContextMenu(object): selection = (selection,) m.activate(context, selection, i) + else: + event.Skip() def display(self, context, selection): raise NotImplementedError() def activate(self, context, selection, i): - raise NotImplementedError() + return None + + def getSubMenu(self, context, selection, menu, i): + return None def getText(self, context, selection): raise NotImplementedError() @@ -90,4 +99,5 @@ class ContextMenu(object): def getBitmap(self, context, selection): return None + from gui.builtinContextMenus import * diff --git a/gui/display.py b/gui/display.py index 5da83e642..1d7421629 100644 --- a/gui/display.py +++ b/gui/display.py @@ -141,9 +141,12 @@ class Display(wx.ListCtrl): for i, col in enumerate(self.activeColumns): if not col.resized: + self.SetColumnWidth(i, wx.LIST_AUTOSIZE_USEHEADER) + headerWidth = self.GetColumnWidth(i) self.SetColumnWidth(i, col.size) - if self.GetColumnWidth(i) < 40 and col.size == wx.LIST_AUTOSIZE: - self.SetColumnWidth(i, 40) + baseWidth = self.GetColumnWidth(i) + if baseWidth < headerWidth: + self.SetColumnWidth(i, headerWidth) for sel in selection: self.Select(sel) diff --git a/gui/fittingView.py b/gui/fittingView.py index 3f5dce7ee..8cf6b699f 100644 --- a/gui/fittingView.py +++ b/gui/fittingView.py @@ -51,6 +51,15 @@ class FittingView(d.Display): self.Bind(wx.EVT_KEY_UP, self.kbEvent) + def getSelectedMods(self): + sel = [] + row = self.GetFirstSelected() + while row != -1: + sel.append(self.mods[self.GetItemData(row)]) + row = self.GetNextSelected(row) + + return sel + def kbEvent(self,event): keycode = event.GetKeyCode() if keycode == wx.WXK_DELETE or keycode == wx.WXK_NUMPAD_DELETE: diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 747f6ede9..94c238810 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -107,6 +107,10 @@ class MainFrame(wx.Frame): view = self.fitMultiSwitch.GetPage(sel).view return view.activeFitID + def getFittingView(self): + sel = self.fitMultiSwitch.GetSelection() + return self.fitMultiSwitch.GetPage(sel).view + def mouseHit(self, event): tab, _ = self.notebookBrowsers.HitTest(event.Position) if tab != -1: