svghmi/ui.py
author Edouard Tisserant <edouard@beremiz.fr>
Tue, 23 Jul 2024 17:05:59 +0200
changeset 3999 1479acf750e2
parent 3913 46ef8be69e8c
permissions -rw-r--r--
MQTT: WIP fix modified status not being set when adding and modifying topics or attributes.

Fix loading of CSV that was not applying model types, and that not checking conformance either.
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)