[bug 662] [Feature Request] - In the Context Menu(Right-Click) show keyboard shortcuts / accelarators #662
- added short cuts / accelarators to right click context menu - menu is updated from config so changes in preferences keybindings appear dynamically - Note: I think there is a bug or discrepancy where for the action edit window title config.py says: 'edit_window_title': 'w where as in code: terminal_popup_menu.py item = Gtk.ImageMenuItem.new_with_mnemonic(_('Set W_indow Title')) Character i is selected as mnemonic. - fixed the above discrepancy
This commit is contained in:
parent
6f99890dd3
commit
548a51c6bb
|
@ -3,7 +3,7 @@
|
||||||
"""terminal_popup_menu.py - classes necessary to provide a terminal context
|
"""terminal_popup_menu.py - classes necessary to provide a terminal context
|
||||||
menu"""
|
menu"""
|
||||||
|
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk, Gdk
|
||||||
|
|
||||||
from .version import APP_NAME
|
from .version import APP_NAME
|
||||||
from .translation import _
|
from .translation import _
|
||||||
|
@ -19,12 +19,54 @@ class TerminalPopupMenu(object):
|
||||||
terminal = None
|
terminal = None
|
||||||
terminator = None
|
terminator = None
|
||||||
config = None
|
config = None
|
||||||
|
accelgrp = None
|
||||||
|
|
||||||
def __init__(self, terminal):
|
def __init__(self, terminal):
|
||||||
"""Class initialiser"""
|
"""Class initialiser"""
|
||||||
self.terminal = terminal
|
self.terminal = terminal
|
||||||
self.terminator = Terminator()
|
self.terminator = Terminator()
|
||||||
self.config = Config()
|
self.config = Config()
|
||||||
|
self.accelgrp = Gtk.AccelGroup()
|
||||||
|
|
||||||
|
def get_menu_item_mask(self, maskstr):
|
||||||
|
mask = 0
|
||||||
|
maskstr = maskstr.lower()
|
||||||
|
if maskstr.find('<Shift>'.lower()) >= 0:
|
||||||
|
mask = mask | Gdk.ModifierType.SHIFT_MASK
|
||||||
|
dbg("adding mask <Shift> %s" % mask)
|
||||||
|
|
||||||
|
if maskstr.find('<Control>'.lower()) >= 0:
|
||||||
|
mask = mask | Gdk.ModifierType.CONTROL_MASK
|
||||||
|
dbg("adding mask <Control> %s" % mask)
|
||||||
|
|
||||||
|
if maskstr.find('<Alt>'.lower()) >= 0:
|
||||||
|
mask = mask | Gdk.ModifierType.MOD1_MASK
|
||||||
|
dbg("adding mask <Alt> %s" % mask)
|
||||||
|
|
||||||
|
mask = Gdk.ModifierType(mask)
|
||||||
|
dbg("menu_item_mask :%d" % mask)
|
||||||
|
return mask
|
||||||
|
|
||||||
|
def menu_item(self, menutype, actstr, menustr):
|
||||||
|
act = self.config.base.get_item('keybindings', actstr)
|
||||||
|
maskstr = act[actstr] if actstr in act else ""
|
||||||
|
mask = self.get_menu_item_mask(maskstr)
|
||||||
|
|
||||||
|
accelchar = ""
|
||||||
|
pos = menustr.lower().find("_")
|
||||||
|
if (pos >= 0 and pos+1 < len(menustr)):
|
||||||
|
accelchar = menustr.lower()[pos+1]
|
||||||
|
|
||||||
|
dbg("action from config:%s for item:%s with shortcut accelchar:(%s)"
|
||||||
|
% (maskstr, menustr, accelchar))
|
||||||
|
item = menutype.new_with_mnemonic(_(menustr))
|
||||||
|
if mask:
|
||||||
|
item.add_accelerator("activate",
|
||||||
|
self.accelgrp,
|
||||||
|
Gdk.keyval_from_name(accelchar),
|
||||||
|
mask,
|
||||||
|
Gtk.AccelFlags.VISIBLE)
|
||||||
|
return item
|
||||||
|
|
||||||
def show(self, widget, event=None):
|
def show(self, widget, event=None):
|
||||||
"""Display the context menu"""
|
"""Display the context menu"""
|
||||||
|
@ -98,23 +140,26 @@ class TerminalPopupMenu(object):
|
||||||
|
|
||||||
menu.append(Gtk.SeparatorMenuItem())
|
menu.append(Gtk.SeparatorMenuItem())
|
||||||
|
|
||||||
item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Copy'))
|
item = self.menu_item(Gtk.ImageMenuItem, 'copy', '_Copy')
|
||||||
item.connect('activate', lambda x: terminal.vte.copy_clipboard())
|
item.connect('activate', lambda x: terminal.vte.copy_clipboard())
|
||||||
item.set_sensitive(terminal.vte.get_has_selection())
|
item.set_sensitive(terminal.vte.get_has_selection())
|
||||||
|
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Paste'))
|
item = self.menu_item(Gtk.ImageMenuItem, 'paste', '_Paste')
|
||||||
item.connect('activate', lambda x: terminal.paste_clipboard())
|
item.connect('activate', lambda x: terminal.paste_clipboard())
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
menu.append(Gtk.SeparatorMenuItem())
|
menu.append(Gtk.SeparatorMenuItem())
|
||||||
|
|
||||||
item = Gtk.ImageMenuItem.new_with_mnemonic(_('Set W_indow Title'))
|
item = self.menu_item(Gtk.ImageMenuItem, 'edit_window_title',
|
||||||
|
'Set _Window Title')
|
||||||
item.connect('activate', lambda x: terminal.key_edit_window_title())
|
item.connect('activate', lambda x: terminal.key_edit_window_title())
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
if not terminal.is_zoomed():
|
if not terminal.is_zoomed():
|
||||||
item = Gtk.ImageMenuItem.new_with_mnemonic(_('Split H_orizontally'))
|
item = self.menu_item(Gtk.ImageMenuItem, 'split_horiz',
|
||||||
|
'Split H_orizontally')
|
||||||
image = Gtk.Image()
|
image = Gtk.Image()
|
||||||
image.set_from_icon_name(APP_NAME + '_horiz', Gtk.IconSize.MENU)
|
image.set_from_icon_name(APP_NAME + '_horiz', Gtk.IconSize.MENU)
|
||||||
item.set_image(image)
|
item.set_image(image)
|
||||||
|
@ -124,7 +169,8 @@ class TerminalPopupMenu(object):
|
||||||
self.terminal.get_cwd()))
|
self.terminal.get_cwd()))
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
item = Gtk.ImageMenuItem.new_with_mnemonic(_('Split V_ertically'))
|
item = self.menu_item(Gtk.ImageMenuItem, 'split_vert',
|
||||||
|
'Split V_ertically')
|
||||||
image = Gtk.Image()
|
image = Gtk.Image()
|
||||||
image.set_from_icon_name(APP_NAME + '_vert', Gtk.IconSize.MENU)
|
image.set_from_icon_name(APP_NAME + '_vert', Gtk.IconSize.MENU)
|
||||||
item.set_image(image)
|
item.set_image(image)
|
||||||
|
@ -134,7 +180,7 @@ class TerminalPopupMenu(object):
|
||||||
self.terminal.get_cwd()))
|
self.terminal.get_cwd()))
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
item = Gtk.MenuItem.new_with_mnemonic(_('Open _Tab'))
|
item = self.menu_item(Gtk.MenuItem, 'new_tab', 'Open _Tab')
|
||||||
item.connect('activate', lambda x: terminal.emit('tab-new', False,
|
item.connect('activate', lambda x: terminal.emit('tab-new', False,
|
||||||
terminal))
|
terminal))
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
@ -147,7 +193,7 @@ class TerminalPopupMenu(object):
|
||||||
|
|
||||||
menu.append(Gtk.SeparatorMenuItem())
|
menu.append(Gtk.SeparatorMenuItem())
|
||||||
|
|
||||||
item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Close'))
|
item = self.menu_item(Gtk.ImageMenuItem, 'close_term', '_Close')
|
||||||
item.connect('activate', lambda x: terminal.close())
|
item.connect('activate', lambda x: terminal.close())
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
|
@ -188,13 +234,15 @@ class TerminalPopupMenu(object):
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
menu.append(Gtk.SeparatorMenuItem())
|
menu.append(Gtk.SeparatorMenuItem())
|
||||||
|
|
||||||
item = Gtk.CheckMenuItem.new_with_mnemonic(_('Show _scrollbar'))
|
item = self.menu_item(Gtk.CheckMenuItem, 'toggle_scrollbar',
|
||||||
|
'Show _scrollbar')
|
||||||
item.set_active(terminal.scrollbar.get_property('visible'))
|
item.set_active(terminal.scrollbar.get_property('visible'))
|
||||||
item.connect('toggled', lambda x: terminal.do_scrollbar_toggle())
|
item.connect('toggled', lambda x: terminal.do_scrollbar_toggle())
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
if hasattr(Gtk, 'Builder'): # VERIFY FOR GTK3: is this ever false?
|
if hasattr(Gtk, 'Builder'): # VERIFY FOR GTK3: is this ever false?
|
||||||
item = Gtk.MenuItem.new_with_mnemonic(_('_Preferences'))
|
item = self.menu_item(Gtk.MenuItem, 'preferences',
|
||||||
|
'_Preferences')
|
||||||
item.connect('activate', lambda x: PrefsEditor(self.terminal))
|
item.connect('activate', lambda x: PrefsEditor(self.terminal))
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
|
@ -245,7 +293,7 @@ class TerminalPopupMenu(object):
|
||||||
|
|
||||||
def add_layout_launcher(self, menu):
|
def add_layout_launcher(self, menu):
|
||||||
"""Add the layout list to the menu"""
|
"""Add the layout list to the menu"""
|
||||||
item = Gtk.MenuItem.new_with_mnemonic(_('_Layouts...'))
|
item = self.menu_item(Gtk.MenuItem, 'layout_launcher', '_Layouts...')
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
submenu = Gtk.Menu()
|
submenu = Gtk.Menu()
|
||||||
item.set_submenu(submenu)
|
item.set_submenu(submenu)
|
||||||
|
|
Loading…
Reference in New Issue