Mercurial > libervia-desktop-kivy
diff src/xmlui.py @ 0:160cc95ad7ea
initial commit:
- basic SàT/QuickApp integration
- basic XMLUI
- profile manager first draft
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 26 Mar 2016 16:20:52 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/xmlui.py Sat Mar 26 16:20:52 2016 +0100 @@ -0,0 +1,110 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Cagou: a SàT frontend +# Copyright (C) 2016 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from sat.core.i18n import _ +from sat_frontends.constants import Const as C +from sat.core.log import getLogger +log = getLogger(__name__) +from sat_frontends.tools import xmlui +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.textinput import TextInput +from kivy.uix.label import Label +from kivy.uix.button import Button +from kivy.uix.widget import Widget + + +class TextWidget(xmlui.TextWidget, Label): + + def __init__(self, xmlui_parent, value): + Label.__init__(self, text=value) + + +class PasswordWidget(xmlui.PasswordWidget, TextInput): + + def __init__(self, _xmlui_parent, value, read_only=False): + TextInput.__init__(self, password=True, multiline=False, + text=value, readonly=read_only, size=(100,25), size_hint=(1,None)) + + def _xmluiSetValue(self, value): + self.text = value + + def _xmluiGetValue(self): + return self.text + + +class VerticalContainer(xmlui.VerticalContainer, BoxLayout): + + def __init__(self, xmlui_parent): + BoxLayout.__init__(self, orientation='vertical') + + def _xmluiAppend(self, widget): + self.add_widget(widget) + + +class WidgetFactory(object): + + def __getattr__(self, attr): + if attr.startswith("create"): + cls = globals()[attr[6:]] + return cls + + +class Title(Label): + + def __init__(self, *args, **kwargs): + kwargs['size'] = (100, 25) + kwargs['size_hint'] = (1,None) + super(Title, self).__init__(*args, **kwargs) + + +class XMLUIPanel(xmlui.XMLUIPanel, BoxLayout): + widget_factory = WidgetFactory() + + def __init__(self, host, parsed_xml, title=None, flags=None, callback=None, profile=C.PROF_KEY_NONE): + self.close_cb = None + BoxLayout.__init__(self, orientation='vertical') + xmlui.XMLUIPanel.__init__(self, host, parsed_xml, title, flags, callback, profile) + + def setCloseCb(self, close_cb): + self.close_cb = close_cb + + def _xmluiClose(self): + if self.close_cb is not None: + self.close_cb(self) + else: + log.error(u"No close method defined") + + def constructUI(self, parsed_dom): + xmlui.XMLUIPanel.constructUI(self, parsed_dom) + if self.xmlui_title: + self.add_widget(Title(text=self.xmlui_title)) + self.add_widget(self.main_cont) + if self.type == 'form': + submit_btn = Button(text=_(u"Submit"), size_hint=(1,0.2)) + submit_btn.bind(on_press=self.onFormSubmitted) + self.add_widget(submit_btn) + if not 'NO_CANCEL' in self.flags: + cancel_btn = Button(text=_(u"Cancel"), size_hint=(1,0.2)) + cancel_btn.bind(on_press=self.onFormCancelled) + self.add_widget(cancel_btn) + self.add_widget(Widget()) # to have elements on the top + + +xmlui.registerClass(xmlui.CLASS_PANEL, XMLUIPanel) +create = xmlui.create