-
-
Save mottosso/12778c6a388d041d6199 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import QtQuick 1.1 | |
Item { | |
width: 200 | |
height: 300 | |
ListView { | |
anchors.fill: parent | |
model: nestedModel | |
delegate: categoryDelegate | |
} | |
ListModel { | |
id: nestedModel | |
ListElement { | |
categoryName: "Veggies" | |
collapsed: true | |
// A ListElement can't contain child elements, but it can contain | |
// a list of elements. A list of ListElements can be used as a model | |
// just like any other model type. | |
subItems: [ | |
ListElement { itemName: "Tomato" }, | |
ListElement { itemName: "Cucumber" }, | |
ListElement { itemName: "Onion" }, | |
ListElement { itemName: "Brains" } | |
] | |
} | |
ListElement { | |
categoryName: "Fruits" | |
collapsed: true | |
subItems: [ | |
ListElement { itemName: "Orange" }, | |
ListElement { itemName: "Apple" }, | |
ListElement { itemName: "Pear" }, | |
ListElement { itemName: "Lemon" } | |
] | |
} | |
ListElement { | |
categoryName: "Cars" | |
collapsed: true | |
subItems: [ | |
ListElement { itemName: "Nissan" }, | |
ListElement { itemName: "Toyota" }, | |
ListElement { itemName: "Chevy" }, | |
ListElement { itemName: "Audi" } | |
] | |
} | |
} | |
Component { | |
id: categoryDelegate | |
Column { | |
width: 200 | |
Rectangle { | |
id: categoryItem | |
border.color: "black" | |
border.width: 5 | |
color: "white" | |
height: 50 | |
width: 200 | |
Text { | |
anchors.verticalCenter: parent.verticalCenter | |
x: 15 | |
font.pixelSize: 24 | |
text: categoryName | |
} | |
Rectangle { | |
color: "red" | |
width: 30 | |
height: 30 | |
anchors.right: parent.right | |
anchors.rightMargin: 15 | |
anchors.verticalCenter: parent.verticalCenter | |
MouseArea { | |
anchors.fill: parent | |
// Toggle the 'collapsed' property | |
onClicked: nestedModel.setProperty(index, "collapsed", !collapsed) | |
} | |
} | |
} | |
Loader { | |
id: subItemLoader | |
// This is a workaround for a bug/feature in the Loader element. If sourceComponent is set to null | |
// the Loader element retains the same height it had when sourceComponent was set. Setting visible | |
// to false makes the parent Column treat it as if it's height was 0. | |
visible: !collapsed | |
property variant subItemModel : subItems | |
sourceComponent: collapsed ? null : subItemColumnDelegate | |
onStatusChanged: if (status == Loader.Ready) item.model = subItemModel | |
} | |
} | |
} | |
Component { | |
id: subItemColumnDelegate | |
Column { | |
property alias model : subItemRepeater.model | |
width: 200 | |
Repeater { | |
id: subItemRepeater | |
delegate: Rectangle { | |
color: "#cccccc" | |
height: 40 | |
width: 200 | |
border.color: "black" | |
border.width: 2 | |
Text { | |
anchors.verticalCenter: parent.verticalCenter | |
x: 30 | |
font.pixelSize: 18 | |
text: itemName | |
} | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment