svghmi/ui.py
branchsvghmi
changeset 3245 c441181247cf
parent 3244 1f365fa5d878
child 3247 7282b40374b0
equal deleted inserted replaced
3244:1f365fa5d878 3245:c441181247cf
    11 import hashlib
    11 import hashlib
    12 import weakref
    12 import weakref
    13 from tempfile import NamedTemporaryFile
    13 from tempfile import NamedTemporaryFile
    14 
    14 
    15 import wx
    15 import wx
       
    16 from wx.lib.scrolledpanel import ScrolledPanel
    16 
    17 
    17 from lxml import etree
    18 from lxml import etree
    18 from lxml.etree import XSLTApplyError
    19 from lxml.etree import XSLTApplyError
    19 from XSLTransform import XSLTransform
    20 from XSLTransform import XSLTransform
    20 
    21 
   165         self.selected_SVG = None
   166         self.selected_SVG = None
   166 
   167 
   167         self.Config = wx.ConfigBase.Get()
   168         self.Config = wx.ConfigBase.Get()
   168         self.libdir = self.RecallLibDir()
   169         self.libdir = self.RecallLibDir()
   169 
   170 
   170         self.picker_panel = wx.Panel(self)
   171         self.picker_desc_splitter = wx.SplitterWindow(self, style=wx.SUNKEN_BORDER | wx.SP_3D)
       
   172 
       
   173         self.picker_panel = wx.Panel(self.picker_desc_splitter)
   171         self.picker_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   174         self.picker_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   172         self.picker_sizer.AddGrowableCol(0)
   175         self.picker_sizer.AddGrowableCol(0)
   173         self.picker_sizer.AddGrowableRow(1)
   176         self.picker_sizer.AddGrowableRow(1)
   174 
   177 
   175         self.widgetpicker = WidgetPicker(self.picker_panel, self.libdir)
   178         self.widgetpicker = WidgetPicker(self.picker_panel, self.libdir)
   184         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnWidgetSelection, self.widgetpicker)
   187         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnWidgetSelection, self.widgetpicker)
   185         self.Bind(wx.EVT_BUTTON, self.OnSelectLibDir, self.libbutton)
   188         self.Bind(wx.EVT_BUTTON, self.OnSelectLibDir, self.libbutton)
   186 
   189 
   187 
   190 
   188 
   191 
   189         self.main_panel = wx.Panel(self)
   192         self.main_panel = ScrolledPanel(parent=self,
       
   193                                                 name='MiscellaneousPanel',
       
   194                                                 style=wx.TAB_TRAVERSAL)
   190 
   195 
   191         self.main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=0)
   196         self.main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=0)
   192         self.main_sizer.AddGrowableCol(0)
   197         self.main_sizer.AddGrowableCol(0)
   193         self.main_sizer.AddGrowableRow(2)
   198         self.main_sizer.AddGrowableRow(2)
   194 
   199 
   195         self.preview = wx.Panel(self.main_panel, size=(-1, _preview_height + _preview_margin*2))
   200         self.preview = wx.Panel(self.main_panel, size=(-1, _preview_height + _preview_margin*2))
   196         self.desc = wx.TextCtrl(self.main_panel, size=wx.Size(-1, 160),
   201         self.staticmsg = wx.StaticText(self)
   197                                    style=wx.TE_READONLY | wx.TE_MULTILINE)
       
   198         self.signature_sizer = wx.BoxSizer(wx.VERTICAL)
   202         self.signature_sizer = wx.BoxSizer(wx.VERTICAL)
   199         self.main_sizer.Add(self.preview, flag=wx.GROW)
   203         self.main_sizer.Add(self.preview, flag=wx.GROW)
       
   204         self.main_sizer.Add(self.staticmsg, flag=wx.GROW)
   200         self.main_sizer.Add(self.signature_sizer, flag=wx.GROW)
   205         self.main_sizer.Add(self.signature_sizer, flag=wx.GROW)
   201         self.main_sizer.Add(self.desc, flag=wx.GROW)
       
   202         self.main_sizer.Layout()
   206         self.main_sizer.Layout()
   203         self.main_panel.SetAutoLayout(True)
   207         self.main_panel.SetAutoLayout(True)
   204         self.main_panel.SetSizer(self.main_sizer)
   208         self.main_panel.SetSizer(self.main_sizer)
   205         self.main_sizer.Fit(self.main_panel)
   209         self.main_sizer.Fit(self.main_panel)
   206         self.preview.Bind(wx.EVT_PAINT, self.OnPaint)
   210         self.preview.Bind(wx.EVT_PAINT, self.OnPaint)
   207         self.preview.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
   211         self.preview.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
   208 
   212 
   209         self.SplitVertically(self.main_panel, self.picker_panel, 300)
   213         self.desc = wx.TextCtrl(self.picker_desc_splitter, size=wx.Size(-1, 160),
       
   214                                    style=wx.TE_READONLY | wx.TE_MULTILINE)
       
   215 
       
   216         self.picker_desc_splitter.SplitHorizontally(self.picker_panel, self.desc, 400)
       
   217         self.SplitVertically(self.main_panel, self.picker_desc_splitter, 300)
   210 
   218 
   211         self.msg = _("Drag selected Widget from here to Inkscape")
   219         self.msg = _("Drag selected Widget from here to Inkscape")
   212         self.tempf = None 
   220         self.tempf = None 
   213 
   221 
   214         self.paths_editors = []
   222         self.paths_editors = []
   216     def ResetSignature(self):
   224     def ResetSignature(self):
   217         self.signature_sizer.Clear()
   225         self.signature_sizer.Clear()
   218         for editor in self.paths_editors:
   226         for editor in self.paths_editors:
   219             editor.Destroy()
   227             editor.Destroy()
   220         self.paths_editors = []
   228         self.paths_editors = []
   221         self.main_sizer.Layout()
       
   222 
   229 
   223     def AddPathToSignature(self, path):
   230     def AddPathToSignature(self, path):
   224         new_editor = PathEditor(self.main_panel, path)
   231         new_editor = PathEditor(self.main_panel, path)
   225         self.paths_editors.append(new_editor)
   232         self.paths_editors.append(new_editor)
   226         self.signature_sizer.Add(new_editor, flag=wx.GROW)
   233         self.signature_sizer.Add(new_editor, flag=wx.GROW)
   227         self.main_sizer.Layout()
       
   228 
   234 
   229     def RecallLibDir(self):
   235     def RecallLibDir(self):
   230         conf = self.Config.Read(_conf_key)
   236         conf = self.Config.Read(_conf_key)
   231         if len(conf) == 0:
   237         if len(conf) == 0:
   232             return None
   238             return None
   250             # Get Preview panel size
   256             # Get Preview panel size
   251             sz = self.preview.GetClientSize()
   257             sz = self.preview.GetClientSize()
   252             w = self.bmp.GetWidth()
   258             w = self.bmp.GetWidth()
   253             dc.DrawBitmap(self.bmp, (sz.width - w)/2, _preview_margin)
   259             dc.DrawBitmap(self.bmp, (sz.width - w)/2, _preview_margin)
   254 
   260 
   255         self.desc.SetValue(self.msg)
       
   256 
   261 
   257 
   262 
   258     def OnSelectLibDir(self, event):
   263     def OnSelectLibDir(self, event):
   259         defaultpath = self.RecallLibDir()
   264         defaultpath = self.RecallLibDir()
   260         if defaultpath == None:
   265         if defaultpath == None:
   275         Called when Preview panel needs to be redrawn
   280         Called when Preview panel needs to be redrawn
   276         @param event: wx.PaintEvent
   281         @param event: wx.PaintEvent
   277         """
   282         """
   278         self.DrawPreview()
   283         self.DrawPreview()
   279         event.Skip()
   284         event.Skip()
       
   285 
       
   286         self.staticmsg.SetLabel(self.msg)
   280 
   287 
   281     def GenThumbnail(self, svgpath, thumbpath):
   288     def GenThumbnail(self, svgpath, thumbpath):
   282         inkpath = get_inkscape_path()
   289         inkpath = get_inkscape_path()
   283         if inkpath is None:
   290         if inkpath is None:
   284             self.msg = _("Inkscape is not installed.")
   291             self.msg = _("Inkscape is not installed.")
   361     def GetSubHMITree(self, _context):
   368     def GetSubHMITree(self, _context):
   362         return [self.hmitree_node.etree()]
   369         return [self.hmitree_node.etree()]
   363 
   370 
   364     def AnalyseWidgetAndUpdateUI(self):
   371     def AnalyseWidgetAndUpdateUI(self):
   365         self.msg = ""
   372         self.msg = ""
       
   373         self.ResetSignature()
   366 
   374 
   367         try:
   375         try:
   368             if self.selected_SVG is None:
   376             if self.selected_SVG is None:
   369                 raise Exception(_("No widget selected"))
   377                 raise Exception(_("No widget selected"))
   370 
   378 
   382             self.msg += str(e)
   390             self.msg += str(e)
   383         except XSLTApplyError as e:
   391         except XSLTApplyError as e:
   384             self.msg += "Widget analysis error: " + e.message
   392             self.msg += "Widget analysis error: " + e.message
   385         else:
   393         else:
   386             
   394             
   387             self.ResetSignature()
       
   388 
   395 
   389             print(etree.tostring(signature, pretty_print=True))
   396             print(etree.tostring(signature, pretty_print=True))
   390             widgets = signature.getroot()
   397             widgets = signature.getroot()
   391             for defs in widgets.iter("defs"):
   398             for defs in widgets.iter("defs"):
   392 
   399 
   393                 # Keep double newlines (to mark paragraphs)
   400                 # Keep double newlines (to mark paragraphs)
   394                 self.msg += defs.find("type").text + ":\n" + "\n\n".join(map(
   401                 self.desc.SetValue(defs.find("type").text + ":\n" + "\n\n".join(map(
   395                     lambda s:s.replace("\n"," ").replace("  ", " "), 
   402                     lambda s:s.replace("\n"," ").replace("  ", " "),
   396                     defs.find("longdesc").text.split("\n\n")))
   403                     defs.find("longdesc").text.split("\n\n"))))
   397                 for arg in defs.iter("arg"):
   404                 for arg in defs.iter("arg"):
   398                     print(arg.get("name"))
   405                     print(arg.get("name"))
   399                     print(arg.get("accepts"))
   406                     print(arg.get("accepts"))
   400                 for path in defs.iter("path"):
   407                 for path in defs.iter("path"):
   401                     self.AddPathToSignature(path)
   408                     self.AddPathToSignature(path)
   409                     path_value = path.get("value")
   416                     path_value = path.get("value")
   410                     path_accepts = map(
   417                     path_accepts = map(
   411                         str.strip, path.get("accepts", '')[1:-1].split(','))
   418                         str.strip, path.get("accepts", '')[1:-1].split(','))
   412                     print(path, path_value, path_accepts)
   419                     print(path, path_value, path_accepts)
   413 
   420 
       
   421         self.main_panel.SetupScrolling(scroll_x=False)
       
   422 
   414 
   423 
   415 
   424 
   416     def ValidateWidget(self):
   425     def ValidateWidget(self):
   417         self.msg = ""
   426         self.msg = ""
   418 
   427