diff --git a/app/src/electron.js b/app/src/electron.js index 6a403a8d7..9e2ab2956 100644 --- a/app/src/electron.js +++ b/app/src/electron.js @@ -1,6 +1,6 @@ const electron = require('electron'); const os = require('os'); -const { Menu } = require('electron'); +const { Menu, ipcMain } = require('electron'); const { fork } = require('child_process'); const { autoUpdater } = require('electron-updater'); const Store = require('electron-store'); @@ -20,6 +20,7 @@ const store = new Store(); // be closed automatically when the JavaScript object is garbage collected. let mainWindow; let splashWindow; +let mainMenu; log.transports.file.level = 'debug'; autoUpdater.logger = log; @@ -51,6 +52,22 @@ function buildMenu() { mainWindow.webContents.executeJavaScript(`dbgate_openFile()`); }, }, + { + label: 'Save', + click() { + mainWindow.webContents.executeJavaScript(`dbgate_tabCommand('save')`); + }, + accelerator: 'Ctrl+S', + id: 'save', + }, + { + label: 'Save As', + click() { + mainWindow.webContents.executeJavaScript(`dbgate_tabCommand('saveAs')`); + }, + accelerator: 'Ctrl+Shift+S', + id: 'saveAs', + }, { type: 'separator' }, { role: 'close' }, ], @@ -134,6 +151,13 @@ function buildMenu() { return Menu.buildFromTemplate(template); } +ipcMain.on('update-menu', async (event, arg) => { + const commands = await mainWindow.webContents.executeJavaScript(`getCurrentTabCommands()`); + console.log('getCurrentTabCommands', commands); + mainMenu.getMenuItemById('save').enabled = !!commands.save; + mainMenu.getMenuItemById('saveAs').enabled = !!commands.saveAs; +}); + function createWindow() { const bounds = store.get('winBounds'); @@ -150,7 +174,8 @@ function createWindow() { }, }); - mainWindow.setMenu(buildMenu()); + mainMenu = buildMenu(); + mainWindow.setMenu(mainMenu); function loadMainWindow() { const startUrl = diff --git a/packages/web/src/TabsPanel.js b/packages/web/src/TabsPanel.js index 1da14e220..60891ee2b 100644 --- a/packages/web/src/TabsPanel.js +++ b/packages/web/src/TabsPanel.js @@ -10,6 +10,7 @@ import useTheme from './theme/useTheme'; import usePropsCompare from './utility/usePropsCompare'; import { useShowMenu } from './modals/showMenu'; import { setSelectedTabFunc } from './utility/common'; +import getElectron from './utility/getElectron'; // const files = [ // { name: 'app.js' }, @@ -219,6 +220,16 @@ export default function TabsPanel() { ); }; + React.useEffect(() => { + const electron = getElectron(); + if (electron) { + const { ipcRenderer } = electron; + const activeTab = tabs.find(x => x.selected); + window['activeTabId'] = activeTab ? activeTab.tabid : null; + ipcRenderer.send('update-menu'); + } + }, [tabs]); + // console.log( // 't', // tabs.map(x => x.tooltip) diff --git a/packages/web/src/index.js b/packages/web/src/index.js index eea7e10fa..29e524d25 100644 --- a/packages/web/src/index.js +++ b/packages/web/src/index.js @@ -1,5 +1,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import _ from 'lodash'; import './index.css'; import '@mdi/font/css/materialdesignicons.css'; import App from './App'; @@ -22,6 +23,17 @@ import localStorageGarbageCollector from './utility/localStorageGarbageCollector // import 'ace-builds/src-noconflict/snippets/mysql'; localStorageGarbageCollector(); +window['tabExports'] = {}; +window['getCurrentTabCommands'] = () => { + const tabid = window['activeTabId']; + return _.mapValues(window['tabExports'][tabid] || {}, v => !!v); +}; +window['dbgate_tabCommand'] = cmd => { + const tabid = window['activeTabId']; + const commands = window['tabExports'][tabid]; + const func = (commands || {})[cmd]; + if (func) func(); +}; ReactDOM.render(, document.getElementById('root')); diff --git a/packages/web/src/modals/SaveTabModal.js b/packages/web/src/modals/SaveTabModal.js index 3161292b2..34b4f0d91 100644 --- a/packages/web/src/modals/SaveTabModal.js +++ b/packages/web/src/modals/SaveTabModal.js @@ -1,6 +1,7 @@ import React from 'react'; import axios from '../utility/axios'; import { changeTab } from '../utility/common'; +import getElectron from '../utility/getElectron'; import { useOpenedTabs, useSetOpenedTabs } from '../utility/globalState'; import keycodes from '../utility/keycodes'; import SaveFileToolbarButton from '../utility/SaveFileToolbarButton'; @@ -72,6 +73,23 @@ export default function SaveTabModal({ } }, [tabVisible, handleKeyboard, canSave]); + React.useEffect(() => { + const electron = getElectron(); + if (electron) { + const { ipcRenderer } = electron; + window['tabExports'][tabid] = { + save: handleSaveRef.current, + saveAs: saveFileModalState.open, + }; + ipcRenderer.send('update-menu'); + + return () => { + delete window['tabExports'][tabid]; + ipcRenderer.send('update-menu'); + }; + } + }, []); + return ( <>