svghmi/ui.py
author Edouard Tisserant <edouard.tisserant@gmail.com>
Thu, 10 Jun 2021 14:05:44 +0200
branchsvghmi
changeset 3255 07f10dc95d2f
parent 3252 352b2111ca66
parent 3253 9233e60a8317
child 3259 76da573569a6
permissions -rw-r--r--
merge
2745
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     1
#!/usr/bin/env python
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     3
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     4
# This file is part of Beremiz
3197
0f41c1e2c121 SVGHMI: split svghmi.py into hmi_tree.py + svghmi.py
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3193
diff changeset
     5
# Copyright (C) 2021: Edouard TISSERANT
2745
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     6
#
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     7
# See COPYING file for copyrights details.
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     8
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
     9
from __future__ import absolute_import
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    10
import os
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
    11
import hashlib
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
    12
import weakref
3252
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
    13
import re
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
    14
from functools import reduce
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
    15
from operator import or_
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    16
from tempfile import NamedTemporaryFile
2745
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    17
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    18
import wx
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
    19
from wx.lib.scrolledpanel import ScrolledPanel
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
    20
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    21
from lxml import etree
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    22
from lxml.etree import XSLTApplyError
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    23
from XSLTransform import XSLTransform
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    24
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    25
import util.paths as paths
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
    26
from IDEFrame import EncodeFileSystemPath, DecodeFileSystemPath
3201
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
    27
from docutil import get_inkscape_path
2745
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    28
2756
f94bc35a023e SVGHMI: added extraction of SVG bounding boxes, obtained from "inkscape -S", and passed to XSLT transform as variable.
Edouard Tisserant
parents: 2753
diff changeset
    29
