#!/usr/bin/python ######################################################################### # # Menu # ######################################################################### import sys import os import wx #from traceback import print_exc #from cStringIO import StringIO #from Dialogs.abcoption import ABCOptionPanel from Utility.constants import * #IGNORE:W0611 ################################################################ # # Class: ToolBarDialog # # Allows a user to alter the settings and appearance of # columns in a ABCBar. # ################################################################ class MenuDialog(wx.Dialog): def __init__(self, parent, configlabel): self.utility = parent.utility title = self.utility.lang.get('customizecontextmenu') pre = wx.PreDialog() pre.Create(parent, -1, title) self.this = pre.this outerbox = wx.BoxSizer( wx.VERTICAL ) self.menuPanel = MenuPanel(self, configlabel) applybtn = wx.Button(self, -1, self.utility.lang.get('apply')) self.Bind(wx.EVT_BUTTON, self.onApply, applybtn) okbtn = wx.Button(self, -1, self.utility.lang.get('ok')) self.Bind(wx.EVT_BUTTON, self.onOK, okbtn) cancelbtn = wx.Button(self, wx.ID_CANCEL, self.utility.lang.get('cancel')) setDefaultsbtn = wx.Button(self, -1, self.utility.lang.get('reverttodefault')) self.Bind(wx.EVT_BUTTON, self.menuPanel.setDefaults, setDefaultsbtn) buttonbox = wx.BoxSizer( wx.HORIZONTAL ) buttonbox.Add(applybtn, 0, wx.ALL, 5) buttonbox.Add(okbtn, 0, wx.ALL, 5) buttonbox.Add(cancelbtn, 0, wx.ALL, 5) buttonbox.Add(setDefaultsbtn, 0, wx.ALL, 5) outerbox.Add( self.menuPanel, 0, wx.EXPAND|wx.ALL, 5) outerbox.Add( buttonbox, 0, wx.ALIGN_CENTER) self.SetAutoLayout( True ) self.SetSizer( outerbox ) self.Fit() def onOK(self, event = None): if self.onApply(event): self.EndModal(wx.ID_OK) def onApply(self, event = None): self.menuPanel.apply() return True ################################################################ # # Class: MenuPanel # # Contains the interface elements for customizing a ABCMenu # ################################################################ class MenuPanel(wx.Panel): def __init__(self, parent, configlabel): wx.Panel.__init__(self, parent, -1) self.parent = parent self.utility = parent.utility self.configlabel = configlabel sizer = wx.BoxSizer(wx.VERTICAL) listsizer = wx.BoxSizer(wx.HORIZONTAL) self.lists = {} self.lists["available"] = ActionsMenu(self, 'menu_available', []) self.lists["current"] = ActionsMenu(self, 'menu_current', []) listsizer.Add(self.lists["available"], 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5) addremovesizer = wx.BoxSizer(wx.VERTICAL) self.buttons = {} self.buttons["add"] = wx.Button(self, -1, self.utility.lang.get('buttons_add') + " ->") self.Bind(wx.EVT_BUTTON, self.addButton, self.buttons["add"]) addremovesizer.Add(self.buttons["add"], 0, wx.ALIGN_CENTER|wx.ALL, 5) self.buttons["remove"]= wx.Button(self, -1, "<- " + self.utility.lang.get('buttons_remove')) self.Bind(wx.EVT_BUTTON, self.removeButton, self.buttons["remove"]) addremovesizer.Add(self.buttons["remove"], 0, wx.ALIGN_CENTER|wx.ALL, 5) listsizer.Add(addremovesizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5) listsizer.Add(self.lists["current"], 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5) updownsizer = wx.BoxSizer(wx.VERTICAL) self.buttons["up"] = self.utility.makeBitmapButton(self, 'moveup.bmp', 'move_up', self.OnMove) updownsizer.Add(self.buttons["up"], 0, wx.ALIGN_CENTER|wx.ALL, 5) self.buttons["down"] = self.utility.makeBitmapButton(self, 'movedown.bmp', 'move_down', self.OnMove) updownsizer.Add(self.buttons["down"], 0, wx.ALIGN_CENTER|wx.ALL, 5) listsizer.Add(updownsizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5) sizer.Add(listsizer, 1, wx.EXPAND) self.loadValues() self.SetSizerAndFit(sizer) def getAvailable(self): available = [] # Always include the separator actionid = ACTION_SEPARATOR action = self.utility.actions[actionid] available.append(actionid) for actionid in self.utility.actions: action = self.utility.actions[actionid] if (actionid != ACTION_SEPARATOR) and (action.menudesc is not None): if (actionid not in self.lists["current"].items): available.append(actionid) return available def getSelected(self, listname = "current"): return self.lists[listname].list.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) def addButton(self, event = None): # Get the button selected on the left index = self.getSelected("available") if index == -1: # Nothing selected on the left return buttonid = self.lists["available"].buttonlist[index] # Remove it from the left if buttonid != ACTION_SEPARATOR: self.lists["available"].removeItem(index) # Add it to the right index = self.lists["current"].addItem(buttonid) self.lists["current"].selectItem(index) def removeButton(self, event = None): # Get the button selected on the right index = self.getSelected("current") if index == -1: # Nothing selected on the right return buttonid = self.lists["current"].buttonlist[index] # Remove it from the right self.lists["current"].removeItem(index) # Add it from the left if buttonid != ACTION_SEPARATOR: index = self.lists["available"].addItem(buttonid) self.lists["available"].selectItem(index) def OnMove(self, event = None): # Get the button selected on the right index = self.getSelected("current") if index == -1: # Nothing selected on the right return # Move up if event.GetId() == self.buttons["up"].GetId(): direction = -1 # Move down else: direction = 1 self.lists["current"].move(index, direction) def apply(self): changed = self.utility.config.Write(self.configlabel, self.lists["current"].buttonlist, "bencode-list") if changed: self.utility.config.Flush() return changed def loadValues(self, Read = None): if Read is None: Read = self.utility.config.Read self.lists["current"].items = Read(self.configlabel, "bencode-list") self.lists["available"].items = self.getAvailable() self.lists["current"].setupItems() self.lists["available"].setupItems() def setDefaults(self, event = None): self.loadValues(self.utility.config.ReadDefault) ############################################################## # # Class : ActionsMenu # # List of actions # ############################################################## class ActionsMenu(wx.Panel): def __init__(self, parent, label, items): wx.Panel.__init__(self, parent, -1) self.parent = parent self.utility = parent.utility self.label = self.utility.lang.get(label) self.items = items self.buttonlist = [] sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(wx.StaticText(self, -1, self.label), 0, wx.ALL, 5) self.list = wx.ListCtrl(self, -1, size = (210, 300), style = wx.LC_REPORT|wx.LC_NO_HEADER|wx.LC_SINGLE_SEL) self.setupList() sizer.Add(self.list, 1, wx.ALL, 5) self.SetSizerAndFit(sizer) self.firsttime = True def setupList(self): self.list.InsertColumn(0, " ") def setupItems(self): if not self.firsttime: # Only need to delete items after the first time self.list.DeleteAllItems() self.buttonlist = [] for actionid in self.items: self.addItem(actionid, resizecol = False) self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) self.firsttime = False def selectItem(self, index): self.list.Select(index) self.list.EnsureVisible(index) def addItem(self, actionid, resizecol = True): try: action = self.utility.actions[actionid] except: return index = self.list.GetItemCount() # (Strip "&" characters out of menu description - used for underlining) text = action.menudesc.replace("&", "") self.list.InsertStringItem(index, text) self.buttonlist.append(actionid) if resizecol: self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) return index def removeItem(self, index): self.list.DeleteItem(index) del self.buttonlist[index] self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) def move(self, index, dir): if dir == -1 and index == 0: # moving up and already at the top return elif dir == 1 and index == len(self.buttonlist) - 1: # moving down and already at the bottom return index2 = index + dir # Get items item = self.list.GetItem(index) item2 = self.list.GetItem(index2) # Swap text and images item.m_text, item2.m_text = item2.m_text, item.m_text # Set items self.list.SetItem(item) self.list.SetItem(item2) # Swap indexes self.buttonlist[index], self.buttonlist[index2] = self.buttonlist[index2], self.buttonlist[index] # Update the selection self.selectItem(index2) ############################################################## # # Class : ABCMenu # # Right click menu composed of actions # ############################################################## class ABCMenu(wx.Menu): def __init__(self, utility, configlabel): wx.Menu.__init__(self) self.utility = utility self.configlabel = configlabel self.items = self.utility.config.Read(configlabel, "bencode-list") for item in self.items: if item == -1: self.AppendSeparator() else: if item in self.utility.actions: self.utility.actions[item].addToMenu(self)