diff --git a/shared/src/config-serializer/config-items/Keymap.ts b/shared/src/config-serializer/config-items/Keymap.ts index 6b4893fa..bddda741 100644 --- a/shared/src/config-serializer/config-items/Keymap.ts +++ b/shared/src/config-serializer/config-items/Keymap.ts @@ -69,4 +69,26 @@ export class Keymap { toString(): string { return ``; } + + renameKeymap(oldAbbr: string, newAbbr: string): Keymap { + let layers: Layer[]; + let layerModified = false; + this.layers.forEach((layer, index) => { + const newLayer = layer.renameKeymap(oldAbbr, newAbbr); + if (newLayer !== layer) { + if (!layerModified) { + layers = this.layers.slice(); + layerModified = true; + } + layers[index] = newLayer; + } + }); + if (layerModified) { + const newKeymap = Object.assign(new Keymap(), this); + newKeymap.layers = layers; + return newKeymap; + } + return this; + } + } diff --git a/shared/src/config-serializer/config-items/Layer.ts b/shared/src/config-serializer/config-items/Layer.ts index 8f59557b..72c91e40 100644 --- a/shared/src/config-serializer/config-items/Layer.ts +++ b/shared/src/config-serializer/config-items/Layer.ts @@ -42,4 +42,25 @@ export class Layer { return ``; } + renameKeymap(oldAbbr: string, newAbbr: string): Layer { + let modules: Module[]; + let moduleModified = false; + this.modules.forEach((module, index) => { + const newModule = module.renameKeymap(oldAbbr, newAbbr); + if (newModule !== module) { + if (!moduleModified) { + modules = this.modules.slice(); + moduleModified = true; + } + modules[index] = newModule; + } + }); + if (moduleModified) { + const newLayer = Object.assign(new Layer(), this); + newLayer.modules = modules; + return newLayer; + } + return this; + } + } diff --git a/shared/src/config-serializer/config-items/Module.ts b/shared/src/config-serializer/config-items/Module.ts index 22cff961..a7ce6e72 100644 --- a/shared/src/config-serializer/config-items/Module.ts +++ b/shared/src/config-serializer/config-items/Module.ts @@ -84,4 +84,26 @@ export class Module { return ``; } + renameKeymap(oldAbbr: string, newAbbr: string): Module { + let keyActions: KeyAction[]; + let keyActionModified = false; + this.keyActions.forEach((keyAction, index) => { + if (!keyAction) { return; } + const newKeyAction = keyAction.renameKeymap(oldAbbr, newAbbr); + if (newKeyAction !== keyAction) { + if (!keyActionModified) { + keyActions = this.keyActions.slice(); + keyActionModified = true; + } + keyActions[index] = newKeyAction; + } + }); + if (keyActionModified) { + const newModule = Object.assign(new Module(), this); + newModule.keyActions = keyActions; + return newModule; + } + return this; + } + } diff --git a/shared/src/config-serializer/config-items/key-action/KeyAction.ts b/shared/src/config-serializer/config-items/key-action/KeyAction.ts index bbcc4783..17679b93 100644 --- a/shared/src/config-serializer/config-items/key-action/KeyAction.ts +++ b/shared/src/config-serializer/config-items/key-action/KeyAction.ts @@ -56,4 +56,7 @@ export abstract class KeyAction { abstract toJsonObject(macros?: Macro[]): any; abstract toBinary(buffer: UhkBuffer, macros?: Macro[]): any; + renameKeymap(oldAbbr: string, newAbbr: string): KeyAction { + return this; + } } diff --git a/shared/src/config-serializer/config-items/key-action/SwitchKeymapAction.ts b/shared/src/config-serializer/config-items/key-action/SwitchKeymapAction.ts index fcedfa8c..ee3e92f4 100644 --- a/shared/src/config-serializer/config-items/key-action/SwitchKeymapAction.ts +++ b/shared/src/config-serializer/config-items/key-action/SwitchKeymapAction.ts @@ -6,15 +6,17 @@ export class SwitchKeymapAction extends KeyAction { keymapAbbreviation: string; - constructor(parameter?: SwitchKeymapAction | Keymap) { + constructor(parameter?: SwitchKeymapAction | Keymap | string) { super(); if (!parameter) { return; } if (parameter instanceof SwitchKeymapAction) { this.keymapAbbreviation = parameter.keymapAbbreviation; - } else { + } else if (parameter instanceof Keymap) { this.keymapAbbreviation = parameter.abbreviation; + } else { + this.keymapAbbreviation = parameter; } } @@ -45,4 +47,11 @@ export class SwitchKeymapAction extends KeyAction { toString(): string { return ``; } + + renameKeymap(oldAbbr: string, newAbbr: string): KeyAction { + if (this.keymapAbbreviation !== oldAbbr) { + return this; + } + return new SwitchKeymapAction(newAbbr); + } } diff --git a/shared/src/store/reducers/user-configuration.ts b/shared/src/store/reducers/user-configuration.ts index 6d7ebe8f..0789cb5e 100644 --- a/shared/src/store/reducers/user-configuration.ts +++ b/shared/src/store/reducers/user-configuration.ts @@ -1,10 +1,11 @@ import '@ngrx/core/add/operator/select'; import { Action } from '@ngrx/store'; -import 'rxjs/add/operator/map'; import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/map'; -import { Helper as KeyActionHelper, KeyAction } from '../../config-serializer/config-items/key-action'; +import { Helper as KeyActionHelper, KeyAction, SwitchKeymapAction } from '../../config-serializer/config-items/key-action'; import { Keymap } from '../../config-serializer/config-items/Keymap'; import { Macro } from '../../config-serializer/config-items/Macro'; import { UserConfiguration } from '../../config-serializer/config-items/UserConfiguration'; @@ -53,6 +54,8 @@ export default function (state = initialState, action: Action): UserConfiguratio if (keymap.abbreviation === action.payload.abbr) { keymap = Object.assign(new Keymap(), keymap); keymap.abbreviation = abbr; + } else { + keymap = keymap.renameKeymap(action.payload.abbr, action.payload.newAbbr); } return keymap;