diff --git a/src/activities/memory/MemoryCommon.qml b/src/activities/memory/MemoryCommon.qml --- a/src/activities/memory/MemoryCommon.qml +++ b/src/activities/memory/MemoryCommon.qml @@ -49,6 +49,7 @@ signal stop property alias items: items + property bool keyNavigationVisible: false Component.onCompleted: { activity.start.connect(start) @@ -68,10 +69,12 @@ property int playerScore: playerScore.text property var dataset: activity.dataset property alias containerModel: containerModel - property alias cardRepeater: cardRepeater + property alias cardRepeater: grid property alias grid: grid + property bool blockClicks: false property int columns property int rows + property int spacing: 5 * ApplicationInfo.ratio } onStart: Activity.start(items) @@ -82,30 +85,41 @@ id: containerModel } - Grid { + + GridView { id: grid - spacing: 5 * ApplicationInfo.ratio - columns: items.columns - rows: items.rows + width: background.width - (items.columns + 1) * items.spacing - 10 * ApplicationInfo.ratio + height: background.height - (items.rows + 1) * items.spacing - 10 * ApplicationInfo.ratio + cellWidth: (background.width - (items.columns + 1) * items.spacing) / items.columns - 10 * ApplicationInfo.ratio + cellHeight: (background.height - (items.rows + 1) * items.spacing) / (items.rows + 0.5) - 10 * ApplicationInfo.ratio anchors { left: background.left right: background.right top: background.top + bottom: background.bottom margins: 10 * ApplicationInfo.ratio } - Repeater { - id: cardRepeater - model: containerModel - - delegate: CardItem { - pairData: pairData_ - tuxTurn: background.items.tuxTurn - width: (background.width - (grid.columns + 1) * grid.spacing) / grid.columns - height: (background.height - (grid.rows + 1) * grid.spacing) / (grid.rows + 0.5) - audioVoices: activity.audioVoices - audioEffects: activity.audioEffects - } + model: containerModel + + delegate: CardItem { + pairData: pairData_ + tuxTurn: background.items.tuxTurn + width: (background.width - (items.columns + 1) * items.spacing) / items.columns - 15 * ApplicationInfo.ratio + height: (background.height - (items.rows + 1) * items.spacing) / (items.rows + 0.5) - 15 * ApplicationInfo.ratio + audioVoices: activity.audioVoices + audioEffects: activity.audioEffects + onIsFoundChanged: background.keyNavigationVisible = false + } + interactive: false + keyNavigationWraps: true + highlightFollowsCurrentItem: true + highlight: Rectangle { + color: "#AAFFFFFF" + radius: 10 + visible: background.keyNavigationVisible + Behavior on x { SpringAnimation { spring: 2; damping: 0.2 } } + Behavior on y { SpringAnimation { spring: 2; damping: 0.2 } } } add: Transition { PathAnimation { @@ -190,6 +204,25 @@ interval: 2000 Component.onCompleted: win.connect(Activity.nextLevel) } + + Keys.enabled: !items.blockClicks + Keys.onPressed: { + background.keyNavigationVisible = true + if(event.key === Qt.Key_Left) + grid.moveCurrentIndexLeft() + while(grid.currentItem.isFound) grid.moveCurrentIndexLeft() // skip the highlight on the already found cards + if(event.key === Qt.Key_Right) + grid.moveCurrentIndexRight() + while(grid.currentItem.isFound) grid.moveCurrentIndexRight() // skip the highlight on the already found cards + if(event.key === Qt.Key_Up) + grid.moveCurrentIndexUp() + while(grid.currentItem.isFound) grid.moveCurrentIndexUp() // skip the highlight on the already found cards + if(event.key === Qt.Key_Down) + grid.moveCurrentIndexDown() + while(grid.currentItem.isFound) grid.moveCurrentIndexDown() // skip the highlight on the already found cards + if(event.key === Qt.Key_Space || event.key === Qt.Key_Enter || event.key === Qt.Key_Return) + if(grid.currentItem.isBack && !grid.currentItem.isFound && !grid.currentItem.tuxTurn && items.selectionCount < 2) grid.currentItem.selected() + } } } diff --git a/src/activities/memory/memory.js b/src/activities/memory/memory.js --- a/src/activities/memory/memory.js +++ b/src/activities/memory/memory.js @@ -51,6 +51,7 @@ items.playQueue = [] items.tuxTurn = false items.selectionCount = 0 + items.blockClicks = false // compute the number of cards var columns = items.dataset[currentLevel].columns @@ -112,11 +113,15 @@ // Return a pair of cards that have already been shown function getShownPair() { - + var columns = items.dataset[currentLevel].columns for(var i = 0; i < nbOfPair * 2; ++i) { - var cardItem1 = items.cardRepeater.itemAt(i) + var xi = (i % columns) * items.grid.cellWidth + items.grid.anchors.margins + var yi = (i / columns) * items.grid.cellHeight + items.grid.anchors.margins + var cardItem1 = items.cardRepeater.itemAt(xi, yi) for(var j = 0; j < nbOfPair * 2; ++j) { - var cardItem2 = items.cardRepeater.itemAt(j) + var xj = (j % columns) * items.grid.cellWidth + items.grid.anchors.margins + var yj = (j / columns) * items.grid.cellHeight + items.grid.anchors.margins + var cardItem2 = items.cardRepeater.itemAt(xj, yj) if(i != j && !cardItem1.isFound && cardItem1.isShown && @@ -153,10 +158,13 @@ // If no pairs shown select a random card var listCardNonReturned = [] + var columns = items.dataset[currentLevel].columns for(var i = 0; i < cardList.length; ++i) { - if (items.cardRepeater.itemAt(i).isFound == false && - items.cardRepeater.itemAt(i).isBack) - listCardNonReturned.push(items.cardRepeater.itemAt(i)) + var x = (i % columns) * items.grid.cellWidth + items.grid.anchors.margins + var y = (i / columns) * items.grid.cellHeight + items.grid.anchors.margins + if (items.cardRepeater.itemAt(x, y).isFound == false && + items.cardRepeater.itemAt(x, y).isBack) + listCardNonReturned.push(items.cardRepeater.itemAt(x, y)) } //select randomly a card in it @@ -226,10 +234,12 @@ function youWon() { + items.blockClicks = true items.bonus.good("flower") } function youLoose(){ + items.blockClicks = true items.bonus.bad("flower") if (items.withTux){ initLevel()