svghmi/ui.py
author Edouard Tisserant <edouard.tisserant@gmail.com>
Wed, 16 Oct 2024 12:18:14 +0200
changeset 4030 45532de22b75
parent 3913 46ef8be69e8c
permissions -rw-r--r--
TESTS: Update Matiec revision in GH workflow
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
3750
f62625418bff automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents: 3609
diff changeset
     9
2745
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
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
    14
import tempfile
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
    15
from threading import Thread, Lock
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
    16
from functools import reduce
3750
f62625418bff automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents: 3609
diff changeset
    17
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
    18
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
    19
from tempfile import NamedTemporaryFile
2745
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    20
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    21
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
    22
from wx.lib.scrolledpanel import ScrolledPanel
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
    23
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
    24
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
    25
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
    26
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
    27
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
    28
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
    29
from IDEFrame import EncodeFileSystemPath, DecodeFileSystemPath
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
    30
from docutil import get_inkscape_path, get_inkscape_version
2745
535eb0b8bd9d Skeleton for svghmi extension
Edouard Tisserant
parents:
diff changeset
    31
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
    32
from util.ProcessLogger import ProcessLogger
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
    33
3573
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    34
# When running as a confined Snap, /tmp isn't accessible from the outside
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    35
# and Widget DnD to Inkscape can't work, since it can't find generated svg 
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    36
# This forces tmp directory in $SNAP_USER_DATA, accessible from other apps
3750
f62625418bff automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents: 3609
diff changeset
    37
if "SNAP" in os.environ:
3573
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    38
     NamedTemporaryFile_orig = NamedTemporaryFile
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    39
     tmpdir = os.path.join(os.environ["SNAP_USER_DATA"], ".tmp")
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    40
     if not os.path.exists(tmpdir):
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    41
         os.mkdir(tmpdir)
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    42
     def NamedTemporaryFile(*args,**kwargs):
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    43
        kwargs["dir"] = tmpdir
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    44
        return NamedTemporaryFile_orig(*args, **kwargs)
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    45
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
    46
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
    47
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
    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
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
    50
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    51
class HMITreeSelector(wx.TreeCtrl):
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    52
    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
    53
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
    54
        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
    55
            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
    56
            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
    57
            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
    58
            wx.TR_LINES_AT_ROOT))
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    59
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
    60
        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
    61
        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
    62
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    63
        self.MakeTree()
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    64
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
    65
        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
    66
        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
    67
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    68
    def _recurseTree(self, current_hmitree_root, current_tc_root):
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    69
        for c in current_hmitree_root.children:
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    70
            if hasattr(c, "children"):
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    71
                display_name = ('{} (class={})'.format(c.name, c.hmiclass)) \
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    72
                               if c.hmiclass is not None else c.name
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    73
                tc_child = self.AppendItem(current_tc_root, display_name)
3303
0ffb41625592 Preliminary support for WxPython 4.1.0. Needs more testing. Grid selection/focus seems broken, and probably many other bugs hidden in dialogs and editors.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3279
diff changeset
    74
                self.SetItemData(tc_child, c)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    75
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    76
                self._recurseTree(c,tc_child)
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    77
            else:
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    78
                display_name = '{} {}'.format(c.nodetype[4:], c.name)
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    79
                tc_child = self.AppendItem(current_tc_root, display_name)
3303
0ffb41625592 Preliminary support for WxPython 4.1.0. Needs more testing. Grid selection/focus seems broken, and probably many other bugs hidden in dialogs and editors.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3279
diff changeset
    80
                self.SetItemData(tc_child, c)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
    81
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
    82
    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
    83
        items = self.GetSelections()
3891
0f375805097a SVGHMI: Fix warning with WxPython > 4.x
Edouard Tisserant <edouard@beremiz.fr>
parents: 3880
diff changeset
    84
        items_pydata = [self.GetItemData(item) for item in items]
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
    85
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
        # 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
    87
        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
    88
            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
    89
                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
    90
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
        # 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
    92
        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
    93
            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
    94
            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
    95
            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
    96
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
    97
        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
    98
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
    99
    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
   100
        """
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
   101
        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
   102
        @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
   103
        """
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
   104
        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
   105
            # 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
   106
            # 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
   107
            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
   108
            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
   109
            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
   110
            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
   111
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
   112
    def MakeTree(self, hmi_tree_root=None):
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   113
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   114
        self.Freeze()
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   115
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   116
        self.root = None
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   117
        self.DeleteAllItems()
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   118
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
   119
        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
   120
            if hmi_tree_root is None else "HMI"
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   121
        self.root = self.AddRoot(root_display_name)
