comparison 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
comparison
equal deleted inserted replaced
13:12a189fbb9ba 14:21a432afd06d
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20 20
21 from sat.core import log as logging 21 from sat.core import log as logging
22 log = logging.getLogger(__name__) 22 log = logging.getLogger(__name__)
23 from kivy.uix.button import Button
23 from kivy.uix.boxlayout import BoxLayout 24 from kivy.uix.boxlayout import BoxLayout
24 from kivy.uix.dropdown import DropDown 25 from kivy.uix.dropdown import DropDown
25 26
26 27
28 class HeaderWidgetButton(Button):
29 pass
30
31
27 class HeaderWidgetSelector(DropDown): 32 class HeaderWidgetSelector(DropDown):
28 pass 33
34 def __init__(self, cagou_widget):
35 super(HeaderWidgetSelector, self).__init__()
36 host = cagou_widget.host
37 for plugin_info in host.getPluggedWidgets(except_cls=cagou_widget.__class__):
38 btn = HeaderWidgetButton(text=plugin_info["name"])
39 btn.bind(on_release=lambda btn, plugin_info=plugin_info: cagou_widget.switchWidget(plugin_info))
40 self.add_widget(btn)
29 41
30 42
31 class CagouWidget(BoxLayout): 43 class CagouWidget(BoxLayout):
32 44
33 def __init__(self): 45 def __init__(self, host):
46 self.host = host
34 BoxLayout.__init__(self, orientation="vertical") 47 BoxLayout.__init__(self, orientation="vertical")
35 self.selector = HeaderWidgetSelector() 48 self.selector = HeaderWidgetSelector(self)
49
50 def switchWidget(self, plugin_info):
51 self.selector.dismiss()
52 factory = plugin_info["factory"]
53 new_widget = factory(self.host, plugin_info, None, None)
54 self.host.switchWidget(self, new_widget)