aboutsummaryrefslogtreecommitdiffstats
path: root/tests/testapplications/elements/content/XmlListModelElement.qml
blob: d69a4f093a0bdc99b0bb0d1eb07e8795ef3db6cd (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
122
123
124
125
126
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

import QtQuick 2.0
import QtQml.XmlListModel

Item {
    id: xmllistmodelelementtest
    anchors.fill: parent
    property string testtext: ""

    XmlListModel { id: xmllistmodelelement
        source: "cookbook.xml"
        query: "/cookbook/recipe"
        XmlListModelRole { name: "title"; elementName: "title" }
        XmlListModelRole { name: "method"; elementName: "method" }
        XmlListModelRole { name: "time"; elementName: "time"; attributeName: "quantity" }
        XmlListModelRole { name: "ingredients"; elementName: "ingredients" }
    }

    ListView {
        id: recipeview
        model: xmllistmodelelement; height: 300; width: 300; clip: true
        anchors.centerIn: parent
        delegate: Component {
            Rectangle { id: delbox; height: 50; width: 296; color: "orange"; border.color: "black"; state: "closed"; clip: true; radius: 5
                anchors.horizontalCenter: parent.horizontalCenter
                Text {
                    id: recipetitle
                    text: model.title; font.pointSize: 12; font.bold: true
                    anchors.horizontalCenter: parent.horizontalCenter; y: 20;
                }

                Text {
                    id: recipetime
                    width: parent.width; height: 20; text: "<b>Time: </b>" +model.time + " minutes"; visible: opacity != 0
                    anchors.horizontalCenter: parent.horizontalCenter; anchors.top: recipetitle.bottom
                    Behavior on opacity { NumberAnimation { duration: 250 } }
                }

                Item {
                    id: ingredientlist
                    visible: opacity != 0
                    width: parent.width
                    height: header.implicitHeight + content.implicitHeight
                    Behavior on opacity { NumberAnimation { duration: 250 } }
                    anchors {
                        horizontalCenter: parent.horizontalCenter
                        top: recipetime.bottom
                        topMargin: 10
                    }
                    Text {
                        id: header
                        text: "<b>Ingredients:</b>"
                    }
                    Text {
                        anchors.top: header.bottom;
                        id: content
                        wrapMode: Text.WordWrap
                        textFormat: Text.MarkdownText
                        width: ingredientlist.width
                        // a bit of regexp to remove unneeded whitespaces
                        text: model.ingredients.replace(/\ +/g,' ')
                    }
                }

                Item {
                    id: recipemethod
                    width: parent.width;
                    height: methodHeader.implicitHeight + methodContent.implicitHeight
                    visible: opacity != 0;
                    anchors {
                        horizontalCenter: parent.horizontalCenter
                        top: ingredientlist.bottom
                    }
                    Text {
                        id: methodHeader
                        text: "<b>Cooking method:</b>"
                    }
                    Text {
                        id: methodContent
                        anchors.top: methodHeader.bottom;
                        wrapMode: Text.WordWrap
                        textFormat: Text.MarkdownText
                        width: recipemethod.width
                        // a bit of regexp to remove unneeded whitespaces
                        text: model.method.replace(/\ +/g,' ')
                    }
                }

                MouseArea { anchors.fill: parent; onClicked: delbox.state = delbox.state == "open" ? "closed" : "open" }
                Behavior on height { NumberAnimation { duration: 250 } }
                states: [
                    State { name: "closed"
                        PropertyChanges { target: delbox; height: 50 }
                        PropertyChanges { target: recipemethod; opacity: 0 }
                        PropertyChanges { target: recipetime; opacity: 0 }
                        PropertyChanges { target: ingredientlist; opacity: 0 }
                    },
                    State { name: "open"
                        PropertyChanges { target: delbox; height: recipemethod.height+recipetime.height+ingredientlist.height+50 }
                        PropertyChanges { target: recipemethod; opacity: 1 }
                        PropertyChanges { target: recipetime; opacity: 1 }
                        PropertyChanges { target: ingredientlist; opacity: 1 }
                        StateChangeScript { script: { recipeview.positionViewAtIndex(model.index, ListView.Beginning); } }
                    }
                ]
            }
        }
    }

    SystemTestHelp { id: helpbubble; visible: statenum != 0
        anchors { top: parent.top; horizontalCenter: parent.horizontalCenter; topMargin: 50 }
        showadvance: false
    }
    BugPanel { id: bugpanel }

    states: [
        State { name: "start"; when: statenum == 1
            PropertyChanges { target: xmllistmodelelementtest
                testtext: "This is a ListView populated by an XmlListModel. Clicking on an item will show the recipe details."
            }
        }
    ]

}