summaryrefslogtreecommitdiffstats
path: root/examples/charts/qmlgallery/qml/customlegend/CustomLegend.qml
blob: 229fb834d8c7adc355c6a84b3398941413e1c69a (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
115
116
117
118
119
120
121
// Copyright (C) 20236 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

pragma ComponentBehavior: Bound
import QtQuick

Rectangle {
    id: legend
    color: "lightgray"

    property int seriesCount: 0
    property variant seriesNames: []
    property variant seriesColors: []

    signal entered(string seriesName)
    signal exited(string seriesName)
    signal selected(string seriesName)

    function addSeries(seriesName, color) {
        var names = seriesNames;
        names[seriesCount] = seriesName;
        seriesNames = names;

        var colors = seriesColors;
        colors[seriesCount] = color;
        seriesColors = colors;

        seriesCount++;
    }

    Gradient {
        id: buttonGradient
        GradientStop { position: 0.0; color: "#F0F0F0" }
        GradientStop { position: 1.0; color: "#A0A0A0" }
    }

    Gradient {
        id: buttonGradientHovered
        GradientStop { position: 0.0; color: "#FFFFFF" }
        GradientStop { position: 1.0; color: "#B0B0B0" }
    }

    //![2]
    Component {
        id: legendDelegate
        Rectangle {
            id: rect
    //![2]
            property string name: legend.seriesNames[DelegateModel.itemsIndex]
            property color markerColor: legend.seriesColors[DelegateModel.itemsIndex]

            gradient: buttonGradient
            border.color: "#A0A0A0"
            border.width: 1
            radius: 4

            implicitWidth: label.implicitWidth + marker.implicitWidth + 30
            implicitHeight: label.implicitHeight + marker.implicitHeight + 10

            Row {
                id: row
                spacing: 5
                anchors.verticalCenter: parent.verticalCenter
                anchors.left: parent.left
                anchors.leftMargin: 5
                Rectangle {
                    id: marker
                    anchors.verticalCenter: parent.verticalCenter
                    color: rect.markerColor
                    opacity: 0.3
                    radius: 4
                    width: 12
                    height: 10
                }
                Text {
                    id: label
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.verticalCenterOffset: -1
                    text: rect.name
                }
            }

    //![3]
            MouseArea {
                id: mouseArea
                anchors.fill: parent
                hoverEnabled: true
                onEntered: {
                    rect.gradient = buttonGradientHovered;
                    legend.entered(label.text);
                }
                onExited: {
                    rect.gradient = buttonGradient;
                    legend.exited(label.text);
                    marker.opacity = 0.3;
                    marker.height = 10;
                }
                onClicked: {
                    legend.selected(label.text);
                    marker.opacity = 1.0;
                    marker.height = 12;
                }
            }
    //![3]
        }
    }

    //![1]
    Row {
        id: legendRow
        anchors.centerIn: parent
        spacing: 10

        Repeater {
            id: legendRepeater
            model: legend.seriesCount
            delegate: legendDelegate
        }
    }
    //![1]
}