diff --git a/developer/src/tike/xml/layoutbuilder/src/builder.ts b/developer/src/tike/xml/layoutbuilder/src/builder.ts index 064cdb3aa9..f859d82b74 100644 --- a/developer/src/tike/xml/layoutbuilder/src/builder.ts +++ b/developer/src/tike/xml/layoutbuilder/src/builder.ts @@ -1,6 +1,8 @@ /// /// +import { builderConstants } from "./constants.js"; + // temporary interface to streamline transform to Typescript interface Builder { [key: string]: any; @@ -15,8 +17,9 @@ export const builder: Builder = { xscale: 1, yscale: 1, uniqId: 1, - lastPresentations: {...builder.defaultPresentations}, // TODO: this has an initialization order problem + lastPresentations: {...builderConstants.defaultPresentations}, lastLayers: {}, + showAllModifierCombinations: false, getPresentation: function () { return $('#selPlatformPresentation').val(); }, @@ -62,7 +65,7 @@ export const builder: Builder = { prepareKeyCapTypes: function() { let types = $('#selKeyCapType'), subTypes = $('#selSubKeyCapType'), opts = ''; - for(let name of builder.specialKeyNames) { + for(let name of builderConstants.specialKeyNames) { opts += ''; } $(types).append(opts); @@ -111,8 +114,8 @@ export const builder: Builder = { renameSpecialKey: function (oldText) { //Note: U+E000 *is* PUA but was not accepted by IE as a character in the EOT font, so Alt recoded as U+E019 - return builder.specialCharacters[oldText] ? - String.fromCharCode(0xE000 + builder.specialCharacters[oldText]) : + return builderConstants.specialCharacters[oldText] ? + String.fromCharCode(0xE000 + builderConstants.specialCharacters[oldText]) : oldText; }, @@ -151,7 +154,7 @@ export const builder: Builder = { }, fillModifierSelect: function() { - var modifiers = builder.showAllModifierCombinations ? builder.validModifierCombinations : builder.minimalModifierCombinations; + var modifiers = builder.showAllModifierCombinations ? builderConstants.validModifierCombinations : builderConstants.minimalModifierCombinations; var $selKeyLayerOverride = $('#selKeyLayerOverride'), @@ -179,7 +182,7 @@ export const builder: Builder = { for (var modifier = 0; modifier < modifiers.length; modifier++) { - var name = builder.getModifierCombinationName(modifiers[modifier]); + var name = builderConstants.getModifierCombinationName(modifiers[modifier]); add($selKeyLayerOverride, name); add($selSubKeyLayerOverride, name); @@ -187,7 +190,7 @@ export const builder: Builder = { } var alreadyAdded = function(modifier) { - return builder.minimalModifierCombinations.indexOf(modifier) >= 0; + return builderConstants.minimalModifierCombinations.indexOf(modifier) >= 0; }; @@ -219,9 +222,9 @@ export const builder: Builder = { if(!builder.showAllModifierCombinations) { // Add any layer names that are already referenced - for(modifier = 0; modifier < builder.validModifierCombinations.length; modifier++) { - var name = builder.getModifierCombinationName(builder.validModifierCombinations[modifier]); - if(!alreadyAdded(builder.validModifierCombinations[modifier]) && isUsed(name)) { + for(modifier = 0; modifier < builderConstants.validModifierCombinations.length; modifier++) { + var name = builderConstants.getModifierCombinationName(builderConstants.validModifierCombinations[modifier]); + if(!alreadyAdded(builderConstants.validModifierCombinations[modifier]) && isUsed(name)) { add($selKeyLayerOverride, name); add($selSubKeyLayerOverride, name); } @@ -230,16 +233,16 @@ export const builder: Builder = { }, getModifierCombinationFromLayerId: function(id) { - for(var i = 0; i < builder.validModifierCombinations.length; i++) { - if(builder.getModifierCombinationName(builder.validModifierCombinations[i]) == id) { - return builder.validModifierCombinations[i]; + for(var i = 0; i < builderConstants.validModifierCombinations.length; i++) { + if(builderConstants.getModifierCombinationName(builderConstants.validModifierCombinations[i]) == id) { + return builderConstants.validModifierCombinations[i]; } } return 0; }, isLayerIdShifted: function(id) { - return (builder.getModifierCombinationFromLayerId(id) & builder.modifierCodes.SHIFT) != 0; + return (builder.getModifierCombinationFromLayerId(id) & builderConstants.modifierCodes.SHIFT) != 0; }, /** @@ -370,19 +373,19 @@ export const builder: Builder = { var row = builder.addRow('bottom'), rowWidth = 0; for (var j = 0; j < layer.row[i].key.length; j++) { var key = layer.row[i].key[j]; - rowWidth += (key.width ? parseInt(key.width, 10) : 100) + (key.pad ? parseInt(key.pad, 10) : builder.keyMargin); + rowWidth += (key.width ? parseInt(key.width, 10) : 100) + (key.pad ? parseInt(key.pad, 10) : builderConstants.keyMargin); } width = Math.max(width, rowWidth); } - width += builder.keyMargin; // add right hand margin - var height = layer.row.length * (100 + builder.keyMargin); // 50% of tablet height, 100 px per row, 5 px margin + width += builderConstants.keyMargin; // add right hand margin + var height = layer.row.length * (100 + builderConstants.keyMargin); // 50% of tablet height, 100 px per row, 5 px margin // // Scaling for different platform images // - var pres = builder.presentations[builder.getPresentation()]; + var pres = builderConstants.presentations[builder.getPresentation()]; if (pres) { builder.xscale = pres.x / width; builder.yscale = pres.y / height; @@ -407,11 +410,11 @@ export const builder: Builder = { var key = layer.row[i].key[j]; var nkey = builder.addKey('key', row, key.sp); var w = key.width ? key.width : 100; - var p = (key.pad ? key.pad : builder.keyMargin) * builder.xscale; + var p = (key.pad ? key.pad : builderConstants.keyMargin) * builder.xscale; let text = builder.inferKeyText(key.text, key.id); calcKeyWidth += parseInt(w, 10); - calcGapWidth += parseInt(key.pad ? key.pad : builder.keyMargin, 10); + calcGapWidth += parseInt(key.pad ? key.pad : builderConstants.keyMargin, 10); $(nkey) .data('id', key.id) @@ -431,12 +434,12 @@ export const builder: Builder = { .css('width', (w * builder.xscale) + 'px') .css('height', (100 * builder.yscale) + 'px') - .css('margin-top', (builder.keyMargin * builder.yscale) + 'px') + .css('margin-top', (builderConstants.keyMargin * builder.yscale) + 'px') .css('margin-left', p + 'px') .css('font-family', builder.escapeFontName(key.font)) .css('font-size', key.fontsize); - if(builder.specialCharacters[text]) + if(builderConstants.specialCharacters[text]) $(nkey).addClass('key-special-text'); builder.addKeyAnnotations(nkey); @@ -463,7 +466,7 @@ export const builder: Builder = { keys.each(function(_index, keyElem) { let width = $(keyElem).data('width'), pad = $(keyElem).data('pad'); keyWidth += width ? parseInt(width, 10) : 100; - gapWidth += pad ? parseInt(pad, 10) : builder.keyMargin; + gapWidth += pad ? parseInt(pad, 10) : builderConstants.keyMargin; }); let count = keys.length, totalWidth = keyWidth + gapWidth; $('.key-size', rowElem).html(count + ' keys
' + @@ -475,8 +478,8 @@ export const builder: Builder = { getStandardKeyCap: function (id, shifted) { id = id ? id.toUpperCase() : ''; - var i = builder.standardKeyNames.findIndex(function(x) { return x.toUpperCase() == id }); - return i >= 0 ? builder.standardKeyCaps[i][shifted ? 1 : 0] : ''; + var i = builderConstants.standardKeyNames.findIndex(function(x) { return x.toUpperCase() == id }); + return i >= 0 ? builderConstants.standardKeyCaps[i][shifted ? 1 : 0] : ''; }, updateKeyId: function (nkey) { @@ -489,21 +492,21 @@ export const builder: Builder = { var listContainer = $('#selPlatformPresentation'); $('option', listContainer).remove(); - for (var i in builder.presentations) { + for (var i in builderConstants.presentations) { if (i.substring(0, builder.lastPlatform.length) != builder.lastPlatform) { continue; } var option = $(document.createElement('option')); - option.attr('value', i).text(builder.presentations[i].name); + option.attr('value', i).text(builderConstants.presentations[i].name); if(builder.lastPresentations[builder.lastPlatform] == i) { - option.attr('selected', true); + option.prop('selected', true); } listContainer.append(option); } builder.prepareLayers(); builder.selectLayer(builder.lastLayers[builder.lastPlatform] ?? 0); - } + }, selectLayer: function (val) { let selection = builder.saveSelection(); @@ -713,7 +716,7 @@ export const builder: Builder = { k.data('text', val); let text = builder.inferKeyText(val, k.data('id')); $('.text', k).text(builder.renameSpecialKey(text)); - if(builder.specialCharacters[text]) { + if(builderConstants.specialCharacters[text]) { k.addClass('key-special-text'); } else { k.removeClass('key-special-text'); @@ -731,7 +734,7 @@ export const builder: Builder = { } else { hintElement.removeClass('custom-hint'); } - if(builder.specialCharacters[val]) { + if(builderConstants.specialCharacters[val]) { hintElement.addClass('key-special-text'); } else { hintElement.removeClass('key-special-text'); @@ -754,7 +757,7 @@ export const builder: Builder = { let val = $(key).data('text'); $('#keyToolbar *').removeAttr('disabled'); $('#sub-key-container').css('display', ''); - $('#key-cap-unicode-toolbar-item, #key-cap-toolbar-item').css('display', builder.specialCharacters[val] ? 'none' : ''); + $('#key-cap-unicode-toolbar-item, #key-cap-toolbar-item').css('display', builderConstants.specialCharacters[val] ? 'none' : ''); } }, @@ -850,7 +853,7 @@ export const builder: Builder = { selectKeyByCode: function (code) { if (code >= 0 && code < 256) { - var keyName = builder.standardKeyNames[code]; + var keyName = builderConstants.standardKeyNames[code]; var key = $('.key').filter(function (_index, elem) { return $(elem).data('id') === keyName; }); if (key.length > 0) builder.selectKey(key[0]); } @@ -900,7 +903,7 @@ export const builder: Builder = { } builder.selectPlatform(); if(data.presentation && - builder.presentations[data.presentation] && + builderConstants.presentations[data.presentation] && $('#selPlatformPresentation option[value="'+data.presentation+'"]').length) { $('#selPlatformPresentation').val(data.presentation); } else { @@ -908,7 +911,7 @@ export const builder: Builder = { $('#selPlatformPresentation').val($('#selPlatformPresentation option:first').val()); } - builder.lastPresentations = {...(data.lastPresentations ?? this.defaultPresentations)}; + builder.lastPresentations = {...(data.lastPresentations ?? builderConstants.defaultPresentations)}; builder.lastLayers = {...(data.lastLayers ?? {})}; let selection = builder.saveSelection(); @@ -972,7 +975,7 @@ const inpKeyNameChange = builder.wrapChange(function (evt: JQueryEventObject) { $('#inpKeyName') .change(inpKeyNameChange) .autocomplete({ - source: builder.lookupKeyNames, + source: builderConstants.lookupKeyNames, change: inpKeyNameChange, select: builder.wrapInstant(inpKeyNameChange) }) diff --git a/developer/src/tike/xml/layoutbuilder/src/constants.ts b/developer/src/tike/xml/layoutbuilder/src/constants.ts index 175faae333..3bea1513af 100644 --- a/developer/src/tike/xml/layoutbuilder/src/constants.ts +++ b/developer/src/tike/xml/layoutbuilder/src/constants.ts @@ -1,8 +1,7 @@ /// /// -import { builder } from './builder.js'; -builder.standardKeyNames = [ +const standardKeyNames = [ 'K_?00', // &H0 'K_LBUTTON', // &H1 'K_RBUTTON', // &H2 @@ -273,7 +272,7 @@ builder.standardKeyNames = [ 'K_?FF' // &HFF ]; -builder.standardKeyCaps = [ +const standardKeyCaps = [ ['',''], // 'K_?00', // &H0 ['',''], // 'K_LBUTTON', // &H1 ['',''], // 'K_RBUTTON', // &H2 @@ -544,18 +543,18 @@ builder.standardKeyCaps = [ ['',''], // 'K_?FF' // &HFF ]; -builder.lookupKeyNames = []; +const lookupKeyNames = []; -for (var i = 0; i < builder.standardKeyNames.length; i++) { - if (builder.standardKeyNames[i].indexOf('?') < 0) { - builder.lookupKeyNames.push(builder.standardKeyNames[i]); +for (var i = 0; i < standardKeyNames.length; i++) { + if (standardKeyNames[i].indexOf('?') < 0) { + lookupKeyNames.push(standardKeyNames[i]); } } -builder.lookupKeyNames.sort(); +lookupKeyNames.sort(); // Defines the PUA code mapping for the various 'special' modifier/control/non-printing keys on keyboards. // This is lifted directly from specialCharacters.ts and must be kept in sync. See also CompileKeymanWeb.pas: CSpecialText10 -builder.specialCharacters = { +const specialCharacters = { '*Shift*': 8, '*Enter*': 5, '*Tab*': 6, @@ -623,9 +622,9 @@ builder.specialCharacters = { // TODO: Skipping size references }; -builder.specialKeyNames = Object.entries(builder.specialCharacters).map(ch => ch[0]); +const specialKeyNames = Object.entries(specialCharacters).map(ch => ch[0]); -builder.presentations = { +const presentations = { "tablet-ipad-landscape": { "x": 829, "y": 299, "name": "iPad (landscape)" }, // 829x622 = iPad tablet box size; (97,101)-(926,723) "tablet-ipad-portrait": { "x": 605, "y": 300, "name": "iPad (portrait)" }, // 605x806 = iPad tablet box size; (98,94)-(703,900) "phone-iphone5-landscape": { "x": 731, "y": 196, "name": "iPhone 5 (landscape)" }, // 731x412 = iPhone box size; (144,39)-(875,451) @@ -633,12 +632,12 @@ builder.presentations = { "desktop": { "x": 640, "y": 300, "name": "Desktop" }, }; -builder.defaultPresentations = { "tablet": "tablet-ipad-landscape", "phone": "phone-iphone5-landscape", "desktop": "desktop" }; +const defaultPresentations = { "tablet": "tablet-ipad-landscape", "phone": "phone-iphone5-landscape", "desktop": "desktop" }; -builder.keyMargin = 15; +const keyMargin = 15; // from kmwosk.js: -builder.modifierCodes = { +const modifierCodes = { "LCTRL":0x0001, "RCTRL":0x0002, "LALT":0x0004, @@ -657,47 +656,46 @@ builder.modifierCodes = { // Lists the combinations that we allow users to use. Some are mutually exclusive, // such as Left+Right modifiers, or chiral and non-chiral modifiers (excl. Shift) -builder.validModifierCombinations = [ +const validModifierCombinations = [ 0, - builder.modifierCodes.LCTRL, - builder.modifierCodes.RCTRL, + modifierCodes.LCTRL, + modifierCodes.RCTRL, - builder.modifierCodes.LALT, - builder.modifierCodes.LCTRL | builder.modifierCodes.LALT, + modifierCodes.LALT, + modifierCodes.LCTRL | modifierCodes.LALT, - builder.modifierCodes.RALT, - builder.modifierCodes.RCTRL | builder.modifierCodes.RALT, + modifierCodes.RALT, + modifierCodes.RCTRL | modifierCodes.RALT, - builder.modifierCodes.SHIFT, + modifierCodes.SHIFT, - builder.modifierCodes.LCTRL | builder.modifierCodes.SHIFT, - builder.modifierCodes.LALT | builder.modifierCodes.SHIFT, - builder.modifierCodes.LCTRL | builder.modifierCodes.LALT | builder.modifierCodes.SHIFT, + modifierCodes.LCTRL | modifierCodes.SHIFT, + modifierCodes.LALT | modifierCodes.SHIFT, + modifierCodes.LCTRL | modifierCodes.LALT | modifierCodes.SHIFT, - builder.modifierCodes.RCTRL | builder.modifierCodes.SHIFT, - builder.modifierCodes.RALT | builder.modifierCodes.SHIFT, - builder.modifierCodes.RCTRL | builder.modifierCodes.RALT | builder.modifierCodes.SHIFT, + modifierCodes.RCTRL | modifierCodes.SHIFT, + modifierCodes.RALT | modifierCodes.SHIFT, + modifierCodes.RCTRL | modifierCodes.RALT | modifierCodes.SHIFT, - builder.modifierCodes.CTRL, - builder.modifierCodes.CTRL | builder.modifierCodes.SHIFT, + modifierCodes.CTRL, + modifierCodes.CTRL | modifierCodes.SHIFT, - builder.modifierCodes.ALT, - builder.modifierCodes.CTRL | builder.modifierCodes.ALT, - builder.modifierCodes.SHIFT | builder.modifierCodes.ALT, - builder.modifierCodes.SHIFT | builder.modifierCodes.CTRL | builder.modifierCodes.ALT, - builder.modifierCodes.CAPS + modifierCodes.ALT, + modifierCodes.CTRL | modifierCodes.ALT, + modifierCodes.SHIFT | modifierCodes.ALT, + modifierCodes.SHIFT | modifierCodes.CTRL | modifierCodes.ALT, + modifierCodes.CAPS ]; -builder.minimalModifierCombinations = [ +const minimalModifierCombinations = [ 0, - builder.modifierCodes.RALT, - builder.modifierCodes.SHIFT, - builder.modifierCodes.RALT | builder.modifierCodes.SHIFT, - builder.modifierCodes.CAPS + modifierCodes.RALT, + modifierCodes.SHIFT, + modifierCodes.RALT | modifierCodes.SHIFT, + modifierCodes.CAPS ]; -builder.showAllModifierCombinations = false; // Add CAPS variants for all of the above (function addCapsCombinations(validCombinations, CAPS) { @@ -708,9 +706,9 @@ builder.showAllModifierCombinations = false; validCombinations.push(newCombination); } } -})(builder.validModifierCombinations, builder.modifierCodes.CAPS); +})(validModifierCombinations, modifierCodes.CAPS); -builder.modifierNames = [ +const modifierNames =[ 'leftctrl', // 0x001 'rightctrl', // 0x002 'leftalt', // 0x004 @@ -729,11 +727,27 @@ builder.modifierNames = [ * @param {Number} c * @return {string} **/ -builder.getModifierCombinationName = function(c) { +const getModifierCombinationName = function(c) { var r = ''; if(c == 0) return 'default'; - for(var i = 0; i < builder.modifierNames.length; i++) { - if(c & (1< /// import { builder } from './builder.js'; +import { builderConstants } from './constants.js'; builder.addKey = function (type, position, sp) { var key = document.createElement('div'); @@ -95,7 +96,7 @@ builder.prepareKey = function () { var key = builder.selectedKey(); builder.hasSavedKeyUndo = false; let val = $(key).data('text'); - $('#selKeyCapType').val(builder.specialCharacters[val] ? val : ''); + $('#selKeyCapType').val(builderConstants.specialCharacters[val] ? val : ''); $('#inpKeyCap').val(val); $('#inpKeyCapUnicode').val(builder.toUnicodeString(val)); @@ -145,7 +146,7 @@ builder.prepareKey = function () { .css('font-family',builder.escapeFontName(key.font)) .css('font-size', key.fontsize); - if(builder.specialCharacters[text]) { + if(builderConstants.specialCharacters[text]) { $(nkey).addClass('key-special-text'); } diff --git a/developer/src/tike/xml/layoutbuilder/src/subkeys.ts b/developer/src/tike/xml/layoutbuilder/src/subkeys.ts index 430751ebc0..30c33c690e 100644 --- a/developer/src/tike/xml/layoutbuilder/src/subkeys.ts +++ b/developer/src/tike/xml/layoutbuilder/src/subkeys.ts @@ -1,6 +1,7 @@ /// /// import { builder } from './builder.js'; +import { builderConstants } from './constants.js'; // // Popup keys @@ -68,7 +69,7 @@ builder.prepareSubKey = function () { $('#inpSubKeyGestureType').val(gestureType); let val = $(key).data('text'); - $('#selSubKeyCapType').val(builder.specialCharacters[val] ? val : ''); + $('#selSubKeyCapType').val(builderConstants.specialCharacters[val] ? val : ''); $('#inpSubKeyCap').val(val); $('#inpSubKeyCapUnicode').val(builder.toUnicodeString(val)); $('#inpSubKeyName').val($(key).data('id')); @@ -91,7 +92,7 @@ $('#inpSubKeyName') .change(subKeyNameChange) .on('input', subKeyNameChange) .autocomplete({ - source: builder.lookupKeyNames, + source: builderConstants.lookupKeyNames, change: subKeyNameChange, select: builder.wrapInstant(subKeyNameChange) }).blur(function () { @@ -104,7 +105,7 @@ builder.subKeyCapChange = function(val) { k.data('text', val); let text = builder.inferKeyText(val, k.data('id')); $('.text', k).text(builder.renameSpecialKey(text)); - if(builder.specialCharacters[text]) { + if(builderConstants.specialCharacters[text]) { k.addClass('key-special-text'); } else { k.removeClass('key-special-text'); @@ -293,7 +294,7 @@ builder.enableSubKeyControls = function () { let val = $(key).data('text'); $('#subKeyToolbar *').removeAttr('disabled'); $('#subKeyToolbar #inpSubKeyGestureType').attr('disabled', 'disabled'); - $('#sub-key-cap-unicode-toolbar-item, #sub-key-cap-toolbar-item').css('display', builder.specialCharacters[val] ? 'none' : ''); + $('#sub-key-cap-unicode-toolbar-item, #sub-key-cap-toolbar-item').css('display', builderConstants.specialCharacters[val] ? 'none' : ''); $('#chkSubKeyIsDefault').prop('disabled', $(key).data('type') != 'longpress'); } }