svghmi/ui.py
branchsvghmi
changeset 3252 352b2111ca66
parent 3251 6d4ff271ebf1
child 3255 07f10dc95d2f
equal deleted inserted replaced
3251:6d4ff271ebf1 3252:352b2111ca66
     8 
     8 
     9 from __future__ import absolute_import
     9 from __future__ import absolute_import
    10 import os
    10 import os
    11 import hashlib
    11 import hashlib
    12 import weakref
    12 import weakref
       
    13 import re
       
    14 from functools import reduce
       
    15 from operator import or_
    13 from tempfile import NamedTemporaryFile
    16 from tempfile import NamedTemporaryFile
    14 
    17 
    15 import wx
    18 import wx
    16 from wx.lib.scrolledpanel import ScrolledPanel
    19 from wx.lib.scrolledpanel import ScrolledPanel
    17 
    20 
   198         self.main_sizer.Add(self.desc, flag=wx.GROW)
   201         self.main_sizer.Add(self.desc, flag=wx.GROW)
   199         self.main_sizer.Add(self.edit_sizer, flag=wx.GROW)
   202         self.main_sizer.Add(self.edit_sizer, flag=wx.GROW)
   200         self.SetSizer(self.main_sizer)
   203         self.SetSizer(self.main_sizer)
   201         self.main_sizer.Fit(self)
   204         self.main_sizer.Fit(self)
   202 
   205 
   203     def setValidityNOK(self):
   206     def setValidity(self, validity):
   204         self.validity_sbmp.SetBitmap(self.invalid_bmp)
   207         if validity is not None:
   205         self.validity_sbmp.Show(True)
   208             bmp = self.valid_bmp if validity else self.invalid_bmp
   206 
   209             self.validity_sbmp.SetBitmap(bmp)
   207     def setValidityOK(self):
   210             self.validity_sbmp.Show(True)
   208         self.validity_sbmp.SetBitmap(self.valid_bmp)
   211         else :
   209         self.validity_sbmp.Show(True)
   212             self.validity_sbmp.Show(False)
   210 
   213 
   211     def setValidityUnknown(self):
   214 models = { typename: re.compile(regex) for typename, regex in [
   212         self.validity_sbmp.Show(False)
   215     ("string", r".*"),
       
   216     ("int", r"^-?[1-9][0-9]*$"),
       
   217     ("real", r"^-?[1-9][0-9]*(\.[0-9]+)?$")]}
   213 
   218 
   214 class ArgEditor(ParamEditor):
   219 class ArgEditor(ParamEditor):
   215     pass
   220     def __init__(self, parent, argdesc):
       
   221         ParamEditor.__init__(self, parent, argdesc)
       
   222         self.ParentObj = parent
       
   223         self.argdesc = argdesc
       
   224         self.Bind(wx.EVT_TEXT, self.OnArgChanged, self.edit)
       
   225 
       
   226     def OnArgChanged(self, event):
       
   227         txt = self.edit.GetValue()
       
   228         accepts = self.argdesc.get("accepts").split(',')
       
   229         self.setValidity(
       
   230             reduce(or_,
       
   231                    map(lambda typename: 
       
   232                            models[typename].match(txt) is not None,
       
   233                        accepts), 
       
   234                    False)
       
   235             if accepts and txt else None)
       
   236         event.Skip()
   216 
   237 
   217 class PathEditor(ParamEditor):
   238 class PathEditor(ParamEditor):
   218     def __init__(self, parent, pathdesc):
   239     def __init__(self, parent, pathdesc):
   219         ParamEditor.__init__(self, parent, pathdesc)
   240         ParamEditor.__init__(self, parent, pathdesc)
   220         self.ParentObj = parent
   241         self.ParentObj = parent
   226     def OnHMITreeDnD(self):
   247     def OnHMITreeDnD(self):
   227         self.ParentObj.GotPathDnDOn(self)
   248         self.ParentObj.GotPathDnDOn(self)
   228 
   249 
   229     def SetPath(self, hmitree_node):
   250     def SetPath(self, hmitree_node):
   230         self.edit.ChangeValue(hmitree_node.hmi_path())
   251         self.edit.ChangeValue(hmitree_node.hmi_path())
   231         if hmitree_node.nodetype in self.pathdesc.get("accepts").split(","):
   252         self.setValidity(
   232             self.setValidityOK()
   253             hmitree_node.nodetype in self.pathdesc.get("accepts").split(","))
   233         else:
       
   234             self.setValidityNOK()
       
   235 
   254 
   236     def OnPathChanged(self, event):
   255     def OnPathChanged(self, event):
   237         # TODO : find corresponding hmitre node and type to update validity
   256         # TODO : find corresponding hmitre node and type to update validity
   238         # Lazy way : hide validity
   257         # Lazy way : hide validity
   239         self.setValidityUnknown()
   258         self.setValidity(None)
   240         event.Skip()
   259         event.Skip()
   241     
   260     
   242 
   261 
   243 _conf_key = "SVGHMIWidgetLib"
   262 _conf_key = "SVGHMIWidgetLib"
   244 _preview_height = 200
   263 _preview_height = 200