Move Plugins into toolbar Actions

As plugins are run on the current tab just like wizards, they should be in the
same place.

review582005
This commit is contained in:
Cédric Krier committed 2012-11-23 18:09:45 +01:00
1 parent 8efc7696a1
commit d04df7b26d
5 files changed
+32 -91

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Move Plugins into toolbar Actions
* Add url to list view
* Add dynamic icon for url
* Add completion on Many2One, Many2Many and One2Many
+1 -19
View File
@@ -84,7 +84,7 @@ Figure: Tryton client application::
Client Window ________________________________________________________________
| Tryton _ o x|
|----------------------------------------------------------------|
Menu bar | File User Options Plugins Shortcuts Help |
Menu bar | File User Options Shortcuts Help |
|________________________________________________________________|
| | ______ |
Tabs | Menu | [Tab1] |[Tab2]| [Tab3]... |
@@ -612,24 +612,6 @@ Save Options:
Saves all the options.
Plug-ins
^^^^^^^^
Plug-ins are client side add-ons for Tryton. There are some included plug-ins
with the standard client.
Execute a Plug-in
+++++++++++++++++
Translate View:
Creates a translation table of the current view.
Print Workflow:
Creates a graph which shows the work flow of the current view.
Print Workflow (complex):
Like 'Print Workflow', with additional sub work flows inherited by the
current view.
Shortcuts
^^^^^^^^^
A collection of user defined shortcuts for specific resources.
+3 -44
View File
@@ -138,7 +138,6 @@ class Main(object):
self.status_hbox = None
self.menubar = None
self.menuitem_user = None
self.menuitem_plugins = None
self.menuitem_shortcut = None
if self.macapp is not None:
@@ -189,6 +188,9 @@ class Main(object):
self.sig_statusbar_show()
# Register plugins
tryton.plugins.register()
# Adding a timer the check to requests
gobject.timeout_add(5 * 60 * 1000, self.request_set)
_MAIN.append(self)
@@ -231,20 +233,6 @@ class Main(object):
menu_options.set_accel_group(self.accel_group)
menu_options.set_accel_path('<tryton>/Options')
menuitem_plugins = gtk.MenuItem(_('_Plugins'))
if self.menuitem_plugins:
menuitem_plugins.set_sensitive(
self.menuitem_plugins.get_property('sensitive'))
else:
menuitem_plugins.set_sensitive(False)
self.menuitem_plugins = menuitem_plugins
menubar.add(menuitem_plugins)
menu_plugins = self._set_menu_plugins()
menuitem_plugins.set_submenu(menu_plugins)
menu_plugins.set_accel_group(self.accel_group)
menu_plugins.set_accel_path('<tryton>/Plugins')
menuitem_shortcut = gtk.MenuItem(_('_Shortcuts'))
if self.menuitem_shortcut:
menuitem_shortcut.set_sensitive(
@@ -276,7 +264,6 @@ class Main(object):
menuitem_file.show_all()
menuitem_user.show_all()
menuitem_options.show_all()
menuitem_plugins.show_all()
menuitem_shortcut.show_all()
menuitem_help.show_all()
else:
@@ -652,21 +639,6 @@ class Main(object):
menu_options.add(imagemenuitem_opt_save)
return menu_options
def _set_menu_plugins(self):
menu_plugins = gtk.Menu()
imagemenuitem_plugin_execute = gtk.ImageMenuItem(
_('_Execute a Plugin'))
image = gtk.Image()
image.set_from_stock('tryton-executable', gtk.ICON_SIZE_MENU)
imagemenuitem_plugin_execute.set_image(image)
imagemenuitem_plugin_execute.connect('activate',
self.sig_plugin_execute)
imagemenuitem_plugin_execute.set_accel_path(
'<tryton>/Plugins/Execute a Plugin')
menu_plugins.add(imagemenuitem_plugin_execute)
return menu_plugins
def _set_menu_help(self):
menu_help = gtk.Menu()
@@ -961,7 +933,6 @@ class Main(object):
self.shortcut_unset()
self.menuitem_shortcut.set_sensitive(True)
self.menuitem_user.set_sensitive(True)
self.menuitem_plugins.set_sensitive(True)
if CONFIG.arguments:
url = CONFIG.arguments.pop()
self.open_url(url)
@@ -1003,7 +974,6 @@ class Main(object):
self.shortcut_unset()
self.menuitem_shortcut.set_sensitive(False)
self.menuitem_user.set_sensitive(False)
self.menuitem_plugins.set_sensitive(False)
if disconnect:
rpc.logout()
self.refresh_ssl()
@@ -1079,17 +1049,6 @@ class Main(object):
screen.display(set_cursor=True)
self.menu_screen = screen
def sig_plugin_execute(self, widget):
page = self.notebook.get_current_page()
if page == -1:
return
datas = {
'model': self.pages[page].model,
'ids': self.pages[page].ids_get(),
'id': self.pages[page].id_get(),
}
tryton.plugins.execute(datas)
@classmethod
def sig_quit(cls, widget=None):
rpc.logout()
+14 -2
View File
@@ -18,6 +18,7 @@ from tryton.common import (TRYTON_ICON, message, sur, sur_3b, COLOR_SCHEMES,
import tryton.common as common
from tryton.translate import date_format
from tryton.common import RPCExecute, RPCException
from tryton import plugins
from tabcontent import TabContent
@@ -555,7 +556,7 @@ class Form(SignalEvent, TabContent):
tbutton.connect('toggled', self.action_popup)
self.tooltips.set_tip(tbutton, tooltip)
self.buttons[special_action] = tbutton
tbutton._can_be_sensitive = bool(toolbars.get(action_type))
tbutton._can_be_sensitive = bool(tbutton._menu.get_children())
else:
tbutton = gtk.SeparatorToolItem()
gtktoolbar.insert(tbutton, -1)
@@ -580,7 +581,18 @@ class Form(SignalEvent, TabContent):
menuitem.connect('activate', self._popup_menu_selected, widget,
new_action, keyword)
menu.add(menuitem)
if keyword == 'action':
menu.add(gtk.SeparatorMenuItem())
for plugin in plugins.MODULES:
for name, func in plugin.get_plugins(self.model):
menuitem = gtk.MenuItem('_' + name)
menuitem.set_use_underline(True)
menuitem.connect('activate', lambda *a: func({
'model': self.model,
'ids': self.id_get(),
'id': self.id_get(),
}))
menu.add(menuitem)
return menu
def _popup_menu_selected(self, menuitem, togglebutton, action, keyword):
+13 -26
View File
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from tryton import common
import os
import sys
import imp
@@ -15,29 +14,17 @@ if not os.path.isdir(PLUGINS_PATH):
os.path.dirname(sys.argv[0]))), 'plugins')
MODULES = []
if os.path.isdir(PLUGINS_PATH):
for plugin in os.listdir(PLUGINS_PATH):
if not os.path.isdir(os.path.join(PLUGINS_PATH, plugin)):
continue
module = os.path.splitext(plugin)[0]
try:
module = imp.load_module(module, *imp.find_module(module,
[PLUGINS_PATH]))
MODULES.append(module)
except ImportError, exception:
continue
def execute(datas):
result = {}
for module in MODULES:
for name, func in module.get_plugins(datas['model']):
result[name] = func
if not result:
common.message(_('No available plugin for this resource!'))
return False
res = common.selection(_('Choose a Plugin'), result, alwaysask=True)
if res:
res[1](datas)
return True
def register():
global MODULES
if os.path.isdir(PLUGINS_PATH):
for plugin in os.listdir(PLUGINS_PATH):
if not os.path.isdir(os.path.join(PLUGINS_PATH, plugin)):
continue
module = os.path.splitext(plugin)[0]
try:
module = imp.load_module(module, *imp.find_module(module,
[PLUGINS_PATH]))
MODULES.append(module)
except ImportError:
continue