270 |
270 |
271 return ((["svghmi"], [(gen_svghmi_c_path, IECCFLAGS)], True), "", |
271 return ((["svghmi"], [(gen_svghmi_c_path, IECCFLAGS)], True), "", |
272 ("runtime_svghmi0.py", open(runtimefile_path, "rb"))) |
272 ("runtime_svghmi0.py", open(runtimefile_path, "rb"))) |
273 |
273 |
274 |
274 |
275 class SVGHMIEditor(ConfTreeNodeEditor): |
275 class HMITreeSelector(wx.TreeCtrl): |
276 CONFNODEEDITOR_TABS = [ |
276 def __init__(self, parent): |
277 (_("HMI Tree"), "CreateHMITreeView")] |
277 global on_hmitree_update |
|
278 wx.TreeCtrl.__init__(self,parent,style=wx.TR_MULTIPLE)# | wx.TR_HIDE_ROOT) |
|
279 |
|
280 isz = (16,16) |
|
281 self.il = il = wx.ImageList(*isz) |
|
282 self.fldridx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_FOLDER, wx.ART_OTHER, isz)) |
|
283 self.fldropenidx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_FOLDER_OPEN, wx.ART_OTHER, isz)) |
|
284 self.fileidx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz)) |
|
285 self.SetImageList(il) |
|
286 |
|
287 on_hmitree_update = self.SVGHMIEditorUpdater() |
|
288 self.MakeTree() |
|
289 |
|
290 def _recurseTree(self, current_hmitree_root, current_tc_root): |
|
291 for c in current_hmitree_root.children: |
|
292 if hasattr(c, "children"): |
|
293 display_name = ('{} (class={})'.format(c.name, c.hmiclass)) \ |
|
294 if c.hmiclass is not None else c.name |
|
295 tc_child = self.AppendItem(current_tc_root, display_name) |
|
296 self.SetPyData(tc_child, None) |
|
297 self.SetItemImage(tc_child, self.fldridx, wx.TreeItemIcon_Normal) |
|
298 self.SetItemImage(tc_child, self.fldropenidx, wx.TreeItemIcon_Expanded) |
|
299 |
|
300 self._recurseTree(c,tc_child) |
|
301 else: |
|
302 display_name = '{} {}'.format(c.nodetype[4:], c.name) |
|
303 tc_child = self.AppendItem(current_tc_root, display_name) |
|
304 self.SetPyData(tc_child, None) |
|
305 self.SetItemImage(tc_child, self.fileidx, wx.TreeItemIcon_Normal) |
|
306 self.SetItemImage(tc_child, self.fileidx, wx.TreeItemIcon_Expanded) |
|
307 |
|
308 def MakeTree(self): |
|
309 global hmi_tree_root |
|
310 |
|
311 self.Freeze() |
|
312 |
|
313 self.root = None |
|
314 self.DeleteAllItems() |
|
315 |
|
316 root_display_name = _("Please build to see HMI Tree") if hmi_tree_root is None else "HMI" |
|
317 self.root = self.AddRoot(root_display_name) |
|
318 self.SetPyData(self.root, None) |
|
319 self.SetItemImage(self.root, self.fldridx, wx.TreeItemIcon_Normal) |
|
320 self.SetItemImage(self.root, self.fldropenidx, wx.TreeItemIcon_Expanded) |
|
321 |
|
322 if hmi_tree_root is not None: |
|
323 self._recurseTree(hmi_tree_root, self.root) |
|
324 |
|
325 self.Thaw() |
278 |
326 |
279 def SVGHMIEditorUpdater(self): |
327 def SVGHMIEditorUpdater(self): |
280 selfref = weakref.ref(self) |
328 selfref = weakref.ref(self) |
281 def SVGHMIEditorUpdate(): |
329 def SVGHMIEditorUpdate(): |
282 o = selfref() |
330 o = selfref() |
283 if o is not None: |
331 if o is not None: |
284 wx.CallAfter(o.MakeTree) |
332 wx.CallAfter(o.MakeTree) |
285 return SVGHMIEditorUpdate |
333 return SVGHMIEditorUpdate |
286 |
334 |
|
335 class HMITreeView(wx.SplitterWindow): |
|
336 |
|
337 def __init__(self, parent): |
|
338 wx.SplitterWindow.__init__(self, parent, |
|
339 style=wx.SUNKEN_BORDER | wx.SP_3D) |
|
340 |
|
341 self.SelectionTree = HMITreeSelector(self) |
|
342 #self.Staging = wx.Panel(self) |
|
343 #self.SplitHorizontally(self.SelectionTree, self.Staging, 200) |
|
344 self.Initialize(self.SelectionTree) |
|
345 |
|
346 |
|
347 class SVGHMIEditor(ConfTreeNodeEditor): |
|
348 CONFNODEEDITOR_TABS = [ |
|
349 (_("HMI Tree"), "CreateHMITreeView")] |
|
350 |
287 def CreateHMITreeView(self, parent): |
351 def CreateHMITreeView(self, parent): |
288 global hmi_tree_updated |
352 #self.HMITreeView = HMITreeView(self) |
289 |
353 return HMITreeSelector(parent) |
290 dvtc = dv.DataViewTreeCtrl(parent) |
354 |
291 isz = (16,16) |
|
292 self.ImageList = il = wx.ImageList(*isz) |
|
293 self.fldridx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_FOLDER, wx.ART_OTHER, isz)) |
|
294 self.fldropenidx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_FOLDER_OPEN, wx.ART_OTHER, isz)) |
|
295 self.fileidx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz)) |
|
296 dvtc.SetImageList(il) |
|
297 |
|
298 |
|
299 self.HMITreeView = dvtc |
|
300 hmi_tree_updated = self.SVGHMIEditorUpdater() |
|
301 self.MakeTree() |
|
302 return self.HMITreeView |
|
303 |
|
304 def _recurseTree(self, current_hmitree_root, current_dvtc_root): |
|
305 dvtc = self.HMITreeView |
|
306 for c in current_hmitree_root.children: |
|
307 if hasattr(c, "children"): |
|
308 display_name = ('{} (class={})'.format(c.name, c.hmiclass)) \ |
|
309 if c.hmiclass is not None else c.name |
|
310 dvtc_child = dvtc.AppendContainer( |
|
311 current_dvtc_root, display_name, |
|
312 self.fldridx, self.fldropenidx) |
|
313 |
|
314 self._recurseTree(c,dvtc_child) |
|
315 else: |
|
316 display_name = '{} {}'.format(c.nodetype[4:], c.name) |
|
317 dvtc.AppendContainer( |
|
318 current_dvtc_root, display_name, |
|
319 self.fileidx, self.fileidx) |
|
320 |
|
321 def MakeTree(self): |
|
322 global hmi_tree_root |
|
323 |
|
324 dvtc = self.HMITreeView |
|
325 |
|
326 dvtc.Freeze() |
|
327 dvtc.DeleteAllItems() |
|
328 |
|
329 root_display_name = _("Please build to see HMI Tree") if hmi_tree_root is None else "HMI" |
|
330 root = dvtc.AppendContainer(dv.NullDataViewItem, |
|
331 root_display_name, |
|
332 self.fldridx, self.fldropenidx) |
|
333 if hmi_tree_root is not None: |
|
334 self._recurseTree(hmi_tree_root, root) |
|
335 dvtc.Thaw() |
|
336 |
355 |
337 class SVGHMI(object): |
356 class SVGHMI(object): |
338 XSD = """<?xml version="1.0" encoding="utf-8" ?> |
357 XSD = """<?xml version="1.0" encoding="utf-8" ?> |
339 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
358 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
340 <xsd:element name="SVGHMI"> |
359 <xsd:element name="SVGHMI"> |