Warning, /education/gcompris/src/activities/sudoku/Sudoku.qml is written in an unsupported language. File is not indexed.
0001 /* gcompris - Sudoku.qml
0002
0003 SPDX-FileCopyrightText: 2014 Johnny Jazeix <jazeix@gmail.com>
0004
0005 2003, 2014: Bruno Coudoin: initial version
0006 2014: Johnny Jazeix: Qt port
0007
0008 SPDX-License-Identifier: GPL-3.0-or-later
0009 */
0010
0011 import QtQuick 2.12
0012 import GCompris 1.0
0013
0014 import "../../core"
0015 import "sudoku.js" as Activity
0016 import "."
0017
0018 ActivityBase {
0019 id: activity
0020 focus: true
0021
0022 onStart: { focus = true; }
0023 onStop: {}
0024
0025 pageComponent: Image {
0026 id: background
0027 anchors.fill: parent
0028 source: Activity.url + "background.svg"
0029 sourceSize.width: width
0030 sourceSize.height: height
0031 fillMode: Image.PreserveAspectCrop
0032
0033 signal start
0034 signal stop
0035
0036 property double baseMargins: 10 * ApplicationInfo.ratio
0037 property double activityLayoutHeight: height - bar.height * 1.5
0038 property bool isHorizontalLayout: width >= activityLayoutHeight
0039
0040 Component.onCompleted: {
0041 dialogActivityConfig.initialize()
0042 activity.start.connect(start)
0043 activity.stop.connect(stop)
0044 focus = true
0045 }
0046
0047 property int nbRegions
0048
0049 QtObject {
0050 id: items
0051 property alias background: background
0052 property int currentLevel: activity.currentLevel
0053 property alias bonus: bonus
0054 property alias score: score
0055 property GCSfx audioEffects: activity.audioEffects
0056 property alias availablePiecesModel: availablePieces
0057 property alias columns: sudoColumn.columns
0058 property alias rows: sudoColumn.rows
0059 property alias sudokuModel: sudokuModel
0060 readonly property var levels: activity.datasetLoader.data
0061 property bool buttonsBlocked: false
0062 }
0063 onStart: Activity.start(items)
0064
0065 onStop: { Activity.stop() }
0066
0067 DialogHelp {
0068 id: dialogHelp
0069 onClose: home()
0070 }
0071
0072 DialogChooseLevel {
0073 id: dialogActivityConfig
0074 currentActivity: activity.activityInfo
0075 onClose: {
0076 home()
0077 }
0078
0079 onSaveData: {
0080 levelFolder = dialogActivityConfig.chosenLevels
0081 currentActivity.currentLevels = dialogActivityConfig.chosenLevels
0082 ApplicationSettings.setCurrentLevels(currentActivity.name, dialogActivityConfig.chosenLevels)
0083 }
0084
0085 onStartActivity: {
0086 background.stop()
0087 background.start()
0088 }
0089 }
0090
0091 Bar {
0092 id: bar
0093 level: items.currentLevel + 1
0094 content: BarEnumContent { value: help | home | level | reload | activityConfig }
0095 onHelpClicked: {
0096 displayDialog(dialogHelp)
0097 }
0098 onActivityConfigClicked: {
0099 displayDialog(dialogActivityConfig)
0100 }
0101 onPreviousLevelClicked: Activity.previousLevel()
0102 onNextLevelClicked: Activity.nextLevel()
0103 onReloadClicked: Activity.initLevel()
0104 onHomeClicked: activity.home()
0105 }
0106
0107 Bonus {
0108 id: bonus
0109 z: 1002
0110 Component.onCompleted: win.connect(Activity.nextLevel)
0111 }
0112
0113 Score {
0114 id: score
0115 z: 1003
0116 height: 48 * ApplicationInfo.ratio
0117 anchors.bottom: bar.top
0118 anchors.right: background.right
0119 anchors.bottomMargin: background.baseMargins
0120 onStop: Activity.incrementLevel()
0121 }
0122
0123 Keys.enabled: !items.buttonsBlocked
0124 Keys.onPressed: {
0125 Activity.onKeyPressed(event);
0126 }
0127
0128 SudokuListWidget {
0129 id: availablePieces
0130 audioEffects: activity.audioEffects
0131 inputBlocked: items.buttonsBlocked
0132 }
0133
0134 ListModel {
0135 id: sudokuModel
0136 }
0137
0138 Item {
0139 id: gridLayout
0140 anchors.margins: background.baseMargins
0141 anchors.bottom: score.top
0142 anchors.right: background.right
0143 states: [
0144 State {
0145 name: "horizontalLayout"
0146 when: background.isHorizontalLayout
0147 AnchorChanges {
0148 target: gridLayout
0149 anchors.top: background.top
0150 anchors.left: availablePieces.right
0151 }
0152 },
0153 State {
0154 name: "verticalLayout"
0155 when: !background.isHorizontalLayout
0156 AnchorChanges {
0157 target: gridLayout
0158 anchors.top: availablePieces.bottom
0159 anchors.left: background.left
0160 }
0161 }
0162 ]
0163 }
0164
0165 Grid {
0166 z: 100
0167 id: sudoColumn
0168 anchors.centerIn: gridLayout
0169 width: Math.min(gridLayout.width, gridLayout.height)
0170 height: width
0171
0172 Repeater {
0173 id: repeater
0174 model: sudokuModel
0175 delegate: blueSquare
0176
0177 Component {
0178 id: blueSquare
0179 SudokuCase {
0180 x: (index%sudoColumn.columns)*width
0181 y: Math.floor(index/sudoColumn.columns)*height
0182 width: parent != null ? parent.width / sudoColumn.columns : 1
0183 height: parent != null ? parent.height/ sudoColumn.columns : 1
0184 gridIndex: index
0185 isInitial: initial
0186 text: textValue
0187 state: mState
0188 }
0189 }
0190 }
0191 }
0192
0193 MouseArea {
0194 id: dynamic
0195 anchors.fill: sudoColumn
0196 enabled: !items.buttonsBlocked
0197 hoverEnabled: true
0198
0199 property int previousHoveredCase: -1
0200 onPositionChanged: {
0201 var x = Math.floor(sudoColumn.rows * mouseX / (sudoColumn.width+1));
0202 var y = Math.floor(sudoColumn.columns * mouseY / (sudoColumn.height+1));
0203 var id = x + y * sudoColumn.rows;
0204
0205 // Only color if we can modify the case
0206 if(sudokuModel.get(id).mState === "default")
0207 sudokuModel.get(id).mState = "hovered";
0208
0209 // Restore previous case if different from the new one
0210 if(previousHoveredCase != id) {
0211 if(previousHoveredCase != -1 && sudokuModel.get(previousHoveredCase).mState === "hovered")
0212 sudokuModel.get(previousHoveredCase).mState = "default"
0213 previousHoveredCase = id
0214 }
0215 }
0216 onExited: {
0217 if(previousHoveredCase != -1 && sudokuModel.get(previousHoveredCase).mState === "hovered")
0218 sudokuModel.get(previousHoveredCase).mState = "default"
0219 previousHoveredCase = -1
0220 }
0221
0222 onClicked: {
0223 var x = Math.floor(sudoColumn.rows * mouseX / sudoColumn.width);
0224 var y = Math.floor(sudoColumn.columns * mouseY / sudoColumn.height);
0225 Activity.clickOn(x, y)
0226 }
0227 }
0228
0229 Grid {
0230 z: 1001
0231 id: regionGrid
0232 columns: rows
0233 rows: nbRegions
0234 visible: nbRegions > 1
0235
0236 anchors.fill: sudoColumn
0237 property int regionLineSize: Math.round(3 * ApplicationInfo.ratio)
0238
0239 Repeater {
0240 id: regionRepeater
0241 model: nbRegions*nbRegions
0242
0243 Rectangle {
0244 z: 1001
0245 color: "transparent"
0246 x: index / nbRegions * sudoColumn.width
0247 y: (index % nbRegions) * sudoColumn.width
0248 width: nbRegions * sudoColumn.width / sudoColumn.columns
0249 height: nbRegions * sudoColumn.height/ sudoColumn.columns
0250 Rectangle {
0251 id: topWall
0252 color: "#2A2A2A"
0253 height: regionGrid.regionLineSize
0254 width: parent.width + regionGrid.regionLineSize
0255 anchors.verticalCenter: parent.top
0256 anchors.horizontalCenter: parent.horizontalCenter
0257 }
0258 Rectangle {
0259 id: leftWall
0260 color: "#2A2A2A"
0261 width: regionGrid.regionLineSize
0262 height: parent.height + regionGrid.regionLineSize
0263 anchors.horizontalCenter: parent.left
0264 anchors.verticalCenter: parent.verticalCenter
0265 }
0266 Rectangle {
0267 id: rightWall
0268 color: "#2A2A2A"
0269 width: regionGrid.regionLineSize
0270 height: parent.height + regionGrid.regionLineSize
0271 anchors.horizontalCenter: parent.right
0272 anchors.verticalCenter: parent.verticalCenter
0273 }
0274 Rectangle {
0275 id: bottomWall
0276 color: "#2A2A2A"
0277 height: regionGrid.regionLineSize
0278 width: parent.width + regionGrid.regionLineSize
0279 anchors.verticalCenter: parent.bottom
0280 anchors.horizontalCenter: parent.horizontalCenter
0281 }
0282 }
0283 }
0284 }
0285 }
0286 }