package uiwidget import ( "fmt" "strings" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" ) type LabelOpts interface { ApplyTo(*widget.Label) } type allignmentOpt struct { Alignment fyne.TextAlign } func AlignmentOpt(alignment fyne.TextAlign) LabelOpts { return &allignmentOpt{alignment} } func (a *allignmentOpt) ApplyTo(lbl *widget.Label) { lbl.Alignment = a.Alignment } type wrappingOpt struct { Wrapping fyne.TextWrap } func WrappingOpt(wrapping fyne.TextWrap) LabelOpts { return &wrappingOpt{wrapping} } func (w *wrappingOpt) ApplyTo(lbl *widget.Label) { lbl.Wrapping = w.Wrapping } type textStyleOpt struct { Style fyne.TextStyle } func TextStyleOpt(style fyne.TextStyle) LabelOpts { return &textStyleOpt{style} } func (t *textStyleOpt) ApplyTo(lbl *widget.Label) { lbl.TextStyle = t.Style } type truncationOpt struct { Truncation fyne.TextTruncation } func TruncationOpt(truncation fyne.TextTruncation) LabelOpts { return &truncationOpt{truncation} } func (t *truncationOpt) ApplyTo(lbl *widget.Label) { lbl.Truncation = t.Truncation } type importanceOpt struct { Importance widget.Importance } func ImportanceOpt(importance widget.Importance) LabelOpts { return &importanceOpt{importance} } func (i *importanceOpt) ApplyTo(lbl *widget.Label) { lbl.Importance = i.Importance } func NewLabel(text string, opts ...LabelOpts) *widget.Label { lbl := widget.NewLabel(text) for _, opt := range opts { opt.ApplyTo(lbl) } return lbl } func NewLabelWithData(data binding.String, opts ...LabelOpts) *widget.Label { lbl := widget.NewLabelWithData(data) for _, opt := range opts { opt.ApplyTo(lbl) } return lbl } func NewUpDownLabelWithData( data binding.String, upHandler func(), downHandler func(), ) fyne.CanvasObject { c1 := container.NewWithoutLayout() c2 := container.NewWithoutLayout() w := NewWidgetBorder( widget.NewLabelWithData(data), ) bu := widget.NewButtonWithIcon("", theme.MoveUpIcon(), upHandler) bd := widget.NewButtonWithIcon("", theme.MoveDownIcon(), downHandler) w.Resize(fyne.NewSize(100, w.MinSize().Height)) c1.Add(w) c2.Move(fyne.NewPos(w.Size().Width, 0)) c1.Add(c2) bu.Resize(fyne.NewSize(30, w.Size().Height*0.5)) bd.Resize(fyne.NewSize(30, w.Size().Height*0.5)) bd.Move(fyne.NewPos(0, w.Size().Height*0.5)) c2.Add(bu) c2.Add(bd) return c1 } func NewH(level int, text string) *widget.RichText { return widget.NewRichTextFromMarkdown( fmt.Sprintf("%s %s", strings.Repeat("#", level), text)) } func NewHWithData(level int, data binding.String) *widget.RichText { txt, _ := data.Get() w := NewH(level, txt) data.AddListener(binding.NewDataListener(func() { txt, _ := data.Get() w.ParseMarkdown(fmt.Sprintf("%s %s", strings.Repeat("#", level), txt)) })) return w } func NewH1(text string) *widget.RichText { return NewH(1, text) } func NewH1WithData(data binding.String) *widget.RichText { return NewHWithData(1, data) } func NewH2(text string) *widget.RichText { return NewH(2, text) } func NewH2WithData(data binding.String) *widget.RichText { return NewHWithData(2, data) } func NewH3(text string) *widget.RichText { return NewH(3, text) } func NewH3WithData(data binding.String) *widget.RichText { return NewHWithData(3, data) } func NewH4(text string) *widget.RichText { return NewH(4, text) } func NewH4WithData(data binding.String) *widget.RichText { return NewHWithData(4, data) } func NewH5(text string) *widget.RichText { return NewH(5, text) } func NewH5WithData(data binding.String) *widget.RichText { return NewHWithData(5, data) } func NewH6(text string) *widget.RichText { return NewH(6, text) } func NewH6WithData(data binding.String) *widget.RichText { return NewHWithData(6, data) }