mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-29 23:12:38 +08:00
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:
parent
8cb270ca86
commit
9e3618bc17
@ -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',
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 },
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user