126 |
126 |
127 self.Thaw() |
127 self.Thaw() |
128 |
128 |
129 _conf_key = "SVGHMIWidgetLib" |
129 _conf_key = "SVGHMIWidgetLib" |
130 _preview_height = 200 |
130 _preview_height = 200 |
|
131 _preview_margin = 5 |
131 class WidgetLibBrowser(wx.Panel): |
132 class WidgetLibBrowser(wx.Panel): |
132 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, |
133 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, |
133 size=wx.DefaultSize): |
134 size=wx.DefaultSize): |
134 |
135 |
135 wx.Panel.__init__(self, parent, id, pos, size) |
136 wx.Panel.__init__(self, parent, id, pos, size) |
140 self.selected_SVG = None |
141 self.selected_SVG = None |
141 |
142 |
142 self.Config = wx.ConfigBase.Get() |
143 self.Config = wx.ConfigBase.Get() |
143 self.libdir = self.RecallLibDir() |
144 self.libdir = self.RecallLibDir() |
144 |
145 |
145 sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=0) |
146 self.main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=0) |
146 sizer.AddGrowableCol(0) |
147 self.main_sizer.AddGrowableCol(0) |
147 sizer.AddGrowableRow(1) |
148 self.main_sizer.AddGrowableRow(1) |
148 self.libbutton = wx.Button(self, -1, _("Select SVG widget library")) |
149 self.libbutton = wx.Button(self, -1, _("Select SVG widget library")) |
149 self.widgetpicker = WidgetPicker(self, self.libdir) |
150 self.widgetpicker = WidgetPicker(self, self.libdir) |
150 self.preview = wx.Panel(self, size=(-1, _preview_height + 10)) |
151 self.preview = wx.Panel(self, size=(-1, _preview_height + _preview_margin*2)) |
151 self.desc = wx.TextCtrl(self, size=wx.Size(-1, 80), |
152 self.desc = wx.TextCtrl(self, size=wx.Size(-1, 160), |
152 style=wx.TE_READONLY | wx.TE_MULTILINE) |
153 style=wx.TE_READONLY | wx.TE_MULTILINE) |
153 self.signature_sizer = wx.BoxSizer(wx.VERTICAL) |
154 self.signature_sizer = wx.BoxSizer(wx.VERTICAL) |
154 sizer.Add(self.libbutton, flag=wx.GROW) |
155 self.main_sizer.Add(self.libbutton, flag=wx.GROW) |
155 sizer.Add(self.widgetpicker, flag=wx.GROW) |
156 self.main_sizer.Add(self.widgetpicker, flag=wx.GROW) |
156 sizer.Add(self.preview, flag=wx.GROW) |
157 self.main_sizer.Add(self.preview, flag=wx.GROW) |
157 sizer.Add(self.desc, flag=wx.GROW) |
158 self.main_sizer.Add(self.desc, flag=wx.GROW) |
158 sizer.Add(self.signature_sizer, flag=wx.GROW) |
159 self.main_sizer.Add(self.signature_sizer, flag=wx.GROW) |
159 sizer.Layout() |
160 self.main_sizer.Layout() |
160 self.SetAutoLayout(True) |
161 self.SetAutoLayout(True) |
161 self.SetSizer(sizer) |
162 self.SetSizer(self.main_sizer) |
162 sizer.Fit(self) |
163 self.main_sizer.Fit(self) |
163 self.Bind(wx.EVT_BUTTON, self.OnSelectLibDir, self.libbutton) |
164 self.Bind(wx.EVT_BUTTON, self.OnSelectLibDir, self.libbutton) |
164 self.preview.Bind(wx.EVT_PAINT, self.OnPaint) |
165 self.preview.Bind(wx.EVT_PAINT, self.OnPaint) |
165 self.preview.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) |
166 self.preview.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) |
166 |
167 |
167 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnWidgetSelection, self.widgetpicker) |
168 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnWidgetSelection, self.widgetpicker) |
168 |
169 |
169 self.msg = _("Drag selected Widget from here to Inkscape") |
170 self.msg = _("Drag selected Widget from here to Inkscape") |
170 self.tempf = None |
171 self.tempf = None |
|
172 |
|
173 self.paths_editors = [] |
|
174 |
|
175 def ResetSignature(self): |
|
176 self.signature_sizer.Clear() |
|
177 for editor in self.paths_editors: |
|
178 editor.Destroy() |
|
179 self.paths_editors = [] |
|
180 self.main_sizer.Layout() |
|
181 |
|
182 def AddPathToSignature(self, path): |
|
183 new_editor = wx.TextCtrl(self, size=wx.Size(-1, -1)) |
|
184 self.paths_editors.append(new_editor) |
|
185 self.signature_sizer.Add(new_editor, flag=wx.GROW) |
|
186 self.main_sizer.Layout() |
171 |
187 |
172 def RecallLibDir(self): |
188 def RecallLibDir(self): |
173 conf = self.Config.Read(_conf_key) |
189 conf = self.Config.Read(_conf_key) |
174 if len(conf) == 0: |
190 if len(conf) == 0: |
175 return None |
191 return None |
311 transform = XSLTransform( |
330 transform = XSLTransform( |
312 os.path.join(ScriptDirectory, "analyse_widget.xslt"),[]) |
331 os.path.join(ScriptDirectory, "analyse_widget.xslt"),[]) |
313 |
332 |
314 svgdom = etree.parse(self.selected_SVG) |
333 svgdom = etree.parse(self.selected_SVG) |
315 |
334 |
316 result = transform.transform(svgdom) |
335 signature = transform.transform(svgdom) |
317 |
336 |
318 for entry in transform.get_error_log(): |
337 for entry in transform.get_error_log(): |
319 self.msg += "XSLT: " + entry.message + "\n" |
338 self.msg += "XSLT: " + entry.message + "\n" |
320 |
339 |
321 except Exception as e: |
340 except Exception as e: |
322 self.msg += str(e) |
341 self.msg += str(e) |
323 except XSLTApplyError as e: |
342 except XSLTApplyError as e: |
324 self.msg += "Widget analysis error: " + e.message |
343 self.msg += "Widget analysis error: " + e.message |
325 else: |
344 else: |
326 return result |
345 |
327 |
346 self.ResetSignature() |
328 def UpdateUI(self, signature): |
347 |
329 if signature is not None: |
|
330 print(etree.tostring(signature, pretty_print=True)) |
348 print(etree.tostring(signature, pretty_print=True)) |
331 widgets = signature.getroot() |
349 widgets = signature.getroot() |
|
350 for defs in widgets.iter("defs"): |
|
351 |
|
352 # Keep double newlines (to mark paragraphs) |
|
353 self.msg += defs.find("type").text + ":\n" + "\n\n".join(map( |
|
354 lambda s:s.replace("\n"," ").replace(" ", " "), |
|
355 defs.find("longdesc").text.split("\n\n"))) |
|
356 for arg in defs.iter("arg"): |
|
357 print(arg.get("name")) |
|
358 print(arg.get("accepts")) |
|
359 for path in defs.iter("path"): |
|
360 self.AddPathToSignature(path) |
|
361 print(path.get("name")) |
|
362 print(path.get("accepts")) |
|
363 |
332 for widget in widgets: |
364 for widget in widgets: |
333 widget_type = widget.get("type") |
365 widget_type = widget.get("type") |
334 print(widget_type) |
366 print(widget_type) |
335 for path in widget: |
367 for path in widget.iterchildren("path"): |
336 path_value = path.get("value") |
368 path_value = path.get("value") |
337 path_accepts = map( |
369 path_accepts = map( |
338 str.strip, path.get("accepts", '')[1:-1].split(',')) |
370 str.strip, path.get("accepts", '')[1:-1].split(',')) |
339 print(path_value, path_accepts) |
371 print(path, path_value, path_accepts) |
340 |
372 |
341 |
373 |
342 |
374 |
343 def ValidateWidget(self): |
375 def ValidateWidget(self): |
344 self.msg = "" |
376 self.msg = "" |
345 |
|
346 signature = self.AnalyseWidget() |
|
347 |
|
348 self.UpdateUI(signature) |
|
349 |
|
350 return |
|
351 |
377 |
352 if self.tempf is not None: |
378 if self.tempf is not None: |
353 os.unlink(self.tempf.name) |
379 os.unlink(self.tempf.name) |
354 self.tempf = None |
380 self.tempf = None |
355 |
381 |