Warning, /education/gcompris/src/activities/lang/MenuScreen.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - MenuScreen.qml 0002 * 0003 * Copyright (C) Siddhesh suthar <siddhesh.it@gmail.com> (Qt Quick port) 0004 * 0005 * Authors: 0006 * Pascal Georges (pascal.georges1@free.fr) (GTK+ version) 0007 * Holger Kaelberer <holger.k@elberer.de> (Qt Quick port of imageid) 0008 * Siddhesh suthar <siddhesh.it@gmail.com> (Qt Quick port) 0009 * Bruno Coudoin <bruno.coudoin@gcompris.net> (Integration Lang dataset) 0010 * 0011 * SPDX-License-Identifier: GPL-3.0-or-later 0012 */ 0013 import QtQuick 2.12 0014 import GCompris 1.0 0015 import QtGraphicalEffects 1.0 0016 import QtQuick.Controls 2.12 0017 0018 import "../../core" 0019 import "lang.js" as Activity 0020 0021 Item { 0022 id: menuScreen 0023 anchors.fill: parent 0024 opacity: 0 0025 0026 property alias menuModel: menuModel 0027 property bool keyboardMode: false 0028 property bool started: opacity == 1 0029 property int spacing: Math.floor(5 * ApplicationInfo.ratio) 0030 0031 Behavior on opacity { PropertyAnimation { duration: 200 } } 0032 0033 function start() { 0034 focus = true 0035 forceActiveFocus() 0036 menuGrid.currentIndex = 0 0037 opacity = 1 0038 } 0039 0040 function stop() { 0041 focus = false 0042 opacity = 0 0043 } 0044 0045 Keys.onEscapePressed: { 0046 home() 0047 } 0048 0049 Keys.onPressed: { 0050 if(event.key === Qt.Key_Space) { 0051 menuGrid.currentItem.selectCurrentItem() 0052 event.accepted = true 0053 } 0054 if(event.key === Qt.Key_Enter) { 0055 menuGrid.currentItem.selectCurrentItem() 0056 event.accepted = true 0057 } 0058 if(event.key === Qt.Key_Return) { 0059 menuGrid.currentItem.selectCurrentItem() 0060 event.accepted = true 0061 } 0062 if(event.key === Qt.Key_Left) { 0063 menuGrid.moveCurrentIndexLeft() 0064 event.accepted = true 0065 } 0066 if(event.key === Qt.Key_Right) { 0067 menuGrid.moveCurrentIndexRight() 0068 event.accepted = true 0069 } 0070 if(event.key === Qt.Key_Up) { 0071 menuGrid.moveCurrentIndexUp() 0072 event.accepted = true 0073 } 0074 if(event.key === Qt.Key_Down) { 0075 menuGrid.moveCurrentIndexDown() 0076 event.accepted = true 0077 } 0078 } 0079 0080 Keys.onReleased: { 0081 keyboardMode = true 0082 event.accepted = false 0083 } 0084 0085 // Activities 0086 property int iconSize: 180 * ApplicationInfo.ratio 0087 0088 property int levelCellWidth: menuGrid.width / Math.floor(menuGrid.width / iconSize ) 0089 property int levelCellHeight: iconSize * 1.4 0090 0091 ListModel { 0092 id: menuModel 0093 } 0094 0095 GridView { 0096 id: menuGrid 0097 0098 anchors { 0099 fill: parent 0100 topMargin: menuScreen.spacing 0101 leftMargin: menuScreen.spacing 0102 bottomMargin: bar.height + menuScreen.spacing 0103 } 0104 cellWidth: levelCellWidth 0105 cellHeight: levelCellHeight 0106 clip: true 0107 model: menuModel 0108 keyNavigationWraps: true 0109 // Needed to calculate the OpacityMask offset 0110 // If not using OpenGL, this value is not used, so we save the calculation and set it to 1 0111 property real hiddenBottom: ApplicationInfo.useOpenGL ? contentHeight - height - contentY : 1 0112 0113 delegate: Rectangle { 0114 id: delegateItem 0115 width: levelCellWidth - menuScreen.spacing 0116 height: levelCellHeight - menuScreen.spacing 0117 property string sectionName: name 0118 color: "#7FFFFFFF" 0119 0120 Image { 0121 id: containerImage 0122 source: image; 0123 anchors.top: parent.top 0124 anchors.left: parent.left 0125 anchors.right: parent.right 0126 anchors.bottom: title.top 0127 anchors.bottomMargin: title.lineCount > 1 ? title.height * -0.5 : menuScreen.spacing 0128 fillMode: Image.PreserveAspectFit 0129 } 0130 0131 Rectangle { 0132 anchors.fill: title 0133 color: menuScreen.keyboardMode && menuGrid.currentIndex == index ? 0134 "#80EAF8FD" : "#80C2ECF8" 0135 } 0136 0137 GCText { 0138 id: title 0139 anchors.bottom: progressLang.top 0140 anchors.bottomMargin: menuScreen.spacing 0141 anchors.horizontalCenter: parent.horizontalCenter 0142 horizontalAlignment: Text.AlignHCenter 0143 width: parent.width - 4 * ApplicationInfo.ratio 0144 fontSizeMode: Text.Fit 0145 minimumPointSize: 7 0146 fontSize: regularSize 0147 elide: Text.ElideRight 0148 maximumLineCount: 2 0149 wrapMode: Text.WordWrap 0150 text: Activity.items.categoriesTranslations[name] 0151 } 0152 0153 GCProgressBar { 0154 id: progressLang 0155 borderSize: ApplicationInfo.ratio 0156 anchors.bottom: parent.bottom 0157 anchors.left: parent.left 0158 anchors.right: parent.right 0159 anchors.bottomMargin: menuScreen.spacing 0160 anchors.leftMargin: ApplicationInfo.ratio * 10 0161 anchors.rightMargin: anchors.leftMargin 0162 height: 14 * ApplicationInfo.ratio 0163 to: wordCount 0164 from: 0 0165 value: progress 0166 displayText: false 0167 } 0168 0169 MouseArea { 0170 anchors.fill: parent 0171 enabled: menuScreen.started 0172 onClicked: selectCurrentItem() 0173 } 0174 0175 function selectCurrentItem() { 0176 Activity.initLevel(index) 0177 } 0178 0179 Rectangle { 0180 color: "#C0FFFFFF" 0181 anchors.centerIn: favoriteButton 0182 width: favoriteButton.width + 2 * ApplicationInfo.ratio 0183 height: width 0184 radius: width * 0.5 0185 } 0186 Image { 0187 id: favoriteButton 0188 source: "qrc:/gcompris/src/activities/menu/resource/" + 0189 ( favorite ? "all.svg" : "all_disabled.svg" ); 0190 anchors { 0191 top: parent.top 0192 right: parent.right 0193 margins: menuScreen.spacing 0194 } 0195 sourceSize.width: iconSize * 0.2 0196 0197 MouseArea { 0198 anchors.fill: parent 0199 onClicked: { 0200 menuModel.get(index)['favorite'] = !menuModel.get(index)['favorite'] 0201 } 0202 } 0203 } 0204 0205 } //delegate close 0206 0207 highlight: Rectangle { 0208 width: levelCellWidth - menuScreen.spacing 0209 height: levelCellHeight - menuScreen.spacing 0210 color: "#AAFFFFFF" 0211 border.width: 2 * ApplicationInfo.ratio 0212 border.color: "#373737" 0213 visible: menuScreen.keyboardMode 0214 Behavior on x { SpringAnimation { spring: 2; damping: 0.2 } } 0215 Behavior on y { SpringAnimation { spring: 2; damping: 0.2 } } 0216 } 0217 0218 Rectangle{ 0219 id: menuMask 0220 visible: false 0221 anchors.fill: menuGrid 0222 // Dynamic position of the gradient used for OpacityMask 0223 // If the hidden bottom part of the grid is > to the maximum height of the gradient, 0224 // we use the maximum height. 0225 // Else we set the gradient start position proportionnally to the hidden bottom part, 0226 // until it disappears. 0227 // And if not using OpenGL, the mask is disabled, so we save the calculation and set it to 1 0228 property real gradientStartValue: 0229 ApplicationInfo.useOpenGL ? 0230 (menuGrid.hiddenBottom > menuGrid.height * 0.08 ? 0231 0.92 : 1 - (menuGrid.hiddenBottom / menuGrid.height)) : 0232 1 0233 gradient: Gradient { 0234 GradientStop { position: 0.0; color: "#FFFFFFFF" } 0235 GradientStop { position: menuMask.gradientStartValue; color: "#FFFFFFFF" } 0236 GradientStop { position: menuMask.gradientStartValue + 0.04; color:"#00FFFFFF"} 0237 } 0238 } 0239 0240 layer.enabled: ApplicationInfo.useOpenGL 0241 layer.effect: OpacityMask { 0242 id: activitiesOpacity 0243 source: menuGrid 0244 maskSource: menuMask 0245 anchors.fill: menuGrid 0246 } 0247 0248 } // grid view close 0249 0250 }