File indexing completed on 2024-04-21 14:43:50
0001 /* GCompris - virtualkeyboard_worker.js 0002 * 0003 * SPDX-FileCopyrightText: 2016 Holger Kaelberer <holger.k@elberer.de> 0004 * 0005 * Authors: 0006 * Holger Kaelberer <holger.k@elberer.de> 0007 * 0008 * SPDX-License-Identifier: GPL-3.0-or-later 0009 */ 0010 0011 WorkerScript.onMessage = function(msg) { 0012 var nRows; 0013 var maxButtons = 0; 0014 msg.rowListModel.clear(); 0015 msg.rowListModel.sync(); 0016 // validate layout syntax: 0017 if (!Array.isArray(msg.a) || msg.a.length < 1) { 0018 msg.error = "VirtualKeyboard: Invalid layout, array of length > 0"; 0019 WorkerScript.sendMessage(msg); 0020 return; 0021 } 0022 nRows = msg.a.length; 0023 // if we need special keys, put them in a separate row at the bottom: 0024 if (msg.shiftKey) { 0025 msg.a.push([ { 0026 label : msg.shiftUpSymbol + " Shift", 0027 shiftLabel: msg.shiftDownSymbol + " Shift", 0028 specialKeyValue: Qt.Key_Shift } ]); 0029 } 0030 var i 0031 var seenLabels = []; 0032 for (i = 0; i < msg.a.length; i++) { 0033 if (!Array.isArray(msg.a[i])) { 0034 msg.error = "VirtualKeyboard: Invalid layout, expecting array of arrays of keys"; 0035 WorkerScript.sendMessage(msg); 0036 return; 0037 } 0038 if (msg.a[i].length > maxButtons) 0039 maxButtons = msg.a[i].length; 0040 for (var j = 0; j < msg.a[i].length; j++) { 0041 if (undefined === msg.a[i][j].label) { 0042 msg.error = "VirtualKeyboard: Invalid layout, invalid key object"; 0043 WorkerScript.sendMessage(msg); 0044 return; 0045 } 0046 if (undefined === msg.a[i][j].specialKeyValue) 0047 msg.a[i][j].specialKeyValue = 0; 0048 var label = msg.a[i][j].label; 0049 // if we have a shift key lowercase all labels: 0050 if (msg.shiftKey && label == label.toLocaleUpperCase()) 0051 label = label.toLocaleLowerCase(); 0052 // drop duplicates (this alters keyboard layout, though!): 0053 if (seenLabels.indexOf(label) !=-1) { 0054 msg.a[i].splice(j, 1); 0055 j--; 0056 continue; 0057 } 0058 msg.a[i][j].label = label; 0059 seenLabels.push(label); 0060 if (msg.shiftKey && undefined === msg.a[i][j].shiftLabel) 0061 msg.a[i][j].shiftLabel = msg.a[i][j].label.toLocaleUpperCase(); 0062 } 0063 } 0064 0065 // populate the model: 0066 for (i = 0; i < msg.a.length; i++) { 0067 var row = msg.a[i]; 0068 var offset = 0; 0069 msg.rowListModel.append({ 0070 rowNum: i, 0071 offset: offset, 0072 keys: row 0073 }); 0074 msg.rowListModel.sync(); // sync once per row, on Android where 0075 // this seems to be executed on the GUI 0076 // thread this leads to an update of 0077 // the Loading overlay 0078 } 0079 msg.numRows = i; 0080 msg.initialized = (msg.numRows > 0); 0081 msg.error = ""; 0082 WorkerScript.sendMessage(msg); 0083 }