diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java index 40ad5fb93f..bb47a60501 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java @@ -43,6 +43,8 @@ public final class LanguageSettingsActivity extends AppCompatActivity { private static Toolbar toolbar = null; private static ListView listView = null; private static TextView lexicalModelTextView = null; + private static TextView correctionsTextView = null; + private static SwitchCompat correctionsToggle = null; private ImageButton addButton = null; private String associatedLexicalModel = ""; private String lgCode; @@ -66,12 +68,20 @@ public final class LanguageSettingsActivity extends AppCompatActivity { @Override public void onClick(View v) { - SwitchCompat correctToggle = (SwitchCompat) v; + // For predictions/corrections toggle + SwitchCompat toggle = (SwitchCompat) v; + + SharedPreferences.Editor prefEditor = prefs.edit(); + + // predictionsToggle overrides correctionToggle and correctionsTextView + if (prefsKey.endsWith(predictionPrefSuffix)) { + boolean override = toggle.isChecked(); + overrideCorrectionsToggle(override); + } // This will allow preemptively making settings for languages without models. // Seems more trouble than it's worth to block this. - SharedPreferences.Editor prefEditor = prefs.edit(); - prefEditor.putBoolean(prefsKey, correctToggle.isChecked()); + prefEditor.putBoolean(prefsKey, toggle.isChecked()); prefEditor.apply(); // Don't use/apply language modeling settings for languages without models. @@ -136,21 +146,23 @@ public final class LanguageSettingsActivity extends AppCompatActivity { RelativeLayout layout = (RelativeLayout)findViewById(R.id.corrections_toggle); - textView = (TextView) layout.findViewById(R.id.text1); - textView.setText(getString(R.string.enable_corrections)); - SwitchCompat toggle = layout.findViewById(R.id.toggle); - toggle.setChecked(mayCorrect); // Link to persistent option storage! Also needs handler. + correctionsTextView = (TextView) layout.findViewById(R.id.text1); + correctionsTextView.setText(getString(R.string.enable_corrections)); + correctionsToggle = layout.findViewById(R.id.toggle); + correctionsToggle.setChecked(mayCorrect); // Link to persistent option storage! Also needs handler. String prefsKey = getLanguageCorrectionPreferenceKey(lgCode); - toggle.setOnClickListener(new PreferenceToggleListener(prefsKey, lgCode)); + correctionsToggle.setOnClickListener(new PreferenceToggleListener(prefsKey, lgCode)); layout = (RelativeLayout)findViewById(R.id.predictions_toggle); textView = (TextView) layout.findViewById(R.id.text1); textView.setText(getString(R.string.enable_predictions)); - toggle = layout.findViewById(R.id.toggle); - toggle.setChecked(mayPredict); // Link to persistent option storage! Also needs handler. + SwitchCompat predictionsToggle = layout.findViewById(R.id.toggle); + predictionsToggle.setChecked(mayPredict); // Link to persistent option storage! Also needs handler. prefsKey = getLanguagePredictionPreferenceKey(lgCode); - toggle.setOnClickListener(new PreferenceToggleListener(prefsKey, lgCode)); + predictionsToggle.setOnClickListener(new PreferenceToggleListener(prefsKey, lgCode)); + + overrideCorrectionsToggle(mayPredict); layout = (RelativeLayout)findViewById(R.id.model_picker); textView = (TextView) layout.findViewById(R.id.text1); @@ -305,6 +317,25 @@ public final class LanguageSettingsActivity extends AppCompatActivity { return langID + correctionPrefSuffix; } + /** + * Overrides the enable and visibility of corrections toggle, + * and overrides the enable of the corrections text view. + * Does not change the corrections toggle value. + * @param override boolean - Value from predictions toggle + * When true, enables corrections toggle and text field, and makes corrections toggle visible + * When false, disables corrections toggle and text field, and makes corrections toggle invisible + */ + private void overrideCorrectionsToggle(boolean override) { + if (correctionsTextView != null) { + correctionsTextView.setEnabled(override); + } + if (correctionsToggle != null) { + correctionsToggle.setEnabled(override); + int visibility = override ? View.VISIBLE : View.INVISIBLE; + correctionsToggle.setVisibility(visibility); + } + } + // Fully details the building of this Activity's list view items. static private class FilteredKeyboardsAdapter extends NestedAdapter { static final int RESOURCE = R.layout.list_row_layout1; diff --git a/android/KMEA/app/src/main/res/drawable/textview_item.xml b/android/KMEA/app/src/main/res/drawable/textview_item.xml new file mode 100644 index 0000000000..00b8d97435 --- /dev/null +++ b/android/KMEA/app/src/main/res/drawable/textview_item.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/KMEA/app/src/main/res/layout/list_row_layout4.xml b/android/KMEA/app/src/main/res/layout/list_row_layout4.xml index d53fd27fc7..5ae4bb771c 100644 --- a/android/KMEA/app/src/main/res/layout/list_row_layout4.xml +++ b/android/KMEA/app/src/main/res/layout/list_row_layout4.xml @@ -14,7 +14,7 @@ = 0; }; - + // check all keys for modifier usage var modifierNames = []; - + for(var i = 0; i < KVKL[builder.lastPlatform].layer.length; i++) { var layer = KVKL[builder.lastPlatform].layer[i]; for(var j = 0; j < layer.row.length; j++) { @@ -844,11 +844,11 @@ $(function () { } } } - + var isUsed = function(modifierName) { return modifierNames.indexOf(modifierName) >= 0; }; - + if(!this.showAllModifierCombinations) { // Add any layer names that are already referenced for(modifier = 0; modifier < this.validModifierCombinations.length; modifier++) { @@ -869,15 +869,15 @@ $(function () { } return 0; }; - + this.isLayerIdShifted = function(id) { return (builder.getModifierCombinationFromLayerId(id) & this.modifierCodes.SHIFT) != 0; }; - + this.prepareLayer = function () { var layer = KVKL[builder.lastPlatform].layer[builder.lastLayerIndex]; - - var isLayerShifted = builder.isLayerIdShifted(layer.id); + + var isLayerShifted = builder.isLayerIdShifted(layer.id); var width = 0; // calculate the widest and rescale for (var i = 0; i < layer.row.length; i++) { @@ -967,7 +967,7 @@ $(function () { $(div).css('clear', 'both'); $('#kbd').append(div); }; - + this.getStandardKeyCap = function (id, shifted) { id = id ? id.toUpperCase() : ''; var i = this.standardKeyNames.findIndex(function(x) { return x.toUpperCase() == id }); @@ -994,7 +994,7 @@ $(function () { } $('#chkDisplayUnderlying')[0].checked = KVKL[builder.lastPlatform].displayUnderlying; - + builder.prepareLayers(); builder.selectLayer(0); } @@ -1050,7 +1050,7 @@ $(function () { if (!saveToRedo) { builder.redoStack = []; } - builder.generate(true); + builder.generate(true,false); var s = { KVKL: JSON.stringify(KVKL), platform: builder.lastPlatform, @@ -1070,7 +1070,7 @@ $(function () { builder.enableUndoControls(); builder.command('modified'); } - + this.commands = []; this.command = function (cmd) { @@ -1127,7 +1127,7 @@ $(function () { return row; }; - + this.addKey = function (position, isSubKey, sp) { var key = document.createElement('div'); var ktext = document.createElement('div'); @@ -1354,12 +1354,12 @@ $(function () { this.selectedKey = function () { return $('#kbd .selected'); } - + this.wrapChange = function(f, opt) { return function() { if(typeof opt == 'object' && opt.saveOnce) { - if (!builder.hasSavedKeyUndo) { - builder.saveUndo(); + if (!builder.hasSavedKeyUndo) { + builder.saveUndo(); builder.hasSavedKeyUndo = true; } else { builder.command('modified'); @@ -1385,7 +1385,7 @@ $(function () { builder.selectedKey().data('width', $(this).val()) .css('width', parseInt($(this).val(), 10) * this.xscale + 'px'); }, {rescale: true})); - + $('#inpKeyName').change(builder.wrapChange(function () { builder.selectedKey().data('id', $(this).val()); builder.updateKeyId(builder.selectedKey()); @@ -1727,14 +1727,14 @@ $(function () { builder.generateSubKeys(); })); - this.generate = function (display) { + this.generate = function (display, force) { var json = JSON.stringify(KVKL, null, ' '); - + if(!display) { // Save changed settings -- only when not saving undo KVKL[builder.lastPlatform].displayUnderlying = $('#chkDisplayUnderlying')[0].checked; } - + var layer = KVKL[builder.lastPlatform].layer[builder.lastLayerIndex]; layer.row = []; @@ -1758,7 +1758,9 @@ $(function () { }); var newJson = JSON.stringify(KVKL, null, ' '); - if(newJson != json) { + if(force || newJson != json) { + // When adding or deleting layers and platforms, we need to force because + // that will not result in changes to the rows. $.ajax('/app/source/file', { 'type': 'POST', 'data': { @@ -1771,7 +1773,7 @@ $(function () { }; this.post = this.generate; - + $('#wedgeAddRowAbove').click(builder.wrapChange(function () { var row = builder.addRow('above'); builder.selectKey(builder.addKey(row, false)); }, {rescale: true})); @@ -1804,16 +1806,16 @@ $(function () { builder.enableKeyControls(); })); - $('#btnGenerate').click(function () { builder.generate(); }); + $('#btnGenerate').click(function () { builder.generate(false,false); }); $('#selPlatform').change(function () { - if (builder.lastPlatform) builder.generate(); + if (builder.lastPlatform) builder.generate(false,false); builder.selectPlatform(); builder.saveState(); }); $('#selLayer').change(function () { - if (builder.lastPlatform) builder.generate(); + if (builder.lastPlatform) builder.generate(false,false); builder.selectLayer(); builder.saveState(); }); @@ -1830,7 +1832,6 @@ $(function () { buttons: { "OK": function () { builder.saveUndo(); - builder.generate(); var platform = $('#selAddPlatform').val(); KVKL[platform] = $.extend(true, {}, KVKL[builder.lastPlatform]); // copy existing platform @@ -1839,6 +1840,8 @@ $(function () { $('#selPlatform').val(platform); builder.selectPlatform(); + builder.generate(false,true); + $(this).dialog('close'); }, "Cancel": function () { @@ -1870,9 +1873,9 @@ $(function () { delete KVKL[platform]; builder.lastPlatform = null; builder.preparePlatforms(); - builder.post(); + builder.generate(false,true); }); - + $('#chkDisplayUnderlying').click(function () { builder.saveUndo(); var platform = $('#selPlatform').val(); @@ -1959,8 +1962,8 @@ $(function () { } } }); - - + + $('#addLayerName').on('input', function() { var layerName = $(this).val(); $('#addLayerList').val(layerName); @@ -1971,7 +1974,7 @@ $(function () { $('#addLayerNote').text(layerName+' is a recognised modifier-aware layer name.'); } }); - + $('#addLayerList').change(function() { var v = $(this).val(); if(v == '(custom)') { @@ -2002,14 +2005,13 @@ $(function () { } } builder.saveUndo(); - builder.generate(); var layer = $.extend(true, {}, KVKL[builder.lastPlatform].layer[builder.lastLayerIndex]); layer.id = id; var n = KVKL[builder.lastPlatform].layer.push(layer) - 1; builder.selectPlatform(); $('#selLayer').val(n); builder.selectLayer(); - builder.post(); + builder.generate(false,true); $(this).dialog('close'); }, "Cancel": function () { @@ -2027,7 +2029,7 @@ $(function () { builder.saveUndo(); KVKL[builder.lastPlatform].layer.splice(builder.lastLayerIndex, 1); builder.selectPlatform(); - builder.post(); + builder.generate(false,true); }); $('#btnEditLayer').click(function () { @@ -2102,23 +2104,23 @@ $(function () { // // Character map drag+drop and double-click insertion // - + builder.charmapDragOver = function(o) { - + // Convert X, Y to document coordinates - + let target = document.elementFromPoint(o.x, o.y); if(target === null || (target.nodeName != 'INPUT' && target.className != 'text')) { return false; } - - return true; + + return true; }; - + builder.charmapDragDrop = function(o) { // Convert X, Y to document coordinates - + if(o.x >= 0 && o.y >= 0) { var target = document.elementFromPoint(o.x, o.y); if(target === null) { @@ -2141,42 +2143,42 @@ $(function () { // Double-click insertion, so use last focused control var target = $(document.lastFocus); } - + // Focus the control and add the text target.focus(); target.val(target.val() + o.text); }; - + builder.loadingState = true; - + builder.saveState = function() { if(builder.loadingState) return; - + var state = { platform: builder.lastPlatform, layer: builder.lastLayerIndex, presentation: $('#selPlatformPresentation').val() }; - + var key = builder.selectedKey(); if(key.length > 0) { state.key = key.data('id'); } - + var subkey = builder.selectedSubKey(); if (subkey.length > 0) { state.subkey = $(subkey).data('id'); } - + $.post('/app/source/toucheditor/state', { 'Filename': builder.filename, 'State': JSON.stringify(state) }); }; - + builder.loadState = function() { - $.get('/app/source/toucheditor/state', + $.get('/app/source/toucheditor/state', { 'Filename': builder.filename }, @@ -2197,7 +2199,7 @@ $(function () { } if(data.key) { builder.selectKey($('#kbd .key').filter(function (index) { return $(this).data('id') === data.key; }).first()); - } + } if(data.subkey) { builder.selectSubKey($('#sk .key').filter(function (index) { return $(this).data('id') === data.subkey; }).first()); } @@ -2205,10 +2207,9 @@ $(function () { } ); }; - + builder.preparePlatforms(); builder.enableUndoControls(); - + builder.loadState(); }); - \ No newline at end of file diff --git a/windows/src/developer/TIKE/xml/layoutbuilder/template-basic.keyman-touch-layout b/windows/src/developer/TIKE/xml/layoutbuilder/template-basic.keyman-touch-layout index 7660d99e28..967ba6e179 100644 --- a/windows/src/developer/TIKE/xml/layoutbuilder/template-basic.keyman-touch-layout +++ b/windows/src/developer/TIKE/xml/layoutbuilder/template-basic.keyman-touch-layout @@ -115,7 +115,7 @@ {"id": "K_B","text":"B"}, {"id": "K_N","text":"N"}, {"id": "K_M","text":"M"}, - {"id": "K_PERIOD","text": ".","sk": [ + {"id": "K_PERIOD","text": ".", "layer": "default", "sk": [ {"text": ",","id": "K_COMMA", "layer": "default"}, {"text": "!","id": "K_1", "layer": "shift"}, {"text": "?","id": "K_SLASH", "layer": "shift"}, @@ -131,7 +131,7 @@ }, { "id": 4, - "key": [ + "key": [ {"id": "K_NUMLOCK","text": "*123*","width":"140","sp": "1","nextlayer": "numeric"}, {"id": "K_LOPT","text": "*Menu*","width": "120","sp": "1"}, {"id": "K_SPACE","text": "","width": "630","sp": "0"}, @@ -244,7 +244,7 @@ {"id": "K_J","text":"j"}, {"id": "K_K","text":"k"}, {"id": "K_L","text":"l"}, - {"text": "","width": "10","sp": "10"} + {"text": "","width": "10","sp": "10"} ] }, { @@ -313,7 +313,7 @@ {"id": "K_J","text":"J"}, {"id": "K_K","text":"K"}, {"id": "K_L","text":"L"}, - {"text": "","width": "10","sp": "10"} + {"text": "","width": "10","sp": "10"} ] }, { @@ -327,7 +327,7 @@ {"id": "K_B","text":"B"}, {"id": "K_N","text":"N"}, {"id": "K_M","text":"M"}, - {"id": "K_PERIOD","text": ".","sk": [ + {"id": "K_PERIOD","text": ".", "layer": "default", "sk": [ {"text": ",","id": "K_COMMA", "layer": "default"}, {"text": "!","id": "K_1", "layer": "shift"}, {"text": "?","id": "K_SLASH", "layer": "shift"}, diff --git a/windows/src/developer/history.md b/windows/src/developer/history.md index 8cd364f0ec..d563b97f89 100644 --- a/windows/src/developer/history.md +++ b/windows/src/developer/history.md @@ -3,6 +3,12 @@ ## 13.0 alpha * Start version 13.0 +## 2019-09-24 12.0.36 beta +* General: File type icons were mismatched (#2112) +* Project: Shift layer in basic touch layout template had incorrect modifier for period (.) on shift layer (#2113) +* Touch layout editor: Adding or deleting a playform or layer and making no other changes would not stick (#2114) +* General: On Windows 7 and 8, in some circumstances dialog boxes could appear behind the main form (#2115) + ## 2019-09-20 12.0.34 beta * Add basic wordlist editor to Keyman Developer (#2086) diff --git a/windows/src/developer/inst/kmdev.wxs b/windows/src/developer/inst/kmdev.wxs index 3cd529f1b3..0d04f65f3f 100644 --- a/windows/src/developer/inst/kmdev.wxs +++ b/windows/src/developer/inst/kmdev.wxs @@ -121,8 +121,6 @@ - - @@ -131,50 +129,38 @@ - + - + - - - - - - - - - - - - - + - + - + - - + + - - + +