diff --git a/electron/main/auto-update.ts b/electron/main/auto-update.js similarity index 100% rename from electron/main/auto-update.ts rename to electron/main/auto-update.js diff --git a/electron/main/menu.ts b/electron/main/menu.js similarity index 92% rename from electron/main/menu.ts rename to electron/main/menu.js index 9068c24..04c6e6a 100644 --- a/electron/main/menu.ts +++ b/electron/main/menu.js @@ -1,5 +1,5 @@ const { app, Menu } = require("electron") -import { OPEN_SETTINGS_EVENT } from "@/src/common/constants"; +import { OPEN_SETTINGS_EVENT, REDO_EVENT } from '@/src/common/constants' import { openAboutWindow } from "./about"; import { quit } from "./index" @@ -63,7 +63,15 @@ const template = [ label: 'Edit', submenu: [ { role: 'undo' }, - { role: 'redo' }, + //{ role: 'undo' }, + { + label: 'Redo', + accelerator: 'CommandOrControl+Shift+z', + click: (menuItem, window, event) => { + window?.webContents.send(REDO_EVENT) + console.log("redo") + }, + }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, diff --git a/electron/preload/index.ts b/electron/preload/index.js similarity index 91% rename from electron/preload/index.ts rename to electron/preload/index.js index c1ec4e3..31e2a1e 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.js @@ -2,10 +2,7 @@ const { contextBridge } = require('electron') import themeMode from "./theme-mode" import { isMac, isWindows, isLinux, isDev } from "../detect-platform" import { ipcRenderer } from "electron" -import { - WINDOW_CLOSE_EVENT, - OPEN_SETTINGS_EVENT, - SETTINGS_CHANGE_EVENT, +import { UPDATE_AVAILABLE_EVENT, UPDATE_ERROR, UPDATE_DOWNLOAD_PROGRESS, @@ -43,12 +40,14 @@ contextBridge.exposeInMainWorld("heynote", { }) }, - onWindowClose(callback) { - ipcRenderer.on(WINDOW_CLOSE_EVENT, callback) - }, - - onOpenSettings(callback) { - ipcRenderer.on(OPEN_SETTINGS_EVENT, callback) + mainProcess: { + on(event, callback) { + ipcRenderer.on(event, callback) + }, + + off(event, callback) { + ipcRenderer.off(event, callback) + }, }, buffer: { @@ -125,10 +124,6 @@ contextBridge.exposeInMainWorld("heynote", { return await getCurrencyData() }, - onSettingsChange(callback) { - ipcRenderer.on(SETTINGS_CHANGE_EVENT, (event, settings) => callback(settings)) - }, - autoUpdate: { callbacks(callbacks) { ipcRenderer.on(UPDATE_AVAILABLE_EVENT, (event, info) => callbacks?.updateAvailable(info)) @@ -163,7 +158,7 @@ contextBridge.exposeInMainWorld("heynote", { }) -function domReady(condition: DocumentReadyState[] = ['complete', 'interactive']) { +function domReady(condition=['complete', 'interactive']) { return new Promise((resolve) => { if (condition.includes(document.readyState)) { resolve(true) @@ -178,12 +173,12 @@ function domReady(condition: DocumentReadyState[] = ['complete', 'interactive']) } const safeDOM = { - append(parent: HTMLElement, child: HTMLElement) { + append(parent, child) { if (!Array.from(parent.children).find(e => e === child)) { return parent.appendChild(child) } }, - remove(parent: HTMLElement, child: HTMLElement) { + remove(parent, child) { if (Array.from(parent.children).find(e => e === child)) { return parent.removeChild(child) } diff --git a/src/components/App.vue b/src/components/App.vue index 1de94f0..404e8c1 100644 --- a/src/components/App.vue +++ b/src/components/App.vue @@ -5,6 +5,8 @@ import { useHeynoteStore } from "../stores/heynote-store" import { useErrorStore } from "../stores/error-store" + import { OPEN_SETTINGS_EVENT, SETTINGS_CHANGE_EVENT } from '@/src/common/constants' + import StatusBar from './StatusBar.vue' import Editor from './Editor.vue' import LanguageSelector from './LanguageSelector.vue' @@ -52,10 +54,10 @@ } onThemeChange(window.heynote.themeMode.initial) window.heynote.themeMode.onChange(onThemeChange) - window.heynote.onSettingsChange((settings) => { + window.heynote.mainProcess.on(SETTINGS_CHANGE_EVENT, (event, settings) => { this.settings = settings }) - window.heynote.onOpenSettings(() => { + window.heynote.mainProcess.on(OPEN_SETTINGS_EVENT, () => { this.showSettings = true }) }, diff --git a/src/components/Editor.vue b/src/components/Editor.vue index 7bf8543..174901a 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -6,6 +6,7 @@ import { useErrorStore } from "../stores/error-store" import { useHeynoteStore } from "../stores/heynote-store.js" import { useEditorCacheStore } from "../stores/editor-cache" + import { REDO_EVENT, WINDOW_CLOSE_EVENT } from '@/src/common/constants'; const NUM_EDITOR_INSTANCES = 5 @@ -46,6 +47,7 @@ return { syntaxTreeDebugContent: null, editor: null, + onWindowClose: null, } }, @@ -53,12 +55,13 @@ this.loadBuffer(this.currentBufferPath) // set up window close handler that will save the buffer and quit - window.heynote.onWindowClose(() => { + this.onWindowClose = () => { window.heynote.buffer.saveAndQuit([ [this.editor.path, this.editor.getContent()], ]) - }) + } + window.heynote.mainProcess.on(WINDOW_CLOSE_EVENT, this.onWindowClose) window.document.addEventListener("currenciesLoaded", this.onCurrenciesLoaded) // if debugSyntaxTree prop is set, display syntax tree for debugging @@ -82,6 +85,7 @@ }, beforeUnmount() { + window.heynote.mainProcess.off(WINDOW_CLOSE_EVENT, this.onWindowClose) window.document.removeEventListener("currenciesLoaded", this.onCurrenciesLoaded) }, diff --git a/vite.config.mjs b/vite.config.mjs index 91a366e..3a2bb2b 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -84,7 +84,7 @@ export default defineConfig({ }, }, { - entry: 'electron/preload/index.ts', + entry: 'electron/preload/index.js', onstart(options) { // Notify the Renderer-Process to reload the page when the Preload-Scripts build is complete, // instead of restarting the entire Electron App. diff --git a/webapp/bridge.js b/webapp/bridge.js index 7d34251..6433db0 100644 --- a/webapp/bridge.js +++ b/webapp/bridge.js @@ -64,6 +64,12 @@ class IpcRenderer { this.callbacks[event].push(callback) } + off(event, callback) { + if (this.callbacks[event]) { + this.callbacks[event] = this.callbacks[event].filter(cb => cb !== callback) + } + } + send(event, ...args) { if (this.callbacks[event]) { for (const callback of this.callbacks[event]) { @@ -213,20 +219,18 @@ const Heynote = { }, }, - onWindowClose(callback) { - //ipcRenderer.on(WINDOW_CLOSE_EVENT, callback) + mainProcess: { + on(event, callback) { + ipcRenderer.on(event, callback) + }, + + off(event, callback) { + ipcRenderer.off(event, callback) + }, }, settings: initialSettings, - onOpenSettings(callback) { - ipcRenderer.on(OPEN_SETTINGS_EVENT, callback) - }, - - onSettingsChange(callback) { - ipcRenderer.on(SETTINGS_CHANGE_EVENT, (event, settings) => callback(settings)) - }, - setSettings(settings) { localStorage.setItem("settings", JSON.stringify(settings)) ipcRenderer.send(SETTINGS_CHANGE_EVENT, settings)