adam-gui/vendor/fyne.io/fyne/v2/widget/toolbar.go

149 lines
3.9 KiB
Go
Raw Normal View History

2024-04-29 19:13:50 +02:00
package widget
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/internal/widget"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
)
// ToolbarItem represents any interface element that can be added to a toolbar
type ToolbarItem interface {
ToolbarObject() fyne.CanvasObject
}
// ToolbarAction is push button style of ToolbarItem
type ToolbarAction struct {
Icon fyne.Resource
OnActivated func() `json:"-"`
}
// ToolbarObject gets a button to render this ToolbarAction
func (t *ToolbarAction) ToolbarObject() fyne.CanvasObject {
button := NewButtonWithIcon("", t.Icon, t.OnActivated)
button.Importance = LowImportance
return button
}
// SetIcon updates the icon on a ToolbarItem
//
// Since: 2.2
func (t *ToolbarAction) SetIcon(icon fyne.Resource) {
t.Icon = icon
t.ToolbarObject().Refresh()
}
// NewToolbarAction returns a new push button style ToolbarItem
func NewToolbarAction(icon fyne.Resource, onActivated func()) *ToolbarAction {
return &ToolbarAction{icon, onActivated}
}
// ToolbarSpacer is a blank, stretchable space for a toolbar.
// This is typically used to assist layout if you wish some left and some right aligned items.
// Space will be split evebly amongst all the spacers on a toolbar.
type ToolbarSpacer struct {
}
// ToolbarObject gets the actual spacer object for this ToolbarSpacer
func (t *ToolbarSpacer) ToolbarObject() fyne.CanvasObject {
return layout.NewSpacer()
}
// NewToolbarSpacer returns a new spacer item for a Toolbar to assist with ToolbarItem alignment
func NewToolbarSpacer() *ToolbarSpacer {
return &ToolbarSpacer{}
}
// ToolbarSeparator is a thin, visible divide that can be added to a Toolbar.
// This is typically used to assist visual grouping of ToolbarItems.
type ToolbarSeparator struct {
}
// ToolbarObject gets the visible line object for this ToolbarSeparator
func (t *ToolbarSeparator) ToolbarObject() fyne.CanvasObject {
return canvas.NewRectangle(theme.ForegroundColor())
}
// NewToolbarSeparator returns a new separator item for a Toolbar to assist with ToolbarItem grouping
func NewToolbarSeparator() *ToolbarSeparator {
return &ToolbarSeparator{}
}
// Toolbar widget creates a horizontal list of tool buttons
type Toolbar struct {
BaseWidget
Items []ToolbarItem
}
// CreateRenderer is a private method to Fyne which links this widget to its renderer
func (t *Toolbar) CreateRenderer() fyne.WidgetRenderer {
t.ExtendBaseWidget(t)
r := &toolbarRenderer{toolbar: t, layout: layout.NewHBoxLayout()}
r.resetObjects()
return r
}
// Append a new ToolbarItem to the end of this Toolbar
func (t *Toolbar) Append(item ToolbarItem) {
t.Items = append(t.Items, item)
t.Refresh()
}
// Prepend a new ToolbarItem to the start of this Toolbar
func (t *Toolbar) Prepend(item ToolbarItem) {
t.Items = append([]ToolbarItem{item}, t.Items...)
t.Refresh()
}
// MinSize returns the size that this widget should not shrink below
func (t *Toolbar) MinSize() fyne.Size {
t.ExtendBaseWidget(t)
return t.BaseWidget.MinSize()
}
// NewToolbar creates a new toolbar widget.
func NewToolbar(items ...ToolbarItem) *Toolbar {
t := &Toolbar{Items: items}
t.ExtendBaseWidget(t)
t.Refresh()
return t
}
type toolbarRenderer struct {
widget.BaseRenderer
layout fyne.Layout
items []fyne.CanvasObject
toolbar *Toolbar
}
func (r *toolbarRenderer) MinSize() fyne.Size {
return r.layout.MinSize(r.items)
}
func (r *toolbarRenderer) Layout(size fyne.Size) {
r.layout.Layout(r.items, size)
}
func (r *toolbarRenderer) Refresh() {
r.resetObjects()
for i, item := range r.toolbar.Items {
if _, ok := item.(*ToolbarSeparator); ok {
rect := r.items[i].(*canvas.Rectangle)
rect.FillColor = theme.ForegroundColor()
}
}
canvas.Refresh(r.toolbar)
}
func (r *toolbarRenderer) resetObjects() {
r.items = make([]fyne.CanvasObject, 0, len(r.toolbar.Items))
for _, item := range r.toolbar.Items {
r.items = append(r.items, item.ToolbarObject())
}
r.SetObjects(r.items)
}