149 lines
3.9 KiB
Go
149 lines
3.9 KiB
Go
|
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)
|
||
|
}
|