Mercurial > libervia-desktop-kivy
diff src/cagou_widget.py @ 14:21a432afd06d
plugin system, first draft:
- widgets are now handled with plugins, ContactList and WidgetSelector have been changed to be pluggins
- everything in PLUGIN_INFO (including PLUGIN_INFO itself) is optional. Best guess is used if a value is missing
- WidgetsHandler use default widget from plugins, which is WidgetSelector for now
- PLUGIN_INFO is used in the same way as for backed plugins, with (for now) following possible keys:
- "name": human readable name
- "description": long description of what widget do
- "import_name": unique short name used as reference for import
- "main": main class name
- "factory": callback used to instanciate a widget (see Cagou._defaultFactory)
- "kv_file": path to the kv language file to load (same filename with ".kv" will be used if key is not found)
other data should be added quickly, as a path to a file used as icon
- host.getPluggedWidgets can be used to find loaded widgets. except_cls can be used to excluse a class (self.__class__ usually)
- fixed host.switchWidget when old widget is already a CagouWidget
- CagouWidget header new display the available widgets
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 09 Jul 2016 16:02:44 +0200 |
parents | 8b2836b5b6c7 |
children |
line wrap: on
line diff
--- a/src/cagou_widget.py Fri Jul 08 20:18:43 2016 +0200 +++ b/src/cagou_widget.py Sat Jul 09 16:02:44 2016 +0200 @@ -20,16 +20,35 @@ from sat.core import log as logging log = logging.getLogger(__name__) +from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout from kivy.uix.dropdown import DropDown +class HeaderWidgetButton(Button): + pass + + class HeaderWidgetSelector(DropDown): - pass + + def __init__(self, cagou_widget): + super(HeaderWidgetSelector, self).__init__() + host = cagou_widget.host + for plugin_info in host.getPluggedWidgets(except_cls=cagou_widget.__class__): + btn = HeaderWidgetButton(text=plugin_info["name"]) + btn.bind(on_release=lambda btn, plugin_info=plugin_info: cagou_widget.switchWidget(plugin_info)) + self.add_widget(btn) class CagouWidget(BoxLayout): - def __init__(self): + def __init__(self, host): + self.host = host BoxLayout.__init__(self, orientation="vertical") - self.selector = HeaderWidgetSelector() + self.selector = HeaderWidgetSelector(self) + + def switchWidget(self, plugin_info): + self.selector.dismiss() + factory = plugin_info["factory"] + new_widget = factory(self.host, plugin_info, None, None) + self.host.switchWidget(self, new_widget)