functionAreaSlice.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { createSlice, PayloadAction } from '@reduxjs/toolkit';
  2. interface FunctionAreaState {
  3. action: string | null;
  4. actionTrigger: number;
  5. activeTools: Record<string, boolean>; // 工具激活状态映射
  6. }
  7. const initialState: FunctionAreaState = {
  8. action: null,
  9. actionTrigger: 0,
  10. activeTools: {}, // 初始化为空对象
  11. };
  12. // 需要互斥的鼠标左键绑定工具列表
  13. const MOUSE_BINDING_TOOLS = [
  14. 'Adjust Brightness and Contrast',
  15. 'Magnifier',
  16. 'Zoom Image',
  17. 'Pan'
  18. ] as const;
  19. const functionAreaSlice = createSlice({
  20. name: 'functionArea',
  21. initialState,
  22. reducers: {
  23. setAction: (state, action: PayloadAction<string>) => {
  24. state.action = action.payload;
  25. state.actionTrigger += 1;
  26. },
  27. clearAction: (state) => {
  28. state.action = null;
  29. },
  30. setToolActive: (state, action: PayloadAction<string>) => {
  31. state.activeTools[action.payload] = true;
  32. },
  33. setToolInactive: (state, action: PayloadAction<string>) => {
  34. state.activeTools[action.payload] = false;
  35. },
  36. // 切换工具状态(自动处理互斥)
  37. toggleTool: (state, action: PayloadAction<string>) => {
  38. const toolName = action.payload;
  39. const currentlyActive = state.activeTools[toolName];
  40. // 如果工具已激活,停用它
  41. if (currentlyActive) {
  42. state.activeTools[toolName] = false;
  43. state.action = `Deactivate:${toolName}`;
  44. } else {
  45. // 停用所有其他工具(互斥)
  46. MOUSE_BINDING_TOOLS.forEach(tool => {
  47. state.activeTools[tool] = false;
  48. });
  49. // 激活当前工具
  50. state.activeTools[toolName] = true;
  51. state.action = `Activate:${toolName}`;
  52. }
  53. state.actionTrigger += 1;
  54. },
  55. // 停用所有工具
  56. deactivateAllTools: (state) => {
  57. MOUSE_BINDING_TOOLS.forEach(tool => {
  58. state.activeTools[tool] = false;
  59. });
  60. state.action = 'DeactivateAll';
  61. state.actionTrigger += 1;
  62. },
  63. },
  64. });
  65. export const { setAction, clearAction, setToolActive, setToolInactive, toggleTool, deactivateAllTools } = functionAreaSlice.actions;
  66. export default functionAreaSlice.reducer;