summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcitrons <citrons@mondecitronne.com>2025-06-05 19:42:46 -0500
committercitrons <citrons@mondecitronne.com>2025-06-07 16:02:18 -0500
commit0f1c3ef1871f311d79f8274585bdb2925152f576 (patch)
treeb1b281eebc8dd2a8f07ddaad698515cfbe25b517
parent2d54af98b89d5f7ff43bc0d887e42bde7ef87dbc (diff)
limit size of command window preview
-rw-r--r--client/cmd_window.go8
-rw-r--r--client/main.go10
-rw-r--r--client/ui.go7
-rw-r--r--tui/layout.go30
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)