From 0b27ad91d57a73c57b24eb46f7e62ecc67feccc1 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 6 Aug 2020 14:36:08 +0800 Subject: [PATCH] adapt undo/redo to Electron app menu --- .../client/src/hooks/useElectronFeatures.ts | 6 ++-- .../client/src/pages/design/DesignPage.tsx | 16 ++++++++-- .../packages/electron-server/src/appMenu.ts | 29 +++++++++++++++---- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Composer/packages/client/src/hooks/useElectronFeatures.ts b/Composer/packages/client/src/hooks/useElectronFeatures.ts index 3f5846eba2..0f9e00d974 100644 --- a/Composer/packages/client/src/hooks/useElectronFeatures.ts +++ b/Composer/packages/client/src/hooks/useElectronFeatures.ts @@ -5,14 +5,14 @@ import { useEffect } from 'react'; import get from 'lodash/get'; import { getEditorAPI } from '@bfc/shared'; -export const useElectronFeatures = (actionSelected: boolean) => { +export const useElectronFeatures = (actionSelected: boolean, canUndo: boolean, canRedo: boolean) => { // Sync selection state to Electron main process useEffect(() => { if (!window.__IS_ELECTRON__) return; if (!window.ipcRenderer || typeof window.ipcRenderer.send !== 'function') return; - window.ipcRenderer.send('composer-state-change', { actionSelected }); - }, [actionSelected]); + window.ipcRenderer.send('composer-state-change', { actionSelected, canUndo, canRedo }); + }, [actionSelected, canUndo, canRedo]); // Subscribe Electron app menu events (copy/cut/del/undo/redo) useEffect(() => { diff --git a/Composer/packages/client/src/pages/design/DesignPage.tsx b/Composer/packages/client/src/pages/design/DesignPage.tsx index 1a27b9fb17..47e2f77617 100644 --- a/Composer/packages/client/src/pages/design/DesignPage.tsx +++ b/Composer/packages/client/src/pages/design/DesignPage.tsx @@ -8,7 +8,15 @@ import { Breadcrumb, IBreadcrumbItem } from 'office-ui-fabric-react/lib/Breadcru import formatMessage from 'format-message'; import { globalHistory, RouteComponentProps } from '@reach/router'; import get from 'lodash/get'; -import { DialogFactory, SDKKinds, DialogInfo, PromptTab, LuIntentSection, getEditorAPI } from '@bfc/shared'; +import { + DialogFactory, + SDKKinds, + DialogInfo, + PromptTab, + LuIntentSection, + getEditorAPI, + registerEditorAPI, +} from '@bfc/shared'; import { ActionButton } from 'office-ui-fabric-react/lib/Button'; import { JsonEditor } from '@bfc/code-editor'; import Extension, { useTriggerApi, PluginConfig } from '@bfc/extension'; @@ -189,6 +197,10 @@ const DesignPage: React.FC { + registerEditorAPI('Editing', { + Undo: () => undo(), + Redo: () => redo(), + }); //leave design page should clear the history return clearUndo; }, []); @@ -241,7 +253,7 @@ const DesignPage: React.FC handleMenuEvents('undo') }, - { id: 'Redo', label: 'Redo', accelerator: 'CmdOrCtrl+Shift+Z', click: () => handleMenuEvents('redo') }, + { + id: 'Undo', + label: 'Undo', + enabled: false, + accelerator: 'CmdOrCtrl+Z', + click: () => handleMenuEvents('undo'), + }, + { + id: 'Redo', + label: 'Redo', + enabled: false, + accelerator: 'CmdOrCtrl+Shift+Z', + click: () => handleMenuEvents('redo'), + }, { type: 'separator' }, { id: 'Cut', label: 'Cut', enabled: false, accelerator: 'CmdOrCtrl+X', click: () => handleMenuEvents('cut') }, { @@ -181,14 +193,21 @@ export function initAppMenu(win?: Electron.BrowserWindow) { const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); - // Let menu enable/disable status reflect action selection states. - ipcMain && - ipcMain.on && + if (ipcMain && ipcMain.on) { ipcMain.on('composer-state-change', (e, state) => { + // Let menu enable/disable status reflects action selection states. const actionSelected = !!state.actionSelected; ['Cut', 'Copy', 'Delete'].forEach((id) => { menu.getMenuItemById(id).enabled = actionSelected; }); + + // Let menu undo/redo status reflects history status + const canUndo = !!state.canUndo; + menu.getMenuItemById('Undo').enabled = canUndo; + const canRedo = !!state.canRedo; + menu.getMenuItemById('Redo').enabled = canRedo; + Menu.setApplicationMenu(menu); }); + } }