Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
- import QtQuick 1.1
- ListView {
- id: container
- property bool handleKey_Home: true
- property bool numberKeyNavigation: true
- property string skipProperty: ""
- property string hideProperty: ""
- property bool keyInteractive: true
- property bool overloaded: container.contentHeight > container.height
- signal currentIndexChangedByNumberKey()
- signal upKeyLimit()
- signal downKeyLimit()
- signal topKeyLimit()
- signal bottomKeyLimit()
- interactive: false
- function getNextAvailable(ind, forward) {
- var i = ind
- while (true) {
- if (forward) {
- if (i >= count-1)
- break
- ++i
- } else {
- if (i <= 0)
- break
- --i
- }
- if (getIsItemAvailable(i))
- return i
- }
- return ind
- }
- function getIsItemAvailable(ind) {
- if (ind < 0 || ind > count-1)
- return false
- if (skipProperty === "" || model.children[ind][skipProperty] === undefined)
- return true
- return !model.children[ind][skipProperty]
- }
- function getIsItemVisible(ind) {
- if (ind < 0 || ind > count-1)
- return false
- if (hideProperty === "" || model.children[ind][hideProperty] === undefined)
- return true
- return !model.children[ind][hideProperty]
- }
- Keys.onPressed: {
- if (!keyInteractive)
- return
- switch (event.key) {
- case Qt.Key_Up:
- if (orientation !== Qt.Vertical) return;
- if (!tryNavigateUp()) return;
- break;
- case Qt.Key_Left:
- if (orientation !== Qt.Horizontal) return;
- if (!tryNavigateUp()) return;
- break;
- case Qt.Key_PageUp:
- if (!tryNavigateTop()) return;
- break;
- case Qt.Key_Home:
- if (!handleKey_Home) return
- // in any case we stop "Home" propagation
- event.accepted = true;
- if (!tryNavigateTop()) return;
- break;
- case Qt.Key_Down:
- if (orientation !== Qt.Vertical) return;
- if (!tryNavigateDown()) return;
- break;
- case Qt.Key_Right:
- if (orientation !== Qt.Horizontal) return;
- if (!tryNavigateDown()) return;
- break;
- case Qt.Key_PageDown:
- case Qt.Key_End:
- case Qt.Key_Tab:
- if (!tryNavigateBottom()) return;
- break;
- case Qt.Key_1:
- case Qt.Key_2:
- case Qt.Key_3:
- case Qt.Key_4:
- case Qt.Key_5:
- case Qt.Key_6:
- case Qt.Key_7:
- case Qt.Key_8:
- case Qt.Key_9:
- if (!numberKeyNavigation)
- return
- if (event.key < Qt.Key_1 || event.key >= Qt.Key_1 + count)
- return
- var needPageIndex = event.key - Qt.Key_1
- needPageIndex = getIndexAvailable(needPageIndex)
- if (!getIsItemAvailable(needPageIndex))
- return
- positionViewAtIndex(needPageIndex, ListView.Contain)
- currentIndex = needPageIndex
- currentIndexChangedByNumberKey()
- break;
- default:
- return
- }
- event.accepted = true;
- }
- function tryNavigateUp() {
- if (currentIndex <= 0) return false
- var newIndex = getNextAvailable(currentIndex, false)
- if (newIndex === currentIndex) {
- upKeyLimit()
- return false
- }
- currentIndex = newIndex
- return true
- }
- function tryNavigateDown() {
- if (currentIndex >= count-1) return false
- var newIndex = getNextAvailable(currentIndex, true)
- if (newIndex === currentIndex) {
- downKeyLimit()
- return false
- }
- currentIndex = newIndex
- return true
- }
- function tryNavigateTop() {
- // if (currentIndex <= 0) return false
- var newIndex = getNextAvailable(-1, true)
- // if (newIndex === currentIndex)
- topKeyLimit()
- currentIndex = newIndex
- return true
- }
- function tryNavigateBottom() {
- // if (currentIndex >= count-1) return false
- var newIndex = getNextAvailable(count, false)
- // if (newIndex === currentIndex)
- bottomKeyLimit()
- currentIndex = newIndex
- return true
- }
- function getIndexAvailable(ind) {
- var i = -1
- var result = -1
- while (i < ind) {
- ++result
- while (!getIsItemVisible(result) && result < count) {
- ++result
- }
- if (result >= count)
- break
- ++i
- }
- if (result >= count)
- result = -1
- return result
- }
- Component.onCompleted: {
- if (!getIsItemAvailable(currentIndex)) {
- currentIndex = getNextAvailable(currentIndex, true)
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement