This commit is contained in:
2025-08-28 11:20:11 -05:00
parent f41e583089
commit c1db729bb3
2 changed files with 32 additions and 46 deletions

View File

@@ -103,8 +103,11 @@ func (w *LinearLayout) HandleKey(ev *tcell.EventKey) bool {
if ev.Key() == tcell.KeyTab { if ev.Key() == tcell.KeyTab {
if active == nil && len(w.widgets) > 0 { if active == nil && len(w.widgets) > 0 {
// No widget is active // No widget is active
w.widgets[0].SetActive(true) if w.widgets[0].Tabbable() {
return true w.widgets[0].SetActive(true)
return true
}
return false
} }
return w.activateNext() return w.activateNext()
} }
@@ -243,7 +246,6 @@ func (w *LinearLayout) activateNext() bool {
var found bool var found bool
for i := range w.widgets { for i := range w.widgets {
if found && w.widgets[i].Tabbable() { if found && w.widgets[i].Tabbable() {
w.Log("%s.activeNext Setting Next Active: %s", w.Id(), w.widgets[i].Id())
w.widgets[i].SetActive(true) w.widgets[i].SetActive(true)
return true return true
} else if w.widgets[i].Active() { } else if w.widgets[i].Active() {
@@ -251,7 +253,6 @@ func (w *LinearLayout) activateNext() bool {
w.widgets[i].SetActive(false) w.widgets[i].SetActive(false)
} }
} }
w.Log("%s.activeNext Hit End", w.Id())
return false return false
} }
@@ -318,6 +319,13 @@ func (w *LinearLayout) Insert(n Widget, idx int) {
w.updateTotalWeight() w.updateTotalWeight()
} }
// Remove all children from this widget
func (w *LinearLayout) Clear() {
w.widgets = []Widget{}
w.layoutFlags = make(map[Widget]LayoutFlag)
w.layoutWeights = make(map[Widget]int)
}
func (w *LinearLayout) Delete(n Widget) { func (w *LinearLayout) Delete(n Widget) {
for i := 0; i < len(w.widgets); i++ { for i := 0; i < len(w.widgets); i++ {
if w.widgets[i] == n { if w.widgets[i] == n {
@@ -357,6 +365,17 @@ func (w *LinearLayout) RemoveFlag(wd Widget, f LayoutFlag) {
} }
} }
func (w *LinearLayout) GetWeight(wd Widget) int {
if !w.Contains(wd) {
return 0
}
wght := w.layoutWeights[wd]
if wght == 0 {
wght = 1
}
return wght
}
func (w *LinearLayout) SetWeight(wd Widget, wt int) { func (w *LinearLayout) SetWeight(wd Widget, wt int) {
if !w.Contains(wd) { if !w.Contains(wd) {
return return
@@ -399,13 +418,6 @@ func (w *LinearLayout) updateLLVWidgetSize(wd Widget) {
rW := w.w rW := w.w
if w.stacked { if w.stacked {
rW = wd.MinW() rW = wd.MinW()
} else {
if wd == w.widgets[len(w.widgets)-1] {
wrk := float64(w.w) / float64(w.totalWeight)
if wrk == float64((w.w / w.totalWeight)) {
rW -= 1
}
}
} }
wd.HandleResize((&Coord{X: rW, Y: w.getWeightedH(wd)}).ResizeEvent()) wd.HandleResize((&Coord{X: rW, Y: w.getWeightedH(wd)}).ResizeEvent())
} }
@@ -414,17 +426,8 @@ func (w *LinearLayout) updateLLHWidgetSize(wd Widget) {
rH := w.h rH := w.h
if w.stacked { if w.stacked {
rH = wd.MinH() rH = wd.MinH()
} else {
if wd == w.widgets[len(w.widgets)-1] {
wrk := float64(w.h) / float64(w.totalWeight)
if wrk == float64((w.h / w.totalWeight)) {
rH -= 1
}
}
} }
c := &Coord{X: w.getWeightedW(wd), Y: rH} wd.HandleResize((&Coord{X: w.getWeightedW(wd), Y: rH}).ResizeEvent())
w.Log("%s.updateLLHWidgetSize(%s) { %d, %d }", w.Id(), wd.Id(), c.X, c.Y)
wd.HandleResize(c.ResizeEvent())
} }
// The Layout should have a static Size set at this point that we can use // The Layout should have a static Size set at this point that we can use
@@ -440,7 +443,7 @@ func (w *LinearLayout) updateLLVWidgetPos(wd Widget) {
if w.widgets[i] == wd { if w.widgets[i] == wd {
break break
} }
c.Y += w.getWeightedH(w.widgets[i]) c.Y = w.widgets[i].GetY() + w.widgets[i].GetH()
} }
// Do we have a layout flag for this widget? // Do we have a layout flag for this widget?
@@ -481,7 +484,7 @@ func (w *LinearLayout) updateLLHWidgetPos(wd Widget) {
} }
break break
} }
c.X += w.getWeightedW(w.widgets[i]) + 2 c.X = w.widgets[i].GetX() + w.widgets[i].GetW()
} }
// Do we have a layout flag for this widget? // Do we have a layout flag for this widget?
@@ -501,6 +504,8 @@ func (w *LinearLayout) updateLLHWidgetPos(wd Widget) {
c.X += (w.getWeightedW(wd) / 2) - (wd.GetW() / 2) c.X += (w.getWeightedW(wd) / 2) - (wd.GetW() / 2)
} }
} }
// Is the Y of this tricky?
c.Y = 0 c.Y = 0
if wd.GetW() < w.h { if wd.GetW() < w.h {
// We have extra vertical space. // We have extra vertical space.
@@ -520,17 +525,7 @@ func (w *LinearLayout) getWeightedH(wd Widget) int {
} else if w.stacked { } else if w.stacked {
return wd.MinH() return wd.MinH()
} }
wght := w.layoutWeights[wd] return int(float64(w.h)*(float64(w.GetWeight(wd))/float64(w.totalWeight))) - 1
if wght == 0 {
wght = 1
}
retF := float64(w.h) * (float64(wght) / float64(w.totalWeight))
retI := int(retF)
if retF-float64(retI) >= 0.5 {
return retI + 1
} else {
return retI
}
} }
func (w *LinearLayout) getWeightedW(wd Widget) int { func (w *LinearLayout) getWeightedW(wd Widget) int {
@@ -539,20 +534,11 @@ func (w *LinearLayout) getWeightedW(wd Widget) int {
} else if w.stacked { } else if w.stacked {
return wd.MinW() return wd.MinW()
} }
wght := w.layoutWeights[wd] return int(float64(w.w)*(float64(w.GetWeight(wd))/float64(w.totalWeight))) - 1
if wght == 0 {
wght = 1
}
retF := float64(w.w) * (float64(wght) / float64(w.totalWeight))
retI := int(retF)
if retF-float64(retI) >= 0.5 {
return retI + 1
} else {
return retI
}
} }
func (w *LinearLayout) SetStacked(s bool) { w.stacked = s } func (w *LinearLayout) SetStacked(s bool) { w.stacked = s }
func (w *LinearLayout) SetTabDisabled(b bool) { w.disableTab = b }
func (w *LinearLayout) SetBordered(b bool) { w.insetBorder = b } func (w *LinearLayout) SetBordered(b bool) { w.insetBorder = b }
func (w *LinearLayout) SetLogger(l func(string, ...any)) { w.logger = l } func (w *LinearLayout) SetLogger(l func(string, ...any)) { w.logger = l }
func (w *LinearLayout) Log(txt string, args ...any) { func (w *LinearLayout) Log(txt string, args ...any) {

View File

@@ -235,7 +235,7 @@ func (w *List) SetItem(idx int, txt string) {
w.list[idx] = txt w.list[idx] = txt
} }
} }
func (w *List) GetIdx() int { return w.cursor } func (w *List) SelectedIndex() int { return w.cursor }
func (w *List) ClearBorder() { w.border = []rune{} } func (w *List) ClearBorder() { w.border = []rune{} }
func (w *List) SetOnSelect(s func(int, string) bool) { w.onSelect = s } func (w *List) SetOnSelect(s func(int, string) bool) { w.onSelect = s }
func (w *List) SetVimMode(b bool) { w.vimMode = b } func (w *List) SetVimMode(b bool) { w.vimMode = b }