Mercurial > libervia-backend
diff sat/tools/common/template_xmlui.py @ 2562:26edcf3a30eb
core, setup: huge cleaning:
- moved directories from src and frontends/src to sat and sat_frontends, which is the recommanded naming convention
- move twisted directory to root
- removed all hacks from setup.py, and added missing dependencies, it is now clean
- use https URL for website in setup.py
- removed "Environment :: X11 Applications :: GTK", as wix is deprecated and removed
- renamed sat.sh to sat and fixed its installation
- added python_requires to specify Python version needed
- replaced glib2reactor which use deprecated code by gtk3reactor
sat can now be installed directly from virtualenv without using --system-site-packages anymore \o/
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 02 Apr 2018 19:44:50 +0200 |
parents | src/tools/common/template_xmlui.py@0046283a285d |
children | 56f94936df1e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sat/tools/common/template_xmlui.py Mon Apr 02 19:44:50 2018 +0200 @@ -0,0 +1,204 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# SAT: a jabber client +# Copyright (C) 2009-2018 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/>. + +""" template XMLUI parsing + +XMLUI classes from this modules can then be iterated to create the template +""" + +from sat.core.log import getLogger +log = getLogger(__name__) +from sat_frontends.tools import xmlui + + +## Widgets ## + +class Widget(object): + category = u'widget' + type = None + enabled = True + read_only = True + + def __init__(self, xmlui_parent): + self.xmlui_parent = xmlui_parent + + @property + def name(self): + return self._xmlui_name + + +class ValueWidget(Widget): + + def __init__(self, xmlui_parent, value): + super(ValueWidget, self).__init__(xmlui_parent) + self.value = value + + @property + def values(self): + return [self.value] + + @property + def labels(self): + # helper property, there is not label for ValueWidget + # but using labels make rendering more easy (one single method to call) + # values are actually returned + return [self.value] + + +class InputWidget(ValueWidget): + + def __init__(self, xmlui_parent, value, read_only=False): + super(InputWidget, self).__init__(xmlui_parent, value) + self.read_only = read_only + + +class OptionsWidget(Widget): + + def __init__(self, xmlui_parent, options, selected, style): + super(OptionsWidget, self).__init__(xmlui_parent) + self.options = options + self.selected = selected + self.style = style + + @property + def values(self): + for value, label in self.items: + yield value + + @property + def labels(self): + """return only labels from self.items""" + for value, label in self.items: + yield label + + @property + def items(self): + """return suitable items, according to style""" + no_select = self.no_select + for value,label in self.options: + if no_select or value in self.selected: + yield value,label + + @property + def inline(self): + return u'inline' in self.style + + @property + def no_select(self): + return u'noselect' in self.style + + +class EmptyWidget(xmlui.EmptyWidget, Widget): + + def __init__(self, _xmlui_parent): + Widget.__init__(self) + + +class TextWidget(xmlui.TextWidget, ValueWidget): + type = u"text" + + +class LabelWidget(xmlui.LabelWidget, ValueWidget): + type = u"label" + + @property + def for_name(self): + try: + return self._xmlui_for_name + except AttributeError: + return None + + +class StringWidget(xmlui.StringWidget, InputWidget): + type = u"string" + + +class JidInputWidget(xmlui.JidInputWidget, StringWidget): + type = u"jid" + + +class TextBoxWidget(xmlui.TextWidget, InputWidget): + type = u"textbox" + + +class ListWidget(xmlui.ListWidget, OptionsWidget): + type = u"list" + + +## Containers ## + +class Container(object): + category = u'container' + type = None + + def __init__(self, xmlui_parent): + self.xmlui_parent = xmlui_parent + self.children = [] + + def __iter__(self): + return iter(self.children) + + def _xmluiAppend(self, widget): + self.children.append(widget) + + def _xmluiRemove(self, widget): + self.children.remove(widget) + + +class VerticalContainer(xmlui.VerticalContainer, Container): + type = u'vertical' + + +class PairsContainer(xmlui.PairsContainer, Container): + type = u'pairs' + + +class LabelContainer(xmlui.PairsContainer, Container): + type = u'label' + + +## Factory ## + +class WidgetFactory(object): + + def __getattr__(self, attr): + if attr.startswith("create"): + cls = globals()[attr[6:]] + return cls + +## Core ## + + +class XMLUIPanel(xmlui.XMLUIPanel): + widget_factory = WidgetFactory() + + def show(self, *args, **kwargs): + raise NotImplementedError + + +class XMLUIDialog(xmlui.XMLUIDialog): + dialog_factory = WidgetFactory() + + def __init__(*args, **kwargs): + raise NotImplementedError + + +xmlui.registerClass(xmlui.CLASS_PANEL, XMLUIPanel) +xmlui.registerClass(xmlui.CLASS_DIALOG, XMLUIDialog) +create = xmlui.create