summaryrefslogtreecommitdiffstats
path: root/framework/qml/SelectableItem.qml
blob: feb70d8bdc6319329e98a68ac03f5effb093e496 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
 *  Copyright (C) 2017 Michael Bohlender, <bohlender@kolabsys.com>
 *  Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsys.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

import QtQuick 2.7
import QtQuick.Controls 2.2
import org.kube.framework 1.0 as Kube
import QtQuick.Layouts 1.3

QtObject {
    id: root
    property string text: null
    property var layout: null
    property var visualParent: layout.parent
    onVisualParentChanged: {
        component.createObject(visualParent)
    }

    property var comp: Component {
        id: component
        Item {
            anchors.fill: layout

            /**
             * This assumes a layout filled with labels.
             * We iterate over all elements, extract the text, insert a linebreak after every line and a space otherwise.
             */
            function gatherText() {
                var gatheredText = "";
                var length = layout.visibleChildren.length
                for (var i = 0; i < length; i++) {
                    var item = layout.visibleChildren[i]

                    if (item && item.text) {
                        gatheredText += item.text;
                    }
                    if (layout.columns && (((i + 1) % layout.columns) == 0)) {
                        gatheredText += "\n";
                    } else if (i != length - 1){
                        gatheredText += " ";
                    }
                }
                // console.warn("Gathered text: ", gatheredText)
                return gatheredText
            }

            Rectangle {
                anchors.fill: parent
                color: "transparent"
                border.color: Kube.Colors.highlightColor
                border.width: 1
                visible: mouseArea.containsMouse || menu.visible
            }
            MouseArea {
                id: mouseArea
                anchors.fill: parent
                hoverEnabled: true
                acceptedButtons: Qt.RightButton
                z: 1
                onClicked: {
                    menu.x = mouseX
                    menu.y = mouseY
                    menu.open()
                    mouse.accepted = true
                }
            }
            Menu {
                id: menu

                height: menuLayout.height
                width: menuLayout.width
                background: Rectangle {
                    anchors.fill: parent
                    color: Kube.Colors.backgroundColor
                }
                RowLayout {
                    id: menuLayout
                    width: button.width
                    height: button.height
                    Kube.TextButton {
                        id: button
                        text: "Copy"
                        onClicked: {
                            if (root.text) {
                                clipboard.text = root.text
                            } else {
                                clipboard.text = gatherText()
                            }
                            menu.close()
                        }
                    }
                }
                Kube.Clipboard {
                    id: clipboard
                }
            }
        }
    }
}