X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/7b6d0a81e0f3c8e33b1b76d5ecbc5bdb25a87249..effd32b0f2e4d146b219b1727601b0b7f6593638:/view.go?ds=inline diff --git a/view.go b/view.go index e392364..2357198 100644 --- a/view.go +++ b/view.go @@ -28,7 +28,7 @@ func newView(high, low int) *View { return &View{ high: high, low: low, - nodes: make(map[nodeKey]Node), + nodes: make(map[NodeKey]Node), } } @@ -38,7 +38,7 @@ func restoreView(state ViewState, high, low int, tree ViewNodeReader) (*View, er v := newView(high, low) v.merging = state.Merging for _, pair := range state.Lines { - line := nodeKey{pair[0], pair[1]} + line := NodeKey{pair[0], pair[1]} if line.level < 0 || line.level >= bits.UintSize-2 || line.index < 0 || line.index<= 0; n-- { line := v.lines[n] if line == key { @@ -168,6 +168,18 @@ func (v *View) Refresh(node Node) { } } +// Pending tells if a line of the view is not built yet. +func (v *View) Pending() bool { + for _, line := range v.lines { + _, built := v.nodes[line] + if !built { + return true + } + } + + return false +} + // Render returns the view as the model reads it: one line "id+n|text" for each // node inside tags, with the newlines of the text as spaces. func (v *View) Render() string { @@ -185,7 +197,9 @@ func (v *View) LinesWithout(skip map[int]bool) []string { } var text strings.Builder + v.renderLine(&text, line) + lines = append(lines, text.String()) } @@ -197,7 +211,9 @@ func (v *View) LinesWithout(skip map[int]bool) []string { // sees a pending mark or a part of a message. func (v *View) Context(end int) string { var text strings.Builder + text.WriteString("\n") + for _, line := range v.lines { _, built := v.nodes[line] if !built || nodeEnd(line.level, line.index) > end { @@ -213,7 +229,7 @@ func (v *View) Context(end int) string { } // load keeps the node of line when it is built, and tells if it is. -func (v *View) load(tree ViewNodeReader, line nodeKey) (bool, error) { +func (v *View) load(tree ViewNodeReader, line NodeKey) (bool, error) { node, built, err := tree.Node(line.level, line.index) if err != nil || !built { return false, err @@ -240,7 +256,7 @@ func (v *View) fit(tree ViewNodeReader) (bool, error) { } left, right := v.lines[best], v.lines[best+1] - parent := nodeKey{left.level + 1, left.index / 2} + parent := NodeKey{left.level + 1, left.index / 2} _, err = v.load(tree, parent) if err != nil { return merged, err @@ -249,6 +265,7 @@ func (v *View) fit(tree ViewNodeReader) (bool, error) { size += v.lineSize(parent) - v.lineSize(left) - v.lineSize(right) delete(v.nodes, left) delete(v.nodes, right) + v.lines[best] = parent v.lines = append(v.lines[:best+1], v.lines[best+2:]...) merged = true @@ -260,7 +277,7 @@ func (v *View) fit(tree ViewNodeReader) (bool, error) { } // renderLine writes one view line, "id+n|text", and a newline. -func (v *View) renderLine(text *strings.Builder, line nodeKey) { +func (v *View) renderLine(text *strings.Builder, line NodeKey) { body := viewPending node, built := v.nodes[line] if built { @@ -304,7 +321,7 @@ func (v *View) mostDue(tree ViewNodeReader) (int, error) { built, err := tree.Built(left.level+1, left.index/2) if err != nil { - return -1, err + return -1, fmt.Errorf("check parent node: %w", err) } if built { @@ -317,7 +334,7 @@ func (v *View) mostDue(tree ViewNodeReader) (int, error) { } // lineSize returns the size of a view line. -func (v *View) lineSize(line nodeKey) int { +func (v *View) lineSize(line NodeKey) int { node, built := v.nodes[line] if !built { return len(viewPending)