from util.ProcessLogger import ProcessLogger
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
    30
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    31
ScriptDirectory = paths.AbsDir(__file__)
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    32
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    33
HMITreeDndMagicWord = "text/beremiz-hmitree"
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    34
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    35
class HMITreeSelector(wx.TreeCtrl):
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    36
    def __init__(self, parent):
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    37
3177
5a8abd549aa8 SVGHMI: Lighter display of HMI Tree, no more icons and use buttons. Auto expand root. Fix loading of HMI tree XML backup (hmiclass attribute wasn't kept).
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3176
diff changeset
    38
        wx.TreeCtrl.__init__(self, parent, style=(
5a8abd549aa8 SVGHMI: Lighter display of HMI Tree, no more icons and use buttons. Auto expand root. Fix loading of HMI tree XML backup (hmiclass attribute wasn't kept).
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3176
diff changeset
    39
            wx.TR_MULTIPLE |
5a8abd549aa8 SVGHMI: Lighter display of HMI Tree, no more icons and use buttons. Auto expand root. Fix loading of HMI tree XML backup (hmiclass attribute wasn't kept).
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3176
diff changeset
    40
            wx.TR_HAS_BUTTONS |
5a8abd549aa8 SVGHMI: Lighter display of HMI Tree, no more icons and use buttons. Auto expand root. Fix loading of HMI tree XML backup (hmiclass attribute wasn't kept).
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3176
diff changeset
    41
            wx.SUNKEN_BORDER |
5a8abd549aa8 SVGHMI: Lighter display of HMI Tree, no more icons and use buttons. Auto expand root. Fix loading of HMI tree XML backup (hmiclass attribute wasn't kept).
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3176
diff changeset
    42
            wx.TR_LINES_AT_ROOT))
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    43
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    44
        self.ordered_items = []
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    45
        self.parent = parent
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    46
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    47
        self.MakeTree()
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    48
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    49
        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeNodeSelection)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    50
        self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTreeBeginDrag)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    51
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    52
    def _recurseTree(self, current_hmitree_root, current_tc_root):
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    53
        for c in current_hmitree_root.children:
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    54
            if hasattr(c, "children"):
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    55
                display_name = ('{} (class={})'.format(c.name, c.hmiclass)) \
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    56
                               if c.hmiclass is not None else c.name
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    57
                tc_child = self.AppendItem(current_tc_root, display_name)
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    58
                self.SetPyData(tc_child, c)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    59
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    60
                self._recurseTree(c,tc_child)
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    61
            else:
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    62
                display_name = '{} {}'.format(c.nodetype[4:], c.name)
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    63
                tc_child = self.AppendItem(current_tc_root, display_name)
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
    64
                self.SetPyData(tc_child, c)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    65
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    66
    def OnTreeNodeSelection(self, event):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    67
        items = self.GetSelections()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    68
        items_pydata = [self.GetPyData(item) for item in items]
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    69
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    70
        # append new items to ordered item list
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    71
        for item_pydata in items_pydata:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    72
            if item_pydata not in self.ordered_items:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    73
                self.ordered_items.append(item_pydata)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    74
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    75
        # filter out vanished items
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    76
        self.ordered_items = [
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    77
            item_pydata 
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    78
            for item_pydata in self.ordered_items 
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    79
            if item_pydata in items_pydata]
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    80
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    81
        self.parent.OnHMITreeNodeSelection(self.ordered_items)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    82
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    83
    def OnTreeBeginDrag(self, event):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    84
        """
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    85
        Called when a drag is started in tree
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    86
        @param event: wx.TreeEvent
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    87
        """
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    88
        if self.ordered_items:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    89
            print("boink")
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    90
            # Just send a recognizable mime-type, drop destination
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    91
            # will get python data from parent
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    92
            data = wx.CustomDataObject(HMITreeDndMagicWord)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    93
            dragSource = wx.DropSource(self)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    94
            dragSource.SetData(data)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    95
            dragSource.DoDragDrop()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
    96
3201
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
    97
    def MakeTree(self, hmi_tree_root=None):
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    98
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    99
        self.Freeze()
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   100
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   101
        self.root = None
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   102
        self.DeleteAllItems()
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   103
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   104
        root_display_name = _("Please build to see HMI Tree") \
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   105
            if hmi_tree_root is None else "HMI"
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   106
        self.root = self.AddRoot(root_display_name)
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   107
        self.SetPyData(self.root, hmi_tree_root)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   108
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   109
        if hmi_tree_root is not None:
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   110
            self._recurseTree(hmi_tree_root, self.root)
3177
5a8abd549aa8 SVGHMI: Lighter display of HMI Tree, no more icons and use buttons. Auto expand root. Fix loading of HMI tree XML backup (hmiclass attribute wasn't kept).
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3176
diff changeset
   111
            self.Expand(self.root)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   112
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   113
        self.Thaw()
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
   114
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   115
class WidgetPicker(wx.TreeCtrl):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   116
    def __init__(self, parent, initialdir=None):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   117
        wx.TreeCtrl.__init__(self, parent, style=(
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   118
            wx.TR_MULTIPLE |
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   119
            wx.TR_HAS_BUTTONS |
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   120
            wx.SUNKEN_BORDER |
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   121
            wx.TR_LINES_AT_ROOT))
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   122
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   123
        self.MakeTree(initialdir)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   124
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   125
    def _recurseTree(self, current_dir, current_tc_root, dirlist):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   126
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   127
        recurse through subdirectories, but creates tree nodes 
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   128
        only when (sub)directory conbtains .svg file
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   129
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   130
        res = []
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   131
        for f in sorted(os.listdir(current_dir)):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   132
            p = os.path.join(current_dir,f)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   133
            if os.path.isdir(p):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   134
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   135
                r = self._recurseTree(p, current_tc_root, dirlist + [f])
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   136
                if len(r) > 0 :
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   137
                    res = r
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   138
                    dirlist = []
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   139
                    current_tc_root = res.pop()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   140
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   141
            elif os.path.splitext(f)[1].upper() == ".SVG":
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   142
                if len(dirlist) > 0 :
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   143
                    res = []
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   144
                    for d in dirlist:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   145
                        current_tc_root = self.AppendItem(current_tc_root, d)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   146
                        res.append(current_tc_root)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   147
                        self.SetPyData(current_tc_root, None)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   148
                    dirlist = []
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   149
                    res.pop()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   150
                tc_child = self.AppendItem(current_tc_root, f)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   151
                self.SetPyData(tc_child, p)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   152
        return res
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   153
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   154
    def MakeTree(self, lib_dir = None):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   155
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   156
        self.Freeze()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   157
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   158
        self.root = None
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   159
        self.DeleteAllItems()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   160
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   161
        root_display_name = _("Please select widget library directory") \
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   162
            if lib_dir is None else os.path.basename(lib_dir)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   163
        self.root = self.AddRoot(root_display_name)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   164
        self.SetPyData(self.root, None)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   165
3253
9233e60a8317 SVGHMI: fix exception when stored widget library path does not exist anymore
Edouard Tisserant
parents: 3251
diff changeset
   166
        if lib_dir is not None and os.path.exists(lib_dir):
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   167
            self._recurseTree(lib_dir, self.root, [])
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   168
            self.Expand(self.root)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   169
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   170
        self.Thaw()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   171
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   172
class PathDropTarget(wx.DropTarget):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   173
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   174
    def __init__(self, parent):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   175
        data = wx.CustomDataObject(HMITreeDndMagicWord)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   176
        wx.DropTarget.__init__(self, data)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   177
        self.ParentWindow = parent
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   178
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   179
    def OnDrop(self, x, y):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   180
        self.ParentWindow.OnHMITreeDnD()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   181
        return True
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   182
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   183
class ParamEditor(wx.Panel):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   184
    def __init__(self, parent, paramdesc):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   185
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   186
        wx.Panel.__init__(self, parent.main_panel)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   187
        label = paramdesc.get("name")+ ": " + paramdesc.get("accepts") 
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   188
        if paramdesc.text:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   189
            label += "\n\"" + paramdesc.text + "\""
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   190
        self.desc = wx.StaticText(self, label=label)
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   191
        self.valid_bmp = wx.ArtProvider.GetBitmap(wx.ART_TICK_MARK, wx.ART_TOOLBAR, (16,16))
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   192
        self.invalid_bmp = wx.ArtProvider.GetBitmap(wx.ART_CROSS_MARK, wx.ART_TOOLBAR, (16,16))
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   193
        self.validity_sbmp = wx.StaticBitmap(self, -1, self.invalid_bmp)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   194
        self.edit = wx.TextCtrl(self)
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   195
        self.edit_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   196
        self.edit_sizer.AddGrowableCol(0)
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   197
        self.edit_sizer.AddGrowableRow(0)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   198
        self.edit_sizer.Add(self.edit, flag=wx.GROW)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   199
        self.edit_sizer.Add(self.validity_sbmp, flag=wx.GROW)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   200
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   201
        self.main_sizer.Add(self.desc, flag=wx.GROW)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   202
        self.main_sizer.Add(self.edit_sizer, flag=wx.GROW)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   203
        self.SetSizer(self.main_sizer)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   204
        self.main_sizer.Fit(self)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   205
3252
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   206
    def setValidity(self, validity):
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   207
        if validity is not None:
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   208
            bmp = self.valid_bmp if validity else self.invalid_bmp
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   209
            self.validity_sbmp.SetBitmap(bmp)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   210
            self.validity_sbmp.Show(True)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   211
        else :
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   212
            self.validity_sbmp.Show(False)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   213
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   214
models = { typename: re.compile(regex) for typename, regex in [
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   215
    ("string", r".*"),
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   216
    ("int", r"^-?[1-9][0-9]*$"),
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   217
    ("real", r"^-?[1-9][0-9]*(\.[0-9]+)?$")]}
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   218
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   219
class ArgEditor(ParamEditor):
3252
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   220
    def __init__(self, parent, argdesc):
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   221
        ParamEditor.__init__(self, parent, argdesc)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   222
        self.ParentObj = parent
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   223
        self.argdesc = argdesc
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   224
        self.Bind(wx.EVT_TEXT, self.OnArgChanged, self.edit)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   225
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   226
    def OnArgChanged(self, event):
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   227
        txt = self.edit.GetValue()
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   228
        accepts = self.argdesc.get("accepts").split(',')
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   229
        self.setValidity(
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   230
            reduce(or_,
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   231
                   map(lambda typename: 
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   232
                           models[typename].match(txt) is not None,
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   233
                       accepts), 
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   234
                   False)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   235
            if accepts and txt else None)
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   236
        event.Skip()
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   237
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   238
class PathEditor(ParamEditor):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   239
    def __init__(self, parent, pathdesc):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   240
        ParamEditor.__init__(self, parent, pathdesc)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   241
        self.ParentObj = parent
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   242
        self.pathdesc = pathdesc
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   243
        DropTarget = PathDropTarget(self)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   244
        self.edit.SetDropTarget(DropTarget)
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   245
        self.Bind(wx.EVT_TEXT, self.OnPathChanged, self.edit)
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   246
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   247
    def OnHMITreeDnD(self):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   248
        self.ParentObj.GotPathDnDOn(self)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   249
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   250
    def SetPath(self, hmitree_node):
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   251
        self.edit.ChangeValue(hmitree_node.hmi_path())
3252
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   252
        self.setValidity(
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   253
            hmitree_node.nodetype in self.pathdesc.get("accepts").split(","))
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   254
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   255
    def OnPathChanged(self, event):
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   256
        # TODO : find corresponding hmitre node and type to update validity
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   257
        # Lazy way : hide validity
3252
352b2111ca66 SVGHMI: added checking of widget literal argument in DnD UI according to type given in widget description
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3251
diff changeset
   258
        self.setValidity(None)
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   259
        event.Skip()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   260
    
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   261
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   262
_conf_key = "SVGHMIWidgetLib"
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   263
_preview_height = 200
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   264
_preview_margin = 5
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   265
class WidgetLibBrowser(wx.SplitterWindow):
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   266
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   267
                 size=wx.DefaultSize):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   268
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   269
        wx.SplitterWindow.__init__(self, parent,
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   270
                                   style=wx.SUNKEN_BORDER | wx.SP_3D)
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   271
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   272
        self.bmp = None
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   273
        self.msg = None
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   274
        self.hmitree_nodes = []
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   275
        self.selected_SVG = None
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   276
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   277
        self.Config = wx.ConfigBase.Get()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   278
        self.libdir = self.RecallLibDir()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   279
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   280
        self.picker_desc_splitter = wx.SplitterWindow(self, style=wx.SUNKEN_BORDER | wx.SP_3D)
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   281
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   282
        self.picker_panel = wx.Panel(self.picker_desc_splitter)
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   283
        self.picker_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   284
        self.picker_sizer.AddGrowableCol(0)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   285
        self.picker_sizer.AddGrowableRow(1)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   286
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   287
        self.widgetpicker = WidgetPicker(self.picker_panel, self.libdir)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   288
        self.libbutton = wx.Button(self.picker_panel, -1, _("Select SVG widget library"))
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   289
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   290
        self.picker_sizer.Add(self.libbutton, flag=wx.GROW)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   291
        self.picker_sizer.Add(self.widgetpicker, flag=wx.GROW)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   292
        self.picker_sizer.Layout()
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   293
        self.picker_panel.SetAutoLayout(True)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   294
        self.picker_panel.SetSizer(self.picker_sizer)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   295
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   296
        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnWidgetSelection, self.widgetpicker)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   297
        self.Bind(wx.EVT_BUTTON, self.OnSelectLibDir, self.libbutton)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   298
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   299
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   300
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   301
        self.main_panel = ScrolledPanel(parent=self,
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   302
                                                name='MiscellaneousPanel',
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   303
                                                style=wx.TAB_TRAVERSAL)
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   304
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   305
        self.main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=0)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   306
        self.main_sizer.AddGrowableCol(0)
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   307
        self.main_sizer.AddGrowableRow(2)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   308
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   309
        self.staticmsg = wx.StaticText(self, label = _("Drag selected Widget from here to Inkscape"))
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   310
        self.preview = wx.Panel(self.main_panel, size=(-1, _preview_height + _preview_margin*2))
3237
d000a91d1e95 SVGHMI: Intermediate state while updating UI, preparing for displaying widget description and multiple variables selections
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3235
diff changeset
   311
        self.signature_sizer = wx.BoxSizer(wx.VERTICAL)
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   312
        self.args_box = wx.StaticBox(self.main_panel, -1,
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   313
                                     _("Widget's arguments"),
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   314
                                     style = wx.ALIGN_RIGHT)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   315
        self.args_sizer = wx.StaticBoxSizer(self.args_box, wx.VERTICAL)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   316
        self.paths_box = wx.StaticBox(self.main_panel, -1,
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   317
                                      _("Widget's variables"),
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   318
                                      style = wx.ALIGN_RIGHT)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   319
        self.paths_sizer = wx.StaticBoxSizer(self.paths_box, wx.VERTICAL)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   320
        self.signature_sizer.Add(self.args_sizer, flag=wx.GROW)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   321
        self.signature_sizer.AddSpacer(5)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   322
        self.signature_sizer.Add(self.paths_sizer, flag=wx.GROW)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   323
        self.main_sizer.Add(self.staticmsg, flag=wx.GROW)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   324
        self.main_sizer.Add(self.preview, flag=wx.GROW)
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   325
        self.main_sizer.Add(self.signature_sizer, flag=wx.GROW)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   326
        self.main_sizer.Layout()
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   327
        self.main_panel.SetAutoLayout(True)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   328
        self.main_panel.SetSizer(self.main_sizer)
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   329
        self.main_sizer.Fit(self.main_panel)
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   330
        self.preview.Bind(wx.EVT_PAINT, self.OnPaint)
3213
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   331
        self.preview.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   332
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   333
        self.desc = wx.TextCtrl(self.picker_desc_splitter, size=wx.Size(-1, 160),
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   334
                                   style=wx.TE_READONLY | wx.TE_MULTILINE)
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   335
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   336
        self.picker_desc_splitter.SplitHorizontally(self.picker_panel, self.desc, 400)
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   337
        self.SplitVertically(self.main_panel, self.picker_desc_splitter, 300)
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   338
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   339
        self.tempf = None 
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   340
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   341
        self.args_editors = []
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   342
        self.paths_editors = []
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   343
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   344
    def ResetSignature(self):
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   345
        self.args_sizer.Clear()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   346
        for editor in self.args_editors:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   347
            editor.Destroy()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   348
        self.args_editors = []
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   349
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   350
        self.paths_sizer.Clear()
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   351
        for editor in self.paths_editors:
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   352
            editor.Destroy()
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   353
        self.paths_editors = []
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   354
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   355
    def AddArgToSignature(self, arg):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   356
        new_editor = ArgEditor(self, arg)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   357
        self.args_editors.append(new_editor)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   358
        self.args_sizer.Add(new_editor, flag=wx.GROW)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   359
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   360
    def AddPathToSignature(self, path):
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   361
        new_editor = PathEditor(self, path)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   362
        self.paths_editors.append(new_editor)
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   363
        self.paths_sizer.Add(new_editor, flag=wx.GROW)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   364
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   365
    def GotPathDnDOn(self, target_editor):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   366
        dndindex = self.paths_editors.index(target_editor)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   367
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   368
        for hmitree_node,editor in zip(self.hmitree_nodes,
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   369
                                   self.paths_editors[dndindex:]):
3251
6d4ff271ebf1 SVGHMI: UI Updates validity indicator when DnD HMI tree node in text field, according to node type
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3250
diff changeset
   370
            editor.SetPath(hmitree_node)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   371
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   372
    def RecallLibDir(self):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   373
        conf = self.Config.Read(_conf_key)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   374
        if len(conf) == 0:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   375
            return None
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   376
        else:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   377
            return DecodeFileSystemPath(conf)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   378
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   379
    def RememberLibDir(self, path):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   380
        self.Config.Write(_conf_key,
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   381
                          EncodeFileSystemPath(path))
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   382
        self.Config.Flush()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   383
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   384
    def DrawPreview(self):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   385
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   386
        Refresh preview panel 
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   387
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   388
        # Init preview panel paint device context
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   389
        dc = wx.PaintDC(self.preview)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   390
        dc.Clear()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   391
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   392
        if self.bmp:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   393
            # Get Preview panel size
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   394
            sz = self.preview.GetClientSize()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   395
            w = self.bmp.GetWidth()
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   396
            dc.DrawBitmap(self.bmp, (sz.width - w)/2, _preview_margin)
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   397
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   398
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   399
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   400
    def OnSelectLibDir(self, event):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   401
        defaultpath = self.RecallLibDir()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   402
        if defaultpath == None:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   403
            defaultpath = os.path.expanduser("~")
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   404
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   405
        dialog = wx.DirDialog(self, _("Choose a widget library"), defaultpath,
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   406
                              style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   407
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   408
        if dialog.ShowModal() == wx.ID_OK:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   409
            self.libdir = dialog.GetPath()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   410
            self.RememberLibDir(self.libdir)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   411
            self.widgetpicker.MakeTree(self.libdir)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   412
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   413
        dialog.Destroy()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   414
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   415
    def OnPaint(self, event):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   416
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   417
        Called when Preview panel needs to be redrawn
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   418
        @param event: wx.PaintEvent
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   419
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   420
        self.DrawPreview()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   421
        event.Skip()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   422
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   423
    def GenThumbnail(self, svgpath, thumbpath):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   424
        inkpath = get_inkscape_path()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   425
        if inkpath is None:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   426
            self.msg = _("Inkscape is not installed.")
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   427
            return False
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   428
        # TODO: spawn a thread, to decouple thumbnail gen
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   429
        status, result, _err_result = ProcessLogger(
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   430
            None,
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   431
            '"' + inkpath + '" "' + svgpath + '" -e "' + thumbpath +
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   432
            '" -D -h ' + str(_preview_height)).spin()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   433
        if status != 0:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   434
            self.msg = _("Inkscape couldn't generate thumbnail.")
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   435
            return False
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   436
        return True
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   437
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   438
    def OnWidgetSelection(self, event):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   439
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   440
        Called when tree item is selected
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   441
        @param event: wx.TreeEvent
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   442
        """
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   443
        item_pydata = self.widgetpicker.GetPyData(event.GetItem())
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   444
        if item_pydata is not None:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   445
            svgpath = item_pydata
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   446
            dname = os.path.dirname(svgpath)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   447
            fname = os.path.basename(svgpath)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   448
            hasher = hashlib.new('md5')
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   449
            with open(svgpath, 'rb') as afile:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   450
                while True:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   451
                    buf = afile.read(65536)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   452
                    if len(buf) > 0:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   453
                        hasher.update(buf)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   454
                    else:
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   455
                        break
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   456
            digest = hasher.hexdigest()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   457
            thumbfname = os.path.splitext(fname)[0]+"_"+digest+".png"
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   458
            thumbdir = os.path.join(dname, ".svghmithumbs") 
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   459
            thumbpath = os.path.join(thumbdir, thumbfname) 
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   460
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   461
            have_thumb = os.path.exists(thumbpath)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   462
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   463
            try:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   464
                if not have_thumb:
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   465
                    if not os.path.exists(thumbdir):
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   466
                        os.mkdir(thumbdir)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   467
                    have_thumb = self.GenThumbnail(svgpath, thumbpath)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   468
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   469
                self.bmp = wx.Bitmap(thumbpath) if have_thumb else None
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   470
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   471
                self.selected_SVG = svgpath if have_thumb else None
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   472
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   473
                self.AnalyseWidgetAndUpdateUI(fname)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   474
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   475
                if self.msg:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   476
                    self.staticmsg.Show()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   477
                    self.staticmsg.SetLabel(self.msg)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   478
                else:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   479
                    self.staticmsg.Hide()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   480
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   481
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   482
            except IOError:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   483
                self.msg = _("Widget library must be writable")
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   484
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   485
            self.Refresh()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   486
        event.Skip()
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   487
3231
5243c2a2f7f8 SVGHMI: keep track of order of selection in HMI tree, so that variable can be passed in same order to DnD widget
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3228
diff changeset
   488
    def OnHMITreeNodeSelection(self, hmitree_nodes):
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   489
        self.hmitree_nodes = hmitree_nodes
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   490
        # [0] if len(hmitree_nodes) else None
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   491
        # self.ValidateWidget()
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   492
        # self.Refresh()
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   493
3213
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   494
    def OnLeftDown(self, evt):
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   495
        if self.tempf is not None:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   496
            filename = self.tempf.name
3213
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   497
            data = wx.FileDataObject()
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   498
            data.AddFile(filename)
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   499
            dropSource = wx.DropSource(self)
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   500
            dropSource.SetData(data)
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   501
            dropSource.DoDragDrop(wx.Drag_AllowMove)
afef7011f475 SVGHMI: Add file type drag'n'drop to widget picker, for now drops widget's original SVG.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3208
diff changeset
   502
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   503
    def GiveDetails(self, _context, msgs):
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   504
        for msg in msgs:
3222
6adeeb16ac3e SVGHMI: Widget DnD to Inkscape : Added source SVG widget label parsing and pass selecte HMI subtree to XSLT tranform, so that SVG containing multiple widgets can later be matched against hmi tree fragments, in order to DnD complex groups of widgets.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3221
diff changeset
   505
            self.msg += msg.text + "\n"
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   506
        
3234
f2bfb047d0e6 SVGHMI: drop useless code from gen_dnd_widget.yslt2, renamed python callback to pass messages
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3231
diff changeset
   507
    def PassMessage(self, _context, msgs):
f2bfb047d0e6 SVGHMI: drop useless code from gen_dnd_widget.yslt2, renamed python callback to pass messages
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3231
diff changeset
   508
        for msg in msgs:
f2bfb047d0e6 SVGHMI: drop useless code from gen_dnd_widget.yslt2, renamed python callback to pass messages
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3231
diff changeset
   509
            self.msg += msg.text + "\n"
f2bfb047d0e6 SVGHMI: drop useless code from gen_dnd_widget.yslt2, renamed python callback to pass messages
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3231
diff changeset
   510
3222
6adeeb16ac3e SVGHMI: Widget DnD to Inkscape : Added source SVG widget label parsing and pass selecte HMI subtree to XSLT tranform, so that SVG containing multiple widgets can later be matched against hmi tree fragments, in order to DnD complex groups of widgets.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3221
diff changeset
   511
    def GetSubHMITree(self, _context):
6adeeb16ac3e SVGHMI: Widget DnD to Inkscape : Added source SVG widget label parsing and pass selecte HMI subtree to XSLT tranform, so that SVG containing multiple widgets can later be matched against hmi tree fragments, in order to DnD complex groups of widgets.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3221
diff changeset
   512
        return [self.hmitree_node.etree()]
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   513
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   514
    def AnalyseWidgetAndUpdateUI(self, fname):
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   515
        self.msg = ""
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   516
        self.ResetSignature()
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   517
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   518
        try:
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   519
            if self.selected_SVG is None:
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   520
                raise Exception(_("No widget selected"))
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   521
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   522
            transform = XSLTransform(
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   523
                os.path.join(ScriptDirectory, "analyse_widget.xslt"),[])
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   524
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   525
            svgdom = etree.parse(self.selected_SVG)
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   526
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   527
            signature = transform.transform(svgdom)
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   528
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   529
            for entry in transform.get_error_log():
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   530
                self.msg += "XSLT: " + entry.message + "\n" 
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   531
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   532
        except Exception as e:
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   533
            self.msg += str(e)
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   534
        except XSLTApplyError as e:
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   535
            self.msg += "Widget " + fname + " analysis error: " + e.message
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   536
        else:
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   537
            
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   538
            self.msg += "Widget " + fname + ": OK"
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   539
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   540
            print(etree.tostring(signature, pretty_print=True))
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   541
            widgets = signature.getroot()
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   542
            for defs in widgets.iter("defs"):
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   543
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   544
                # Keep double newlines (to mark paragraphs)
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   545
                self.desc.SetValue(defs.find("type").text + ":\n" + "\n\n".join(map(
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   546
                    lambda s:s.replace("\n"," ").replace("  ", " "),
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   547
                    defs.find("longdesc").text.split("\n\n"))))
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   548
                args = [arg for arg in defs.iter("arg")]
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   549
                self.args_box.Show(len(args)!=0)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   550
                for arg in args:
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   551
                    self.AddArgToSignature(arg)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   552
                    print(arg.get("name"))
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   553
                    print(arg.get("accepts"))
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   554
                paths = [path for path in defs.iter("path")]
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   555
                self.paths_box.Show(len(paths)!=0)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   556
                for path in paths:
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   557
                    self.AddPathToSignature(path)
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   558
                    print(path.get("name"))
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   559
                    print(path.get("accepts"))
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   560
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   561
            for widget in widgets:
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   562
                widget_type = widget.get("type")
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   563
                print(widget_type)
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   564
                for path in widget.iterchildren("path"):
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   565
                    path_value = path.get("value")
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   566
                    path_accepts = map(
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   567
                        str.strip, path.get("accepts", '')[1:-1].split(','))
3241
fe945f1f48b7 SVGHMI: WIP on Widget DnD UI : Added documentation to widgets, that is injected in widget parse tree during widget analysis
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3237
diff changeset
   568
                    print(path, path_value, path_accepts)
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   569
3245
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   570
        self.main_panel.SetupScrolling(scroll_x=False)
c441181247cf SVGHMI: DnD UI : changed layout again, moved description in a vertical splitter, added scrollbar for preview and signature, fixed flickering description
Edouard Tisserant
parents: 3244
diff changeset
   571
3235
b2b6bf45aa2d SVGHMI: Add analyse_widget stylesheet and python code to execute it, in order to obtain widget signature independently of DnD SVG file generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3234
diff changeset
   572
3222
6adeeb16ac3e SVGHMI: Widget DnD to Inkscape : Added source SVG widget label parsing and pass selecte HMI subtree to XSLT tranform, so that SVG containing multiple widgets can later be matched against hmi tree fragments, in order to DnD complex groups of widgets.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3221
diff changeset
   573
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   574
    def ValidateWidget(self):
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   575
        self.msg = ""
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   576
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   577
        if self.tempf is not None:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   578
            os.unlink(self.tempf.name)
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   579
            self.tempf = None
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   580
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   581
        try:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   582
            if self.selected_SVG is None:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   583
                raise Exception(_("No widget selected"))
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   584
            if self.hmitree_node is None:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   585
                raise Exception(_("No HMI tree node selected"))
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   586
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   587
            transform = XSLTransform(
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   588
                os.path.join(ScriptDirectory, "gen_dnd_widget_svg.xslt"),
3222
6adeeb16ac3e SVGHMI: Widget DnD to Inkscape : Added source SVG widget label parsing and pass selecte HMI subtree to XSLT tranform, so that SVG containing multiple widgets can later be matched against hmi tree fragments, in order to DnD complex groups of widgets.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3221
diff changeset
   589
                [("GetSubHMITree", self.GetSubHMITree),
3234
f2bfb047d0e6 SVGHMI: drop useless code from gen_dnd_widget.yslt2, renamed python callback to pass messages
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3231
diff changeset
   590
                 ("PassMessage", self.GiveDetails)])
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   591
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   592
            svgdom = etree.parse(self.selected_SVG)
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   593
3223
061796d9855e SVGHMI: Widget transform before DnD now should have HMI path as a parameter, but this path isn't computed for some reason... WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3222
diff changeset
   594
            result = transform.transform(
061796d9855e SVGHMI: Widget transform before DnD now should have HMI path as a parameter, but this path isn't computed for some reason... WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3222
diff changeset
   595
                svgdom, hmi_path = self.hmitree_node.hmi_path())
3221
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   596
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   597
            for entry in transform.get_error_log():
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   598
                self.msg += "XSLT: " + entry.message + "\n" 
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   599
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   600
            self.tempf = NamedTemporaryFile(suffix='.svg', delete=False)
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   601
            result.write(self.tempf, encoding="utf-8")
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   602
            self.tempf.close()
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   603
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   604
        except Exception as e:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   605
            self.msg += str(e)
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   606
        except XSLTApplyError as e:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   607
            self.msg += "Widget transform error: " + e.message
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   608
                
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   609
    def __del__(self):
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   610
        if self.tempf is not None:
3d307ad803ea SVGHMI: Widget Library Picker now transforms SVG widget before allowing DnD. Transform is just identity forn now, but label parsing have already been included. To be continued.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3213
diff changeset
   611
            os.unlink(self.tempf.name)
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
   612
3201
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
   613
class SVGHMI_UI(wx.SplitterWindow):
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
   614
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
   615
    def __init__(self, parent, register_for_HMI_tree_updates):
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   616
        wx.SplitterWindow.__init__(self, parent,
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   617
                                   style=wx.SUNKEN_BORDER | wx.SP_3D)
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   618
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   619
        self.SelectionTree = HMITreeSelector(self)
3193
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   620
        self.Staging = WidgetLibBrowser(self)
8006bb60a4dd SVGHMI: Added SVG widget library browser. Supports browsing and previewing widgets. Widget validation and drag'n'drop are still to be implemented.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3180
diff changeset
   621
        self.SplitVertically(self.SelectionTree, self.Staging, 300)
3201
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
   622
        register_for_HMI_tree_updates(weakref.ref(self))
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
   623
6dadc1690284 SVGHMI: split svghmi.py into svghmi.py (Config Tree Node + code gen) and ui.py (UI for HMI tree and Widget picking)
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3197
diff changeset
   624
    def HMITreeUpdate(self, hmi_tree_root):
3247
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   625
        self.SelectionTree.MakeTree(hmi_tree_root)
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   626
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   627
    def OnHMITreeNodeSelection(self, hmitree_nodes):
7282b40374b0 SVGHMI: UI now have multiple HMI tree variables DnD to widget paths. Still no type checking, WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3245
diff changeset
   628
        self.Staging.OnHMITreeNodeSelection(hmitree_nodes)