svghmi/ui.py
branchsvghmi
changeset 3241 fe945f1f48b7
parent 3237 d000a91d1e95
child 3243 92cc21f88bf8
equal deleted inserted replaced
3238:8a9d4c794cba 3241:fe945f1f48b7
   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
   191 
   207 
   192         if self.bmp:
   208         if self.bmp:
   193             # Get Preview panel size
   209             # Get Preview panel size
   194             sz = self.preview.GetClientSize()
   210             sz = self.preview.GetClientSize()
   195             w = self.bmp.GetWidth()
   211             w = self.bmp.GetWidth()
   196             dc.DrawBitmap(self.bmp, (sz.width - w)/2, 5)
   212             dc.DrawBitmap(self.bmp, (sz.width - w)/2, _preview_margin)
   197 
   213 
   198         self.desc.SetValue(self.msg)
   214         self.desc.SetValue(self.msg)
   199 
   215 
   200 
   216 
   201     def OnSelectLibDir(self, event):
   217     def OnSelectLibDir(self, event):
   268                     have_thumb = self.GenThumbnail(svgpath, thumbpath)
   284                     have_thumb = self.GenThumbnail(svgpath, thumbpath)
   269 
   285 
   270                 self.bmp = wx.Bitmap(thumbpath) if have_thumb else None
   286                 self.bmp = wx.Bitmap(thumbpath) if have_thumb else None
   271 
   287 
   272                 self.selected_SVG = svgpath if have_thumb else None
   288                 self.selected_SVG = svgpath if have_thumb else None
   273                 self.ValidateWidget()
   289 
       
   290                 self.AnalyseWidgetAndUpdateUI()
       
   291 
   274             except IOError:
   292             except IOError:
   275                 self.msg = _("Widget library must be writable")
   293                 self.msg = _("Widget library must be writable")
   276 
   294 
   277             self.Refresh()
   295             self.Refresh()
   278         event.Skip()
   296         event.Skip()
   299         for msg in msgs:
   317         for msg in msgs:
   300             self.msg += msg.text + "\n"
   318             self.msg += msg.text + "\n"
   301 
   319 
   302     def GetSubHMITree(self, _context):
   320     def GetSubHMITree(self, _context):
   303         return [self.hmitree_node.etree()]
   321         return [self.hmitree_node.etree()]
   304     def AnalyseWidget(self):
   322 
       
   323     def AnalyseWidgetAndUpdateUI(self):
   305         self.msg = ""
   324         self.msg = ""
   306 
   325 
   307         try:
   326         try:
   308             if self.selected_SVG is None:
   327             if self.selected_SVG is None:
   309                 raise Exception(_("No widget selected"))
   328                 raise Exception(_("No widget selected"))
   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