Warning, /education/gcompris/src/activities/analog_electricity/AnalogElectricity.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - AnalogElectricity.qml 0002 * 0003 * SPDX-FileCopyrightText: 2020 Aiswarya Kaitheri Kandoth <aiswaryakk29@gmail.com> 0004 * 0005 * Authors: 0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 0007 * Pulkit Gupta <pulkitnsit@gmail.com> (DigitalElectricity code) 0008 * Rudra Nil Basu <rudra.nil.basu.1996@gmail.com> (DigitalElectricity code) 0009 * Timothée Giet <animtim@gmail.com> (mouse drag refactoring) 0010 * Aiswarya Kaitheri Kandoth <aiswaryakk29@gmail.com> (Qt Quick port of AnalogElectricity) 0011 * 0012 * SPDX-License-Identifier: GPL-3.0-or-later 0013 */ 0014 import QtQuick 2.12 0015 import GCompris 1.0 0016 0017 import "../../core" 0018 import "analog_electricity.js" as Activity 0019 0020 ActivityBase { 0021 id: activity 0022 0023 onStart: focus = true 0024 onStop: {} 0025 0026 pageComponent: Image { 0027 id: background 0028 anchors.fill: parent 0029 source: Activity.urlDigital + "texture02.webp" 0030 fillMode: Image.Tile 0031 signal start 0032 signal stop 0033 0034 onWidthChanged: resizeTimer.restart(); 0035 onHeightChanged: resizeTimer.restart(); 0036 0037 Timer { 0038 id: resizeTimer 0039 interval: 200 0040 repeat: false 0041 running: false 0042 triggeredOnStart: false 0043 onTriggered: Activity.updateWiresOnResize(); 0044 } 0045 0046 Timer { 0047 id: netlistTimer 0048 interval: 500 0049 repeat: false 0050 running: false 0051 triggeredOnStart: false 0052 onTriggered: Activity.createNetlist(); 0053 } 0054 0055 property bool hori: background.width >= background.height 0056 0057 Component.onCompleted: { 0058 dialogActivityConfig.initialize(); 0059 activity.start.connect(start); 0060 activity.stop.connect(stop); 0061 } 0062 0063 // Needed to get keyboard focus on IntroMessage 0064 Keys.forwardTo: tutorialInstruction 0065 0066 Keys.onPressed: { 0067 if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && okButton.enabled) { 0068 Activity.checkAnswer() 0069 } 0070 if (event.key === Qt.Key_Plus) { 0071 Activity.zoomIn(); 0072 } 0073 if (event.key === Qt.Key_Minus) { 0074 Activity.zoomOut(); 0075 } 0076 if (event.key === Qt.Key_Right) { 0077 playArea.x -= 200; 0078 } 0079 if (event.key === Qt.Key_Left) { 0080 playArea.x += 200; 0081 } 0082 if (event.key === Qt.Key_Up) { 0083 playArea.y += 200; 0084 } 0085 if (event.key === Qt.Key_Down) { 0086 playArea.y -= 200; 0087 } 0088 if (playArea.x >= mousePan.drag.maximumX) { 0089 playArea.x = mousePan.drag.maximumX; 0090 } 0091 if (playArea.y >= mousePan.drag.maximumY) { 0092 playArea.y = mousePan.drag.maximumY; 0093 } 0094 if (playArea.x <= mousePan.drag.minimumX) { 0095 playArea.x = mousePan.drag.minimumX; 0096 } 0097 if (playArea.y <= mousePan.drag.minimumY) { 0098 playArea.y = mousePan.drag.minimumY; 0099 } 0100 } 0101 0102 // Add here the QML items you need to access in javascript 0103 QtObject { 0104 id: items 0105 property Item main: activity.main 0106 property alias background: background 0107 property int currentLevel: activity.currentLevel 0108 property alias bonus: bonus 0109 property alias playArea: playArea 0110 property alias mousePan: mousePan 0111 property alias availablePieces: availablePieces 0112 property alias tutorialDataset: tutorialDataset 0113 property alias toolTip: toolTip 0114 property alias infoTxt: infoTxt 0115 property alias infoImage: infoImage 0116 property alias dataset: dataset 0117 property alias netlistTimer: netlistTimer 0118 property real toolsMargin: 90 * ApplicationInfo.ratio 0119 property real zoomLvl: 0.25 0120 property string mode: "tutorial" 0121 property bool isTutorialMode: mode == "tutorial" ? true : false 0122 property alias tutorialInstruction: tutorialInstruction 0123 0124 } 0125 0126 Loader { 0127 id: dataset 0128 asynchronous: false 0129 } 0130 0131 TutorialDataset { 0132 id: tutorialDataset 0133 } 0134 0135 IntroMessage { 0136 id: tutorialInstruction 0137 intro: [] 0138 textContainerWidth: background.hori ? parent.width - inputComponentsContainer.width - items.toolsMargin : 0.9 * background.width 0139 textContainerHeight: background.hori ? 0.5 * parent.height : parent.height - inputComponentsContainer.height - (bar.height * 2) - items.toolsMargin 0140 anchors { 0141 fill: undefined 0142 top: background.hori ? parent.top : inputComponentsContainer.bottom 0143 topMargin: 10 0144 right: parent.right 0145 rightMargin: 5 0146 left: background.hori ? inputComponentsContainer.right : parent.left 0147 leftMargin: 5 0148 } 0149 z: 5 0150 } 0151 0152 onStart: Activity.start(items); 0153 onStop: { 0154 resizeTimer.stop(); 0155 netlistTimer.stop(); 0156 Activity.stop(); 0157 } 0158 0159 Rectangle { 0160 id: visibleArea 0161 color: "#00000000" 0162 width:background.width - items.toolsMargin - 10 0163 height: background.height - bar.height - items.toolsMargin - 10 0164 anchors { 0165 fill: undefined 0166 top: parent.top 0167 topMargin: 5 0168 right: parent.right 0169 rightMargin: 5 0170 left: inputComponentsContainer.right 0171 leftMargin: 5 0172 bottom: bar.top 0173 bottomMargin: 20 0174 } 0175 z: 6 0176 0177 GCText { 0178 id: infoTxt 0179 anchors { 0180 horizontalCenter: parent.horizontalCenter 0181 top: parent.top 0182 topMargin: 2 0183 } 0184 fontSizeMode: Text.Fit 0185 minimumPixelSize: 10 0186 font.pixelSize: 150 0187 color: "white" 0188 horizontalAlignment: Text.AlignHLeft 0189 width: Math.min(implicitWidth, 0.90 * parent.width) 0190 height: Math.min(implicitHeight, 0.7 * parent.height) 0191 wrapMode: TextEdit.WordWrap 0192 visible: false 0193 z: 4 0194 } 0195 0196 Rectangle { 0197 id: infoTxtContainer 0198 anchors.fill: parent 0199 opacity: 1 0200 radius: 10 0201 color: "#373737" 0202 border.width: 2 0203 border.color: "#F2F2F2" 0204 visible: infoTxt.visible 0205 MouseArea { 0206 anchors.fill: parent 0207 onClicked: infoTxt.visible = false 0208 } 0209 z: 3 0210 } 0211 0212 Image { 0213 id: infoImage 0214 property bool imgVisible: false 0215 height: source == "" ? 0 : parent.height * 0.3 - 10 0216 width: source == "" ? 0 : parent.width - 10 0217 fillMode: Image.PreserveAspectFit 0218 visible: infoTxt.visible && imgVisible 0219 anchors { 0220 top: infoTxt.bottom 0221 horizontalCenter: infoTxtContainer.horizontalCenter 0222 } 0223 z: 5 0224 } 0225 } 0226 0227 Rectangle { 0228 id: playArea 0229 color: "#10000000" 0230 x: items.toolsMargin 0231 y: 0 0232 width: background.width * 4 - items.toolsMargin 0233 height: background.height * 4 - (bar.height * 1.1) 0234 0235 property double sizeMultiplier: 0236 playArea.width > playArea.height ? playArea.width : playArea.height 0237 0238 PinchArea { 0239 id: pinchZoom 0240 anchors.fill: parent 0241 onPinchFinished: { 0242 if (pinch.scale < 1) { 0243 Activity.zoomOut(); 0244 } 0245 if (pinch.scale > 1) { 0246 Activity.zoomIn(); 0247 } 0248 } 0249 MouseArea { 0250 id: mousePan 0251 anchors.fill: parent 0252 scrollGestureEnabled: false //needed for pinchZoom 0253 drag.target: playArea 0254 drag.axis: Drag.XandYAxis 0255 drag.minimumX: - playArea.width * items.zoomLvl 0256 drag.maximumX: items.toolsMargin 0257 drag.minimumY: - playArea.height * items.zoomLvl 0258 drag.maximumY: 0 0259 onClicked: { 0260 Activity.disableToolDelete(); 0261 Activity.deselect(); 0262 availablePieces.hideToolbar(); 0263 } 0264 } 0265 } 0266 } 0267 0268 Rectangle { 0269 id: inputComponentsContainer 0270 width: items.toolsMargin 0271 height: background.height 0272 color: "#4A3823" 0273 anchors.left: parent.left 0274 Image { 0275 id: containerTexture 0276 anchors.fill: parent 0277 anchors.rightMargin: 3 * ApplicationInfo.ratio 0278 anchors.bottomMargin: 0 0279 source: Activity.urlDigital + "texture01.webp" 0280 fillMode: Image.Tile 0281 ListWidget { 0282 id: availablePieces 0283 hori: background.hori 0284 } 0285 } 0286 z: 10 0287 } 0288 0289 Rectangle { 0290 id: toolTip 0291 anchors { 0292 bottom: bar.top 0293 bottomMargin: 10 0294 left: inputComponentsContainer.left 0295 leftMargin: 5 0296 } 0297 width: toolTipTxt.width + 10 0298 height: toolTipTxt.height + 5 0299 color: "#373737" 0300 opacity: 0 0301 radius: 10 0302 z: 100 0303 border.width: 2 0304 border.color: "#F2F2F2" 0305 property alias text: toolTipTxt.text 0306 Behavior on opacity { NumberAnimation { duration: 120 } } 0307 0308 function show(newText) { 0309 if(newText) { 0310 text = newText; 0311 opacity = 1; 0312 } else { 0313 opacity = 0; 0314 } 0315 } 0316 0317 GCText { 0318 id: toolTipTxt 0319 anchors.centerIn: parent 0320 fontSize: regularSize 0321 color: "white" 0322 horizontalAlignment: Text.AlignHCenter 0323 wrapMode: TextEdit.WordWrap 0324 } 0325 } 0326 0327 DialogChooseLevel { 0328 id: dialogActivityConfig 0329 currentActivity: activity.activityInfo 0330 onClose: { 0331 home(); 0332 } 0333 onLoadData: { 0334 if(activityData && activityData["mode"]) { 0335 items.mode = activityData["mode"]; 0336 } 0337 } 0338 } 0339 0340 DialogHelp { 0341 id: dialogHelp 0342 onClose: home(); 0343 } 0344 0345 BarButton { 0346 id: okButton 0347 visible: items.isTutorialMode 0348 anchors { 0349 bottom: bar.top 0350 right: parent.right 0351 rightMargin: 10 * ApplicationInfo.ratio 0352 bottomMargin: height * 0.5 0353 } 0354 source: "qrc:/gcompris/src/core/resource/bar_ok.svg" 0355 sourceSize.width: 60 * ApplicationInfo.ratio 0356 enabled: !tutorialInstruction.visible && !bonus.isPlaying 0357 onClicked: Activity.checkAnswer(); 0358 } 0359 0360 Bar { 0361 id: bar 0362 level: items.currentLevel + 1 0363 content: BarEnumContent { value: help | home | (items.isTutorialMode ? level : 0) | reload | activityConfig } 0364 onHelpClicked: displayDialog(dialogHelp); 0365 onPreviousLevelClicked: Activity.previousLevel(); 0366 onNextLevelClicked: Activity.nextLevel(); 0367 onHomeClicked: home(); 0368 onReloadClicked: Activity.reset(); 0369 onActivityConfigClicked: { 0370 displayDialog(dialogActivityConfig); 0371 } 0372 } 0373 0374 Bonus { 0375 id: bonus 0376 Component.onCompleted: win.connect(Activity.nextLevel); 0377 } 0378 0379 states: [ 0380 State { 0381 id: "horizontalView" 0382 when: background.hori 0383 PropertyChanges { 0384 target: visibleArea 0385 width: background.width - items.toolsMargin - 10 0386 height: background.height - bar.height - items.toolsMargin - 10 0387 } 0388 AnchorChanges { 0389 target: visibleArea 0390 anchors.top: parent.top 0391 anchors.left: inputComponentsContainer.right 0392 } 0393 PropertyChanges { 0394 target: playArea 0395 x: items.toolsMargin 0396 y: 0 0397 width: background.width * 4 - items.toolsMargin 0398 height: background.height * 4 - (bar.height * 1.1) 0399 } 0400 PropertyChanges { 0401 target: mousePan 0402 drag.maximumX: items.toolsMargin 0403 drag.maximumY: 0 0404 } 0405 PropertyChanges { 0406 target: inputComponentsContainer 0407 width: items.toolsMargin 0408 height: background.height 0409 } 0410 PropertyChanges { 0411 target: containerTexture 0412 anchors.rightMargin: 3 * ApplicationInfo.ratio 0413 anchors.bottomMargin: 0 0414 } 0415 }, 0416 State { 0417 id: "verticalView" 0418 when: !background.hori 0419 PropertyChanges { 0420 target: visibleArea 0421 width: background.width - 10 0422 height: background.height - bar.height - 10 0423 } 0424 AnchorChanges { 0425 target: visibleArea 0426 anchors.top: inputComponentsContainer.bottom 0427 anchors.left: parent.left 0428 } 0429 PropertyChanges { 0430 target: playArea 0431 x: 0 0432 y: items.toolsMargin 0433 width: background.width * 4 0434 height: background.height * 4 - (bar.height * 1.1) - items.toolsMargin 0435 } 0436 PropertyChanges { 0437 target: mousePan 0438 drag.maximumX: 0 0439 drag.maximumY: items.toolsMargin 0440 } 0441 PropertyChanges { 0442 target: inputComponentsContainer 0443 width: background.width 0444 height: items.toolsMargin 0445 } 0446 PropertyChanges { 0447 target: containerTexture 0448 anchors.rightMargin: 0 0449 anchors.bottomMargin: 3 * ApplicationInfo.ratio 0450 } 0451 } 0452 ] 0453 } 0454 }