refactor: update selection preferences and enums for improved consistency

- Removed deprecated selection IPC channels from IpcChannel.
- Replaced string literals with enums for SelectionTriggerMode and SelectionFilterMode in preference management.
- Updated the SelectionService and selectionStore to utilize the new enum types for better type safety and clarity.
- Marked selectionStore as deprecated for future removal after data refactoring.
This commit is contained in:
fullex 2025-09-09 12:14:29 +08:00
parent 8cb270ca86
commit 9e3618bc17
6 changed files with 34 additions and 63 deletions

View File

@ -280,12 +280,6 @@ export enum IpcChannel {
Selection_ToolbarVisibilityChange = 'selection:toolbar-visibility-change',
Selection_ToolbarDetermineSize = 'selection:toolbar-determine-size',
Selection_WriteToClipboard = 'selection:write-to-clipboard',
Selection_SetEnabled = 'selection:set-enabled',
Selection_SetTriggerMode = 'selection:set-trigger-mode',
Selection_SetFilterMode = 'selection:set-filter-mode',
Selection_SetFilterList = 'selection:set-filter-list',
Selection_SetFollowToolbar = 'selection:set-follow-toolbar',
Selection_SetRemeberWinSize = 'selection:set-remeber-win-size',
Selection_ActionWindowClose = 'selection:action-window-close',
Selection_ActionWindowMinimize = 'selection:action-window-minimize',
Selection_ActionWindowPin = 'selection:action-window-pin',

View File

@ -14,8 +14,18 @@ export type PreferenceShortcutType = {
system: boolean
}
export type SelectionTriggerMode = 'selected' | 'ctrlkey' | 'shortcut'
export type SelectionFilterMode = 'default' | 'whitelist' | 'blacklist'
export enum SelectionTriggerMode {
Selected = 'selected',
Ctrlkey = 'ctrlkey',
Shortcut = 'shortcut'
}
export enum SelectionFilterMode {
Default = 'default',
Whitelist = 'whitelist',
Blacklist = 'blacklist'
}
export type SelectionActionItem = {
id: string
name: string

View File

@ -584,10 +584,10 @@ export const DefaultPreferences: PreferencesType = {
'feature.selection.compact': false,
'feature.selection.enabled': false,
'feature.selection.filter_list': [],
'feature.selection.filter_mode': 'default',
'feature.selection.filter_mode': PreferenceTypes.SelectionFilterMode.Default,
'feature.selection.follow_toolbar': true,
'feature.selection.remember_win_size': false,
'feature.selection.trigger_mode': 'selected',
'feature.selection.trigger_mode': PreferenceTypes.SelectionTriggerMode.Selected,
'feature.translate.model_prompt': TRANSLATE_PROMPT,
'feature.translate.target_language': 'en-us',
'shortcut.app.exit_fullscreen': { editable: false, enabled: true, key: ['Escape'], system: true },

View File

@ -2,7 +2,8 @@ import { preferenceService } from '@data/PreferenceService'
import { loggerService } from '@logger'
import { SELECTION_FINETUNED_LIST, SELECTION_PREDEFINED_BLACKLIST } from '@main/configs/SelectionConfig'
import { isDev, isMac, isWin } from '@main/constant'
import type { SelectionActionItem, SelectionFilterMode, SelectionTriggerMode } from '@shared/data/preferenceTypes'
import type { SelectionActionItem } from '@shared/data/preferenceTypes'
import { SelectionTriggerMode } from '@shared/data/preferenceTypes'
import { IpcChannel } from '@shared/IpcChannel'
import { app, BrowserWindow, ipcMain, screen, systemPreferences } from 'electron'
import { join } from 'path'
@ -41,12 +42,6 @@ type RelativeOrientation =
| 'middleRight'
| 'center'
enum TriggerMode {
Selected = 'selected',
Ctrlkey = 'ctrlkey',
Shortcut = 'shortcut'
}
/** SelectionService is a singleton class that manages the selection hook and the toolbar window
*
* Features:
@ -69,7 +64,7 @@ export class SelectionService {
private initStatus: boolean = false
private started: boolean = false
private triggerMode = TriggerMode.Selected
private triggerMode = SelectionTriggerMode.Selected
private isFollowToolbar = true
private isRemeberWinSize = false
private filterMode = 'default'
@ -160,7 +155,7 @@ export class SelectionService {
}
private initConfig(): void {
this.triggerMode = preferenceService.get('feature.selection.trigger_mode') as TriggerMode
this.triggerMode = preferenceService.get('feature.selection.trigger_mode')
this.isFollowToolbar = preferenceService.get('feature.selection.follow_toolbar')
this.isRemeberWinSize = preferenceService.get('feature.selection.remember_win_size')
this.filterMode = preferenceService.get('feature.selection.filter_mode')
@ -170,10 +165,10 @@ export class SelectionService {
this.setHookFineTunedList()
this.unsubscriberForChangeListeners.push(
preferenceService.subscribeChange('feature.selection.trigger_mode', (triggerMode: string) => {
const oldTriggerMode = this.triggerMode as TriggerMode
preferenceService.subscribeChange('feature.selection.trigger_mode', (triggerMode: SelectionTriggerMode) => {
const oldTriggerMode = this.triggerMode
this.triggerMode = triggerMode as TriggerMode
this.triggerMode = triggerMode
this.processTriggerMode()
//trigger mode changed, need to update the filter list
@ -233,7 +228,7 @@ export class SelectionService {
let combinedMode = mode
//only the selected mode need to combine the predefined blacklist with the user-defined blacklist
if (this.triggerMode === TriggerMode.Selected) {
if (this.triggerMode === SelectionTriggerMode.Selected) {
switch (mode) {
case 'blacklist':
//combine the predefined blacklist with the user-defined blacklist
@ -753,7 +748,7 @@ export class SelectionService {
* it's a public method used by shortcut service
*/
public processSelectTextByShortcut(): void {
if (!this.selectionHook || !this.started || this.triggerMode !== TriggerMode.Shortcut) return
if (!this.selectionHook || !this.started || this.triggerMode !== SelectionTriggerMode.Shortcut) return
const selectionData = this.selectionHook.getCurrentSelection()
@ -1012,7 +1007,7 @@ export class SelectionService {
*/
private handleKeyDownHide = (data: KeyboardEventData) => {
//dont hide toolbar when ctrlkey is pressed
if (this.triggerMode === TriggerMode.Ctrlkey && this.isCtrlkey(data.vkCode)) {
if (this.triggerMode === SelectionTriggerMode.Ctrlkey && this.isCtrlkey(data.vkCode)) {
return
}
//dont hide toolbar when shiftkey or altkey is pressed, because it's used for selection
@ -1412,7 +1407,7 @@ export class SelectionService {
if (!this.selectionHook) return
switch (this.triggerMode) {
case TriggerMode.Selected:
case SelectionTriggerMode.Selected:
if (this.isCtrlkeyListenerActive) {
this.selectionHook.off('key-down', this.handleKeyDownCtrlkeyMode)
this.selectionHook.off('key-up', this.handleKeyUpCtrlkeyMode)
@ -1422,7 +1417,7 @@ export class SelectionService {
this.selectionHook.setSelectionPassiveMode(false)
break
case TriggerMode.Ctrlkey:
case SelectionTriggerMode.Ctrlkey:
if (!this.isCtrlkeyListenerActive) {
this.selectionHook.on('key-down', this.handleKeyDownCtrlkeyMode)
this.selectionHook.on('key-up', this.handleKeyUpCtrlkeyMode)
@ -1432,7 +1427,7 @@ export class SelectionService {
this.selectionHook.setSelectionPassiveMode(true)
break
case TriggerMode.Shortcut:
case SelectionTriggerMode.Shortcut:
//remove the ctrlkey listener, don't need any key listener for shortcut mode
if (this.isCtrlkeyListenerActive) {
this.selectionHook.off('key-down', this.handleKeyDownCtrlkeyMode)
@ -1470,30 +1465,6 @@ export class SelectionService {
selectionService?.determineToolbarSize(width, height)
})
ipcMain.handle(IpcChannel.Selection_SetEnabled, (_, enabled: boolean) => {
preferenceService.set('feature.selection.enabled', enabled)
})
ipcMain.handle(IpcChannel.Selection_SetTriggerMode, (_, triggerMode: SelectionTriggerMode) => {
preferenceService.set('feature.selection.trigger_mode', triggerMode)
})
ipcMain.handle(IpcChannel.Selection_SetFollowToolbar, (_, isFollowToolbar: boolean) => {
preferenceService.set('feature.selection.follow_toolbar', isFollowToolbar)
})
ipcMain.handle(IpcChannel.Selection_SetRemeberWinSize, (_, isRemeberWinSize: boolean) => {
preferenceService.set('feature.selection.remember_win_size', isRemeberWinSize)
})
ipcMain.handle(IpcChannel.Selection_SetFilterMode, (_, filterMode: SelectionFilterMode) => {
preferenceService.set('feature.selection.filter_mode', filterMode)
})
ipcMain.handle(IpcChannel.Selection_SetFilterList, (_, filterList: string[]) => {
preferenceService.set('feature.selection.filter_list', filterList)
})
// [macOS] only macOS has the available isFullscreen mode
ipcMain.handle(
IpcChannel.Selection_ProcessAction,

View File

@ -382,14 +382,6 @@ const api = {
writeToClipboard: (text: string) => ipcRenderer.invoke(IpcChannel.Selection_WriteToClipboard, text),
determineToolbarSize: (width: number, height: number) =>
ipcRenderer.invoke(IpcChannel.Selection_ToolbarDetermineSize, width, height),
setEnabled: (enabled: boolean) => ipcRenderer.invoke(IpcChannel.Selection_SetEnabled, enabled),
setTriggerMode: (triggerMode: string) => ipcRenderer.invoke(IpcChannel.Selection_SetTriggerMode, triggerMode),
setFollowToolbar: (isFollowToolbar: boolean) =>
ipcRenderer.invoke(IpcChannel.Selection_SetFollowToolbar, isFollowToolbar),
setRemeberWinSize: (isRemeberWinSize: boolean) =>
ipcRenderer.invoke(IpcChannel.Selection_SetRemeberWinSize, isRemeberWinSize),
setFilterMode: (filterMode: string) => ipcRenderer.invoke(IpcChannel.Selection_SetFilterMode, filterMode),
setFilterList: (filterList: string[]) => ipcRenderer.invoke(IpcChannel.Selection_SetFilterList, filterList),
processAction: (actionItem: SelectionActionItem, isFullScreen: boolean = false) =>
ipcRenderer.invoke(IpcChannel.Selection_ProcessAction, actionItem, isFullScreen),
closeActionWindow: () => ipcRenderer.invoke(IpcChannel.Selection_ActionWindowClose),

View File

@ -1,5 +1,9 @@
/**
* @deprecated The whole file will be removed after data refactoring
*/
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import type { SelectionActionItem, SelectionFilterMode, SelectionTriggerMode } from '@shared/data/preferenceTypes'
import type { SelectionActionItem } from '@shared/data/preferenceTypes'
import { SelectionFilterMode, SelectionTriggerMode } from '@shared/data/preferenceTypes'
export interface SelectionState {
selectionEnabled: boolean
@ -34,13 +38,13 @@ export const defaultActionItems: SelectionActionItem[] = [
export const initialState: SelectionState = {
selectionEnabled: false,
triggerMode: 'selected',
triggerMode: SelectionTriggerMode.Selected,
isCompact: false,
isAutoClose: false,
isAutoPin: false,
isFollowToolbar: true,
isRemeberWinSize: false,
filterMode: 'default',
filterMode: SelectionFilterMode.Default,
filterList: [],
actionWindowOpacity: 100,
actionItems: defaultActionItems