improve rendering performance

This commit is contained in:
sawka 2023-02-23 23:24:26 -08:00
parent 3b1198d6b7
commit 281d964d86
3 changed files with 43 additions and 1 deletions

View File

@ -31,6 +31,8 @@ type OV<V> = mobx.IObservableValue<V>;
type OArr<V> = mobx.IObservableArray<V>; type OArr<V> = mobx.IObservableArray<V>;
type OMap<K,V> = mobx.ObservableMap<K,V>; type OMap<K,V> = mobx.ObservableMap<K,V>;
type VisType = "visible" | "";
type HeightChangeCallbackType = (lineNum : number, newHeight : number, oldHeight : number) => void; type HeightChangeCallbackType = (lineNum : number, newHeight : number, oldHeight : number) => void;
type RendererComponentProps = {sw : ScreenWindow, line : LineType, width : number, staticRender : boolean, visible : OV<boolean>, onHeightChange : HeightChangeCallbackType, collapsed : boolean}; type RendererComponentProps = {sw : ScreenWindow, line : LineType, width : number, staticRender : boolean, visible : OV<boolean>, onHeightChange : HeightChangeCallbackType, collapsed : boolean};
@ -688,16 +690,50 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
})(); })();
} }
getLineDomId() : string {
let {line} = this.props;
return "line-" + getLineId(line);
}
renderSimple() {
let {sw, line, width, topBorder} = this.props;
let cmd = GlobalModel.getCmd(line);
let usedRows = sw.getUsedRows(line, cmd, width);
let mainDivCn = cn(
"line",
"line-cmd",
{"top-border": topBorder},
);
// header is 36px tall, padding+border = 6px
// zero-terminal is 0px
// terminal-wrapper overhead is 11px (margin/padding)
// each terminal line 16px
// inner-height, if zero-lines => 42
// else: 53+(lines*16)
let height = 42; // height of zero height terminal
if (usedRows > 0) {
height = 53 + termHeightFromRows(usedRows);
}
return (
<div className={mainDivCn} id={this.getLineDomId()} ref={this.lineRef} data-lineid={line.lineid} data-linenum={line.linenum} data-windowid={line.windowid} style={{height: height}}>
<LineAvatar line={line} cmd={cmd}/>
</div>
);
}
render() { render() {
let {sw, line, width, staticRender, visible, topBorder} = this.props; let {sw, line, width, staticRender, visible, topBorder} = this.props;
let model = GlobalModel; let model = GlobalModel;
let lineid = line.lineid; let lineid = line.lineid;
let isVisible = visible.get(); let isVisible = visible.get();
if (staticRender || !isVisible) {
return this.renderSimple();
}
let formattedTime = getLineDateTimeStr(line.ts); let formattedTime = getLineDateTimeStr(line.ts);
let cmd = model.getCmd(line); let cmd = model.getCmd(line);
if (cmd == null) { if (cmd == null) {
return ( return (
<div className="line line-invalid" id={"line-" + getLineId(line)} ref={this.lineRef} data-lineid={line.lineid} data-linenum={line.linenum} data-windowid={line.windowid}> <div className="line line-invalid" id={this.getLineDomId()} ref={this.lineRef} data-lineid={line.lineid} data-linenum={line.linenum} data-windowid={line.windowid}>
[cmd not found '{line.cmdid}'] [cmd not found '{line.cmdid}']
</div> </div>
); );
@ -734,6 +770,7 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
if (line.renderer == "image") { if (line.renderer == "image") {
RendererComponent = ImageRenderer; RendererComponent = ImageRenderer;
} }
return ( return (
<div className={mainDivCn} id={"line-" + getLineId(line)} <div className={mainDivCn} id={"line-" + getLineId(line)}
ref={this.lineRef} onClick={this.handleClick} ref={this.lineRef} onClick={this.handleClick}

View File

@ -602,6 +602,9 @@ class ScreenWindow {
} }
getUsedRows(line : LineType, cmd : Cmd, width : number) : number { getUsedRows(line : LineType, cmd : Cmd, width : number) : number {
if (cmd == null) {
return 0;
}
let termOpts = cmd.getTermOpts(); let termOpts = cmd.getTermOpts();
if (!termOpts.flexrows) { if (!termOpts.flexrows) {
return termOpts.rows; return termOpts.rows;

View File

@ -700,11 +700,13 @@ body::-webkit-scrollbar {
.avatar { .avatar {
cursor: pointer; cursor: pointer;
margin-right: 10px; margin-right: 10px;
height: 36px;
} }
.line-header { .line-header {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
height: 36px;
.meta-wrap { .meta-wrap {
flex-grow: 1; flex-grow: 1;