3303
0ffb41625592 Preliminary support for WxPython 4.1.0. Needs more testing. Grid selection/focus seems broken, and probably many other bugs hidden in dialogs and editors.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3279
diff changeset
   122
        self.SetItemData(self.root, hmi_tree_root)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   123
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   124
        if hmi_tree_root is not None:
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   125
            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
   126
            self.Expand(self.root)
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   127
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   128
        self.Thaw()
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
   129
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
   130
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
   131
    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
   132
        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
   133
            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
   134
            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
   135
            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
   136
            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
   137
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
        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
   139
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
    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
   141
        """
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
        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
   143
        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
   144
        """
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
        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
   146
        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
   147
            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
   148
            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
   149
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
                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
   151
                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
   152
                    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
   153
                    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
   154
                    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
   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
            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
   157
                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
   158
                    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
   159
                    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
   160
                        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
   161
                        res.append(current_tc_root)
3303
0ffb41625592 Preliminary support for WxPython 4.1.0. Needs more testing. Grid selection/focus seems broken, and probably many other bugs hidden in dialogs and editors.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3279
diff changeset
   162
                        self.SetItemData(current_tc_root, 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
   163
                    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
   164
                    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
   165
                tc_child = self.AppendItem(current_tc_root, f)
3303
0ffb41625592 Preliminary support for WxPython 4.1.0. Needs more testing. Grid selection/focus seems broken, and probably many other bugs hidden in dialogs and editors.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3279
diff changeset
   166
                self.SetItemData(tc_child, p)
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
        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
   168
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
    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
   170
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
        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
   172
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
   173
        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
   174
        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
   175
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
   176
        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
   177
            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
   178
        self.root = self.AddRoot(root_display_name)
3303
0ffb41625592 Preliminary support for WxPython 4.1.0. Needs more testing. Grid selection/focus seems broken, and probably many other bugs hidden in dialogs and editors.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3279
diff changeset
   179
        self.SetItemData(self.root, 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
   180
3253
9233e60a8317 SVGHMI: fix exception when stored widget library path does not exist anymore
Edouard Tisserant
parents: 3251
diff changeset
   181
        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
   182
            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
   183
            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
   184
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
   185
        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
   186
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
   187
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
   188
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
    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
   190
        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
   191
        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
   192
        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
   193
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
   194
    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
   195
        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
   196
        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
   197
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
   198
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
   199
    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
   200
        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
   201
        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
   202
        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
   203
            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
   204
        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
   205
        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
   206
        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
   207
        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
   208
        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
   209
        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
   210
        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
   211
        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
   212
        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
   213
        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
   214
        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
   215
        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
   216
        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
   217
        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
   218
        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
   219
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   220
    def GetValue(self):
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   221
        return self.edit.GetValue()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   222
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
   223
    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
   224
        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
   225
            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
   226
            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
   227
            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
   228
        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
   229
            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
   230
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
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
   232
    ("string", r".*"),
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   233
    ("int", r"^-?([1-9][0-9]*|0)$"),
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   234
    ("real", r"^-?([1-9][0-9]*|0)(\.[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
   235
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
   236
class ArgEditor(ParamEditor):
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   237
    def __init__(self, parent, argdesc, prefillargdesc):
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
   238
        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
   239
        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
   240
        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
   241
        self.Bind(wx.EVT_TEXT, self.OnArgChanged, self.edit)
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   242
        prefill = "" if prefillargdesc is None else prefillargdesc.get("value")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   243
        self.edit.SetValue(prefill)
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   244
        # TODO add a button to add more ArgEditror instance 
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   245
        #      when ordinality is multiple
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
   246
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
   247
    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
   248
        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
   249
        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
   250
        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
   251
            reduce(or_,
3750
f62625418bff automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents: 3609
diff changeset
   252
                   [models[typename].match(txt) is not None for typename in accepts], 
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
   253
                   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
   254
            if accepts and txt else None)
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   255
        self.ParentObj.RegenSVGLater()
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
   256
        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
   257
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
   258
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
   259
    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
   260
        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
   261
        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
   262
        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
   263
        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
   264
        self.edit.SetDropTarget(DropTarget)
3265
f3cb352048b6 SVGHMI: DnD UI: Add hint instructing user to Drag HMI tree items to text field.
Edouard Tisserant
parents: 3263
diff changeset
   265
        self.edit.SetHint(_("Drag'n'drop HMI variable here"))
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
   266
        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
   267
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
   268
    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
   269
        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
   270
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
   271
    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
   272
        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
   273
        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
   274
            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
   275
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
   276
    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
   277
        # 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
   278
        # 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
   279
        self.setValidity(None)
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   280
        self.ParentObj.RegenSVGLater()
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
   281
        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
   282
    
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   283
def KeepDoubleNewLines(txt):
3750
f62625418bff automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents: 3609
diff changeset
   284
    return "\n\n".join([re.sub(r'\s+',' ',s) for s in txt.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
   285
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
   286
_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
   287
_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
   288
_preview_margin = 5
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   289
thumbnail_temp_path = None
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   290
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   291
class WidgetLibBrowser(wx.SplitterWindow):
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   292
    def __init__(self, parent, controler, id=wx.ID_ANY, pos=wx.DefaultPosition,
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
   293
                 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
   294
3243
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   295
        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
   296
                                   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
   297
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
   298
        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
   299
        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
   300
        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
   301
        self.selected_SVG = None
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   302
        self.Controler = controler
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
   303
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
   304
        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
   305
        self.libdir = self.RecallLibDir()
3274
16066300b254 SVGHMI: default library path, default page when starting a SVGHMI project, error page when no SVG present
Edouard Tisserant
parents: 3265
diff changeset
   306
        if self.libdir is None:
16066300b254 SVGHMI: default library path, default page when starting a SVGHMI project, error page when no SVG present
Edouard Tisserant
parents: 3265
diff changeset
   307
            self.libdir = os.path.join(ScriptDirectory, "widgetlib") 
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
   308
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
   309
        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
   310
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
   311
        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
   312
        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
   313
        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
   314
        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
   315
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   316
        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
   317
        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
   318
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   319
        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
   320
        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
   321
        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
   322
        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
   323
        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
   324
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   325
        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
   326
        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
   327
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   328
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   329
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
   330
        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
   331
                                                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
   332
                                                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
   333
92cc21f88bf8 SVGHMI: WIP: Widget Library UI: Reworking widget selection and binding.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3241
diff changeset
   334
        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
   335
        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
   336
        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
   337
3818
e528b11a60cc Py3 related fixes for SVGHMI UI.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3750
diff changeset
   338
        self.staticmsg = wx.StaticText(self.main_panel, 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
   339
        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
   340
        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
   341
        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
   342
                                     _("Widget's arguments"),
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   343
                                     style = wx.ALIGN_CENTRE_HORIZONTAL)
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
   344
        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
   345
        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
   346
                                      _("Widget's variables"),
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   347
                                      style = wx.ALIGN_CENTRE_HORIZONTAL)
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
   348
        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
   349
        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
   350
        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
   351
        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
   352
        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
   353
        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
   354
        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
   355
        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
   356
        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
   357
        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
   358
        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
   359
        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
   360
        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
   361
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
   362
        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
   363
                                   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
   364
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
   365
        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
   366
        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
   367
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
   368
        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
   369
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   370
        self.RegenSVGThread = None
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   371
        self.RegenSVGLock = Lock()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   372
        self.RegenSVGTimer = wx.Timer(self, -1)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   373
        self.RegenSVGParams = None
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   374
        self.Bind(wx.EVT_TIMER,
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   375
                  self.RegenSVG,
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   376
                  self.RegenSVGTimer)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   377
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
   378
        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
   379
        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
   380
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   381
    def SetMessage(self, msg):
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   382
        self.staticmsg.SetLabel(msg)
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   383
        self.main_sizer.Layout()
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   384
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
   385
    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
   386
        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
   387
        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
   388
            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
   389
        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
   390
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
   391
        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
   392
        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
   393
            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
   394
        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
   395
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   396
    def AddArgToSignature(self, arg, prefillarg):
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   397
        new_editor = ArgEditor(self, arg, prefillarg)
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
   398
        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
   399
        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
   400
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
   401
    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
   402
        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
   403
        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
   404
        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
   405
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
   406
    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
   407
        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
   408
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
   409
        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
   410
                                   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
   411
            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
   412
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   413
        self.RegenSVGNow()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   414
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
   415
    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
   416
        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
   417
        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
   418
            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
   419
        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
   420
            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
   421
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
    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
   423
        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
   424
                          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
   425
        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
   426
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
    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
   428
        """
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
        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
   430
        """
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
        # 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
   432
        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
   433
        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
   434
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
        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
   436
            # 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
   437
            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
   438
            w = self.bmp.GetWidth()
3818
e528b11a60cc Py3 related fixes for SVGHMI UI.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3750
diff changeset
   439
            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
   440
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
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
    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
   444
        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
   445
        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
   446
            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
   447
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
        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
   449
                              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
   450
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
        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
   452
            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
   453
            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
   454
            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
   455
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
        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
   457
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
    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
   459
        """
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
        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
   461
        @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
   462
        """
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
   463
        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
   464
        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
   465
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
    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
   467
        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
   468
        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
   469
            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
   470
            return False
3913
46ef8be69e8c SVGHMI: Fix thumbnail generation.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3891
diff changeset
   471
        inkpath = inkpath.decode()
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   472
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   473
        export_opt = "-o" if get_inkscape_version()[0] > 0 else "-e"
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   474
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
   475
        # 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
   476
        status, result, _err_result = ProcessLogger(
3573
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
   477
            #self.Controler.GetCTRoot().logger,
1ee56fb544fc IDE, SVGHMI: Workaround Snap package not launching Inskape, POEdit or Chromium directly, producing lot of output in Incskape CLI, and messing with TMPDIR
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3526
diff changeset
   478
            None,
3818
e528b11a60cc Py3 related fixes for SVGHMI UI.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3750
diff changeset
   479
            [ inkpath, svgpath, export_opt, thumbpath, "-D", "-h", str(_preview_height)]).spin()
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
   480
        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
   481
            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
   482
            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
   483
        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
   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
    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
   486
        """
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
        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
   488
        @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
   489
        """
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   490
        global thumbnail_temp_path
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   491
        event.Skip()
3891
0f375805097a SVGHMI: Fix warning with WxPython > 4.x
Edouard Tisserant <edouard@beremiz.fr>
parents: 3880
diff changeset
   492
        item_pydata = self.widgetpicker.GetItemData(event.GetItem())
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
        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
   494
            svgpath = item_pydata
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   495
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   496
            if thumbnail_temp_path is None:
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   497
                try:
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   498
                    dname = os.path.dirname(svgpath)
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   499
                    thumbdir = os.path.join(dname, ".svghmithumbs") 
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   500
                    if not os.path.exists(thumbdir):
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   501
                        os.mkdir(thumbdir)
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   502
                except Exception :
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   503
                    # library not writable : use temp dir
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   504
                    thumbnail_temp_path = os.path.join(
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   505
                        tempfile.gettempdir(), "svghmithumbs")
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   506
                    thumbdir = thumbnail_temp_path
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   507
                    if not os.path.exists(thumbdir):
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   508
                        os.mkdir(thumbdir)
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   509
            else:
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   510
                thumbdir = thumbnail_temp_path
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   511
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
   512
            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
   513
            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
   514
            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
   515
                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
   516
                    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
   517
                    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
   518
                        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
   519
                    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
   520
                        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
   521
            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
   522
            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
   523
            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
   524
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
   525
            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
   526
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   527
            if not have_thumb:
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   528
                self.Controler.GetCTRoot().logger.write(
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   529
                    "Rendering preview of " + fname + " widget.\n")
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   530
                have_thumb = self.GenThumbnail(svgpath, thumbpath)
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   531
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   532
            self.bmp = wx.Bitmap(thumbpath) if have_thumb else None
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   533
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   534
            self.selected_SVG = svgpath if have_thumb else None
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   535
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   536
            self.AnalyseWidgetAndUpdateUI(fname)
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   537
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   538
            self.SetMessage(self.msg)
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
   539
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
   540
            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
   541
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
   542
    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
   543
        self.hmitree_nodes = 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
   544
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
   545
    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
   546
        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
   547
            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
   548
            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
   549
            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
   550
            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
   551
            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
   552
            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
   553
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   554
    def RegenSVGLater(self, when=1):
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   555
        self.SetMessage(_("SVG generation pending"))
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   556
        self.RegenSVGTimer.Start(milliseconds=when*1000, oneShot=True)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   557
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   558
    def RegenSVGNow(self):
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   559
        self.RegenSVGLater(when=0)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   560
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   561
    def RegenSVG(self, event):
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   562
        self.SetMessage(_("Generating SVG..."))
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   563
        args = [arged.GetValue() for arged in self.args_editors]
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   564
        while args and not args[-1]: args.pop(-1)
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   565
        paths = [pathed.GetValue() for pathed in self.paths_editors]
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   566
        while paths and not paths[-1]: paths.pop(-1)
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   567
        if self.RegenSVGLock.acquire(True):
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   568
            self.RegenSVGParams = (args, paths)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   569
            if self.RegenSVGThread is None:
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   570
                self.RegenSVGThread = \
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   571
                    Thread(target=self.RegenSVGProc,
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   572
                           name="RegenSVGThread").start()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   573
            self.RegenSVGLock.release()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   574
        event.Skip()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   575
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   576
    def RegenSVGProc(self):
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   577
        self.RegenSVGLock.acquire(True)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   578
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   579
        newparams = self.RegenSVGParams
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   580
        self.RegenSVGParams = None
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   581
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   582
        while newparams is not None:
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   583
            self.RegenSVGLock.release()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   584
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   585
            res = self.GenDnDSVG(newparams)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   586
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   587
            self.RegenSVGLock.acquire(True)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   588
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   589
            newparams = self.RegenSVGParams
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   590
            self.RegenSVGParams = None
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   591
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   592
        self.RegenSVGThread = None
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   593
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   594
        self.RegenSVGLock.release()
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   595
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   596
        wx.CallAfter(self.DoneRegenSVG)
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
   597
        
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   598
    def DoneRegenSVG(self):
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   599
        self.SetMessage(self.msg if self.msg else _("SVG ready for drag'n'drop"))
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   600
        
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
   601
    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
   602
        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
   603
        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
   604
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
   605
        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
   606
            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
   607
                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
   608
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
   609
            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
   610
                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
   611
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
   612
            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
   613
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
   614
            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
   615
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
   616
            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
   617
                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
   618
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
   619
        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
   620
            self.msg += str(e)
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   621
            return
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
   622
        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
   623
            self.msg += "Widget " + fname + " analysis error: " + e.message
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   624
            return
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
   625
            
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   626
        self.msg += "Widget " + fname + ": OK"
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   627
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   628
        widgets = signature.getroot()
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   629
        widget = widgets.find("widget")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   630
        defs = widget.find("defs")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   631
        # Keep double newlines (to mark paragraphs)
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   632
        widget_desc = widget.find("desc")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   633
        self.desc.SetValue(
3279
5615e062a77d SVGHMI: DnD UI: Use widget's short description, initially forgoten.
Edouard Tisserant
parents: 3274
diff changeset
   634
            fname + ":\n\n" + (
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   635
                _("No description given") if widget_desc is None else 
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   636
                KeepDoubleNewLines(widget_desc.text)
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   637
            ) + "\n\n" +
3279
5615e062a77d SVGHMI: DnD UI: Use widget's short description, initially forgoten.
Edouard Tisserant
parents: 3274
diff changeset
   638
            defs.find("type").text + " Widget: "+defs.find("shortdesc").text+"\n\n" +
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   639
            KeepDoubleNewLines(defs.find("longdesc").text))
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   640
        prefillargs = widget.findall("arg")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   641
        args = defs.findall("arg")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   642
        # extend args description in prefilled args in longer 
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   643
        # (case of variable list of args)
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   644
        if len(prefillargs) < len(args):
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   645
            prefillargs += [None]*(len(args)-len(prefillargs))
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   646
        if args and len(prefillargs) > len(args):
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   647
            # TODO: check ordinality of last arg
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   648
            # TODO: check that only last arg has multiple ordinality
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   649
            args += [args[-1]]*(len(prefillargs)-len(args))
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   650
        self.args_box.Show(len(args)!=0)
3750
f62625418bff automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents: 3609
diff changeset
   651
        for arg, prefillarg in zip(args,prefillargs):
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   652
            self.AddArgToSignature(arg, prefillarg)
3454
0b5ab53007a9 SVGHMI: cosmetic fixes + removed dead code
Edouard Tisserant
parents: 3279
diff changeset
   653
0b5ab53007a9 SVGHMI: cosmetic fixes + removed dead code
Edouard Tisserant
parents: 3279
diff changeset
   654
        # TODO support predefined path count (as for XYGraph)
3259
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   655
        paths = defs.findall("path")
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   656
        self.paths_box.Show(len(paths)!=0)
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   657
        for path in paths:
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   658
            self.AddPathToSignature(path)
76da573569a6 SVGHMI: UI: added prefill of arguments according to values in widget instance in library. Also added library's widget instance description to description field.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3255
diff changeset
   659
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
   660
        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
   661
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   662
    def GetWidgetParams(self, _context):
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   663
        args,paths = self.GenDnDSVGParams
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   664
        root = etree.Element("params")
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   665
        for arg in args:
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   666
            etree.SubElement(root, "arg", value=arg)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   667
        for path in paths:
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   668
            etree.SubElement(root, "path", value=path)
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   669
        return root
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   670
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   671
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   672
    def GenDnDSVG(self, newparams):
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
   673
        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
   674
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   675
        self.GenDnDSVGParams = newparams
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   676
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
   677
        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
   678
            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
   679
            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
   680
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
   681
        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
   682
            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
   683
                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
   684
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
   685
            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
   686
                os.path.join(ScriptDirectory, "gen_dnd_widget_svg.xslt"),
3263
1205b2d0acf2 SVGHMI: DnD UI: Fix SVG gen that was dropping widget name and making XSLTExceptions plus some UX enhancements.
Edouard Tisserant
parents: 3261
diff changeset
   687
                [("GetWidgetParams", self.GetWidgetParams)])
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
   688
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
   689
            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
   690
3261
06ea7a1152af SVGHMI: DnD UI: SVG for DnD now generated again based on paths and args entries filled by user.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3259
diff changeset
   691
            result = transform.transform(svgdom)
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
   692
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
   693
            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
   694
                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
   695
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
   696
            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
   697
            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
   698
            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
   699
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
   700
        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
   701
            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
   702
        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
   703
            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
   704
                
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
   705
    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
   706
        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
   707
            os.unlink(self.tempf.name)
2816
d813ecfe8941 SVGHMI: Added simple HMI Tree View.
Edouard Tisserant
parents: 2815
diff changeset
   708
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
   709
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
   710
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   711
    def __init__(self, parent, controler, register_for_HMI_tree_updates):
2818
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   712
        wx.SplitterWindow.__init__(self, parent,
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   713
                                   style=wx.SUNKEN_BORDER | wx.SP_3D)
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   714
65f32c94d7ec SVGHMI: re-implemented tree view with classic wxTreeCtl
Edouard Tisserant
parents: 2817
diff changeset
   715
        self.SelectionTree = HMITreeSelector(self)
3499
72ee59ff959c SVGHMI: Adapt to Inkscape 0.92 "-e" replaced by "-o" in 1.2, and workaround access right problem when generating thumbnails.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3454
diff changeset
   716
        self.Staging = WidgetLibBrowser(self, controler)
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
   717
        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
   718
        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
   719
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
   720
    def HMITreeUpdate(self, hmi_tree_root):
3880
89549813a6c1 SVGHMI: Fixes UI lifecycle problems
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3818
diff changeset
   721
        if self:
89549813a6c1 SVGHMI: Fixes UI lifecycle problems
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3818
diff changeset
   722
            self.SelectionTree.MakeTree(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
   723
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
   724
    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
   725
        self.Staging.OnHMITreeNodeSelection(hmitree_nodes)