Smileys in the grid
Another useful view element is the GridView. The GridView element will display the model items in a cell grid. A typical GridView declaration is shown below:
GridView {
id: gridView
model: gridModel
delegate: gridDelegate
cellHeight: 100
cellWidth: 150
}
We need to add two properties: cellHeight and cellWidth to define the cell size. Otherwise the usage is similar to the ListView element. We can also use the same model, e.g. a string list.
Let’s create a new application with GridView. Let’s take the smiley icon example from the previous post and replace the ListView element with GridView.
The main.qml file is basically the same as in the ListView app.
import QtQuick 1.1
import com.nokia.meego 1.0
PageStackWindow {
id: appWindow
property string iconPrefix: "icon-m-messaging-smiley-"
property string iconNames: "angry;cool;cry;evil;grin;happy;heart;kiss;lips-sealed;sad;sarcastic;skeptical;sleepy;surprised;tongue;very-happy;wink;worried"
property string iconSelected: "angry"
initialPage: gridPage
GridPage {
id: gridPage
}
IconPage {
id: iconPage
}
ToolBarLayout {
id: commonTools
visible: true
ToolIcon {
platformIconId: "toolbar-view-menu"
anchors.right: (parent === undefined) ? undefined : parent.right
onClicked: (myMenu.status === DialogStatus.Closed) ? myMenu.open() : myMenu.close()
}
}
Menu {
id: myMenu
visualParent: pageStack
MenuLayout {
MenuItem { text: qsTr("Sample menu item") }
}
}
}
The GridView element is placed into the file GridPage.qml. The model and delegate properties are used in a same way as in the ListView element. The delegate component is a simple rectangle (with a gradient fill) containing the icon name. When the icon name is clicked the IconPage will be displayed.
import QtQuick 1.1
import com.nokia.meego 1.0
Page {
tools: commonTools
Label {
id:title
text: "Please select an icon"
font.pixelSize: 40
anchors.left: parent.left; anchors.leftMargin: leftMargin
}
Rectangle {
id: background
anchors.top: title.bottom
height: parent.height-title.height;
width: parent.width
}
GridView {
id: listView
model: iconNames.split(";")
delegate: gridDelegate
cellHeight: 100
cellWidth: 150
anchors.top: background.top
anchors.topMargin: 20
anchors.left: background.left
anchors.leftMargin: 20
width: background.width-30
height: background.height-10
clip: true
}
Component {
id: gridDelegate
Rectangle {
width: 140
height: 100
gradient: Gradient {
GradientStop { position: 0.0; color: "white"}
GradientStop { position: 1.0; color: "gray"}
}
Text {
text: modelData
font.pixelSize: 28
color: "steelblue"
anchors.centerIn: parent
MouseArea {
anchors.fill: parent
onClicked: {
iconSelected=modelData
pageStack.push(iconPage)
}
}
}
}
}
}
The IconPage is the same as in the ListView example.
import QtQuick 1.1
import com.nokia.meego 1.0
Page {
Item {
id: item
anchors.centerIn: parent
width: parent.width; height: 100
Image {
anchors.centerIn: parent
source: "image://theme/"+iconPrefix+iconSelected
}
}
Label {
id:label
anchors.top: item.bottom
anchors.horizontalCenter: parent.horizontalCenter
text: iconSelected
}
tools: ToolBarLayout {
id: iconTools
visible: true
ToolIcon {
platformIconId: "toolbar-back"
anchors.left: parent.left
onClicked: pageStack.pop()
}
}
}
If we compile and run the app the result should look like follows:
With our chosen cell size we will get a grid consisting of 3 columns in the portrait mode. In the landscape mode the grid will adjust automatically. All cells do not fit into the landscape display but the GridView can be scrolled just like the ListView.
Let’s save the example into GitHub as TestApp6. You can open the source code from the address:
https://github.com/n9dyfi/TestApp6.git

