Warning, /education/gcompris/src/activities/braille_alphabets/BrailleChar.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - BrailleChar.qml
0002 *
0003 * SPDX-FileCopyrightText: 2014 Arkit Vora <arkitvora123@gmail.com>
0004 *
0005 * Authors:
0006 * Srishti Sethi <srishakatux@gmail.com> (GTK+ version)
0007 * Arkit Vora <arkitvora123@gmail.com> (Qt Quick port)
0008 *
0009 * SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 import QtQuick 2.12
0012 import "braille_alphabets.js" as Activity
0013 import "../../core"
0014 import GCompris 1.0
0015
0016 Item {
0017 id: brailleCharItem
0018 height: dotWidth * 3 + grid.spacing * 4
0019
0020 property string brailleChar: ""
0021 property real dotWidth: width * 0.4
0022 property real dotHeight: dotWidth
0023 property alias circles: circles
0024 property bool clickable
0025 property double thinBorder: 2 * ApplicationInfo.ratio
0026 property double thickBorder: 4 * ApplicationInfo.ratio
0027 property bool isLetter: brailleChar >= 'A' && brailleChar <= 'Z'
0028 property var brailleCodesLetter: {
0029 // For ASCII each letter, this represent the active dots in Braille.
0030 "A": [1], "B": [1, 2], "C": [1, 4], "D": [1, 4, 5], "E": [1, 5],
0031 "F": [1, 2, 4], "G": [1, 2, 4, 5], "H": [1, 2, 5], "I": [2, 4],
0032 "J": [2, 4, 5], "K": [1, 3], "L": [1, 2, 3], "M": [1, 3, 4],
0033 "N": [1, 3, 4, 5], "O": [1, 3, 5], "P": [1, 2, 3, 4], "Q": [1, 2, 3, 4, 5],
0034 "R": [1, 2, 3, 5], "S": [2, 3, 4], "T": [2, 3, 4, 5], "U": [1, 3, 6],
0035 "V": [1, 2, 3, 6], "W": [2, 4, 5, 6], "X": [1, 3, 4, 6], "Y": [1, 3, 4, 5, 6],
0036 "Z": [1, 3, 5, 6]
0037 }
0038 property var brailleCodesNumber: {
0039 // For ASCII each letter, this represent the active dots in Braille.
0040 "+": [3, 4, 6], "-": [3, 6], "*": [1, 6], "/": [3, 4],
0041 "#": [3, 4, 5, 6], "1": [1], "2" :[1, 2], "3": [1, 4], "4": [1, 4, 5],
0042 "5": [1, 5], "6": [1, 2, 4], "7": [1, 2, 4, 5], "8": [1, 2, 5],
0043 "9": [2, 4], "0" :[2, 4, 5]
0044 }
0045 property var brailleCodes: isLetter ? brailleCodesLetter : brailleCodesNumber
0046
0047 function updateDotsFromBrailleChar() {
0048 var dots = []
0049 for(var car in brailleCodes) {
0050 if(car === brailleChar) {
0051 dots = brailleCodes[car]
0052 }
0053 }
0054
0055 // Clear all the dots
0056 for(var i = 0; i < 6; i++) {
0057 circles.itemAt(i).state = "off"
0058 }
0059
0060 for(var i in dots) {
0061 circles.itemAt(i).state = "on"
0062 }
0063 }
0064
0065 function updateBrailleCharFromDots() {
0066 var dots = []
0067 for( var i = 0; i < 6; i++) {
0068 if(circles.itemAt(i).state === "on")
0069 dots.push(i + 1)
0070 }
0071
0072 var stringifiedDots = JSON.stringify(dots)
0073 for(var car in brailleCodes) {
0074 if(JSON.stringify(brailleCodes[car]) === stringifiedDots) {
0075 brailleChar = car
0076 return
0077 }
0078 }
0079 brailleChar = ""
0080 }
0081
0082 function clearLetter() {
0083 brailleChar = ""
0084 updateDotsFromBrailleChar()
0085 }
0086
0087 function switchState(value) {
0088 circles.itemAt(value-1).switchState()
0089 }
0090
0091 Grid {
0092 id: grid
0093 anchors.centerIn: brailleCharItem
0094 spacing: (brailleCharItem.width - brailleCharItem.dotWidth * 2) / 2
0095 columns: 2
0096 rows: 3
0097 flow: Grid.TopToBottom
0098
0099 Repeater {
0100
0101 id: circles
0102 model: 6
0103
0104 Rectangle {
0105 id: incircle1
0106 border.width: brailleCharItem.thinBorder
0107 color: on ? "#373737" : "#f0f0f0"
0108 border.color: "#373737"
0109 width: dotWidth
0110 height: dotHeight
0111 radius: width * 0.5
0112
0113 property bool on: clickable ? false : click_on_off()
0114
0115 function click_on_off() {
0116 var code = brailleCodes[brailleChar]
0117 if(!code)
0118 return false
0119 for(var i = 0; i < code.length; i++) {
0120 if(code[i] === index + 1) {
0121 return true
0122 }
0123 }
0124 return false
0125 }
0126
0127 function switchState() {
0128 if (state == "on") {
0129 state = "off"
0130 } else {
0131 state = "on"
0132 }
0133 activity.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/scroll.wav")
0134 // On touch screens we don't get the exit event.
0135 border.width = 2 * ApplicationInfo.ratio
0136 brailleCharItem.updateBrailleCharFromDots()
0137
0138 }
0139
0140 Behavior on color {
0141 ColorAnimation {
0142 duration: 200
0143 }
0144 }
0145
0146 GCText {
0147 id: numtext
0148 text: clickable ? modelData+1 : ""
0149 color: "#2a2a2a"
0150 anchors.left: index >= 3 ? incircle1.right : undefined
0151 anchors.right: index < 3 ? incircle1.left : undefined
0152 anchors.verticalCenter: incircle1.verticalCenter
0153 font.weight: Font.DemiBold
0154 font.pointSize: NaN // need to clear font.pointSize explicitly
0155 font.pixelSize: Math.min(30 * ApplicationInfo.ratio,
0156 Math.max(parent.height, 20))
0157 anchors.margins: 10
0158 }
0159
0160 MouseArea {
0161 id : mouse1
0162 enabled: clickable && !items.buttonsBlocked ? true : false
0163 anchors.fill: parent
0164 hoverEnabled: true
0165 onEntered: incircle1.border.width = brailleCharItem.thickBorder
0166 onExited: incircle1.border.width = brailleCharItem.thinBorder
0167 onClicked: {
0168 incircle1.switchState();
0169 }
0170 }
0171
0172 states: [
0173 State {
0174 name: "on"
0175
0176 PropertyChanges {
0177 target: incircle1
0178 on: true
0179 }
0180
0181 },
0182 State {
0183 name: "off"
0184
0185 PropertyChanges {
0186 target: incircle1
0187 on: false
0188 }
0189 }
0190 ]
0191 }
0192 }
0193 }
0194 }