Warning, /education/gcompris/src/activities/lightsoff/Lightsoff.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - lightsoff.qml
0002 *
0003 * SPDX-FileCopyrightText: 2014 Stephane Mankowski <stephane@mankowski.fr>
0004 *
0005 * Authors:
0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version)
0007 * Stephane Mankowski <stephane@mankowski.fr> (Qt Quick port)
0008 * Timothée Giet <animtim@gmail.com> (Layout and visual refactoring)
0009 *
0010 * SPDX-License-Identifier: GPL-3.0-or-later
0011 */
0012 import QtQuick 2.12
0013 import GCompris 1.0
0014
0015 import "../../core"
0016 import "lightsoff.js" as Activity
0017
0018 ActivityBase {
0019 id: activity
0020
0021 onStart: focus = true
0022 onStop: {
0023
0024 }
0025
0026 pageComponent: Image {
0027 id: background
0028 source: "qrc:/gcompris/src/activities/family/resource/background.svg"
0029 anchors.fill: parent
0030 sourceSize.width: width
0031 sourceSize.height: height
0032 fillMode: Image.PreserveAspectCrop
0033
0034 signal start
0035 signal stop
0036
0037 property bool keyNavigationVisible: false
0038
0039 Component.onCompleted: {
0040 dialogActivityConfig.initialize()
0041 activity.start.connect(start)
0042 activity.stop.connect(stop)
0043 }
0044
0045 // Add here the QML items you need to access in javascript
0046 QtObject {
0047 id: items
0048 property Item main: activity.main
0049 property alias background: background
0050 property int currentLevel: activity.currentLevel
0051 property alias bonus: bonus
0052 property bool isPortrait: (background.height >= background.width - tux.width)
0053 property alias nightSky: nightSky.opacity
0054 property alias modelTable: modelTable
0055 readonly property var levels: activity.datasetLoader.data
0056 property bool blockClicks: false
0057 property int nbCell: 5
0058 property int cellSize: isPortrait ? Math.min((parent.height - bar.height * 2.5) / items.nbCell,
0059 (parent.width - 40) / items.nbCell) :
0060 (parent.height - bar.height * 1.5) / items.nbCell
0061 property int nbCelToWin: 0
0062 property var lightRatio: items.nbCelToWin / (items.nbCell * items.nbCell)
0063 }
0064
0065 onStart: {
0066 Activity.start(items)
0067 }
0068 onStop: {
0069 Activity.stop()
0070 }
0071
0072 Keys.enabled: !items.blockClicks
0073 Keys.onPressed: {
0074 background.keyNavigationVisible = true
0075 if (event.key === Qt.Key_Left)
0076 grid.moveCurrentIndexLeft()
0077 if (event.key === Qt.Key_Right)
0078 grid.moveCurrentIndexRight()
0079 if (event.key === Qt.Key_Down)
0080 grid.moveCurrentIndexDown()
0081 if (event.key === Qt.Key_Up)
0082 grid.moveCurrentIndexUp()
0083 if (event.key === Qt.Key_Space || event.key === Qt.Key_Enter || event.key === Qt.Key_Return)
0084 Activity.windowPressed(grid.currentIndex)
0085 }
0086
0087 states: [
0088 State {
0089 id: verticalState
0090 when: items.isPortrait
0091 AnchorChanges {
0092 target: building
0093 anchors.bottom: tux.verticalCenter
0094 }
0095 },
0096 State {
0097 id: horizontalState
0098 when: !items.isPortrait
0099 AnchorChanges {
0100 target: building
0101 anchors.bottom: tux.bottom
0102 }
0103 }
0104 ]
0105
0106 Rectangle {
0107 id: nightSky
0108 color: "#052e3c"
0109 opacity: items.lightRatio
0110 anchors.fill: background
0111 }
0112
0113 Image {
0114 id: sun
0115 source: "qrc:/gcompris/src/activities/menu/resource/all.svg"
0116 sourceSize.height: items.cellSize * 2 * items.nbCell / 5
0117 anchors {
0118 left: parent.left
0119 top: parent.top
0120 topMargin: (parent.height - land.height) * items.lightRatio
0121 }
0122 Behavior on anchors.topMargin {
0123 PropertyAnimation {
0124 duration: 1000
0125 }
0126 }
0127 }
0128
0129 Image {
0130 id: land
0131 source: Activity.url + "back.svg"
0132 anchors.bottom: parent.bottom
0133 anchors.top: tux.top
0134 anchors.left: parent.left
0135 anchors.right: parent.right
0136 fillMode: Image.PreserveAspectCrop
0137 sourceSize.height: height
0138 }
0139 Rectangle {
0140 id: buildingBorders
0141 color: "#808080"
0142 width: building.width + 5 * ApplicationInfo.ratio
0143 height: building.height + 2.5 * ApplicationInfo.ratio
0144 anchors.horizontalCenter: building.horizontalCenter
0145 anchors.bottom: building.bottom
0146 }
0147 Rectangle {
0148 id: building
0149 color: "#c8c8c8"
0150 width: gridarea.width
0151 anchors.top: grid.top
0152 anchors.bottom: tux.bottom
0153 anchors.horizontalCenter: parent.horizontalCenter
0154 anchors.topMargin: items.cellSize * -0.5
0155 }
0156
0157 Rectangle {
0158 id: gridarea
0159 visible: false
0160 width: items.cellSize * items.nbCell
0161 anchors.top: parent.top
0162 anchors.bottom: tux.bottom
0163 anchors.horizontalCenter: parent.horizontalCenter
0164 }
0165
0166 GridView {
0167 id: grid
0168 anchors.verticalCenter: gridarea.verticalCenter
0169 anchors.horizontalCenter: parent.horizontalCenter
0170 width: items.nbCell * items.cellSize
0171 height: width
0172 cellWidth: items.cellSize
0173 cellHeight: items.cellSize
0174
0175 ListModel {
0176 id: modelTable
0177 }
0178
0179 model: modelTable
0180
0181 delegate: Rectangle {
0182 color: soluce === 1 ? "#20df543d" : "transparent"
0183 height: items.cellSize
0184 width: items.cellSize
0185 border {
0186 color: soluce === 1 ? "#df543d" : "transparent"
0187 width: items.cellSize * 0.025
0188 }
0189 radius: items.cellSize * 0.1
0190
0191 BarButton {
0192 anchors.fill: parent
0193 fillMode: Image.PreserveAspectFit
0194 source: lighton === 1 ? Activity.url + "on.svg" : Activity.url + "off.svg"
0195 sourceSize.height: items.cellSize
0196 mouseArea.hoverEnabled: !items.blockClicks
0197 mouseArea.enabled: !items.blockClicks
0198 onClicked: Activity.windowPressed(index)
0199 visible: true
0200 }
0201 }
0202
0203 interactive: false
0204 keyNavigationWraps: true
0205 highlightFollowsCurrentItem: true
0206 highlight: Rectangle {
0207 width: items.cellSize
0208 height: items.cellSize
0209 color: "#EEEEEE"
0210 radius: items.cellSize * 0.1
0211 visible: background.keyNavigationVisible
0212 Behavior on x { SpringAnimation { spring: 2; damping: 0.2 } }
0213 Behavior on y { SpringAnimation { spring: 2; damping: 0.2 } }
0214 }
0215 }
0216
0217 Image {
0218 source: Activity.url + "grass.svg"
0219 anchors.verticalCenter: building.bottom
0220 anchors.horizontalCenter: building.horizontalCenter
0221 width: buildingBorders.width
0222 sourceSize.height: height
0223 fillMode: Image.TileHorizontally
0224 }
0225
0226 BarButton {
0227 id: tux
0228 fillMode: Image.PreserveAspectFit
0229 source: "qrc:/gcompris/src/activities/ballcatch/resource/tux.svg"
0230 height: bar.height
0231 sourceSize.height: height
0232 visible: true
0233 anchors {
0234 right: parent.right
0235 rightMargin: 20
0236 bottom: bar.top
0237 bottomMargin: 20
0238 }
0239 onClicked: Activity.solve()
0240 }
0241
0242 DialogHelp {
0243 id: dialogHelp
0244 onClose: home()
0245 }
0246
0247 DialogChooseLevel {
0248 id: dialogActivityConfig
0249 currentActivity: activity.activityInfo
0250
0251 onSaveData: {
0252 levelFolder = dialogActivityConfig.chosenLevels
0253 currentActivity.currentLevels = dialogActivityConfig.chosenLevels
0254 ApplicationSettings.setCurrentLevels(currentActivity.name, dialogActivityConfig.chosenLevels)
0255 }
0256 onClose: {
0257 home()
0258 }
0259 onStartActivity: {
0260 background.stop()
0261 background.start()
0262 }
0263 }
0264
0265 Bar {
0266 id: bar
0267 level: items.currentLevel + 1
0268 content: BarEnumContent {
0269 value: help | home | level | reload | activityConfig
0270 }
0271 onHelpClicked: {
0272 displayDialog(dialogHelp)
0273 }
0274 onPreviousLevelClicked: Activity.previousLevel()
0275 onNextLevelClicked: Activity.nextLevel()
0276 onHomeClicked: activity.home()
0277 onReloadClicked: Activity.initLevel()
0278 onActivityConfigClicked: {
0279 displayDialog(dialogActivityConfig)
0280 }
0281 }
0282
0283 Bonus {
0284 id: bonus
0285 onStop: items.blockClicks = false
0286 Component.onCompleted: win.connect(Activity.nextLevel)
0287 }
0288 }
0289 }