From bfd94a9e26aad3663cd2a20b620c02e994a72d15 Mon Sep 17 00:00:00 2001 From: Maarten Heremans Date: Fri, 14 Jun 2024 14:15:47 +0200 Subject: [PATCH] Add callbacks for resize and move --- baseview.go | 11 +++++++++++ dialog.go | 3 ++- screen/screen.go | 37 ++++++++++++++++++++++++++++++++++++- screenhandler.go | 8 ++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/baseview.go b/baseview.go index 0fbe6ca..a642384 100644 --- a/baseview.go +++ b/baseview.go @@ -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) +} diff --git a/dialog.go b/dialog.go index 7d955d2..6066cb2 100644 --- a/dialog.go +++ b/dialog.go @@ -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 { diff --git a/screen/screen.go b/screen/screen.go index 7e36f7b..3416e60 100644 --- a/screen/screen.go +++ b/screen/screen.go @@ -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 diff --git a/screenhandler.go b/screenhandler.go index ee75ee0..bdf98ce 100644 --- a/screenhandler.go +++ b/screenhandler.go @@ -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) +}