Add callbacks for resize and move

This commit is contained in:
Maarten Heremans 2024-06-14 14:15:47 +02:00
parent 36d12fd547
commit bfd94a9e26
4 changed files with 57 additions and 2 deletions

View File

@ -10,6 +10,9 @@ import (
"github.com/nicksnyder/go-i18n/v2/i18n"
)
type ResizeCallbackFn func(fyne.Size)
type MoveCallbackFn func(fyne.Position)
// BaseView represents the base implementation of a view
// You can create new view types by composing a type around BaseView
type BaseView struct {
@ -137,3 +140,11 @@ func (v *BaseView) GetBinding(bindingName string) binding.DataItem {
func (v *BaseView) GetCanvasObject() fyne.CanvasObject {
return v.CanvasObject
}
func (v *BaseView) RegisterResizeCallback(cb ResizeCallbackFn) {
v.ScreenHandler.RegisterResizeCallback(cb)
}
func (v *BaseView) RegisterMoveCallback(cb MoveCallbackFn) {
v.ScreenHandler.RegisterMoveCallback(cb)
}

View File

@ -5,6 +5,7 @@ import (
"fmt"
"io/fs"
"bitbucket.org/hevanto/ui/screen"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/dialog"
@ -357,7 +358,7 @@ func (d *FormDialog) SetButtonLabels(
func (d *FormDialog) Initialize() fyne.CanvasObject {
if d.itemsFn == nil {
form := d.BaseDialog.Initialize().(*fyne.Container)
form := d.BaseDialog.Initialize().(*screen.Screen).AsContainer()
d.itemsFn = func() []*widget.FormItem {
res := make([]*widget.FormItem, 0, len(form.Objects)/2)
for i := 0; i < len(form.Objects); i += 2 {

View File

@ -57,8 +57,12 @@ type ScreenHandler interface {
}
type Screen struct {
fyne.CanvasObject
rootElement *Element
screenHandler ScreenHandler
resizeCallbacks []func(fyne.Size)
moveCallbacks []func(fyne.Position)
}
func New(
@ -107,13 +111,44 @@ func NewTemplate(
}
func (s *Screen) Initialize() (obj fyne.CanvasObject, err error) {
if obj, err = s.rootElement.BuildUI(s.screenHandler); err != nil {
if s.CanvasObject, err = s.rootElement.BuildUI(s.screenHandler); err != nil {
err = fmt.Errorf("failed to build screen: %w", err)
return
}
obj = s
return
}
func (s *Screen) Move(p fyne.Position) {
s.CanvasObject.Move(p)
for _, cb := range s.moveCallbacks {
cb(p)
}
}
func (s *Screen) Resize(sz fyne.Size) {
s.CanvasObject.Resize(sz)
for _, cb := range s.resizeCallbacks {
cb(sz)
}
}
func (s *Screen) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(s.CanvasObject)
}
func (s *Screen) RegisterResizeCallback(cb func(fyne.Size)) {
s.resizeCallbacks = append(s.resizeCallbacks, cb)
}
func (s *Screen) RegisterMoveCallback(cb func(fyne.Position)) {
s.moveCallbacks = append(s.moveCallbacks, cb)
}
func (s *Screen) AsContainer() *fyne.Container {
return s.CanvasObject.(*fyne.Container)
}
type TemplateScreenHandler struct {
localizer *i18n.Localizer
elementsMap map[string]*UIElement

View File

@ -430,3 +430,11 @@ func (h *ScreenHandler) GetOnValidationChangedHandler(name string) screen.Valida
}
return fn
}
func (h *ScreenHandler) RegisterResizeCallback(cb ResizeCallbackFn) {
h.screenDefinition.RegisterResizeCallback(cb)
}
func (h *ScreenHandler) RegisterMoveCallback(cb MoveCallbackFn) {
h.screenDefinition.RegisterMoveCallback(cb)
}