2026-01-28 12:35:10 -06:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fyne.io/fyne/v2"
|
|
|
|
|
"fyne.io/fyne/v2/widget"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// TextOverlayProgressBar is a custom widget that displays a progress bar with text overlay.
|
2026-02-05 17:50:55 -06:00
|
|
|
// This allows showing progress information (e.g., step description) directly on the progress bar.
|
2026-01-28 12:35:10 -06:00
|
|
|
type TextOverlayProgressBar struct {
|
|
|
|
|
widget.BaseWidget
|
|
|
|
|
progressBar *widget.ProgressBar
|
|
|
|
|
label *widget.Label
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewTextOverlayProgressBar creates a new TextOverlayProgressBar.
|
|
|
|
|
func NewTextOverlayProgressBar() *TextOverlayProgressBar {
|
|
|
|
|
p := &TextOverlayProgressBar{
|
|
|
|
|
progressBar: widget.NewProgressBar(),
|
|
|
|
|
label: widget.NewLabel(""),
|
|
|
|
|
}
|
|
|
|
|
p.ExtendBaseWidget(p)
|
|
|
|
|
return p
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// SetValue sets the progress value of the underlying progress bar.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (p *TextOverlayProgressBar) SetValue(v float64) {
|
|
|
|
|
p.progressBar.SetValue(v)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SetText sets the text to be displayed on the progress bar.
|
|
|
|
|
func (p *TextOverlayProgressBar) SetText(text string) {
|
|
|
|
|
p.label.SetText(text)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CreateRenderer returns a new renderer for the widget.
|
|
|
|
|
func (p *TextOverlayProgressBar) CreateRenderer() fyne.WidgetRenderer {
|
|
|
|
|
return &textOverlayProgressBarRenderer{
|
|
|
|
|
progressBar: p.progressBar,
|
|
|
|
|
label: p.label,
|
|
|
|
|
objects: []fyne.CanvasObject{p.progressBar, p.label},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// textOverlayProgressBarRenderer is the renderer for the TextOverlayProgressBar.
|
|
|
|
|
// It handles the layout and rendering of the progress bar and the overlay text.
|
2026-01-28 12:35:10 -06:00
|
|
|
type textOverlayProgressBarRenderer struct {
|
|
|
|
|
progressBar *widget.ProgressBar
|
|
|
|
|
label *widget.Label
|
|
|
|
|
objects []fyne.CanvasObject
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// Layout defines the size and position of the progress bar and the label.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (r *textOverlayProgressBarRenderer) Layout(size fyne.Size) {
|
|
|
|
|
r.progressBar.Resize(size)
|
|
|
|
|
r.label.Resize(size)
|
|
|
|
|
r.label.Move(fyne.NewPos(0, 0))
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// MinSize returns the minimum size of the widget.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (r *textOverlayProgressBarRenderer) MinSize() fyne.Size {
|
|
|
|
|
return r.progressBar.MinSize()
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// Refresh redraws the widget.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (r *textOverlayProgressBarRenderer) Refresh() {
|
|
|
|
|
r.progressBar.Refresh()
|
|
|
|
|
r.label.Refresh()
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// Objects returns the canvas objects that make up the widget.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (r *textOverlayProgressBarRenderer) Objects() []fyne.CanvasObject {
|
|
|
|
|
return r.objects
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 17:50:55 -06:00
|
|
|
// Destroy is a no-op for this renderer.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (r *textOverlayProgressBarRenderer) Destroy() {}
|
|
|
|
|
|
|
|
|
|
// CustomTheme is a custom theme to make the progress bar thinner.
|
|
|
|
|
type CustomTheme struct {
|
|
|
|
|
fyne.Theme
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewCustomTheme creates a new CustomTheme.
|
|
|
|
|
func NewCustomTheme(theme fyne.Theme) *CustomTheme {
|
|
|
|
|
return &CustomTheme{Theme: theme}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Size returns the size for a given themeable item.
|
2026-02-05 17:50:55 -06:00
|
|
|
// It overrides the default progress bar height to make it thinner.
|
2026-01-28 12:35:10 -06:00
|
|
|
func (t *CustomTheme) Size(name fyne.ThemeSizeName) float32 {
|
|
|
|
|
if name == "progressBar.height" {
|
|
|
|
|
return 10
|
|
|
|
|
}
|
|
|
|
|
return t.Theme.Size(name)
|
|
|
|
|
}
|