diff --git a/src/emain.ts b/src/emain.ts index 84c934ab..d58ff75a 100644 --- a/src/emain.ts +++ b/src/emain.ts @@ -110,4 +110,18 @@ electron.ipcMain.on("get-id", (event) => { return; }); +function getContextMenu() : any { + let menu = new electron.Menu(); + let menuItem = new electron.MenuItem({label: "Testing", click: () => console.log("click testing!")}); + menu.append(menuItem); + return menu; +} + +electron.ipcMain.on("context-screen", (event, {screenId}, {x, y}) => { + console.log("context-screen", screenId); + let menu = getContextMenu(); + menu.popup({x, y}); +}); + + diff --git a/src/main.tsx b/src/main.tsx index c0d2e41f..2b96ecf0 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -235,6 +235,11 @@ class CmdInput extends React.Component<{}, {}> { setTimeout(() => this.doSubmitCmd(), 0); return; } + if (e.code == "Tab") { + e.preventDefault(); + this.setCurLine(this.getCurLine() + "[tab]"); + return; + } if (e.code == "ArrowUp") { e.preventDefault(); let hidx = this.historyIndex.get(); @@ -561,6 +566,13 @@ class ScreenTabs extends React.Component<{session : Session}, {}> { } GlobalInput.switchScreen(screenId); } + + handleContextMenu(e : any, screenId : string) : void { + e.preventDefault(); + console.log("handle context menu!", screenId); + let model = GlobalModel; + model.contextScreen(screenId); + } render() { let {session} = this.props; @@ -572,7 +584,7 @@ class ScreenTabs extends React.Component<{session : Session}, {}> { return (
-
this.handleSwitchScreen(screen.screenId)}> +
this.handleSwitchScreen(screen.screenId)} onContextMenu={(event) => this.handleContextMenu(event, screen.screenId)}> {screen.name.get()}
⌘{index+1}
@@ -618,7 +630,11 @@ class MainSideBar extends React.Component<{}, {}> { } handleSessionClick(sessionId : string) { - console.log("click session", sessionId); + GlobalInput.switchSession(sessionId); + } + + handleNewSession() { + GlobalInput.createNewSession(); } render() { @@ -645,7 +661,7 @@ class MainSideBar extends React.Component<{}, {}> {
  • this.handleSessionClick(session.sessionId)}>#{session.name.get()}
  • -
  • New Session
  • +
  • this.handleNewSession()}> New Session
  • diff --git a/src/model.ts b/src/model.ts index 6b208f27..597fd90e 100644 --- a/src/model.ts +++ b/src/model.ts @@ -30,6 +30,7 @@ type ElectronApi = { onICmd : (callback : (mods : KeyModsType) => void) => void, onBracketCmd : (callback : (event : any, arg : {relative : number}, mods : KeyModsType) => void) => void, onDigitCmd : (callback : (event : any, arg : {digit : number}, mods : KeyModsType) => void) => void, + contextScreen : (screenId : string) => void, }; function getApi() : ElectronApi { @@ -513,6 +514,11 @@ class Model { getApi().onDigitCmd(this.onDigitCmd.bind(this)); } + contextScreen(e : any, screenId : string) { + console.log("model", screenId); + getApi().contextScreen({screenId: screenId}, {x: e.x, y: e.y}); + } + onTCmd(mods : KeyModsType) { console.log("got cmd-t", mods); GlobalInput.createNewScreen(); @@ -562,13 +568,18 @@ class Model { mobx.action(() => { let oldActiveScreen = this.getActiveScreen(); genMergeData(this.sessionList, sessionUpdateMsg.sessions, (s : Session) => s.sessionId, (sdata : SessionDataType) => sdata.sessionid, (sdata : SessionDataType) => new Session(sdata), (s : Session) => s.sessionIdx.get()); - let newActiveScreen = this.getActiveScreen(); - if (oldActiveScreen != newActiveScreen) { - if (newActiveScreen == null) { - this.activateScreen(this.activeSessionId.get(), null, oldActiveScreen); - } - else { - this.activateScreen(newActiveScreen.sessionId, newActiveScreen.screenId, oldActiveScreen); + if (update.activesessionid) { + this.activateSession(update.activesessionid); + } + else { + let newActiveScreen = this.getActiveScreen(); + if (oldActiveScreen != newActiveScreen) { + if (newActiveScreen == null) { + this.activateScreen(this.activeSessionId.get(), null, oldActiveScreen); + } + else { + this.activateScreen(newActiveScreen.sessionId, newActiveScreen.screenId, oldActiveScreen); + } } } })(); @@ -749,6 +760,18 @@ class Model { }); } + activateSession(sessionId : string) { + let oldActiveSession = this.getActiveSession(); + if (oldActiveSession.sessionId == sessionId) { + return; + } + let newSession = this.getSessionById(sessionId); + if (newSession == null) { + return; + } + this.activateScreen(sessionId, newSession.activeScreenId.get()); + } + activateScreen(sessionId : string, screenId : string, oldActiveScreen? : Screen) { if (!oldActiveScreen) { oldActiveScreen = this.getActiveScreen(); @@ -842,10 +865,18 @@ class InputClass { constructor() { } + switchSession(session : string) { + GlobalModel.submitCommand("session", null, [session], null); + } + switchScreen(screen : string) { GlobalModel.submitCommand("screen", null, [screen], null); } + createNewSession() { + GlobalModel.submitCommand("session", "open", null, null); + } + createNewScreen() { GlobalModel.submitCommand("screen", "open", null, null); } diff --git a/src/preload.js b/src/preload.js index cabd1179..b5c8743b 100644 --- a/src/preload.js +++ b/src/preload.js @@ -6,4 +6,5 @@ contextBridge.exposeInMainWorld("api", { onICmd: (callback) => ipcRenderer.on("i-cmd", callback), onBracketCmd: (callback) => ipcRenderer.on("bracket-cmd", callback), onDigitCmd: (callback) => ipcRenderer.on("digit-cmd", callback), + contextScreen: (screenOpts, position) => ipcRenderer.send("context-screen", screenOpts, position), });