Refine colored select styling and add accent bar

This commit is contained in:
Stu Leak 2026-01-04 02:32:52 -05:00
parent 70ba1bdd95
commit b3c60a78fb

View File

@ -1120,20 +1120,38 @@ func (cs *ColoredSelect) Disable() {
// CreateRenderer creates the renderer for the colored select // CreateRenderer creates the renderer for the colored select
func (cs *ColoredSelect) CreateRenderer() fyne.WidgetRenderer { func (cs *ColoredSelect) CreateRenderer() fyne.WidgetRenderer {
// Create simple dropdown with minimal changes to avoid freezing
displayText := cs.selected displayText := cs.selected
if displayText == "" && cs.placeHolder != "" { if displayText == "" && cs.placeHolder != "" {
displayText = cs.placeHolder displayText = cs.placeHolder
} }
// Create simple button that shows popup (using basic button) bg := canvas.NewRectangle(selectBackgroundColor())
button := widget.NewButton(displayText, func() { bar := canvas.NewRectangle(selectAccentColor(cs.selected, cs.colorMap))
cs.showPopup() bar.SetMinSize(fyne.NewSize(6, 24))
label := canvas.NewText(displayText, selectTextColor())
label.Alignment = fyne.TextAlignLeading
label.TextSize = 14
caret := canvas.NewText("▼", selectTextColor())
caret.TextSize = 12
content := container.NewBorder(nil, nil, bar, nil,
container.NewPadded(container.NewBorder(nil, nil, nil, caret, label)))
tappable := NewTappable(container.NewMax(bg, content), func() {
if !cs.disabled {
cs.showPopup()
}
}) })
return &coloredSelectRenderer{ return &coloredSelectRenderer{
select_: cs, select_: cs,
button: button, bg: bg,
bar: bar,
label: label,
caret: caret,
tappable: tappable,
} }
} }
@ -1220,32 +1238,70 @@ func (cs *ColoredSelect) Tapped(*fyne.PointEvent) {
} }
type coloredSelectRenderer struct { type coloredSelectRenderer struct {
select_ *ColoredSelect select_ *ColoredSelect
button *widget.Button bg *canvas.Rectangle
bar *canvas.Rectangle
label *canvas.Text
caret *canvas.Text
tappable *Tappable
} }
func (r *coloredSelectRenderer) Layout(size fyne.Size) { func (r *coloredSelectRenderer) Layout(size fyne.Size) {
r.button.Resize(size) r.tappable.Resize(size)
} }
func (r *coloredSelectRenderer) MinSize() fyne.Size { func (r *coloredSelectRenderer) MinSize() fyne.Size {
return r.button.MinSize() return r.tappable.MinSize()
} }
func (r *coloredSelectRenderer) Refresh() { func (r *coloredSelectRenderer) Refresh() {
// Update display text displayText := r.select_.selected
if r.select_.selected != "" { if displayText == "" && r.select_.placeHolder != "" {
r.button.SetText(r.select_.selected) displayText = r.select_.placeHolder
} else if r.select_.placeHolder != "" {
r.button.SetText(r.select_.placeHolder)
} else {
r.button.SetText("")
} }
r.button.Refresh()
if r.select_.disabled {
r.bg.FillColor = color.NRGBA{R: 42, G: 46, B: 54, A: 255}
r.label.Color = color.NRGBA{R: 140, G: 150, B: 160, A: 255}
r.caret.Color = color.NRGBA{R: 140, G: 150, B: 160, A: 255}
} else {
r.bg.FillColor = selectBackgroundColor()
r.label.Color = selectTextColor()
r.caret.Color = selectTextColor()
}
r.bar.FillColor = selectAccentColor(r.select_.selected, r.select_.colorMap)
r.label.Text = displayText
r.bg.Refresh()
r.bar.Refresh()
r.label.Refresh()
r.caret.Refresh()
r.tappable.Refresh()
} }
func (r *coloredSelectRenderer) Destroy() {} func (r *coloredSelectRenderer) Destroy() {}
func (r *coloredSelectRenderer) Objects() []fyne.CanvasObject { func (r *coloredSelectRenderer) Objects() []fyne.CanvasObject {
return []fyne.CanvasObject{r.button} return []fyne.CanvasObject{r.tappable}
}
func selectBackgroundColor() color.Color {
return color.NRGBA{R: 54, G: 72, B: 96, A: 255}
}
func selectTextColor() color.Color {
return color.NRGBA{R: 230, G: 236, B: 245, A: 255}
}
func selectAccentColor(selected string, colorMap map[string]color.Color) color.Color {
if selected == "" {
return color.NRGBA{R: 90, G: 90, B: 90, A: 255}
}
if colorMap != nil {
if col := colorMap[selected]; col != nil {
return col
}
}
return color.NRGBA{R: 90, G: 90, B: 90, A: 255}
} }