Added various widgets
This commit is contained in:
131
uiwidget/dateentry.go
Normal file
131
uiwidget/dateentry.go
Normal file
@ -0,0 +1,131 @@
|
||||
package uiwidget
|
||||
|
||||
import (
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/theme"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
|
||||
xwidget "fyne.io/x/fyne/widget"
|
||||
)
|
||||
|
||||
type DateEntry struct {
|
||||
widget.Entry
|
||||
calendar *xwidget.Calendar
|
||||
popUp *widget.PopUp
|
||||
|
||||
OnDateChanged func(time.Time)
|
||||
|
||||
date time.Time
|
||||
}
|
||||
|
||||
func NewDateEntry() *DateEntry {
|
||||
e := &DateEntry{}
|
||||
e.Validator = func(s string) error {
|
||||
_, err := time.Parse("02/01/2006", s)
|
||||
return err
|
||||
}
|
||||
e.OnChanged = func(s string) {
|
||||
if e.Validate() != nil {
|
||||
if e.OnDateChanged != nil {
|
||||
time, _ := time.Parse("02/01/2006", s)
|
||||
e.OnDateChanged(time)
|
||||
}
|
||||
}
|
||||
}
|
||||
e.ExtendBaseWidget(e)
|
||||
e.SetDate(time.Now())
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *DateEntry) CreateRenderer() fyne.WidgetRenderer {
|
||||
e.ExtendBaseWidget(e)
|
||||
if e.ActionItem == nil {
|
||||
e.ActionItem = e.setupDropdown()
|
||||
if e.Disabled() {
|
||||
e.ActionItem.(fyne.Disableable).Disable()
|
||||
}
|
||||
}
|
||||
return e.Entry.CreateRenderer()
|
||||
}
|
||||
|
||||
func (e *DateEntry) Enable() {
|
||||
if e.ActionItem != nil {
|
||||
e.ActionItem.(fyne.Disableable).Enable()
|
||||
}
|
||||
e.Entry.Enable()
|
||||
}
|
||||
|
||||
func (e *DateEntry) Disable() {
|
||||
if e.ActionItem != nil {
|
||||
e.ActionItem.(fyne.Disableable).Disable()
|
||||
}
|
||||
e.Entry.Disable()
|
||||
}
|
||||
|
||||
func (e *DateEntry) MinSize() fyne.Size {
|
||||
e.ExtendBaseWidget(e)
|
||||
return e.Entry.MinSize()
|
||||
}
|
||||
|
||||
func (e *DateEntry) Move(pos fyne.Position) {
|
||||
e.Entry.Move(pos)
|
||||
if e.popUp != nil {
|
||||
e.popUp.Move(e.popUpPos())
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DateEntry) Resize(size fyne.Size) {
|
||||
e.Entry.Resize(size)
|
||||
if e.popUp != nil {
|
||||
e.popUp.Resize(fyne.NewSize(size.Width, e.popUp.Size().Height))
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DateEntry) SetDate(date time.Time) {
|
||||
e.date = date
|
||||
e.calendar = xwidget.NewCalendar(date, e.onDateSelected)
|
||||
e.SetText(date.Format("02/01/2006"))
|
||||
|
||||
if e.ActionItem == nil {
|
||||
e.ActionItem = e.setupDropdown()
|
||||
if e.Disabled() {
|
||||
e.ActionItem.(fyne.Disableable).Disable()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DateEntry) GetDate() time.Time {
|
||||
return e.date
|
||||
}
|
||||
|
||||
func (e *DateEntry) popUpPos() fyne.Position {
|
||||
entryPos := fyne.CurrentApp().Driver().AbsolutePositionForObject(e)
|
||||
return entryPos.Add(fyne.NewPos(0, e.Size().Height-theme.InputBorderSize()))
|
||||
}
|
||||
|
||||
func (e *DateEntry) setupDropdown() *widget.Button {
|
||||
dropdownButton := widget.NewButton("", func() {
|
||||
c := fyne.CurrentApp().Driver().CanvasForObject(e)
|
||||
|
||||
e.popUp = widget.NewPopUp(e.calendar, c)
|
||||
e.popUp.ShowAtPosition(e.popUpPos())
|
||||
e.popUp.Resize(
|
||||
fyne.NewSize(
|
||||
float32(math.Max(float64(e.Size().Width), float64(e.popUp.MinSize().Width))),
|
||||
e.popUp.MinSize().Height))
|
||||
})
|
||||
dropdownButton.Importance = widget.LowImportance
|
||||
dropdownButton.SetIcon(theme.MenuDropDownIcon())
|
||||
return dropdownButton
|
||||
}
|
||||
|
||||
func (e *DateEntry) onDateSelected(date time.Time) {
|
||||
e.date = date
|
||||
e.SetText(e.date.Format("02/01/2006"))
|
||||
if e.popUp != nil {
|
||||
e.popUp.Hide()
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"bitbucket.org/hevanto/ui/uilayout"
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/data/binding"
|
||||
@ -125,11 +126,11 @@ func NewLabelWithData(data binding.String, opts ...LabelOpts) *widget.Label {
|
||||
//
|
||||
// Returns fyne.CanvasObject: the created widget.
|
||||
func NewUpDownLabelWithData(
|
||||
minSize *fyne.Size,
|
||||
data binding.String,
|
||||
upHandler func(),
|
||||
downHandler func(),
|
||||
) fyne.CanvasObject {
|
||||
c1 := container.NewWithoutLayout()
|
||||
c2 := container.NewWithoutLayout()
|
||||
w := NewWidgetBorder(
|
||||
widget.NewLabelWithData(data),
|
||||
@ -137,15 +138,19 @@ func NewUpDownLabelWithData(
|
||||
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
|
||||
|
||||
if minSize == nil {
|
||||
minSize = &fyne.Size{Width: 100, Height: 0}
|
||||
}
|
||||
return container.NewHBox(
|
||||
container.New(uilayout.NewMinSizeLayout(*minSize),
|
||||
w), c2)
|
||||
}
|
||||
|
||||
// NewH creates a RichText widget formatted as a header of the provided level.
|
||||
|
Reference in New Issue
Block a user