From 452c49a6e238e8069583933acf8a2b8f3ee33c31 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Wed, 30 Sep 2009 13:25:47 +1000 Subject: Allow GridView key navigation to be overridden. Also add GridView example. --- examples/declarative/gridview/gridview.qml | 60 ++++++++ .../declarative/gridview/pics/AddressBook_48.png | Bin 0 -> 3350 bytes .../declarative/gridview/pics/AudioPlayer_48.png | Bin 0 -> 3806 bytes examples/declarative/gridview/pics/Camera_48.png | Bin 0 -> 3540 bytes examples/declarative/gridview/pics/DateBook_48.png | Bin 0 -> 2610 bytes examples/declarative/gridview/pics/EMail_48.png | Bin 0 -> 3655 bytes examples/declarative/gridview/pics/TodoList_48.png | Bin 0 -> 3429 bytes .../declarative/gridview/pics/VideoPlayer_48.png | Bin 0 -> 4151 bytes src/declarative/fx/qfxgridview.cpp | 160 +++++++++++++++------ src/declarative/fx/qfxgridview.h | 6 + src/declarative/fx/qfxlistview.cpp | 12 ++ 11 files changed, 198 insertions(+), 40 deletions(-) create mode 100644 examples/declarative/gridview/gridview.qml create mode 100644 examples/declarative/gridview/pics/AddressBook_48.png create mode 100644 examples/declarative/gridview/pics/AudioPlayer_48.png create mode 100644 examples/declarative/gridview/pics/Camera_48.png create mode 100644 examples/declarative/gridview/pics/DateBook_48.png create mode 100644 examples/declarative/gridview/pics/EMail_48.png create mode 100644 examples/declarative/gridview/pics/TodoList_48.png create mode 100644 examples/declarative/gridview/pics/VideoPlayer_48.png diff --git a/examples/declarative/gridview/gridview.qml b/examples/declarative/gridview/gridview.qml new file mode 100644 index 0000000..2e5110a --- /dev/null +++ b/examples/declarative/gridview/gridview.qml @@ -0,0 +1,60 @@ +import Qt 4.6 + +Rectangle { + width: 300; height: 400; color: "white" + + ListModel { + id: AppModel + ListElement { + name: "Music" + icon: "AudioPlayer_48.png" + } + ListElement { + name: "Movies" + icon: "VideoPlayer_48.png" + } + ListElement { + name: "Camera" + icon: "Camera_48.png" + } + ListElement { + name: "Calendar" + icon: "DateBook_48.png" + } + ListElement { + name: "Messaging" + icon: "EMail_48.png" + } + ListElement { + name: "Todo List" + icon: "TodoList_48.png" + } + ListElement { + name: "Contacts" + icon: "AddressBook_48.png" + } + } + + Component { + id: AppDelegate + Item { + width: 100; height: 100 + Image { id: Icon; y: 20; anchors.horizontalCenter: parent.horizontalCenter; source: icon } + Text { anchors.top: Icon.bottom; anchors.horizontalCenter: parent.horizontalCenter; text: name } + } + } + + Component { + id: AppHighlight + Rectangle { width: 80; height: 80; color: "#FFFF88" } + } + + GridView { + id: List1 + anchors.fill: parent + cellWidth: 100; cellHeight: 100 + model: AppModel; delegate: AppDelegate + highlight: AppHighlight + focus: true + } +} diff --git a/examples/declarative/gridview/pics/AddressBook_48.png b/examples/declarative/gridview/pics/AddressBook_48.png new file mode 100644 index 0000000..1ab7c8e Binary files /dev/null and b/examples/declarative/gridview/pics/AddressBook_48.png differ diff --git a/examples/declarative/gridview/pics/AudioPlayer_48.png b/examples/declarative/gridview/pics/AudioPlayer_48.png new file mode 100644 index 0000000..f4b8689 Binary files /dev/null and b/examples/declarative/gridview/pics/AudioPlayer_48.png differ diff --git a/examples/declarative/gridview/pics/Camera_48.png b/examples/declarative/gridview/pics/Camera_48.png new file mode 100644 index 0000000..c76b524 Binary files /dev/null and b/examples/declarative/gridview/pics/Camera_48.png differ diff --git a/examples/declarative/gridview/pics/DateBook_48.png b/examples/declarative/gridview/pics/DateBook_48.png new file mode 100644 index 0000000..58f5787 Binary files /dev/null and b/examples/declarative/gridview/pics/DateBook_48.png differ diff --git a/examples/declarative/gridview/pics/EMail_48.png b/examples/declarative/gridview/pics/EMail_48.png new file mode 100644 index 0000000..d6d84a6 Binary files /dev/null and b/examples/declarative/gridview/pics/EMail_48.png differ diff --git a/examples/declarative/gridview/pics/TodoList_48.png b/examples/declarative/gridview/pics/TodoList_48.png new file mode 100644 index 0000000..0988448 Binary files /dev/null and b/examples/declarative/gridview/pics/TodoList_48.png differ diff --git a/examples/declarative/gridview/pics/VideoPlayer_48.png b/examples/declarative/gridview/pics/VideoPlayer_48.png new file mode 100644 index 0000000..52638c5 Binary files /dev/null and b/examples/declarative/gridview/pics/VideoPlayer_48.png differ diff --git a/src/declarative/fx/qfxgridview.cpp b/src/declarative/fx/qfxgridview.cpp index 1095dc1..3bfc799 100644 --- a/src/declarative/fx/qfxgridview.cpp +++ b/src/declarative/fx/qfxgridview.cpp @@ -593,11 +593,11 @@ void QFxGridViewPrivate::createHighlight() highlight = new FxGridItem(item, q); highlightXAnimator = new QmlEaseFollow(q); highlightXAnimator->setTarget(QmlMetaProperty(highlight->item, QLatin1String("x"))); - highlightXAnimator->setVelocity(400); + highlightXAnimator->setDuration(150); highlightXAnimator->setEnabled(autoHighlight); highlightYAnimator = new QmlEaseFollow(q); highlightYAnimator->setTarget(QmlMetaProperty(highlight->item, QLatin1String("y"))); - highlightYAnimator->setVelocity(400); + highlightYAnimator->setDuration(150); highlightYAnimator->setEnabled(autoHighlight); } else { delete highlightContext; @@ -1064,54 +1064,134 @@ qreal QFxGridView::maxXExtent() const Q_D(const QFxGridView); if (d->flow == QFxGridView::LeftToRight) return QFxFlickable::maxXExtent(); - return -(d->endPosition() - height()); + return -(d->endPosition() - width()); } void QFxGridView::keyPressEvent(QKeyEvent *event) { Q_D(QFxGridView); + QFxFlickable::keyPressEvent(event); + if (event->isAccepted()) + return; + if (d->model && d->model->count() && d->interactive) { - if ((d->flow == QFxGridView::LeftToRight && event->key() == Qt::Key_Up) - || (d->flow == QFxGridView::TopToBottom && event->key() == Qt::Key_Left)) { - if (currentIndex() >= d->columns || d->wrap) { - d->moveReason = QFxGridViewPrivate::Key; - int index = currentIndex() - d->columns; - setCurrentIndex(index >= 0 ? index : d->model->count()-1); - event->accept(); - return; - } - } else if ((d->flow == QFxGridView::LeftToRight && event->key() == Qt::Key_Down) - || (d->flow == QFxGridView::TopToBottom && event->key() == Qt::Key_Right)) { - if (currentIndex() < d->model->count() - d->columns || d->wrap) { - d->moveReason = QFxGridViewPrivate::Key; - int index = currentIndex()+d->columns; - setCurrentIndex(index < d->model->count() ? index : 0); - event->accept(); - return; - } - } else if ((d->flow == QFxGridView::LeftToRight && event->key() == Qt::Key_Left) - || (d->flow == QFxGridView::TopToBottom && event->key() == Qt::Key_Up)) { - if (currentIndex() > 0 || d->wrap) { - d->moveReason = QFxGridViewPrivate::Key; - int index = currentIndex() - 1; - setCurrentIndex(index >= 0 ? index : d->model->count()-1); - event->accept(); - return; - } - } else if ((d->flow == QFxGridView::LeftToRight && event->key() == Qt::Key_Right) - || (d->flow == QFxGridView::TopToBottom && event->key() == Qt::Key_Down)) { - if (currentIndex() < d->model->count() - 1 || d->wrap) { - d->moveReason = QFxGridViewPrivate::Key; - int index = currentIndex() + 1; - setCurrentIndex(index < d->model->count() ? index : 0); - event->accept(); - return; - } + d->moveReason = QFxGridViewPrivate::Key; + int oldCurrent = currentIndex(); + switch (event->key()) { + case Qt::Key_Up: + moveCurrentIndexUp(); + break; + case Qt::Key_Down: + moveCurrentIndexDown(); + break; + case Qt::Key_Left: + moveCurrentIndexLeft(); + break; + case Qt::Key_Right: + moveCurrentIndexRight(); + break; + default: + break; + } + if (oldCurrent != currentIndex()) { + event->accept(); + return; } } d->moveReason = QFxGridViewPrivate::Other; event->ignore(); - QFxFlickable::keyPressEvent(event); +} + +/*! + \qmlmethod GridView::moveCurrentIndexUp + + Move the currentIndex up one item in the view. + The current index will wrap if keyNavigationWraps is true and it + is currently at the end. +*/ +void QFxGridView::moveCurrentIndexUp() +{ + Q_D(QFxGridView); + if (d->flow == QFxGridView::LeftToRight) { + if (currentIndex() >= d->columns || d->wrap) { + int index = currentIndex() - d->columns; + setCurrentIndex(index >= 0 ? index : d->model->count()-1); + } + } else { + if (currentIndex() > 0 || d->wrap) { + int index = currentIndex() - 1; + setCurrentIndex(index >= 0 ? index : d->model->count()-1); + } + } +} + +/*! + \qmlmethod GridView::moveCurrentIndexDown + + Move the currentIndex down one item in the view. + The current index will wrap if keyNavigationWraps is true and it + is currently at the end. +*/ +void QFxGridView::moveCurrentIndexDown() +{ + Q_D(QFxGridView); + if (d->flow == QFxGridView::LeftToRight) { + if (currentIndex() < d->model->count() - d->columns || d->wrap) { + int index = currentIndex()+d->columns; + setCurrentIndex(index < d->model->count() ? index : 0); + } + } else { + if (currentIndex() < d->model->count() - 1 || d->wrap) { + int index = currentIndex() + 1; + setCurrentIndex(index < d->model->count() ? index : 0); + } + } +} + +/*! + \qmlmethod GridView::moveCurrentIndexLeft + + Move the currentIndex left one item in the view. + The current index will wrap if keyNavigationWraps is true and it + is currently at the end. +*/ +void QFxGridView::moveCurrentIndexLeft() +{ + Q_D(QFxGridView); + if (d->flow == QFxGridView::LeftToRight) { + if (currentIndex() > 0 || d->wrap) { + int index = currentIndex() - 1; + setCurrentIndex(index >= 0 ? index : d->model->count()-1); + } + } else { + if (currentIndex() >= d->columns || d->wrap) { + int index = currentIndex() - d->columns; + setCurrentIndex(index >= 0 ? index : d->model->count()-1); + } + } +} + +/*! + \qmlmethod GridView::moveCurrentIndexRight + + Move the currentIndex right one item in the view. + The current index will wrap if keyNavigationWraps is true and it + is currently at the end. +*/ +void QFxGridView::moveCurrentIndexRight() +{ + Q_D(QFxGridView); + if (d->flow == QFxGridView::LeftToRight) { + if (currentIndex() < d->model->count() - 1 || d->wrap) { + int index = currentIndex() + 1; + setCurrentIndex(index < d->model->count() ? index : 0); + } + } else { + if (currentIndex() < d->model->count() - d->columns || d->wrap) { + int index = currentIndex()+d->columns; + setCurrentIndex(index < d->model->count() ? index : 0); + } + } } void QFxGridView::componentComplete() diff --git a/src/declarative/fx/qfxgridview.h b/src/declarative/fx/qfxgridview.h index 996141f..08a7565 100644 --- a/src/declarative/fx/qfxgridview.h +++ b/src/declarative/fx/qfxgridview.h @@ -112,6 +112,12 @@ public: static QFxGridViewAttached *qmlAttachedProperties(QObject *); +public Q_SLOTS: + void moveCurrentIndexUp(); + void moveCurrentIndexDown(); + void moveCurrentIndexLeft(); + void moveCurrentIndexRight(); + Q_SIGNALS: void countChanged(); void currentIndexChanged(); diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp index 3584892..71fa2ea 100644 --- a/src/declarative/fx/qfxlistview.cpp +++ b/src/declarative/fx/qfxlistview.cpp @@ -1372,6 +1372,12 @@ void QFxListView::keyPressEvent(QKeyEvent *event) event->ignore(); } +/*! + \qmlmethod ListView::incrementCurrentIndex + + Increments the current index. The current index will wrap + if keyNavigationWraps is true and it is currently at the end. +*/ void QFxListView::incrementCurrentIndex() { Q_D(QFxListView); @@ -1381,6 +1387,12 @@ void QFxListView::incrementCurrentIndex() } } +/*! + \qmlmethod ListView::decrementCurrentIndex + + Decrements the current index. The current index will wrap + if keyNavigationWraps is true and it is currently at the beginning. +*/ void QFxListView::decrementCurrentIndex() { Q_D(QFxListView); -- cgit v0.12