From 7ccd842bf7676887a345dcb0ac0311a8c5216924 Mon Sep 17 00:00:00 2001 From: sawka Date: Mon, 2 Jan 2023 14:08:24 -0800 Subject: [PATCH] allow line to be selected (don't change focus when selecting text). working on contextmenu --- src/emain.ts | 17 +++++++++++++++++ src/main.tsx | 31 +++++++++++++++++++------------ src/model.ts | 11 ++++++++++- src/preload.js | 1 + src/term.ts | 4 ++++ 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/emain.ts b/src/emain.ts index c98613c7b..7f0230975 100644 --- a/src/emain.ts +++ b/src/emain.ts @@ -354,6 +354,17 @@ function getContextMenu() : any { return menu; } +function getCutCopyPasteMenu() : any { + let menu = new electron.Menu(); + let menuItem = new electron.MenuItem({label: "Cut", role: "cut"}); + menu.append(menuItem); + menuItem = new electron.MenuItem({label: "Copy", role: "copy"}); + menu.append(menuItem); + menuItem = new electron.MenuItem({label: "Paste", role: "paste"}); + menu.append(menuItem); + return menu; +} + function getFetchHeaders() { return { "x-authkey": GlobalAuthKey, @@ -437,6 +448,12 @@ electron.ipcMain.on("context-screen", (event, {screenId}, {x, y}) => { menu.popup({x, y}); }); +electron.ipcMain.on("context-editmenu", (event, {x, y}) => { + console.log("context-editmenu"); + let menu = getCutCopyPasteMenu(); + menu.popup({x, y}); +}); + async function createMainWindowWrap() { let clientData = null; try { diff --git a/src/main.tsx b/src/main.tsx index 62b130a9f..19a9c4911 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -402,6 +402,13 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width @boundMethod handleClick() { let {line} = this.props; + let sel = window.getSelection(); + if (this.lineRef.current != null) { + let selText = sel.toString(); + if (sel.anchorNode != null && this.lineRef.current.contains(sel.anchorNode) && !isBlank(selText)) { + return; + } + } GlobalCommandRunner.swSelectLine(String(line.linenum), "cmd"); } @@ -456,15 +463,15 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
-
-
+
+
-
-
+
+
{line.userid}
{formattedTime}
-
+
{line.cmdid} ({termOpts.rows}x{termOpts.cols}) @@ -472,8 +479,8 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width {this.renderCmdText(cmd, remote)}
-
-
0})} onClick={this.clickStar}> +
+
0})} onClick={this.clickStar}> @@ -482,15 +489,15 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
-
+
-
+
-
-
(loading)
+
+
(loading)
-
+
state unchanged
diff --git a/src/model.ts b/src/model.ts index c8bd17af4..327858f9a 100644 --- a/src/model.ts +++ b/src/model.ts @@ -107,6 +107,7 @@ type ElectronApi = { onBracketCmd : (callback : (event : any, arg : {relative : number}, mods : KeyModsType) => void) => void, onDigitCmd : (callback : (event : any, arg : {digit : number}, mods : KeyModsType) => void) => void, contextScreen : (screenOpts : {screenId : string}, position : {x : number, y : number}) => void, + contextEditMenu : (position : {x : number, y : number}) => void, onLocalServerStatusChange : (callback : (status : boolean, pid : number) => void) => void, }; @@ -1576,6 +1577,7 @@ class Model { getApi().onDigitCmd(this.onDigitCmd.bind(this)); getApi().onLocalServerStatusChange(this.onLocalServerStatusChange.bind(this)); document.addEventListener("keydown", this.docKeyDownHandler.bind(this)); + document.addEventListener("selectionchange", this.docSelectionChangeHandler.bind(this)); } getBaseHostPort() : string { @@ -1598,6 +1600,10 @@ class Model { }; } + docSelectionChangeHandler(e : any) { + // nothing for now + } + docKeyDownHandler(e : any) { if (isModKeyPress(e)) { return; @@ -1649,10 +1655,13 @@ class Model { } contextScreen(e : any, screenId : string) { - console.log("model", screenId); getApi().contextScreen({screenId: screenId}, {x: e.x, y: e.y}); } + contextEditMenu(e : any) { + getApi().contextEditMenu({x: e.x, y: e.y}); + } + getUIContext() : UIContextType { let rtn : UIContextType = { sessionid : null, diff --git a/src/preload.js b/src/preload.js index 51eed608e..e398d4f28 100644 --- a/src/preload.js +++ b/src/preload.js @@ -18,5 +18,6 @@ contextBridge.exposeInMainWorld("api", { onBracketCmd: (callback) => ipcRenderer.on("bracket-cmd", callback), onDigitCmd: (callback) => ipcRenderer.on("digit-cmd", callback), contextScreen: (screenOpts, position) => ipcRenderer.send("context-screen", screenOpts, position), + contextEditMenu: (position) => ipcRenderer.send("context-editmenu", position), onLocalServerStatusChange: (callback) => ipcRenderer.on("local-server-status-change", callback), }); diff --git a/src/term.ts b/src/term.ts index 232fe72fc..e3e8af921 100644 --- a/src/term.ts +++ b/src/term.ts @@ -108,6 +108,10 @@ class TermWrap { this.terminal.attachCustomKeyEventHandler((e) => opts.customKeyHandler(e, this)); } this.reloadTerminal(0); + elem.addEventListener("contextmenu", (e) => { + console.log("elem-contextmenu", elem, e); + GlobalModel.contextEditMenu(e); + }); } @boundMethod