From 9e5372f1914e80a7eaed90aa22ce7d16be6c3019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 12:17:03 +0100 Subject: [PATCH 1/8] Use accel path for shortcuts --- tryton/gui/main.py | 106 ++++++++++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 39 deletions(-) diff --git a/tryton/gui/main.py b/tryton/gui/main.py index 9f34eac782..00a3b62cd9 100644 --- a/tryton/gui/main.py +++ b/tryton/gui/main.py @@ -45,6 +45,45 @@ class Main(object): self.accel_group = gtk.AccelGroup() self.window.add_accel_group(self.accel_group) + gtk.accel_map_add_entry('/File/Connect', gtk.keysyms.O, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/File/Quit', gtk.keysyms.Q, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/New', gtk.keysyms.N, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Save', gtk.keysyms.S, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Duplicate', gtk.keysyms.D, + gtk.gdk.CONTROL_MASK|gtk.gdk.SHIFT_MASK) + gtk.accel_map_add_entry('/Form/Delete', gtk.keysyms.D, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Find', gtk.keysyms.F, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Next', gtk.keysyms.Page_Down, + 0) + gtk.accel_map_add_entry('/Form/Previous', gtk.keysyms.Page_Up, + 0) + gtk.accel_map_add_entry('/Form/Switch View', gtk.keysyms.L, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Menu', gtk.keysyms.T, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Home', gtk.keysyms.H, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Close', gtk.keysyms.W, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Previous Tab', gtk.keysyms.Page_Up, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Next Tab', gtk.keysyms.Page_Down, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Goto', gtk.keysyms.G, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Reload', gtk.keysyms.R, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Actions', gtk.keysyms.E, + gtk.gdk.CONTROL_MASK) + gtk.accel_map_add_entry('/Form/Print', gtk.keysyms.P, + gtk.gdk.CONTROL_MASK) + self.tooltips = gtk.Tooltips() toolbar = gtk.Toolbar() @@ -63,6 +102,8 @@ class Main(object): menu_file = self._set_menu_file() menuitem_file.set_submenu(menu_file) + menu_file.set_accel_group(self.accel_group) + menu_file.set_accel_path('/File') menuitem_user = gtk.MenuItem(_('_User')) self.menuitem_user = menuitem_user @@ -71,6 +112,7 @@ class Main(object): menu_user = self._set_menu_user() menuitem_user.set_submenu(menu_user) + menuitem_user.set_accel_path('/User') menuitem_form = gtk.MenuItem(_('For_m')) self.menuitem_form = menuitem_form @@ -79,12 +121,15 @@ class Main(object): menu_form = self._set_menu_form() menuitem_form.set_submenu(menu_form) + menu_form.set_accel_group(self.accel_group) + menu_form.set_accel_path('/Form') menuitem_options = gtk.MenuItem(_('_Options')) menubar.add(menuitem_options) menu_options = self._set_menu_options() menuitem_options.set_submenu(menu_options) + menuitem_options.set_accel_path('/Options') menuitem_plugins = gtk.MenuItem(_('_Plugins')) self.menuitem_plugins = menuitem_plugins @@ -93,17 +138,20 @@ class Main(object): menu_plugins = self._set_menu_plugins() menuitem_plugins.set_submenu(menu_plugins) + menuitem_plugins.set_accel_path('/Plugins') menuitem_shortcut = gtk.MenuItem(_('_Shortcuts')) self.menuitem_shortcut = menuitem_shortcut self.menuitem_shortcut.set_sensitive(False) menubar.add(menuitem_shortcut) + menuitem_shortcut.set_accel_path('/Shortcuts') menuitem_help = gtk.MenuItem(_('_Help')) menubar.add(menuitem_help) menu_help = self._set_menu_help() menuitem_help.set_submenu(menu_help) + menuitem_help.set_accel_path('/Help') vbox.pack_start(toolbar, False, True) @@ -199,9 +247,8 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-connect', gtk.ICON_SIZE_MENU) imagemenuitem_connect.set_image(image) - imagemenuitem_connect.add_accelerator('activate', self.accel_group, - gtk.keysyms.O, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_connect.connect('activate', self.sig_login) + imagemenuitem_connect.set_accel_path('/File/Connect') menu_file.add(imagemenuitem_connect) imagemenuitem_disconnect = gtk.ImageMenuItem(_('_Disconnect')) @@ -256,9 +303,8 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-log-out', gtk.ICON_SIZE_MENU) imagemenuitem_close.set_image(image) - imagemenuitem_close.add_accelerator('activate', self.accel_group, - gtk.keysyms.Q, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_close.connect('activate', self.sig_close) + imagemenuitem_close.set_accel_path('/File/Quit') menu_file.add(imagemenuitem_close) return menu_file @@ -297,37 +343,32 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-new', gtk.ICON_SIZE_MENU) imagemenuitem_new.set_image(image) - imagemenuitem_new.add_accelerator('activate', self.accel_group, - gtk.keysyms.N, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_new.connect('activate', self._sig_child_call, 'but_new') + imagemenuitem_new.set_accel_path('/Form/New') menu_form.add(imagemenuitem_new) imagemenuitem_save = gtk.ImageMenuItem(_('_Save'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-save', gtk.ICON_SIZE_MENU) imagemenuitem_save.set_image(image) - imagemenuitem_save.add_accelerator('activate', self.accel_group, - gtk.keysyms.S, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_save.connect('activate', self._sig_child_call, 'but_save') + imagemenuitem_save.set_accel_path('/Form/Save') menu_form.add(imagemenuitem_save) imagemenuitem_copy = gtk.ImageMenuItem(_('_Duplicate'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-copy', gtk.ICON_SIZE_MENU) imagemenuitem_copy.set_image(image) - imagemenuitem_copy.add_accelerator('activate', self.accel_group, - gtk.keysyms.D, gtk.gdk.CONTROL_MASK|gtk.gdk.SHIFT_MASK, - gtk.ACCEL_VISIBLE) imagemenuitem_copy.connect('activate', self._sig_child_call, 'but_copy') + imagemenuitem_copy.set_accel_path('/Form/Duplicate') menu_form.add(imagemenuitem_copy) imagemenuitem_delete = gtk.ImageMenuItem(_('_Delete...'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-delete', gtk.ICON_SIZE_MENU) imagemenuitem_delete.set_image(image) - imagemenuitem_delete.add_accelerator('activate', self.accel_group, - gtk.keysyms.D, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_delete.connect('activate', self._sig_child_call, 'but_remove') + imagemenuitem_delete.set_accel_path('/Form/Delete') menu_form.add(imagemenuitem_delete) menu_form.add(gtk.SeparatorMenuItem()) @@ -336,45 +377,40 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-find', gtk.ICON_SIZE_MENU) imagemenuitem_search.set_image(image) - imagemenuitem_search.add_accelerator('activate', self.accel_group, - gtk.keysyms.F, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_search.connect('activate', self._sig_child_call, 'but_search') + imagemenuitem_search.set_accel_path('/Form/Find') menu_form.add(imagemenuitem_search) imagemenuitem_next = gtk.ImageMenuItem(_('_Next'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-go-next', gtk.ICON_SIZE_MENU) imagemenuitem_next.set_image(image) - imagemenuitem_next.add_accelerator('activate', self.accel_group, - gtk.keysyms.Page_Down, 0, gtk.ACCEL_VISIBLE) imagemenuitem_next.connect('activate', self._sig_child_call, 'but_next') + imagemenuitem_next.set_accel_path('/Form/Next') menu_form.add(imagemenuitem_next) imagemenuitem_previous = gtk.ImageMenuItem(_('_Previous'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-go-previous', gtk.ICON_SIZE_MENU) imagemenuitem_previous.set_image(image) - imagemenuitem_previous.add_accelerator('activate', self.accel_group, - gtk.keysyms.Page_Up, 0, gtk.ACCEL_VISIBLE) imagemenuitem_previous.connect('activate', self._sig_child_call, 'but_previous') + imagemenuitem_previous.set_accel_path('/Form/Previous') menu_form.add(imagemenuitem_previous) imagemenuitem_switch = gtk.ImageMenuItem(_('_Switch View'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-fullscreen', gtk.ICON_SIZE_MENU) imagemenuitem_switch.set_image(image) - imagemenuitem_switch.add_accelerator('activate', self.accel_group, - gtk.keysyms.L, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_switch.connect('activate', self._sig_child_call, 'but_switch') + imagemenuitem_switch.set_accel_path('/Form/Switch View') menu_form.add(imagemenuitem_switch) imagemenuitem_menu = gtk.ImageMenuItem(_('_Menu'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-start-here', gtk.ICON_SIZE_MENU) imagemenuitem_menu.set_image(image) - imagemenuitem_menu.add_accelerator('activate', self.accel_group, - gtk.keysyms.T, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_menu.connect('activate', self.sig_win_menu) + imagemenuitem_menu.set_accel_path('/Form/Menu') menu_form.add(imagemenuitem_menu) menu_form.add(gtk.SeparatorMenuItem()) @@ -383,30 +419,26 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-go-home', gtk.ICON_SIZE_MENU) imagemenuitem_home.set_image(image) - imagemenuitem_home.add_accelerator('activate', self.accel_group, - gtk.keysyms.H, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_home.connect('activate', self.sig_home_new) + imagemenuitem_home.set_accel_path('/Form/Home') menu_form.add(imagemenuitem_home) imagemenuitem_close = gtk.ImageMenuItem(_('_Close'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-close', gtk.ICON_SIZE_MENU) imagemenuitem_close.set_image(image) - imagemenuitem_close.add_accelerator('activate', self.accel_group, - gtk.keysyms.W, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_close.connect('activate', self.sig_win_close) + imagemenuitem_close.set_accel_path('/Form/Close') menu_form.add(imagemenuitem_close) imagemenuitem_win_prev = gtk.ImageMenuItem(_('_Previous Tab'), self.accel_group) - imagemenuitem_win_prev.add_accelerator('activate', self.accel_group, - gtk.keysyms.Page_Up, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_win_prev.connect('activate', self.sig_win_prev) + imagemenuitem_win_prev.set_accel_path('/Form/Previous Tab') menu_form.add(imagemenuitem_win_prev) imagemenuitem_win_next = gtk.ImageMenuItem(_('_Next Tab'), self.accel_group) - imagemenuitem_win_next.add_accelerator('activate', self.accel_group, - gtk.keysyms.Page_Down, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_win_next.connect('activate', self.sig_win_next) + imagemenuitem_win_next.set_accel_path('/Form/Next Tab') menu_form.add(imagemenuitem_win_next) menu_form.add(gtk.SeparatorMenuItem()) @@ -417,10 +449,9 @@ class Main(object): imagemenuitem_goto_id = gtk.ImageMenuItem(_('_Go to Record ID...'), self.accel_group) - imagemenuitem_win_next.add_accelerator('activate', self.accel_group, - gtk.keysyms.G, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_goto_id.connect('activate', self._sig_child_call, 'but_goto_id') + imagemenuitem_goto_id.set_accel_path('/Form/Goto') menu_form.add(imagemenuitem_goto_id) menu_form.add(gtk.SeparatorMenuItem()) @@ -429,10 +460,9 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-refresh', gtk.ICON_SIZE_MENU) imagemenuitem_reload.set_image(image) - imagemenuitem_reload.add_accelerator('activate', self.accel_group, - gtk.keysyms.R, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_reload.connect('activate', self._sig_child_call, 'but_reload') + imagemenuitem_reload.set_accel_path('/Form/Reload') menu_form.add(imagemenuitem_reload) menu_form.add(gtk.SeparatorMenuItem()) @@ -441,20 +471,18 @@ class Main(object): image = gtk.Image() image.set_from_stock('tryton-executable', gtk.ICON_SIZE_MENU) imagemenuitem_action.set_image(image) - imagemenuitem_action.add_accelerator('activate', self.accel_group, - gtk.keysyms.E, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_action.connect('activate', self._sig_child_call, 'but_action') + imagemenuitem_action.set_accel_path('/Form/Actions') menu_form.add(imagemenuitem_action) imagemenuitem_print = gtk.ImageMenuItem(_('_Print...'), self.accel_group) image = gtk.Image() image.set_from_stock('tryton-print', gtk.ICON_SIZE_MENU) imagemenuitem_print.set_image(image) - imagemenuitem_print.add_accelerator('activate', self.accel_group, - gtk.keysyms.P, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) imagemenuitem_print.connect('activate', self._sig_child_call, 'but_print') + imagemenuitem_print.set_accel_path('/Form/Print') menu_form.add(imagemenuitem_print) menu_form.add(gtk.SeparatorMenuItem()) From 6aba98d0538504067b10bb57f60c568a999d4109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 13:16:28 +0100 Subject: [PATCH 2/8] Store shortcut in .trytonsc for issue244 --- tryton/gui/main.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tryton/gui/main.py b/tryton/gui/main.py index 00a3b62cd9..3c7c420e5f 100644 --- a/tryton/gui/main.py +++ b/tryton/gui/main.py @@ -5,7 +5,7 @@ import urlparse import gobject import gtk import tryton.rpc as rpc -from tryton.config import CONFIG, TRYTON_ICON, PIXMAPS_DIR, DATA_DIR +from tryton.config import CONFIG, TRYTON_ICON, PIXMAPS_DIR, DATA_DIR, get_home_dir import tryton.common as common from tryton.action import Action from tryton.gui.window import Window @@ -84,6 +84,9 @@ class Main(object): gtk.accel_map_add_entry('/Form/Print', gtk.keysyms.P, gtk.gdk.CONTROL_MASK) + if hasattr(gtk, 'accel_map_load'): + gtk.accel_map_load(os.path.join(get_home_dir(), '.trytonsc')) + self.tooltips = gtk.Tooltips() toolbar = gtk.Toolbar() @@ -1114,16 +1117,17 @@ class Main(object): tryton.plugin.execute(datas, self.window) @staticmethod - def sig_quit(widget): + def sig_quit(widget=None): CONFIG.save() + if hasattr(gtk, 'accel_map_save'): + gtk.accel_map_save(os.path.join(get_home_dir(), '.trytonsc')) gtk.main_quit() def sig_close(self, widget): if common.sur(_("Do you really want to quit?"), parent=self.window): if not self.sig_logout(widget): return False - CONFIG.save() - gtk.main_quit() + Main.sig_quit() def sig_delete(self, widget, event): if common.sur(_("Do you really want to quit?"), parent=self.window): From da7660eaa9cc578217d5f1a01284467bd52248e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 14:01:16 +0100 Subject: [PATCH 3/8] Add missing gettext import for issue466 --- tryton/plugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tryton/plugin.py b/tryton/plugin.py index eb34a49727..10a4bca360 100644 --- a/tryton/plugin.py +++ b/tryton/plugin.py @@ -1,7 +1,11 @@ -#This file is part of Tryton. The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. +#This file is part of Tryton. The COPYRIGHT file at the top level of +#this repository contains the full copyright notices and license terms. import common import os import imp +import gettext + +_ = gettext.gettext PLUGINS_PATH = os.path.join(os.path.dirname(__file__), 'plugins') MODULES = [] From f0fdaf6a245ba4039af43894197affc4bab10ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 14:04:27 +0100 Subject: [PATCH 4/8] Let default language at startup for issue464 --- tryton/translate.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tryton/translate.py b/tryton/translate.py index 85b2ab5120..2ea58054af 100644 --- a/tryton/translate.py +++ b/tryton/translate.py @@ -179,14 +179,6 @@ def setlang(lang=None, locale_dict=None): except: logging.getLogger('translate').info( _('Unable to set locale %s') % lang2 + '.' + encoding) - else: - try: - if os.name == 'nt': - os.environ['LANG'] = '' - locale.setlocale(locale.LC_ALL, '') - except: - logging.getLogger('translate').warn( - _('Unable to unset locale')) if os.path.isdir(locale_dir): gettext.bindtextdomain(PACKAGE, locale_dir) From 18ef8181032917d52c9aeb854ed9d2f67f063400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 14:06:54 +0100 Subject: [PATCH 5/8] Set client.lang to default locale for issue464 --- tryton/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tryton/config.py b/tryton/config.py index c35ffda91d..5d9fc4e948 100644 --- a/tryton/config.py +++ b/tryton/config.py @@ -7,6 +7,7 @@ import gettext from version import VERSION import logging import sys +import locale _ = gettext.gettext @@ -74,7 +75,7 @@ class ConfigManager(object): 'client.form_tab_orientation': 90, 'client.tree_width': True, 'client.spellcheck': False, - 'client.lang': 'en_US', + 'client.lang': locale.getdefaultlocale()[0], 'client.actions': { 'odt': {0: find_path(['ooffice', 'ooffice2'], '%s'), 1: find_path(['ooffice', 'ooffice2'], '-p %s')}, From a5b578b09afe8730c382800565581ec0b0a5a339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 14:54:40 +0100 Subject: [PATCH 6/8] Handle KeyboardInterrupt for issue467 --- tryton/client.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tryton/client.py b/tryton/client.py index 8b7a993f1c..1cc08896fe 100644 --- a/tryton/client.py +++ b/tryton/client.py @@ -12,7 +12,7 @@ import logging import version import config -from config import CONFIG, CURRENT_DIR, PREFIX, PIXMAPS_DIR, TRYTON_ICON +from config import CONFIG, CURRENT_DIR, PREFIX, PIXMAPS_DIR, TRYTON_ICON, get_home_dir import translate import gui import traceback @@ -93,7 +93,12 @@ class TrytonClient(object): #except ImportError: # pass - gtk.main() + try: + gtk.main() + except KeyboardInterrupt: + CONFIG.save() + if hasattr(gtk, 'accel_map_save'): + gtk.accel_map_save(os.path.join(get_home_dir(), '.trytonsc')) if __name__ == "__main__": CLIENT = TrytonClient() From 7edbb5aefb3e4b12fc13ae232ffaa00fabafdb8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 14:59:05 +0100 Subject: [PATCH 7/8] Set focus on entry_user if there is no _USERNAME for issue470 --- tryton/common/common.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tryton/common/common.py b/tryton/common/common.py index 96559ef8bd..6df21115a1 100644 --- a/tryton/common/common.py +++ b/tryton/common/common.py @@ -429,8 +429,11 @@ def send_bugtracker(msg, parent): win.vbox.pack_start(hbox) win.show_all() - entry_password.grab_focus() - entry_user.set_text(rpc._USERNAME) + if rpc._USERNAME: + entry_user.set_text(rpc._USERNAME) + entry_password.grab_focus() + else: + entry_user.grab_focus() response = win.run() parent.present() From daf2651fb4c6e1fa7b955099290946ac3ea3416f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Oct 2008 15:00:46 +0100 Subject: [PATCH 8/8] Do no more call empty setlang --- tryton/client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tryton/client.py b/tryton/client.py index 1cc08896fe..f542cc32b4 100644 --- a/tryton/client.py +++ b/tryton/client.py @@ -25,7 +25,6 @@ class TrytonClient(object): def __init__(self): logging.basicConfig() - translate.setlang() translate.setlang(CONFIG['client.lang']) for logger in CONFIG['logging.logger'].split(','):