diff --git a/packages/uhk-common/package.json b/packages/uhk-common/package.json index eb44870c512..1eb50887452 100644 --- a/packages/uhk-common/package.json +++ b/packages/uhk-common/package.json @@ -16,7 +16,7 @@ "build:generate-versions": "node ./scripts/generate-versions.mjs", "build:tsc": "tsc --project src/tsconfig.build.json", "build:user-config": "tsx ./scripts/generate-user-configs.ts", - "clean": "rimraf ./node_modules ./dist user-config.json", + "clean": "rimraf ./node_modules ./dist user-config.json ./src/user-config-60.ts ./src/user-config-80.ts", "test": "node --loader=ts-node/esm --test \"**/*.test.ts\"", "lint": "eslint" }, diff --git a/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration-values.ts b/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration-values.ts new file mode 100644 index 00000000000..784d0792c0b --- /dev/null +++ b/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration-values.ts @@ -0,0 +1,108 @@ +import { UHK_80_USER_CONFIG } from '../../user-config-80.js'; + +import { AdvancedSecondaryRoleConfiguration } from './advanced-secondary-role-configuration'; +import { SecondaryRoleAdvancedStrategyTimeoutAction } from './secondary-role-advanced-strategy-timeout-action.js'; +import { SecondaryRoleAdvancedStrategyTimeoutType } from './secondary-role-advanced-strategy-timeout-type.js'; +import { SecondaryRoleAdvancedStrategyTriggeringEvent } from './secondary-role-advanced-strategy-triggering-event.js'; +import { SecondaryRoleStrategy } from './secondary-role-strategy.js'; + +export const ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES: Array = [ + 'secondaryRoleAdvancedStrategyTimeout', + 'secondaryRoleAdvancedStrategyMinimumHoldTime', + 'secondaryRoleAdvancedStrategyTrigger', + 'secondaryRoleAdvancedStrategyTimeoutAction', + 'secondaryRoleAdvancedStrategyTimeoutType', + 'secondaryRoleAdvancedStrategySafetyMargin', + 'secondaryRoleAdvancedStrategyDoubletapToPrimary', + 'secondaryRoleAdvancedStrategyTriggerByMouse', + 'secondaryRoleAdvancedStrategyTriggerFromSameHalf' +] + +export const ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_SET = new Set(ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES) + +export interface AdvancedSecondaryRoleConfigurationPreset { + name: string; + strategy: SecondaryRoleStrategy; + tooltip: string; + configuration: AdvancedSecondaryRoleConfiguration; +} + +export const CUSTOM_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME = 'Custom'; +export const CUSTOM_ADVANCED_SECONDARY_ROLE_TOOLTIP = 'your individual settings'; +export const TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME = 'Timeout'; +export const SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME = 'Simple'; + +export const SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { + name: SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME, + strategy: SecondaryRoleStrategy.Simple, + tooltip: 'hold while tapping another key for secondary, tap for primary', + configuration: { + secondaryRoleAdvancedStrategyTimeout: UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyTimeout, // TODO: Firngrod, can the timeout be disabled with the new implementation? + secondaryRoleAdvancedStrategyMinimumHoldTime: UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyMinimumHoldTime, + secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction[UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyTimeoutAction], + secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType[UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyTimeoutType], + secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent[UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyTrigger], + secondaryRoleAdvancedStrategySafetyMargin: UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategySafetyMargin, + secondaryRoleAdvancedStrategyDoubletapToPrimary: UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyDoubletapToPrimary, + secondaryRoleAdvancedStrategyTriggerByMouse: UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyTriggerByMouse, + secondaryRoleAdvancedStrategyTriggerFromSameHalf: UHK_80_USER_CONFIG.secondaryRoleAdvancedStrategyTriggerFromSameHalf, + } +} + +export const HRM_TIMEOUT_CANCEL_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { + name: 'HRM-timeout-cancel', + strategy: SecondaryRoleStrategy.Advanced, + tooltip: 'hold while tapping another key for secondary, tap for primary, hold past timeout for no action', + configuration: { + secondaryRoleAdvancedStrategyTimeout: 300, + secondaryRoleAdvancedStrategyMinimumHoldTime: 150, + secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.None, + secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Passive, + secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.Release, + secondaryRoleAdvancedStrategySafetyMargin: -40, + secondaryRoleAdvancedStrategyDoubletapToPrimary: false, + secondaryRoleAdvancedStrategyTriggerByMouse: true, + secondaryRoleAdvancedStrategyTriggerFromSameHalf: false, + } +} + +export const HRM_TIMEOUT_SECONDARY_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { + name: 'HRM-timeout-secondary', + strategy: SecondaryRoleStrategy.Advanced, + tooltip: 'hold while tapping another key or hold past timeout for secondary, tap for primary', + configuration: { + secondaryRoleAdvancedStrategyTimeout: 350, + secondaryRoleAdvancedStrategyMinimumHoldTime: 100, + secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.Secondary, + secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Active, + secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.Release, + secondaryRoleAdvancedStrategySafetyMargin: 1, + secondaryRoleAdvancedStrategyDoubletapToPrimary: true, + secondaryRoleAdvancedStrategyTriggerByMouse: false, + secondaryRoleAdvancedStrategyTriggerFromSameHalf: false, + } +} + +export const TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { + name: TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME, + strategy: SecondaryRoleStrategy.Advanced, + tooltip: 'hold until timeout for secondary, briefly tap for primary', + configuration: { + secondaryRoleAdvancedStrategyTimeout: 200, + secondaryRoleAdvancedStrategyMinimumHoldTime: 150, + secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.Secondary, + secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Active, + secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.None, + secondaryRoleAdvancedStrategySafetyMargin: 0, + secondaryRoleAdvancedStrategyDoubletapToPrimary: true, + secondaryRoleAdvancedStrategyTriggerByMouse: true, + secondaryRoleAdvancedStrategyTriggerFromSameHalf: true, + } +} + +export const BUILTIN_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESETS: AdvancedSecondaryRoleConfigurationPreset[] = [ + SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, + HRM_TIMEOUT_CANCEL_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, + HRM_TIMEOUT_SECONDARY_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, + TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, +]; diff --git a/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration.ts b/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration.ts index d421a393e7d..e6e0bbfbec9 100644 --- a/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration.ts +++ b/packages/uhk-common/src/config-serializer/config-items/advanced-secondary-role-configuration.ts @@ -1,7 +1,6 @@ import { SecondaryRoleAdvancedStrategyTimeoutAction } from './secondary-role-advanced-strategy-timeout-action.js'; import { SecondaryRoleAdvancedStrategyTimeoutType } from './secondary-role-advanced-strategy-timeout-type.js'; import { SecondaryRoleAdvancedStrategyTriggeringEvent } from './secondary-role-advanced-strategy-triggering-event.js'; -import { SecondaryRoleStrategy } from './secondary-role-strategy.js'; export interface AdvancedSecondaryRoleConfiguration { secondaryRoleAdvancedStrategyTimeout: number; @@ -14,104 +13,3 @@ export interface AdvancedSecondaryRoleConfiguration { secondaryRoleAdvancedStrategyTriggerByMouse: boolean; secondaryRoleAdvancedStrategyTriggerFromSameHalf: boolean; } - -export const ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES: Array = [ - 'secondaryRoleAdvancedStrategyTimeout', - 'secondaryRoleAdvancedStrategyMinimumHoldTime', - 'secondaryRoleAdvancedStrategyTrigger', - 'secondaryRoleAdvancedStrategyTimeoutAction', - 'secondaryRoleAdvancedStrategyTimeoutType', - 'secondaryRoleAdvancedStrategySafetyMargin', - 'secondaryRoleAdvancedStrategyDoubletapToPrimary', - 'secondaryRoleAdvancedStrategyTriggerByMouse', - 'secondaryRoleAdvancedStrategyTriggerFromSameHalf' -] - -export const ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_SET = new Set(ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES) - -export interface AdvancedSecondaryRoleConfigurationPreset { - name: string; - strategy: SecondaryRoleStrategy; - tooltip: string; - configuration: AdvancedSecondaryRoleConfiguration; -} - -export const CUSTOM_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME = 'Custom'; -export const CUSTOM_ADVANCED_SECONDARY_ROLE_TOOLTIP = 'your individual settings'; -export const TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME = 'Timeout'; -export const SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME = 'Simple'; - -export const SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { - name: SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME, - strategy: SecondaryRoleStrategy.Simple, - tooltip: 'hold while tapping another key for secondary, tap for primary', - configuration: { - secondaryRoleAdvancedStrategyTimeout: 1000, // TODO: Firngrod, can the timeout be disabled with the new implementation? - secondaryRoleAdvancedStrategyMinimumHoldTime: 0, - secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.Secondary, - secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Active, - secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.Press, - secondaryRoleAdvancedStrategySafetyMargin: 0, - secondaryRoleAdvancedStrategyDoubletapToPrimary: false, - secondaryRoleAdvancedStrategyTriggerByMouse: true, - secondaryRoleAdvancedStrategyTriggerFromSameHalf: true, - } -} - -export const HRM_TIMEOUT_CANCEL_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { - name: 'HRM-timeout-cancel', - strategy: SecondaryRoleStrategy.Advanced, - tooltip: 'hold while tapping another key for secondary, tap for primary, hold past timeout for no action', - configuration: { - secondaryRoleAdvancedStrategyTimeout: 300, - secondaryRoleAdvancedStrategyMinimumHoldTime: 150, - secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.None, - secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Passive, - secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.Release, - secondaryRoleAdvancedStrategySafetyMargin: -40, - secondaryRoleAdvancedStrategyDoubletapToPrimary: false, - secondaryRoleAdvancedStrategyTriggerByMouse: true, - secondaryRoleAdvancedStrategyTriggerFromSameHalf: false, - } -} - -export const HRM_TIMEOUT_SECONDARY_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { - name: 'HRM-timeout-secondary', - strategy: SecondaryRoleStrategy.Advanced, - tooltip: 'hold while tapping another key or hold past timeout for secondary, tap for primary', - configuration: { - secondaryRoleAdvancedStrategyTimeout: 350, - secondaryRoleAdvancedStrategyMinimumHoldTime: 100, - secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.Secondary, - secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Active, - secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.Release, - secondaryRoleAdvancedStrategySafetyMargin: 1, - secondaryRoleAdvancedStrategyDoubletapToPrimary: true, - secondaryRoleAdvancedStrategyTriggerByMouse: false, - secondaryRoleAdvancedStrategyTriggerFromSameHalf: false, - } -} - -export const TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET: AdvancedSecondaryRoleConfigurationPreset = { - name: TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME, - strategy: SecondaryRoleStrategy.Advanced, - tooltip: 'hold until timeout for secondary, briefly tap for primary', - configuration: { - secondaryRoleAdvancedStrategyTimeout: 200, - secondaryRoleAdvancedStrategyMinimumHoldTime: 150, - secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction.Secondary, - secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType.Active, - secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent.None, - secondaryRoleAdvancedStrategySafetyMargin: 0, - secondaryRoleAdvancedStrategyDoubletapToPrimary: true, - secondaryRoleAdvancedStrategyTriggerByMouse: true, - secondaryRoleAdvancedStrategyTriggerFromSameHalf: true, - } -} - -export const BUILTIN_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESETS: AdvancedSecondaryRoleConfigurationPreset[] = [ - SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, - HRM_TIMEOUT_CANCEL_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, - HRM_TIMEOUT_SECONDARY_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, - TIMEOUT_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, -]; diff --git a/packages/uhk-common/src/index.ts b/packages/uhk-common/src/index.ts index d42af083aeb..65b82cb7f7b 100644 --- a/packages/uhk-common/src/index.ts +++ b/packages/uhk-common/src/index.ts @@ -1,4 +1,5 @@ export { Buffer } from './buffer.js'; +export * from './config-serializer/config-items/advanced-secondary-role-configuration-values.js'; export * from './config-serializer/index.js'; export * from './log/index.js'; export * from './models/index.js'; diff --git a/packages/uhk-common/user-config-80.json b/packages/uhk-common/user-config-80.json index e120c15a352..015515c04fb 100644 --- a/packages/uhk-common/user-config-80.json +++ b/packages/uhk-common/user-config-80.json @@ -65,12 +65,12 @@ "mouseScrollAcceleratedSpeed": 50, "secondaryRoleStrategy": "Simple", "secondaryRoleAdvancedStrategyDoubletapTimeout": 200, - "secondaryRoleAdvancedStrategyTimeout": 350, - "secondaryRoleAdvancedStrategySafetyMargin": 50, - "secondaryRoleAdvancedStrategyTrigger": "Release", - "secondaryRoleAdvancedStrategyDoubletapToPrimary": true, + "secondaryRoleAdvancedStrategyTimeout": 1000, + "secondaryRoleAdvancedStrategySafetyMargin": 0, + "secondaryRoleAdvancedStrategyTrigger": "Press", + "secondaryRoleAdvancedStrategyDoubletapToPrimary": false, "secondaryRoleAdvancedStrategyTimeoutAction": "Secondary", - "secondaryRoleAdvancedStrategyTriggerByMouse": false, + "secondaryRoleAdvancedStrategyTriggerByMouse": true, "secondaryRoleAdvancedStrategyTriggerFromSameHalf": true, "secondaryRoleAdvancedStrategyMinimumHoldTime": 0, "secondaryRoleAdvancedStrategyTimeoutType": "Active", diff --git a/packages/uhk-web/src/app/store/reducers/user-configuration.ts b/packages/uhk-web/src/app/store/reducers/user-configuration.ts index 954099fe30d..da1cb72cab2 100644 --- a/packages/uhk-web/src/app/store/reducers/user-configuration.ts +++ b/packages/uhk-web/src/app/store/reducers/user-configuration.ts @@ -36,6 +36,7 @@ import { RgbColorInterface, RightSlotModules, SecondaryRoleStrategy, + SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET, SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME, SwitchKeymapAction, SwitchLayerAction, @@ -169,8 +170,19 @@ export function reducer( newState.newerUserConfiguration = undefined; newState.selectedKeymapAbbr = undefined; newState.layerOptions = calculateLayerOptions(newState); - newState.customAdvancedSecondaryRoleConfiguration = undefined; - newState.isCustomPresetTheLastLoadedPreset = false; + + // If the secondary role strategy is simple, then always set the simple preset values. + // It prevents the UI inconsistency when we change the values of the Simple strategy and the UI shows different values. + if (newState.userConfiguration.secondaryRoleStrategy === SecondaryRoleStrategy.Simple) { + applyAdvancedSecondaryRoleConfiguration(newState.userConfiguration, SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET.configuration); + } + else { + const advancedSecondaryRoleConfiguration = extractAdvancedSecondaryRoleConfiguration(newState.userConfiguration); + newState.isCustomPresetTheLastLoadedPreset = !BUILTIN_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESETS.find(preset => isEqual(preset.configuration, advancedSecondaryRoleConfiguration)) + if (newState.isCustomPresetTheLastLoadedPreset) { + newState.customAdvancedSecondaryRoleConfiguration = advancedSecondaryRoleConfiguration; + } + } return newState; } @@ -927,17 +939,7 @@ export function reducer( newState.isCustomPresetTheLastLoadedPreset = false; } - const customAdvancedSecondaryRoleConfiguration = {} as AdvancedSecondaryRoleConfiguration; - newState.customAdvancedSecondaryRoleConfiguration = customAdvancedSecondaryRoleConfiguration; - - for (const fieldName of ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES) { - // Save the old typings behavior config - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (customAdvancedSecondaryRoleConfiguration[fieldName] as any) = userConfiguration[fieldName]; - // Apply the loaded typings behavior config - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (userConfiguration[fieldName] as any) = presetConfiguration[fieldName]; - } + applyAdvancedSecondaryRoleConfiguration(userConfiguration, presetConfiguration); return newState } @@ -1087,11 +1089,14 @@ export function reducer( case UserConfig.ActionTypes.SetUserConfigurationValue: { const payload = (action as UserConfig.SetUserConfigurationValueAction).payload; const userConfiguration: UserConfiguration = Object.assign(new UserConfiguration(), state.userConfiguration); + const newState = { + ...state, + userConfiguration, + }; userConfiguration[payload.propertyName] = payload.value; - let selectedBacklightingColorIndex = state.selectedBacklightingColorIndex; if (payload.propertyName === 'backlightingMode') { - selectedBacklightingColorIndex = -1; + newState.selectedBacklightingColorIndex = -1; if (payload.value === BacklightingMode.PerKeyBacklighting) { userConfiguration.perKeyRgbPresent = true; } @@ -1100,13 +1105,16 @@ export function reducer( if (ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_SET.has(payload.propertyName as keyof AdvancedSecondaryRoleConfiguration)) { userConfiguration.secondaryRoleStrategy = SecondaryRoleStrategy.Advanced; + + newState.isCustomPresetTheLastLoadedPreset = true + newState.customAdvancedSecondaryRoleConfiguration = {} as AdvancedSecondaryRoleConfiguration; + for (const fieldName of ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (newState.customAdvancedSecondaryRoleConfiguration[fieldName] as any )= userConfiguration[fieldName]; + } } - return { - ...state, - selectedBacklightingColorIndex, - userConfiguration - }; + return newState; } case KeymapActions.ActionTypes.EditDescription: { @@ -1329,18 +1337,13 @@ export const isBacklightingColoring = (state: State): boolean => state.selectedB export const selectedBacklightingColor = (state: State): RgbColorInterface => state.backlightingColorPalette[state.selectedBacklightingColorIndex]; export const selectedBacklightingColorIndex = (state: State): number => state.selectedBacklightingColorIndex; export const calculateTypingBehaviorPresets = (state: State): TypingBehaviorPreset[] => { - const currentConfiguration = ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES.reduce((config, fieldName) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (config[fieldName] as any) = state.userConfiguration[fieldName]; - - return config; - }, {} as AdvancedSecondaryRoleConfiguration) + const currentConfiguration = extractAdvancedSecondaryRoleConfiguration(state.userConfiguration); let hasMatches = false; const result: TypingBehaviorPreset[] = BUILTIN_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESETS.map(preset => { if (preset.name === SIMPLE_ADVANCED_SECONDARY_ROLE_CONFIGURATION_PRESET_NAME) { - hasMatches = state.userConfiguration.secondaryRoleStrategy === SecondaryRoleStrategy.Simple; + hasMatches = !state.isCustomPresetTheLastLoadedPreset && state.userConfiguration.secondaryRoleStrategy === SecondaryRoleStrategy.Simple; return { ...preset, @@ -1348,14 +1351,6 @@ export const calculateTypingBehaviorPresets = (state: State): TypingBehaviorPres } } - if (state.userConfiguration.secondaryRoleStrategy === SecondaryRoleStrategy.Simple) { - return { - ...preset, - selected: false, - } - } - - if (!state.isCustomPresetTheLastLoadedPreset && isEqual(preset.configuration, currentConfiguration)) { hasMatches = true; return { @@ -1666,3 +1661,20 @@ function generateHostConnectionName(hostConnections: HostConnection[], baseName: iter++; } } + +function applyAdvancedSecondaryRoleConfiguration(userConfiguration: UserConfiguration, advancedSecondaryRoleConfiguration: AdvancedSecondaryRoleConfiguration) { + for (const fieldName of ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (userConfiguration[fieldName] as any) = advancedSecondaryRoleConfiguration[fieldName]; + } + +} + +function extractAdvancedSecondaryRoleConfiguration(userConfiguration: UserConfiguration): AdvancedSecondaryRoleConfiguration { + return ADVANCED_SECONDARY_ROLE_CONFIGURATION_FIELD_NAMES.reduce((config, fieldName) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (config[fieldName] as any) = userConfiguration[fieldName]; + + return config; + }, {} as AdvancedSecondaryRoleConfiguration); +}