Working on buffer stuff...

Trying to figure out how/if it fits...
This commit is contained in:
2025-10-17 16:36:29 -05:00
parent 6aaaa68228
commit 25777066cd
4 changed files with 147 additions and 74 deletions

View File

@@ -50,7 +50,7 @@ type AbsoluteLayout struct {
cursor int
disableTab bool
logger func(string)
logger func(string, ...any)
}
var _ Widget = (*AbsoluteLayout)(nil)
@@ -209,10 +209,10 @@ func (w *AbsoluteLayout) Clear() {
func (w *AbsoluteLayout) SetDefaultAnchor(d LayoutFlag) { w.defAnchor = d }
func (w *AbsoluteLayout) SetLogger(l func(string)) { w.logger = l }
func (w *AbsoluteLayout) Log(txt string) {
func (w *AbsoluteLayout) SetLogger(l func(string, ...any)) { w.logger = l }
func (w *AbsoluteLayout) Log(txt string, args ...any) {
if w.logger != nil {
w.logger(txt)
w.logger(txt, args...)
}
}
@@ -229,21 +229,39 @@ func (w *AbsoluteLayout) updateWidgetLayouts() {
for _, wd := range w.widgets {
w.updateWidgetPos(wd)
}
var updated []Widget
for wd := range w.wManualSizes {
w.updateWidgetSize(wd)
updated = append(updated, wd)
}
for wd := range w.wDynamicSizes {
w.updateWidgetSize(wd)
updated = append(updated, wd)
}
for i := range w.widgets {
var next bool
for j := range updated {
if updated[j] == w.widgets[i] {
next = true
}
}
if next {
continue
}
w.updateWidgetSize(w.widgets[i])
}
}
// Set a widgets position relative to the layout
func (w *AbsoluteLayout) updateWidgetPos(wd Widget) {
wd.SetPos(w.getRelPos(wd))
p := w.getRelPos(wd)
w.Log("%s: Setting Pos: %s (%d,%d)", w.Id(), wd.Id(), p.X, p.Y)
wd.SetPos(p)
}
func (w *AbsoluteLayout) updateWidgetSize(wd Widget) {
if sz, ok := w.wManualSizes[wd]; ok {
w.Log("%s: Updating Size: %s (%d,%d)", w.Id(), wd.Id(), sz.X, sz.Y)
wd.SetW(sz.X)
wd.SetH(sz.Y)
return
@@ -252,19 +270,17 @@ func (w *AbsoluteLayout) updateWidgetSize(wd Widget) {
// X: Layout Width - Widget X
// Y: Layout Height - Widget Y
available := Coord{X: w.GetW() - wd.GetX(), Y: w.GetH() - wd.GetY()}
ww := wd.WantW()
if ww < available.X {
wd.SetW(ww)
} else if wd.MinW() < available.X {
if wd.WantW() < available.X {
wd.SetW(wd.WantW())
} else if wd.MinW() > available.X {
wd.SetW(available.X)
} else {
wd.SetW(wd.MinW())
}
wh := wd.WantH()
if wh < available.Y {
wd.SetH(wh)
} else if wd.MinH() < available.Y {
if wd.WantH() < available.Y {
wd.SetH(wd.WantH())
} else if wd.MinH() > available.Y {
wd.SetH(available.Y)
} else {
wd.SetH(wd.MinH())
@@ -272,8 +288,13 @@ func (w *AbsoluteLayout) updateWidgetSize(wd Widget) {
}
// Manually set the size of a widget, the Layout won't override it
func (w *AbsoluteLayout) SetWidgetSize(wd Widget, sz Coord) { w.wManualSizes[wd] = sz }
func (w *AbsoluteLayout) SetDynamicWidgetSize(wd Widget, flg LayoutFlag) { w.wDynamicSizes[wd] = flg }
func (w *AbsoluteLayout) SetWidgetSize(wd Widget, sz Coord) {
w.wManualSizes[wd] = sz
}
func (w *AbsoluteLayout) SetDynamicWidgetSize(wd Widget, flg LayoutFlag) {
w.wDynamicSizes[wd] = flg
}
func (w *AbsoluteLayout) getRelPos(wd Widget) Coord {
var p Coord
@@ -339,6 +360,7 @@ func (w *AbsoluteLayout) DeleteIndex(idx int) {
delete(w.wAnchor, p)
}
}
func (w *AbsoluteLayout) Delete(n Widget) {
for i := 0; i < len(w.widgets); i++ {
if w.widgets[i] == n {
@@ -347,6 +369,7 @@ func (w *AbsoluteLayout) Delete(n Widget) {
}
}
}
func (w *AbsoluteLayout) IndexOf(n Widget) int {
for i := range w.widgets {
if w.widgets[i] == n {