diff --git a/app/src/electron.js b/app/src/electron.js index e2d7f7013..b5160ae18 100644 --- a/app/src/electron.js +++ b/app/src/electron.js @@ -86,7 +86,7 @@ function commandItem(item) { } function buildMenu() { - let template = _cloneDeepWith(mainMenuDefinition, item => { + let template = _cloneDeepWith(mainMenuDefinition({ editMenu: true }), item => { if (item.divider) { return { type: 'separator' }; } @@ -164,6 +164,9 @@ ipcMain.on('app-started', async (event, arg) => { } }); ipcMain.on('window-action', async (event, arg) => { + if (!mainWindow) { + return; + } switch (arg) { case 'minimize': mainWindow.minimize(); @@ -199,6 +202,23 @@ ipcMain.on('window-action', async (event, arg) => { case 'zoomreset': mainWindow.webContents.zoomLevel = 0; break; + + // edit + case 'undo': + mainWindow.webContents.undo(); + break; + case 'redo': + mainWindow.webContents.redo(); + break; + case 'cut': + mainWindow.webContents.cut(); + break; + case 'copy': + mainWindow.webContents.copy(); + break; + case 'paste': + mainWindow.webContents.paste(); + break; } }); diff --git a/app/src/mainMenuDefinition.js b/app/src/mainMenuDefinition.js index 94bcbd0ea..8efc4c7d0 100644 --- a/app/src/mainMenuDefinition.js +++ b/app/src/mainMenuDefinition.js @@ -1,4 +1,4 @@ -module.exports = [ +module.exports = ({ editMenu }) => [ { label: 'File', submenu: [ @@ -34,6 +34,20 @@ module.exports = [ ], }, + editMenu + ? { + label: 'Edit', + submenu: [ + { command: 'edit.undo' }, + { command: 'edit.redo' }, + { divider: true }, + { command: 'edit.cut' }, + { command: 'edit.copy' }, + { command: 'edit.paste' }, + ], + } + : null, + // { // label: 'Edit', // submenu: [ diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 359b2c5c2..85dc10bc9 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -690,6 +690,50 @@ registerCommand({ onClick: () => getElectron().send('window-action', 'zoomreset'), }); +registerCommand({ + id: 'edit.undo', + category: 'Edit', + name: 'Undo', + keyText: 'CtrlOrCommand+Z', + testEnabled: () => getElectron() != null, + onClick: () => getElectron().send('window-action', 'undo'), +}); + +registerCommand({ + id: 'edit.redo', + category: 'Edit', + name: 'Redo', + testEnabled: () => getElectron() != null, + onClick: () => getElectron().send('window-action', 'redo'), +}); + +registerCommand({ + id: 'edit.cut', + category: 'Edit', + name: 'Cut', + keyText: 'CtrlOrCommand+X', + testEnabled: () => getElectron() != null, + onClick: () => getElectron().send('window-action', 'cut'), +}); + +registerCommand({ + id: 'edit.copy', + category: 'Edit', + name: 'Copy', + keyText: 'CtrlOrCommand+C', + testEnabled: () => getElectron() != null, + onClick: () => getElectron().send('window-action', 'copy'), +}); + +registerCommand({ + id: 'edit.paste', + category: 'Edit', + name: 'Paste', + keyText: 'CtrlOrCommand+V', + testEnabled: () => getElectron() != null, + onClick: () => getElectron().send('window-action', 'paste'), +}); + const electron = getElectron(); if (electron) { electron.addEventListener('run-command', (e, commandId) => runCommand(commandId)); diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index febd606c1..ae351b1ce 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -47,7 +47,7 @@ name: 'Insert new row', toolbarName: 'New row', icon: 'icon add', - keyText: 'Insert', + keyText: isMac() ? 'Command+I' : 'Insert', testEnabled: () => getCurrentDataGrid()?.getGrider()?.editable, onClick: () => getCurrentDataGrid().insertNewRow(), }); @@ -191,7 +191,6 @@ id: 'dataGrid.clearFilter', category: 'Data grid', name: 'Clear filter', - keyText: 'CtrlOrCommand+I', testEnabled: () => getCurrentDataGrid()?.clearFilterEnabled(), onClick: () => getCurrentDataGrid().clearFilter(), }); @@ -306,7 +305,7 @@ import EditJsonModal from '../modals/EditJsonModal.svelte'; import { apiCall } from '../utility/api'; import getElectron from '../utility/getElectron'; - import { isCtrlOrCommandKey } from '../utility/common'; + import { isCtrlOrCommandKey, isMac } from '../utility/common'; export let onLoadNextData = undefined; export let grider = undefined; diff --git a/packages/web/src/widgets/TitleBar.svelte b/packages/web/src/widgets/TitleBar.svelte index c91df8f81..38b2f7994 100644 --- a/packages/web/src/widgets/TitleBar.svelte +++ b/packages/web/src/widgets/TitleBar.svelte @@ -16,7 +16,7 @@ {#if !isMac()}
{/if}
{title}
diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 7c0e68a5c..0bc12c0df 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -76,7 +76,7 @@ const rect = domMainMenu.getBoundingClientRect(); const left = rect.right; const top = rect.top; - const items = mainMenuDefinition; + const items = mainMenuDefinition({ editMenu: false }); currentDropDownMenu.set({ left, top, items }); }