--- a/svghmi/gen_index_xhtml.xslt Mon May 03 00:14:38 2021 +0200
+++ b/svghmi/gen_index_xhtml.xslt Tue May 18 09:22:17 2021 +0200
@@ -1964,6 +1964,23 @@
+ <xsl:template match="widget[@type='AnimateRotation']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>AnimateRotation - DEPRECATED, do not use. + <xsl:text>Doesn't follow WYSIWYG principle, and forces user to add animateTransform tag in SVG (using inkscape XML editor for exemple) + <xsl:text>AnimateRotation - DEPRECATED</xsl:text> + <path name="speed" accepts="HMI_INT,HMI_REAL"> + <xsl:text>speed</xsl:text> <xsl:template match="widget[@type='AnimateRotation']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>AnimateRotationWidget</xsl:text>
@@ -1995,6 +2012,8 @@
<xsl:text> // change animation properties
+ <xsl:text> // TODO : rewrite with proper es6 <xsl:text> for(let child of this.element.children){
<xsl:text> if(child.nodeName == "animateTransform"){
@@ -2046,11 +2065,17 @@
- <xsl:template match="widget[@type='AnimateRotation']" mode="widget_defs">
- <xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
+ <xsl:template match="widget[@type='Back']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Back widget brings focus back to previous page in history when clicked. + <xsl:text>Jump to previous page</xsl:text> <xsl:template match="widget[@type='Back']" mode="widget_class">
<xsl:text>class </xsl:text>
@@ -2080,6 +2105,31 @@
+ <xsl:template match="widget[@type='Button']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Button widget takes one boolean variable path, and reflect current true + <xsl:text>or false value by showing "active" or "inactive" labeled element + <xsl:text>respectively. Pressing and releasing button changes variable to true and + <xsl:text>false respectively. Potential inconsistency caused by quick consecutive + <xsl:text>presses on the button is mitigated by using a state machine that wait for + <xsl:text>previous state change to be reflected on variable before applying next one. + <xsl:text>Push button reflecting consistently given boolean variable</xsl:text> + <path name="value" accepts="HMI_BOOL"> + <xsl:text>Boolean variable</xsl:text> <xsl:variable name="_button_fsm">
@@ -2301,7 +2351,6 @@
<xsl:template match="widget[@type='Button']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -2310,6 +2359,35 @@
<xsl:with-param name="mandatory" select="'no'"/>
+ <xsl:template match="widget[@type='CircularBar']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>CircularBar widget changes the end angle of a "path" labeled arc according + <xsl:text>to value of the single accepted variable. + <xsl:text>If "min" a "max" labeled texts are provided, then they are used as + <xsl:text>respective minimum and maximum value. Otherwise, value is expected to be + <xsl:text>in between 0 and 100. + <xsl:text>If "value" labeled text is found, then its content is replaced by value. + <xsl:text>Change end angle of Inkscape's arc</xsl:text> + <path name="value" accepts="HMI_INT,HMI_REAL"> + <xsl:text>Value to display</xsl:text> <xsl:template match="widget[@type='CircularBar']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>CircularBarWidget</xsl:text>
@@ -2412,7 +2490,6 @@
<xsl:template match="widget[@type='CircularBar']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -2427,6 +2504,47 @@
<xsl:with-param name="mandatory" select="'no'"/>
+ <xsl:template match="widget[@type='CircularSlider']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>CircularSlider - DEPRECATED, to be replaced by PathSlider + <xsl:text>This widget moves "handle" labeled group along "range" labeled + <xsl:text>arc, according to value of the single accepted variable. + <xsl:text>If "min" a "max" labeled texts are provided, or if first and second + <xsl:text>argument are given, then they are used as respective minimum and maximum + <xsl:text>value. Otherwise, value is expected to be in between 0 and 100. + <xsl:text>If "value" labeled text is found, then its content is replaced by value. + <xsl:text>During drag, "setpoint" labeled group is moved to position defined by user + <xsl:text>while "handle" reflects current value from variable. + <xsl:text>CircularSlider - DEPRECATED</xsl:text> + <arg name="min" count="optional" accepts="int,real"> + <xsl:text>minimum value</xsl:text> + <arg name="min" count="optional" accepts="int,real"> + <xsl:text>maximum value</xsl:text> + <path name="value" accepts="HMI_INT,HMI_REAL"> + <xsl:text>Value to display</xsl:text> <xsl:template match="widget[@type='CircularSlider']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>CircularSliderWidget</xsl:text>
@@ -2887,7 +3005,6 @@
<xsl:template match="widget[@type='CircularSlider']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -2904,6 +3021,24 @@
+ <xsl:template match="widget[@type='CustomHtml']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>CustomHtml widget allows insertion of HTML code in a svg:foreignObject. + <xsl:text>Widget content is replaced by foreignObject. HTML code is obtained from + <xsl:text>"code" labeled text content. HTML insert position and size is given with + <xsl:text>"container" labeled element. + <xsl:text>Custom HTML insert</xsl:text> <xsl:template match="widget[@type='CustomHtml']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>CustomHtmlWidget</xsl:text>
@@ -2950,7 +3085,6 @@
<xsl:template match="widget[@type='CustomHtml']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -2958,6 +3092,42 @@
+ <xsl:template match="widget[@type='Display']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>If Display widget is a svg:text element, then text content is replaced by + <xsl:text>value of given variables, space separated. + <xsl:text>Otherwise, if Display widget is a group containing a svg:text element + <xsl:text>labelled "format", then text content is replaced by printf-like formated + <xsl:text>string. In other words, if "format" labeled text is "%d %s %f", then 3 + <xsl:text>variables paths are expected : HMI_IN, HMI_STRING and HMI_REAL. + <xsl:text>In case Display widget is a svg::text element, it is also possible to give + <xsl:text>format string as first argument. + <xsl:text>Printf-like formated text display </xsl:text> + <arg name="format" count="optional" accepts="string"> + <xsl:text>printf-like format string when not given as svg:text</xsl:text> + <path name="fields" count="many" accepts="HMI_INT,HMI_REAL,HMI_STRING,HMI_BOOL"> + <xsl:text>variables to be displayed</xsl:text> <xsl:template match="widget[@type='Display']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>DisplayWidget</xsl:text>
@@ -2978,7 +3148,6 @@
<xsl:template match="widget[@type='Display']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:variable name="format">
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
@@ -3530,6 +3699,48 @@
+ <xsl:template match="widget[@type='DropDown']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>DropDown widget let user select an entry in a list of texts, given as + <xsl:text>arguments. Single variable path is index of selection. + <xsl:text>It needs "text" (svg:text), "box" (svg:rect), "button" (svg:*), + <xsl:text>and "highlight" (svg:rect) labeled elements. + <xsl:text>When user clicks on "button", "text" is duplicated to display enties in the + <xsl:text>limit of available space in page, and "box" is extended to contain all + <xsl:text>texts. "highlight" is moved over pre-selected entry. + <xsl:text>When only one argument is given, and argment contains "#langs" then list of + <xsl:text>texts is automatically set to the list of human-readable languages supported + <xsl:text>Let user select text entry in a drop-down menu</xsl:text> + <arg name="entries" count="many" accepts="string"> + <xsl:text>drop-down menu entries</xsl:text> + <path name="selection" accepts="HMI_INT"> + <xsl:text>selection index</xsl:text> <xsl:template match="widget[@type='DropDown']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>DropDownWidget</xsl:text>
@@ -4192,7 +4403,6 @@
<xsl:template match="widget[@type='DropDown']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -4219,9 +4429,54 @@
+ <xsl:template match="widget[@type='ForEach']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>ForEach widget is used to span a small set of widget over a larger set of + <xsl:text>repeated HMI_NODEs. + <xsl:text>Idea is somewhat similar to relative page, but it all happens inside the + <xsl:text>ForEach widget, no page involved. + <xsl:text>Together with relative Jump widgets it can be used to build a menu to reach + <xsl:text>relative pages covering many identical HMI_NODES siblings. + <xsl:text>ForEach widget takes a HMI_CLASS name as argument and a HMI_NODE path as + <xsl:text>Direct sub-elements can be either groups of widget to be spanned, labeled + <xsl:text>"ClassName:offset", or buttons to control the spanning, labeled + <xsl:text>"ClassName:+/-number". + <xsl:text>span widgets over a set of repeated HMI_NODEs</xsl:text> + <arg name="class_name" accepts="string"> + <xsl:text>HMI_CLASS name</xsl:text> + <path name="root" accepts="HMI_NODE"> + <xsl:text> where to find HMI_NODEs whose HMI_CLASS is class_name</xsl:text> <xsl:template match="widget[@type='ForEach']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:if test="count(path) != 1">
<xsl:message terminate="yes">
<xsl:text>ForEach widget </xsl:text>
@@ -4479,22 +4734,28 @@
<xsl:text>Input widget takes one variable path, and displays current value in
- <xsl:text>optional "value" labeled sub-element. Click on optional "edit" labeled
- <xsl:text>element opens keypad to edit value. Operation on current value is
- <xsl:text>performed when click on sub-elements with label starting with '=', '+'
- <xsl:text>or '-' sign. Value after sign is used as operand.
+ <xsl:text>optional "value" labeled sub-element. + <xsl:text>Click on optional "edit" labeled element opens keypad to edit value. + <xsl:text>Operation on current value is performed when click on sub-elements with + <xsl:text>label starting with '=', '+' or '-' sign. Value after sign is used as <xsl:text>Input field with predefined operation buttons</xsl:text>
+ <arg name="format" accepts="string"> <xsl:text>optional printf-like format </xsl:text>
- <path accepts="HMI_INT, HMI_REAL, HMI_STRING">
+ <path name="edit" accepts="HMI_INT, HMI_REAL, HMI_STRING"> <xsl:text>single variable to edit</xsl:text>
@@ -4651,6 +4912,30 @@
+ <xsl:template match="widget[@type='JsonTable']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Send given variables as POST to http URL argument, spread returned JSON in + <xsl:text>SVG sub-elements of "data" labeled element. + <xsl:text>Documentation to be written. see svbghmi exemple. + <xsl:text>Http POST variables, spread JSON back</xsl:text> + <arg name="url" accepts="string"> + <path name="edit" accepts="HMI_INT, HMI_REAL, HMI_STRING"> + <xsl:text>single variable to edit</xsl:text> <xsl:template match="widget[@type='JsonTable']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>JsonTableWidget</xsl:text>
@@ -5075,7 +5360,6 @@
<xsl:template match="widget[@type='JsonTable']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -5120,6 +5404,44 @@
+ <xsl:template match="widget[@type='Jump']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Jump widget brings focus to a different page. Mandatory single argument + <xsl:text>gives name of the page. + <xsl:text>Optional single path is used as new reference when jumping to a relative + <xsl:text>page, it must point to a HMI_NODE. + <xsl:text>"active"+"inactive" labeled elements can be provided and reflect current + <xsl:text>page being shown. + <xsl:text>"disabled" labeled element, if provided, is shown instead of "active" or + <xsl:text>"inactive" widget when pointed HMI_NODE is null. + <xsl:text>Jump to given page</xsl:text> + <arg name="page" accepts="string"> + <xsl:text>name of page to jump to</xsl:text> + <path name="reference" count="optional" accepts="HMI_NODE"> + <xsl:text>reference for relative jump</xsl:text> <xsl:template match="widget[@type='Jump']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>JumpWidget</xsl:text>
@@ -5238,7 +5560,6 @@
<xsl:template match="widget[@type='Jump']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:variable name="activity">
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
@@ -5354,6 +5675,21 @@
+ <xsl:template match="widget[@type='Keypad']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Keypad - to be written + <xsl:text>Keypad </xsl:text> + <arg name="supported_types" accepts="string"> + <xsl:text>keypad can input those types </xsl:text> <xsl:template match="declarations:keypad">
@@ -5585,7 +5921,6 @@
<xsl:template match="widget[@type='Keypad']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -5645,9 +5980,13 @@
+ <xsl:template match="widget[@type='List']" mode="widget_desc"> + <xsl:value-of select="@type"/> <xsl:template match="widget[@type='List']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:for-each select="$hmi_element/*[@inkscape:label]">
@@ -5663,6 +6002,8 @@
<xsl:template match="widget[@type='TextStyleList']" mode="widget_defs">
<xsl:param name="hmi_element"/>
+ <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs"> <xsl:param name="hmi_element"/>
@@ -5678,6 +6019,43 @@
+ <xsl:template match="widget[@type='Meter']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Meter widget moves the end of "needle" labeled path along "range" labeled + <xsl:text>path, according to value of the single accepted variable. + <xsl:text>Needle is reduced to a single segment. If "min" a "max" labeled texts + <xsl:text>are provided, or if first and second argument are given, then they are used + <xsl:text>as respective minimum and maximum value. Otherwise, value is expected to be + <xsl:text>in between 0 and 100. + <xsl:text>If "value" labeled text is found, then its content is replaced by value. + <xsl:text>Moves "needle" along "range"</xsl:text> + <arg name="min" count="optional" accepts="int,real"> + <xsl:text>minimum value</xsl:text> + <arg name="max" count="optional" accepts="int,real"> + <xsl:text>maximum value</xsl:text> + <path name="value" accepts="HMI_INT,HMI_REAL"> + <xsl:text>Value to display</xsl:text> <xsl:template match="widget[@type='Metter']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>MetterWidget</xsl:text>
@@ -5740,7 +6118,6 @@
<xsl:template match="widget[@type='Meter']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -5755,6 +6132,35 @@
<xsl:with-param name="mandatory" select="'no'"/>
+ <xsl:template match="widget[@type='MultiState']" mode="widget_defs"> + <xsl:param name="hmi_element"/> + <xsl:text>Mutlistateh widget hides all subelements whose label do not match given + <xsl:text>variable value representation. For exemple if given variable type + <xsl:text>is HMI_INT and value is 1, then elements with label '1' will be displayed. + <xsl:text>Label can have comments, so '1#some comment' would also match. If matching + <xsl:text>variable of type HMI_STRING, then double quotes must be used. For exemple, + <xsl:text>'"hello"' or '"hello"#another comment' match HMI_STRING 'hello'. + <xsl:text>Click on widget changes variable value to next value in given list, or to + <xsl:text>first one if not initialized to value already part of the list. + <xsl:text>Show elements whose label match value.</xsl:text> + <path name="value" accepts="HMI_INT,HMI_STRING"> + <xsl:text>value to compare to labels</xsl:text> <xsl:template match="widget[@type='MultiState']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>MultiStateWidget</xsl:text>
@@ -5841,7 +6247,6 @@
<xsl:template match="widget[@type='MultiState']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:variable name="regex" select="'^("[^"].*"|\-?[0-9]+|false|true)(#.*)?$'"/>
@@ -5871,6 +6276,27 @@
+ <xsl:template match="widget[@type='ScrollBar']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>ScrollBar - documentation to be written + <xsl:text>ScrollBar</xsl:text> + <path name="value" accepts="HMI_INT"> + <xsl:text>value</xsl:text> + <path name="range" accepts="HMI_INT"> + <xsl:text>range</xsl:text> + <path name="visible" accepts="HMI_INT"> + <xsl:text>visible</xsl:text> <xsl:template match="widget[@type='ScrollBar']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>ScrollBarWidget</xsl:text>
@@ -6053,7 +6479,6 @@
<xsl:template match="widget[@type='ScrollBar']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -6084,6 +6509,27 @@
+ <xsl:template match="widget[@type='Slider']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Slider - DEPRECATED - use ScrollBar or PathSlider instead + <xsl:text>Slider - DEPRECATED - use ScrollBar instead</xsl:text> + <path name="value" accepts="HMI_INT"> + <xsl:text>value</xsl:text> + <path name="range" accepts="HMI_INT"> + <xsl:text>range</xsl:text> + <path name="visible" accepts="HMI_INT"> + <xsl:text>visible</xsl:text> <xsl:template match="widget[@type='Slider']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>SliderWidget</xsl:text>
@@ -6764,7 +7210,6 @@
<xsl:template match="widget[@type='Slider']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
@@ -6779,6 +7224,31 @@
<xsl:with-param name="mandatory" select="'no'"/>
+ <xsl:template match="widget[@type='Switch']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Switch widget hides all subelements whose label do not match given + <xsl:text>variable current value representation. For exemple if given variable type + <xsl:text>is HMI_INT and value is 1, then elements with label '1' will be displayed. + <xsl:text>Label can have comments, so '1#some comment' would also match. If matching + <xsl:text>variable of type HMI_STRING, then double quotes must be used. For exemple, + <xsl:text>'"hello"' or '"hello"#another comment' match HMI_STRING 'hello'. + <xsl:text>Show elements whose label match value.</xsl:text> + <path name="value" accepts="HMI_INT,HMI_STRING"> + <xsl:text>value to compare to labels</xsl:text> <xsl:template match="widget[@type='Switch']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>SwitchWidget</xsl:text>
@@ -6809,7 +7279,6 @@
<xsl:template match="widget[@type='Switch']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:variable name="regex" select="'^("[^"].*"|\-?[0-9]+|false|true)(#.*)?$'"/>
@@ -6842,6 +7311,25 @@
+ <xsl:template match="widget[@type='ToggleButton']" mode="widget_desc"> + <xsl:value-of select="@type"/> + <xsl:text>Button widget takes one boolean variable path, and reflect current true + <xsl:text>or false value by showing "active" or "inactive" labeled element + <xsl:text>respectively. Clicking or touching button toggles variable. + <xsl:text>Toggle button reflecting given boolean variable</xsl:text> + <path name="value" accepts="HMI_BOOL"> + <xsl:text>Boolean variable</xsl:text> <xsl:template match="widget[@type='ToggleButton']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>ToggleButtonWidget</xsl:text>
@@ -6926,7 +7414,6 @@
<xsl:template match="widget[@type='ToggleButton']" mode="widget_defs">
<xsl:param name="hmi_element"/>
- <xsl:param name="hmi_element"/>
<xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
--- a/svghmi/ui.py Mon May 03 00:14:38 2021 +0200
+++ b/svghmi/ui.py Tue May 18 09:22:17 2021 +0200
@@ -128,6 +128,7 @@
_conf_key = "SVGHMIWidgetLib"
class WidgetLibBrowser(wx.Panel):
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
@@ -142,24 +143,24 @@
self.Config = wx.ConfigBase.Get()
self.libdir = self.RecallLibDir()
- sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=0)
- sizer.AddGrowableCol(0)
- sizer.AddGrowableRow(1)
+ self.main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=0) + self.main_sizer.AddGrowableCol(0) + self.main_sizer.AddGrowableRow(1) self.libbutton = wx.Button(self, -1, _("Select SVG widget library"))
self.widgetpicker = WidgetPicker(self, self.libdir)
- self.preview = wx.Panel(self, size=(-1, _preview_height + 10))
- self.desc = wx.TextCtrl(self, size=wx.Size(-1, 80),
+ self.preview = wx.Panel(self, size=(-1, _preview_height + _preview_margin*2)) + self.desc = wx.TextCtrl(self, size=wx.Size(-1, 160), style=wx.TE_READONLY | wx.TE_MULTILINE)
self.signature_sizer = wx.BoxSizer(wx.VERTICAL)
- sizer.Add(self.libbutton, flag=wx.GROW)
- sizer.Add(self.widgetpicker, flag=wx.GROW)
- sizer.Add(self.preview, flag=wx.GROW)
- sizer.Add(self.desc, flag=wx.GROW)
- sizer.Add(self.signature_sizer, flag=wx.GROW)
+ self.main_sizer.Add(self.libbutton, flag=wx.GROW) + self.main_sizer.Add(self.widgetpicker, flag=wx.GROW) + self.main_sizer.Add(self.preview, flag=wx.GROW) + self.main_sizer.Add(self.desc, flag=wx.GROW) + self.main_sizer.Add(self.signature_sizer, flag=wx.GROW) + self.main_sizer.Layout()
+ self.SetSizer(self.main_sizer) + self.main_sizer.Fit(self) self.Bind(wx.EVT_BUTTON, self.OnSelectLibDir, self.libbutton)
self.preview.Bind(wx.EVT_PAINT, self.OnPaint)
self.preview.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
@@ -169,6 +170,21 @@
self.msg = _("Drag selected Widget from here to Inkscape")
+ self.paths_editors = [] + def ResetSignature(self): + self.signature_sizer.Clear() + for editor in self.paths_editors: + self.paths_editors = [] + self.main_sizer.Layout() + def AddPathToSignature(self, path): + new_editor = wx.TextCtrl(self, size=wx.Size(-1, -1)) + self.paths_editors.append(new_editor) + self.signature_sizer.Add(new_editor, flag=wx.GROW) + self.main_sizer.Layout() conf = self.Config.Read(_conf_key)
@@ -193,7 +209,7 @@
sz = self.preview.GetClientSize()
- dc.DrawBitmap(self.bmp, (sz.width - w)/2, 5)
+ dc.DrawBitmap(self.bmp, (sz.width - w)/2, _preview_margin) self.desc.SetValue(self.msg)
@@ -270,7 +286,9 @@
self.bmp = wx.Bitmap(thumbpath) if have_thumb else None
self.selected_SVG = svgpath if have_thumb else None
+ self.AnalyseWidgetAndUpdateUI() self.msg = _("Widget library must be writable")
@@ -301,7 +319,8 @@
def GetSubHMITree(self, _context):
return [self.hmitree_node.etree()]
- def AnalyseWidget(self):
+ def AnalyseWidgetAndUpdateUI(self): @@ -313,7 +332,7 @@
svgdom = etree.parse(self.selected_SVG)
- result = transform.transform(svgdom)
+ signature = transform.transform(svgdom) for entry in transform.get_error_log():
self.msg += "XSLT: " + entry.message + "\n"
@@ -323,32 +342,39 @@
except XSLTApplyError as e:
self.msg += "Widget analysis error: " + e.message
- def UpdateUI(self, signature):
- if signature is not None:
print(etree.tostring(signature, pretty_print=True))
widgets = signature.getroot()
+ for defs in widgets.iter("defs"): + # Keep double newlines (to mark paragraphs) + self.msg += defs.find("type").text + ":\n" + "\n\n".join(map( + lambda s:s.replace("\n"," ").replace(" ", " "), + defs.find("longdesc").text.split("\n\n"))) + for arg in defs.iter("arg"): + print(arg.get("accepts")) + for path in defs.iter("path"): + self.AddPathToSignature(path) + print(path.get("name")) + print(path.get("accepts")) widget_type = widget.get("type")
+ for path in widget.iterchildren("path"): path_value = path.get("value")
str.strip, path.get("accepts", '')[1:-1].split(','))
- print(path_value, path_accepts)
+ print(path, path_value, path_accepts) def ValidateWidget(self):
- signature = self.AnalyseWidget()
- self.UpdateUI(signature)
if self.tempf is not None:
os.unlink(self.tempf.name)