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 }