| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- 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)
- }
|