diff --git a/wdgt_linear_layout.go b/wdgt_linear_layout.go index 70092db..dd4ddfc 100644 --- a/wdgt_linear_layout.go +++ b/wdgt_linear_layout.go @@ -103,8 +103,11 @@ func (w *LinearLayout) HandleKey(ev *tcell.EventKey) bool { if ev.Key() == tcell.KeyTab { if active == nil && len(w.widgets) > 0 { // No widget is active - w.widgets[0].SetActive(true) - return true + if w.widgets[0].Tabbable() { + w.widgets[0].SetActive(true) + return true + } + return false } return w.activateNext() } @@ -243,7 +246,6 @@ func (w *LinearLayout) activateNext() bool { var found bool for i := range w.widgets { 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) return true } else if w.widgets[i].Active() { @@ -251,7 +253,6 @@ func (w *LinearLayout) activateNext() bool { w.widgets[i].SetActive(false) } } - w.Log("%s.activeNext Hit End", w.Id()) return false } @@ -318,6 +319,13 @@ func (w *LinearLayout) Insert(n Widget, idx int) { 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) { for i := 0; i < len(w.widgets); i++ { 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) { if !w.Contains(wd) { return @@ -399,13 +418,6 @@ func (w *LinearLayout) updateLLVWidgetSize(wd Widget) { rW := w.w if w.stacked { 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()) } @@ -414,17 +426,8 @@ func (w *LinearLayout) updateLLHWidgetSize(wd Widget) { rH := w.h if w.stacked { 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} - w.Log("%s.updateLLHWidgetSize(%s) { %d, %d }", w.Id(), wd.Id(), c.X, c.Y) - wd.HandleResize(c.ResizeEvent()) + wd.HandleResize((&Coord{X: w.getWeightedW(wd), Y: rH}).ResizeEvent()) } // 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 { 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? @@ -481,7 +484,7 @@ func (w *LinearLayout) updateLLHWidgetPos(wd Widget) { } 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? @@ -501,6 +504,8 @@ func (w *LinearLayout) updateLLHWidgetPos(wd Widget) { c.X += (w.getWeightedW(wd) / 2) - (wd.GetW() / 2) } } + + // Is the Y of this tricky? c.Y = 0 if wd.GetW() < w.h { // We have extra vertical space. @@ -520,17 +525,7 @@ func (w *LinearLayout) getWeightedH(wd Widget) int { } else if w.stacked { return wd.MinH() } - wght := w.layoutWeights[wd] - 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 - } + return int(float64(w.h)*(float64(w.GetWeight(wd))/float64(w.totalWeight))) - 1 } func (w *LinearLayout) getWeightedW(wd Widget) int { @@ -539,20 +534,11 @@ func (w *LinearLayout) getWeightedW(wd Widget) int { } else if w.stacked { return wd.MinW() } - wght := w.layoutWeights[wd] - 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 - } + return int(float64(w.w)*(float64(w.GetWeight(wd))/float64(w.totalWeight))) - 1 } 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) SetLogger(l func(string, ...any)) { w.logger = l } func (w *LinearLayout) Log(txt string, args ...any) { diff --git a/wdgt_list.go b/wdgt_list.go index 91e250b..088dd37 100644 --- a/wdgt_list.go +++ b/wdgt_list.go @@ -235,7 +235,7 @@ func (w *List) SetItem(idx int, txt string) { 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) SetOnSelect(s func(int, string) bool) { w.onSelect = s } func (w *List) SetVimMode(b bool) { w.vimMode = b }