Files
agent/packages/uhk-common/src/config-serializer/config-items/module.ts
2018-02-17 18:07:33 +01:00

93 lines
2.9 KiB
TypeScript

import { assertEnum, assertUInt8 } from '../assert';
import { UhkBuffer } from '../uhk-buffer';
import { KeyActionHelper, KeyAction, NoneAction, PlayMacroAction, SwitchKeymapAction } from './key-action';
import { Macro } from './macro';
import { UserConfiguration } from './user-configuration';
export class Module {
@assertUInt8
id: number;
keyActions: KeyAction[];
constructor(other?: Module) {
if (!other) {
return;
}
this.id = other.id;
this.keyActions = other.keyActions.map(keyAction => KeyActionHelper.createKeyAction(keyAction));
}
fromJsonObject(jsonObject: any, macros?: Macro[]): Module {
this.id = jsonObject.id;
this.keyActions = jsonObject.keyActions.map((keyAction: any) => {
return KeyActionHelper.createKeyAction(keyAction, macros);
});
return this;
}
fromBinary(buffer: UhkBuffer, macros?: Macro[]): Module {
this.id = buffer.readUInt8();
const keyActionsLength: number = buffer.readCompactLength();
this.keyActions = [];
for (let i = 0; i < keyActionsLength; ++i) {
this.keyActions.push(KeyActionHelper.createKeyAction(buffer, macros));
}
return this;
}
toJsonObject(macros?: Macro[]): any {
return {
id: this.id,
keyActions: this.keyActions.map(keyAction => {
if (keyAction && (macros || !(keyAction instanceof PlayMacroAction || keyAction instanceof SwitchKeymapAction))) {
return keyAction.toJsonObject(macros);
}
return null;
})
};
}
toBinary(buffer: UhkBuffer, userConfiguration: UserConfiguration): void {
buffer.writeUInt8(this.id);
const noneAction = new NoneAction();
buffer.writeArray(this.keyActions, (uhkBuffer: UhkBuffer, keyAction: KeyAction) => {
if (keyAction) {
keyAction.toBinary(uhkBuffer, userConfiguration);
} else {
noneAction.toBinary(uhkBuffer);
}
});
}
toString(): string {
return `<Module id="${this.id}">`;
}
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;
}
}