Skip to content

Commit

Permalink
Added editor context menu and improved change control (#176)
Browse files Browse the repository at this point in the history
* Added editor context menu and improved change control

* Small change
  • Loading branch information
lvcabral authored Feb 1, 2025
1 parent 9a6f59c commit 965d590
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 12 deletions.
27 changes: 26 additions & 1 deletion src/app/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ let isResizing = false;
let editorManager;
let currentId = nanoid(10);
let isCodeChanged = false;
let unchangedCode = "";

function main() {
updateButtons();
Expand All @@ -123,7 +124,14 @@ function main() {
return;
}
}
markCodeAsChanged();
if (editorManager.editor.getValue() !== unchangedCode) {
markCodeAsChanged();
} else {
markCodeAsSaved();
}
});
editorManager.editor.on("contextmenu", (event) => {
api.send("contextMenu");
});
hideEditor(!(currentApp.title === undefined || currentApp.title.endsWith("editor_code.brs")));
populateCodeSelector();
Expand Down Expand Up @@ -320,6 +328,19 @@ codeSelect.addEventListener("change", async (e) => {
currentId = nanoid(10);
resetApp();
}
resetUndoHistory();
});

function resetUndoHistory() {
editorManager?.editor?.clearHistory();
}

api.receive("editorUndo", function () {
editorManager?.editor?.undo();
});

api.receive("editorRedo", function () {
editorManager?.editor?.redo();
});

function loadCode(id) {
Expand Down Expand Up @@ -365,6 +386,7 @@ async function deleteCode() {
localStorage.removeItem(currentId);
currentId = nanoid(10);
resetApp();
unchangedCode = "";
showToast("Code deleted from the browser local storage!", 3000);
}
} else {
Expand Down Expand Up @@ -456,6 +478,7 @@ function resetApp(id = "", code = "") {
brs.terminate("EXIT_USER_NAV");
clearTerminal();
}
unchangedCode = code;
editorManager.editor.setValue(code);
editorManager.editor.focus();
markCodeAsSaved();
Expand Down Expand Up @@ -498,6 +521,7 @@ function saveCode() {
} else {
const codeName = codeSelect.options[codeSelect.selectedIndex].text.replace(/^ /, "");
localStorage.setItem(currentId, `@=${codeName}=@${code}`);
unchangedCode = code;
showToast(
"Code saved in the simulator local storage.\nTo share it use the Share button.",
5000
Expand Down Expand Up @@ -527,6 +551,7 @@ codeDialog.addEventListener("close", (e) => {
currentId = nanoid(10);
}
localStorage.setItem(currentId, `@=${codeName}=@${code}`);
unchangedCode = code;
populateCodeSelector(currentId);
if (actionType.value === "rename") {
showToast("Code snippet renamed in the simulator local storage.", 5000);
Expand Down
3 changes: 3 additions & 0 deletions src/app/preload.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ contextBridge.exposeInMainWorld("api", {
"saveIcon",
"updateRegistry",
"showEditor",
"contextMenu",
"keySent",
"runCode",
"runUrl",
Expand Down Expand Up @@ -143,6 +144,8 @@ contextBridge.exposeInMainWorld("api", {
"saveScreenshot",
"executeFile",
"openEditor",
"editorUndo",
"editorRedo",
];
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender`
Expand Down
48 changes: 39 additions & 9 deletions src/menu/editMenuTemplate.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*---------------------------------------------------------------------------------------------
* BrightScript Simulation Desktop Application (https://github.com/lvcabral/brs-desktop)
*
* Copyright (c) 2019-2023 Marcelo Lv Cabral. All Rights Reserved.
* Copyright (c) 2019-2025 Marcelo Lv Cabral. All Rights Reserved.
*
* Licensed under the MIT License. See LICENSE in the repository root for license information.
*--------------------------------------------------------------------------------------------*/
Expand All @@ -12,11 +12,11 @@ const isMacOS = process.platform === "darwin";
export const editMenuTemplate = {
label: "&Edit",
submenu: [
{ label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:", visible: isMacOS, },
{ label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:", visible: isMacOS, },
{ type: "separator", visible: isMacOS, },
{ label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:", visible: isMacOS, },
{ label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:", visible: isMacOS, },
{ label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:", visible: isMacOS },
{ label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:", visible: isMacOS },
{ type: "separator", visible: isMacOS },
{ label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:", visible: isMacOS },
{ label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:", visible: isMacOS },
{
id: "copy-screen",
label: "Copy Screenshot",
Expand All @@ -26,8 +26,13 @@ export const editMenuTemplate = {
copyScreenshot();
},
},
{ label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:", visible: isMacOS, },
{ label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:", visible: isMacOS, },
{ label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:", visible: isMacOS },
{
label: "Select All",
accelerator: "CmdOrCtrl+A",
selector: "selectAll:",
visible: isMacOS,
},
{ type: "separator" },
{
id: "settings",
Expand All @@ -50,6 +55,31 @@ export const editSettingsMenuTemplate = {
{ label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
{ label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
{ label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
{ label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" }
{ label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" },
],
};

export const editContextMenuTemplate = {
label: "&Edit",
submenu: [
{
label: "Undo",
accelerator: "CmdOrCtrl+Z",
click: (_, window) => {
window.webContents.send("editorUndo");
},
},
{
label: "Redo",
accelerator: "CmdOrCtrl+Shift+Z",
click: (_, window) => {
window.webContents.send("editorRedo");
},
},
{ type: "separator" },
{ label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
{ label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
{ label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
{ label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" },
],
};
17 changes: 15 additions & 2 deletions src/menu/menuService.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
import { app, BrowserWindow, Menu, ipcMain } from "electron";
import { macOSMenuTemplate } from "./macOSMenuTemplate";
import { fileMenuTemplate } from "./fileMenuTemplate";
import { editMenuTemplate, editSettingsMenuTemplate } from "./editMenuTemplate";
import {
editMenuTemplate,
editSettingsMenuTemplate,
editContextMenuTemplate,
} from "./editMenuTemplate";
import { deviceMenuTemplate } from "./deviceMenuTemplate";
import { viewMenuTemplate } from "./viewMenuTemplate";
import { helpMenuTemplate } from "./helpMenuTemplate";
Expand Down Expand Up @@ -121,7 +125,10 @@ export function getAppIconPath(appID) {
let iconPath = path.join(__dirname, "images", "channel-icon.png");
const index = getChannelIds().indexOf(appID);
if (index >= 0) {
const appIconPath = path.join(app.getPath("userData"), getRecentPackage(index).hashCode() + ".png");
const appIconPath = path.join(
app.getPath("userData"),
getRecentPackage(index).hashCode() + ".png"
);
if (fs.existsSync(appIconPath)) {
iconPath = appIconPath;
}
Expand Down Expand Up @@ -224,6 +231,12 @@ ipcMain.on("enableMenuItem", (event, id, enable) => {
enableMenuItem(id, enable);
});

ipcMain.on("contextMenu", (event) => {
const menuTemplate = editContextMenuTemplate.submenu;
const menu = Menu.buildFromTemplate(menuTemplate);
menu.popup(BrowserWindow.fromWebContents(event.sender));
});

// Internal functions
function restoreRecentFiles() {
let recentFilesDefault = { ids: [], zip: [], names: [], versions: [], brs: [] };
Expand Down

0 comments on commit 965d590

Please sign in to comment.