--- 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"
_preview_height = 200
+_preview_margin = 5
class WidgetLibBrowser(wx.Panel):
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
size=wx.DefaultSize):
@@ -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)
- sizer.Layout()
+ 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.SetAutoLayout(True)
- self.SetSizer(sizer)
- sizer.Fit(self)
+ 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.tempf = None
+ self.paths_editors = []
+
+ def ResetSignature(self):
+ self.signature_sizer.Clear()
+ for editor in self.paths_editors:
+ editor.Destroy()
+ 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()
+
def RecallLibDir(self):
conf = self.Config.Read(_conf_key)
if len(conf) == 0:
@@ -193,7 +209,7 @@
# Get Preview panel size
sz = self.preview.GetClientSize()
w = self.bmp.GetWidth()
- 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.ValidateWidget()
+
+ self.AnalyseWidgetAndUpdateUI()
+
except IOError:
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):
self.msg = ""
try:
@@ -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
else:
- return result
-
- def UpdateUI(self, signature):
- if signature is not None:
+
+ self.ResetSignature()
+
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("name"))
+ print(arg.get("accepts"))
+ for path in defs.iter("path"):
+ self.AddPathToSignature(path)
+ print(path.get("name"))
+ print(path.get("accepts"))
+
for widget in widgets:
widget_type = widget.get("type")
print(widget_type)
- for path in widget:
+ for path in widget.iterchildren("path"):
path_value = path.get("value")
path_accepts = map(
str.strip, path.get("accepts", '')[1:-1].split(','))
- print(path_value, path_accepts)
+ print(path, path_value, path_accepts)
def ValidateWidget(self):
self.msg = ""
- signature = self.AnalyseWidget()
-
- self.UpdateUI(signature)
-
- return
-
if self.tempf is not None:
os.unlink(self.tempf.name)
self.tempf = None