diff --git a/electron/main/menu.js b/electron/main/menu.js index 353c2fee..420d5d4a 100644 --- a/electron/main/menu.js +++ b/electron/main/menu.js @@ -1,5 +1,5 @@ const { app, Menu } = require("electron") -import { OPEN_SETTINGS_EVENT, UNDO_EVENT, REDO_EVENT, MOVE_BLOCK_EVENT, DELETE_BLOCK_EVENT, CHANGE_BUFFER_EVENT } from '@/src/common/constants' +import { OPEN_SETTINGS_EVENT, UNDO_EVENT, REDO_EVENT, MOVE_BLOCK_EVENT, DELETE_BLOCK_EVENT, CHANGE_BUFFER_EVENT, SELECT_ALL_EVENT } from '@/src/common/constants' import { openAboutWindow } from "./about"; import { quit } from "./index" @@ -22,6 +22,14 @@ const redoMenuItem = { }, } +const selectAllMenuItem = { + label: 'Select All', + accelerator: 'CommandOrControl+a', + click: (menuItem, window, event) => { + window?.webContents.send(SELECT_ALL_EVENT) + }, +} + const deleteBlockMenuItem = { label: 'Delete block', accelerator: 'CommandOrControl+Shift+D', @@ -117,7 +125,7 @@ const template = [ ...(isMac ? [ { role: 'pasteAndMatchStyle' }, { role: 'delete' }, - { role: 'selectAll' }, + selectAllMenuItem, { type: 'separator' }, { label: 'Speech', @@ -129,7 +137,7 @@ const template = [ ] : [ { role: 'delete' }, { type: 'separator' }, - { role: 'selectAll' } + selectAllMenuItem, ]) ] }, @@ -226,7 +234,7 @@ export function getEditorContextMenu(win) { {role: 'copy'}, {role: 'paste'}, {type: 'separator'}, - {role: 'selectAll'}, + selectAllMenuItem, {type: 'separator'}, deleteBlockMenuItem, moveBlockMenuItem, diff --git a/src/common/constants.js b/src/common/constants.js index 90d9ac03..5667f087 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -9,6 +9,7 @@ export const UNDO_EVENT = "undo" export const MOVE_BLOCK_EVENT = "move-block" export const DELETE_BLOCK_EVENT = "delete-block" export const CHANGE_BUFFER_EVENT = "change-buffer" +export const SELECT_ALL_EVENT = "select-all" export const UPDATE_AVAILABLE_EVENT = "update-available" export const UPDATE_NOT_AVAILABLE_EVENT = "update-not-available" diff --git a/src/components/Editor.vue b/src/components/Editor.vue index 9dfde363..aca46583 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -5,7 +5,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, DELETE_BLOCK_EVENT, UNDO_EVENT } from '@/src/common/constants'; + import { REDO_EVENT, WINDOW_CLOSE_EVENT, DELETE_BLOCK_EVENT, UNDO_EVENT, SELECT_ALL_EVENT } from '@/src/common/constants'; const NUM_EDITOR_INSTANCES = 5 @@ -57,6 +57,12 @@ } }) + window.heynote.mainProcess.on(SELECT_ALL_EVENT, () => { + if (this.editor) { + toRaw(this.editor).selectAll() + } + }) + // if debugSyntaxTree prop is set, display syntax tree for debugging if (this.debugSyntaxTree) { setInterval(() => { @@ -82,6 +88,7 @@ window.heynote.mainProcess.off(UNDO_EVENT) window.heynote.mainProcess.off(REDO_EVENT) window.heynote.mainProcess.off(DELETE_BLOCK_EVENT) + window.heynote.mainProcess.off(SELECT_ALL_EVENT) this.editorCacheStore.tearDown(); }, diff --git a/src/editor/editor.js b/src/editor/editor.js index 4d1c2b77..749328ad 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -13,7 +13,7 @@ import { customSetup } from "./setup.js" import { heynoteLang } from "./lang-heynote/heynote.js" import { noteBlockExtension, blockLineNumbers, blockState, getActiveNoteBlock, triggerCursorChange } from "./block/block.js" import { heynoteEvent, SET_CONTENT, DELETE_BLOCK, APPEND_BLOCK } from "./annotation.js"; -import { changeCurrentBlockLanguage, triggerCurrenciesLoaded, getBlockDelimiter, deleteBlock } from "./block/commands.js" +import { changeCurrentBlockLanguage, triggerCurrenciesLoaded, getBlockDelimiter, deleteBlock, selectAll } from "./block/commands.js" import { formatBlockContent } from "./block/format-code.js" import { heynoteKeymap } from "./keymap.js" import { emacsKeymap } from "./emacs.js" @@ -413,6 +413,10 @@ export class HeynoteEditor { redo() { redo(this.view) } + + selectAll() { + selectAll(this.view) + } }