diff --git a/src/elements.tsx b/src/elements.tsx index 5f5e21af..a111a19d 100644 --- a/src/elements.tsx +++ b/src/elements.tsx @@ -6,6 +6,10 @@ import {boundMethod} from "autobind-decorator"; import cn from "classnames"; import {If, For, When, Otherwise, Choose} from "tsx-control-statements/components"; +function renderCmdText(text : string) : any { + return ⌘{text}; +} + class CmdStrCode extends React.Component<{cmdstr : string, onUse : () => void, onCopy : () => void, isCopied : boolean, fontSize : "normal" | "large", limitHeight : boolean}, {}> { @boundMethod handleUse(e : any) { @@ -65,4 +69,4 @@ class Toggle extends React.Component<{checked : boolean, onChange : (value : boo } } -export {CmdStrCode, Toggle}; +export {CmdStrCode, Toggle, renderCmdText}; diff --git a/src/linecomps.tsx b/src/linecomps.tsx index c45fa294..4245bc14 100644 --- a/src/linecomps.tsx +++ b/src/linecomps.tsx @@ -12,6 +12,7 @@ import type {LineType, CmdDataType, FeStateType, RemoteType, RemotePtrType, Rend import cn from "classnames"; import {TermWrap} from "./term"; import type {LineContainerModel} from "./model"; +import {renderCmdText} from "./elements"; dayjs.extend(localizedFormat) @@ -125,7 +126,7 @@ class LineAvatar extends React.Component<{line : LineType, cmd : Cmd}, {}> { @mobxReact.observer -class LineCmd extends React.Component<{screen : LineContainerModel, line : LineType, width : number, staticRender : boolean, visible : OV, onHeightChange : HeightChangeCallbackType, topBorder : boolean, renderMode : RenderModeType, overrideCollapsed : OV, noSelect? : boolean}, {}> { +class LineCmd extends React.Component<{screen : LineContainerModel, line : LineType, width : number, staticRender : boolean, visible : OV, onHeightChange : HeightChangeCallbackType, topBorder : boolean, renderMode : RenderModeType, overrideCollapsed : OV, noSelect? : boolean, showHints? : boolean}, {}> { lineRef : React.RefObject = React.createRef(); cmdTextRef : React.RefObject = React.createRef(); rtnStateDiff : mobx.IObservableValue = mobx.observable.box(null, {name: "linecmd-rtn-state-diff"}); @@ -514,6 +515,11 @@ class LineCmd extends React.Component<{screen : LineContainerModel, line : LineT + +
+
focus line ({renderCmdText("L")})
+
+
); } diff --git a/src/main.tsx b/src/main.tsx index 6c82e0ce..80c7d886 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -19,6 +19,7 @@ import {BookmarksView} from "./bookmarks"; import {HistoryView} from "./history"; import {Line, Prompt} from "./linecomps"; import {ScreenSettingsModal, SessionSettingsModal} from "./settings"; +import {renderCmdText} from "./elements"; dayjs.extend(localizedFormat) @@ -41,10 +42,6 @@ type InterObsValue = { timeoutid? : any, }; -function renderCmdText(text : string) : any { - return ⌘{text}; -} - function isBlank(s : string) : boolean { return (s == null || s == ""); } @@ -1444,8 +1441,12 @@ class CmdInput extends React.Component<{}, {}> { } @boundMethod - clickHistoryHint() : void { + clickHistoryHint(e : any) : void { + e.preventDefault(); + e.stopPropagation(); + let inputModel = GlobalModel.inputModel; + console.log("hitory hint", inputModel.historyShow.get()); if (inputModel.historyShow.get()) { inputModel.resetHistory(); } @@ -1514,7 +1515,7 @@ class CmdInput extends React.Component<{}, {}> {
focus input ({renderCmdText("I")})
-
{historyShow ? "close history (esc)" : "show history (ctrl-r)"}
+
{historyShow ? "close history (esc)" : "show history (ctrl-r)"}
@@ -2173,6 +2174,17 @@ class ScreenTabs extends React.Component<{session : Session}, {}> { showingScreens.push(screen); } } + showingScreens.sort((a, b) => { + let aidx = a.screenIdx.get(); + let bidx = b.screenIdx.get(); + if (aidx < bidx) { + return -1; + } + if (aidx > bidx) { + return 1; + } + return 0; + }); return (
diff --git a/src/model.ts b/src/model.ts index 7b762842..a8d69a16 100644 --- a/src/model.ts +++ b/src/model.ts @@ -2,7 +2,7 @@ import * as mobx from "mobx"; import {sprintf} from "sprintf-js"; import {boundMethod} from "autobind-decorator"; import {debounce} from "throttle-debounce"; -import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeSimpleData, boundInt, isModKeyPress} from "./util"; +import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeDataMap, genMergeSimpleData, boundInt, isModKeyPress} from "./util"; import {TermWrap} from "./term"; import {v4 as uuidv4} from "uuid"; import type {SessionDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts, RendererContext, RendererModel, PtyDataType, BookmarkType, ClientDataType, HistoryViewDataType, AlertMessageType, HistorySearchParams, FocusTypeStrs, ScreenLinesType, HistoryTypeStrs} from "./types"; @@ -2228,7 +2228,7 @@ class Model { activeSessionId : OV = mobx.observable.box(null, {name: "activeSessionId"}); sessionListLoaded : OV = mobx.observable.box(false, {name: "sessionListLoaded"}); sessionList : OArr = mobx.observable.array([], {name: "SessionList", deep: false}); - screenList : OArr = mobx.observable.array([], {name: "ScreenList", deep: false}); + screenMap : OMap = mobx.observable.map({}, {name: "ScreenMap", deep: false}); ws : WSControl; remotes : OArr = mobx.observable.array([], {name: "remotes", deep: false}); remotesLoaded : OV = mobx.observable.box(false, {name: "remotesLoaded"}); @@ -2580,14 +2580,11 @@ class Model { let update : ModelUpdateType = genUpdate; if ("screens" in update) { if (update.connect) { - this.screenList.clear(); + this.screenMap.clear(); } - genMergeData(this.screenList, update.screens, (s : Screen) => s.screenId, (sdata : ScreenDataType) => sdata.screenid, (sdata : ScreenDataType) => new Screen(sdata), null); - for (let i=0; i s.screenId, (sdata : ScreenDataType) => sdata.screenid, (sdata : ScreenDataType) => new Screen(sdata)); + for (let i=0; i { let rtn : Record = {}; - for (let i=0; i, DataType extends IData objs.replace(newObjs); } +function genMergeDataMap, DataType extends IDataType>( + objMap : mobx.ObservableMap, + dataArr : DataType[], + objIdFn : (obj : ObjType) => string, + dataIdFn : (data : DataType) => string, + ctorFn : (data : DataType) => ObjType, +) : {added : string[], removed : string[]} +{ + let rtn : {added : string[], removed : string[]} = {added: [], removed: []}; + if (dataArr == null || dataArr.length == 0) { + return rtn; + } + for (let i=0; i { let envStr = atob(envStr64); let parts = envStr.split("\x00"); @@ -182,4 +221,4 @@ function incObs(inum : mobx.IObservableValue) { })(); } -export {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeSimpleData, parseEnv0, boundInt, isModKeyPress, incObs}; +export {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeDataMap, genMergeSimpleData, parseEnv0, boundInt, isModKeyPress, incObs};