diff --git a/public/style.css b/public/style.css index cc672218ce..75c521b649 100644 --- a/public/style.css +++ b/public/style.css @@ -983,12 +983,14 @@ button { } .keycode-container, -.keycode-layer { +.keycode-layer, +.keycode-layer-container { font-size: 10px; display: block; } .keycode-container:after, +.keycode-layer-container:after, .keycode-layer:after { content: ''; width: 14px; diff --git a/src/components/BaseKey.vue b/src/components/BaseKey.vue index 2ce85ca296..da5970b65a 100644 --- a/src/components/BaseKey.vue +++ b/src/components/BaseKey.vue @@ -164,7 +164,7 @@ export default { dstIndex: this.id }); } else { - this.setKeycode(json.code); + this.setKeycode({ _code: json.code, layer: json.layer }); } this.dragleave(); }, @@ -200,7 +200,7 @@ export default { }, remove() { this.setSelected(this.id); - this.setKeycode('KC_NO'); + this.setKeycode({ _code: 'KC_NO' }); } }, data() { diff --git a/src/components/Keycode.vue b/src/components/Keycode.vue index d8fa4102c9..f1aa463c22 100644 --- a/src/components/Keycode.vue +++ b/src/components/Keycode.vue @@ -33,7 +33,8 @@ export default { width: null, name: String, classes: String, - styles: Object + styles: Object, + layer: Number }, computed: { computedStyles() { @@ -87,16 +88,19 @@ export default { ev.dataTransfer.setDragImage(this.crt, 0, 0); this.dragging = true; - let { name, code, type } = this; + let { name, code, type, layer } = this; ev.dropEffect = 'copy'; ev.dataTransfer.dropEffect = 'move'; ev.dataTransfer.setData( 'application/json', - JSON.stringify({ name, type, code }) + JSON.stringify({ name, type, code, layer }) ); }, clicked() { - this.$store.commit('keymap/setKeycode', this.code); + this.$store.commit('keymap/setKeycode', { + _code: this.code, + layer: this.layer + }); } }, mounted() { diff --git a/src/components/LayerContainerKey.vue b/src/components/LayerContainerKey.vue new file mode 100644 index 0000000000..55306c4de1 --- /dev/null +++ b/src/components/LayerContainerKey.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/components/VisualKeymap.vue b/src/components/VisualKeymap.vue index 7f2fcb6060..959e9179b5 100644 --- a/src/components/VisualKeymap.vue +++ b/src/components/VisualKeymap.vue @@ -18,6 +18,7 @@ import BaseKey from '@/components/BaseKey'; import AnyKey from '@/components/AnyKey'; import LayerKey from '@/components/LayerKey'; import ContainerKey from '@/components/ContainerKey'; +import LayerContainerKey from '@/components/LayerContainerKey'; export default { name: 'visual-keymap', @@ -139,6 +140,8 @@ export default { return ContainerKey; case 'layer': return LayerKey; + case 'layer-container': + return LayerContainerKey; case 'text': return AnyKey; default: diff --git a/src/jquery.js b/src/jquery.js index ea6d0c7b29..1e52890bad 100644 --- a/src/jquery.js +++ b/src/jquery.js @@ -55,7 +55,7 @@ function generateKeypressHandler(keycode) { return; } - store.commit('keymap/setKeycode', meta.code); + store.commit('keymap/setKeycode', { _code: meta.code }); } }; } @@ -102,7 +102,7 @@ function setLayerToNonEmpty(_layer) { */ function newAnyKey(keycode) { - var anyKey = store.getters['keycodes/lookupKeycode']('text'); + const anyKey = store.getters['keycodes/lookupKeycode']('text'); // make a copy otherwise it uses a reference return Object.assign({}, anyKey, { text: keycode }); } @@ -121,6 +121,22 @@ function newKey(metadata, keycode, obj) { return key; } +// newLayerContainerKey combines aspects of a layer and a container key +// We pre-assign the layers to make the UI easier to implement. +function newLayerContainerKey(keycode, internal) { + const internals = internal.split(','); + const LCKey = store.getters['keycodes/lookupKeycode']( + `${keycode}(${internals[0]},kc)` + ); + + let contents = store.getters['keycodes/lookupKeycode'](internals[1]); + if (isUndefined(contents)) { + contents = store.getters['keycodes/lookupKeycode']('KC_NO'); + } + let { code, layer, name, type } = LCKey; + return Object.assign({ code, layer, name, type, contents: contents }); +} + function parseKeycode(keycode, stats) { let metadata; @@ -138,6 +154,10 @@ function parseKeycode(keycode, stats) { //Check whether it is a layer switching code or combo keycode if (internal.includes('KC')) { + // Layer Tap keycode + if (maincode === 'LT') { + return newLayerContainerKey(maincode, internal); + } // combo keycode metadata = store.getters['keycodes/lookupKeycode'](internal); if (metadata === undefined) { diff --git a/src/scss/colorways.scss b/src/scss/colorways.scss index b8cff49398..3c50077cbc 100644 --- a/src/scss/colorways.scss +++ b/src/scss/colorways.scss @@ -235,14 +235,16 @@ .gmk-wob-key { background: $color-gmk-abs-CR; color: $color-gmk-abs-WS1; - input { - background: lighten($color-gmk-abs-CR, 40%); + input, .key-contents { + color: $color-gmk-abs-CR; + background: lighten($color-gmk-abs-CR, 60%); } } .gmk-wob-mod { background: $color-gmk-abs-CR; color: $color-gmk-abs-WS1; - input { + input, .key-contents { + color: $color-gmk-abs-CR; background: lighten($color-gmk-abs-CR, 40%); } } @@ -269,14 +271,14 @@ .gmk-olivetti-key { background: $color-gmk-abs-CP; color: $color-gmk-abs-V4; - input { + input, .key-contents { background: lighten($color-gmk-abs-CP, 40%); } } .gmk-olivetti-mod { background: $color-gmk-abs-U9; color: $color-gmk-abs-V4; - input { + input, .key-contents { background: lighten($color-gmk-abs-U9, 40%); } } @@ -286,14 +288,15 @@ .gmk-olivia-key { background: $color-gmk-abs-CP; color: #363434; - input { + input, .key-contents { background: lighten($color-gmk-abs-CP, 40%); } } .gmk-olivia-mod { background: #363434; color: #e8c4b8; - input { + input, .key-contents { + color: lighten(#e8c4b8, 20%); background: lighten(#363434, 40%); } } @@ -327,10 +330,18 @@ .gmk-metaverse-key { background: $color-gmk-abs-WS1; color: $color-gmk-abs-CR; + input, .key-contents { + background: $color-gmk-abs-WS1; + color: $color-gmk-abs-CR; + } } .gmk-metaverse-mod { background: $color-gmk-abs-CR; color: $color-gmk-abs-WS1; + input, .key-contents { + color: $color-gmk-abs-WS1; + background: lighten($color-gmk-abs-CR, 40%); + } } .gmk-metaverse-accent { background: $color-gmk-abs-RO2; diff --git a/src/store/modules/keycodes/quantum.js b/src/store/modules/keycodes/quantum.js index 49ce0a1f44..3325533a64 100644 --- a/src/store/modules/keycodes/quantum.js +++ b/src/store/modules/keycodes/quantum.js @@ -1,3 +1,13 @@ +// make a Layer Tap Key Keycode Definition +function makeLT(layer) { + return { + name: `LT ${layer}`, + code: `LT(${layer},kc)`, + type: 'layer-container', + layer: layer, + title: `kc on tap, switch to layer ${layer} while held` + }; +} export default [ { label: 'Quantum', width: 'label', group: true }, @@ -21,7 +31,7 @@ export default [ title: 'Manually enter any QMK keycode' }, - { label: 'Layer functions', width: 'label' }, + { label: 'Layer and Layer Tap functions', width: 'label' }, { name: 'MO', @@ -67,6 +77,26 @@ export default [ title: 'Switch to layer for one keypress' }, + { width: 500 }, + + makeLT(0), + makeLT(1), + makeLT(2), + makeLT(3), + makeLT(4), + makeLT(5), + makeLT(6), + makeLT(7), + { width: 250 }, + makeLT(8), + makeLT(9), + makeLT(10), + makeLT(11), + makeLT(12), + makeLT(13), + makeLT(14), + makeLT(15), + { label: 'Mod key combinations (A = Alt, C = Control, G = Windows/Command, S = Shift)', diff --git a/src/store/modules/keymap.js b/src/store/modules/keymap.js index 3ffa3b83cf..5f4e940707 100644 --- a/src/store/modules/keymap.js +++ b/src/store/modules/keymap.js @@ -62,7 +62,10 @@ const getters = { function(acc, key, i) { var keycode = key.code; if (keycode) { - if (keycode.indexOf('(kc)') !== -1) { + if ( + keycode.indexOf('(kc)') !== -1 || + keycode.indexOf(',kc)') !== -1 + ) { if (key.contents) { keycode = keycode.replace('kc', key.contents.code); } else { @@ -122,7 +125,7 @@ const mutations = { setSelected(state, index) { state.selectedIndex = index; }, - setKeycode(state, _code) { + setKeycode(state, { _code, layer }) { if (isUndefined(state.selectedIndex)) { return; } @@ -136,6 +139,12 @@ const mutations = { if (type === 'layer') { Vue.set(state.keymap[state.layer][state.selectedIndex], 'layer', 0); } + if (type === 'layer-container') { + if (state.keymap[layer] === undefined) { + mutations.initLayer(state, layer); + } + Vue.set(state.keymap[state.layer][state.selectedIndex], 'layer', layer); + } mutations.setSelected(state, undefined); mutations.setDirty(state); },