From 0f1c3ef1871f311d79f8274585bdb2925152f576 Mon Sep 17 00:00:00 2001 From: citrons Date: Thu, 5 Jun 2025 19:42:46 -0500 Subject: limit size of command window preview --- client/cmd_window.go | 8 ++++++++ client/main.go | 10 +++++++++- client/ui.go | 7 ------- tui/layout.go | 30 +++++++++++++++++++++++++++++- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/client/cmd_window.go b/client/cmd_window.go index e8dcaed..0a76e25 100644 --- a/client/cmd_window.go +++ b/client/cmd_window.go @@ -86,9 +86,11 @@ func (w *cmdWindow) showPreview() { Width: tui.Fill, Height: tui.Children, }) + var isOverflow bool tui.Push(msg.Id(), tui.Box { Width: tui.Fill, Height: tui.Children, Style: &tui.Style {Fg: tui.White, Bg: colorDefault[bottom.IsOdd()]}, + Overflow: true, MaxHeight: 7, IsOverflow: &isOverflow, }) msg.Show(bottom.IsOdd()) tui.Pop() @@ -98,6 +100,12 @@ func (w *cmdWindow) showPreview() { Style: &tui.Style {Bg: tui.White, Fg: tui.Black}, }) + if isOverflow { + tui.Push("", tui.Box {Width: tui.TextSize, Height: 1, NoWrap: true}) + tui.Text("[MORE]", nil) + tui.Pop() + } + tui.Push("", tui.Box {Width: tui.Fill, Height: 1}) tui.Pop() diff --git a/client/main.go b/client/main.go index c9da6c3..5993cf6 100644 --- a/client/main.go +++ b/client/main.go @@ -39,7 +39,15 @@ func main() { redraw = true case <-drawTick: if redraw { - globalApp.show() + for i := 0; i < 2; i++ { + // some information takes two passes to propogate + tui.Clear() + globalApp.show() + tui.DrawLayout() + } + if tui.Present() != nil { + os.Exit(-1) + } redraw = false } case text := <-globalApp.activePaste: diff --git a/client/ui.go b/client/ui.go index a6b6924..50e7790 100644 --- a/client/ui.go +++ b/client/ui.go @@ -7,7 +7,6 @@ import ( "citrons.xyz/talk/proto" "zgo.at/termfo/keys" "strings" - "os" ) func (a *application) getWin() window.Window { @@ -189,7 +188,6 @@ func (a *application) showWindow() { } func (a *application) show() { - tui.Clear() s := tui.Size() tui.Push("", tui.Box { Width: tui.BoxSize(s.Width), Height: tui.BoxSize(s.Height), @@ -201,9 +199,4 @@ func (a *application) show() { tui.Text(strings.Repeat("│", s.Height), nil) tui.Pop() a.showWindow() - - tui.DrawLayout() - if tui.Present() != nil { - os.Exit(-1) - } } \ No newline at end of file diff --git a/tui/layout.go b/tui/layout.go index f195048..4caa3a6 100644 --- a/tui/layout.go +++ b/tui/layout.go @@ -8,18 +8,21 @@ import ( type Box struct { id string Width, Height BoxSize + MaxWidth, MaxHeight BoxSize Dir Direction Overflow bool Style *Style Margins [4]int Scroll *ScrollState NoWrap bool + IsOverflow *bool text []textRun computedLines [][]textRun children []*Box computedPosition int computedSize [2]int computedRect rect + isOverflow bool } type BoxSize int @@ -97,6 +100,10 @@ func Push(id string, box Box) { box.computedSize[axis] = int(value) } } + b := layout.back[id] + if box.IsOverflow != nil { + *box.IsOverflow = b != nil && b.isOverflow + } } func Text(text string, style *Style) { @@ -117,14 +124,22 @@ func (b Box) axes() [2]BoxSize { return [2]BoxSize {b.Width, b.Height} } +func (b Box) maxAxes() [2]BoxSize { + return [2]BoxSize {b.MaxWidth, b.MaxHeight} +} + func (b *Box) marginsSize(axis int) int { return b.Margins[axis * 2] + b.Margins[axis * 2 + 1] } func (b *Box) computeFillSizes(axis int) { for _, c := range b.children { + size := b.computedSize[axis] if c.axes()[axis] == Fill { - c.computedSize[axis] = b.computedSize[axis] + c.computedSize[axis] = size + } + if c.maxAxes()[axis] == Fill { + c.computedSize[axis] = min(c.computedSize[axis], size) } c.computeFillSizes(axis) } @@ -143,11 +158,24 @@ func (b *Box) computeChildrenSizes(axis int) { if b.axes()[axis] == Children { b.computedSize[axis] = size } + if b.maxAxes()[axis] == Children { + b.computedSize[axis] = min(b.computedSize[axis], size) + } + if b.maxAxes()[axis] > 0 { + b.computedSize[axis] = min( + b.computedSize[axis], int(b.maxAxes()[axis]) + b.marginsSize(axis), + ) + } } func (b *Box) solve(axis int) { switch { case b.Dir.axis() == axis && b.Overflow: + size := b.marginsSize(axis) + for _, c := range b.children { + size += c.computedSize[axis] + } + b.isOverflow = size > b.computedSize[axis] break case b.Dir.axis() == axis: size := b.marginsSize(axis) -- cgit v1.2.3