131 lines
3.2 KiB
Python
131 lines
3.2 KiB
Python
import ClientConstants as CC
|
|
import collections
|
|
import HydrusGlobals as HG
|
|
import wx
|
|
|
|
menus_to_submenus = collections.defaultdict( set )
|
|
menus_to_menu_item_data = collections.defaultdict( set )
|
|
|
|
def AppendMenu( menu, submenu, label ):
|
|
|
|
label = SanitiseLabel( label )
|
|
|
|
menu.AppendMenu( CC.ID_NULL, label, submenu )
|
|
|
|
menus_to_submenus[ menu ].add( submenu )
|
|
|
|
def AppendMenuBitmapItem( event_handler, menu, label, description, bitmap, callable, *args, **kwargs ):
|
|
|
|
label = SanitiseLabel( label )
|
|
|
|
menu_item = wx.MenuItem( menu, wx.ID_ANY, label )
|
|
|
|
menu_item.SetHelp( description )
|
|
|
|
menu_item.SetBitmap( bitmap )
|
|
|
|
menu.AppendItem( menu_item )
|
|
|
|
BindMenuItem( event_handler, menu, menu_item, callable, *args, **kwargs )
|
|
|
|
return menu_item
|
|
|
|
def AppendMenuCheckItem( event_handler, menu, label, description, initial_value, callable, *args, **kwargs ):
|
|
|
|
label = SanitiseLabel( label )
|
|
|
|
menu_item = menu.AppendCheckItem( wx.ID_ANY, label, description )
|
|
|
|
menu_item.Check( initial_value )
|
|
|
|
BindMenuItem( event_handler, menu, menu_item, callable, *args, **kwargs )
|
|
|
|
return menu_item
|
|
|
|
def AppendMenuItem( event_handler, menu, label, description, callable, *args, **kwargs ):
|
|
|
|
label = SanitiseLabel( label )
|
|
|
|
menu_item = menu.Append( wx.ID_ANY, label, description )
|
|
|
|
BindMenuItem( event_handler, menu, menu_item, callable, *args, **kwargs )
|
|
|
|
return menu_item
|
|
|
|
def AppendMenuLabel( menu, label, description = None ):
|
|
|
|
if description is None:
|
|
|
|
description = ''
|
|
|
|
|
|
menu_item = menu.Append( wx.ID_ANY, label, description )
|
|
|
|
return menu_item
|
|
|
|
def AppendSeparator( menu ):
|
|
|
|
num_items = menu.GetMenuItemCount()
|
|
|
|
if num_items > 0:
|
|
|
|
last_item = menu.FindItemByPosition( num_items - 1 )
|
|
|
|
if not last_item.IsSeparator():
|
|
|
|
menu.AppendSeparator()
|
|
|
|
|
|
|
|
def BindMenuItem( event_handler, menu, menu_item, callable, *args, **kwargs ):
|
|
|
|
event_callable = GetEventCallable( callable, *args, **kwargs )
|
|
|
|
event_handler.Bind( wx.EVT_MENU, event_callable, source = menu_item )
|
|
|
|
menus_to_menu_item_data[ menu ].add( ( menu_item, event_handler ) )
|
|
|
|
def DestroyMenuItems( menu ):
|
|
|
|
handler = HG.client_controller.GetApp()
|
|
|
|
menu_item_data = menus_to_menu_item_data[ menu ]
|
|
|
|
del menus_to_menu_item_data[ menu ]
|
|
|
|
for ( menu_item, event_handler ) in menu_item_data:
|
|
|
|
event_handler.Unbind( wx.EVT_MENU, source = menu_item )
|
|
|
|
menu_item.Destroy()
|
|
|
|
|
|
submenus = menus_to_submenus[ menu ]
|
|
|
|
del menus_to_submenus[ menu ]
|
|
|
|
for submenu in submenus:
|
|
|
|
DestroyMenuItems( submenu )
|
|
|
|
|
|
def DestroyMenu( menu ):
|
|
|
|
DestroyMenuItems( menu )
|
|
|
|
menu.Destroy()
|
|
|
|
def GetEventCallable( callable, *args, **kwargs ):
|
|
|
|
def event_callable( event ):
|
|
|
|
callable( *args, **kwargs )
|
|
|
|
|
|
return event_callable
|
|
|
|
def SanitiseLabel( label ):
|
|
|
|
return label.replace( '&', '&&' )
|
|
|