ui/baseview.go
2024-06-14 14:15:47 +02:00

151 lines
3.1 KiB
Go

package ui
import (
"embed"
"io/fs"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/data/binding"
"github.com/google/uuid"
"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 {
// The concrete view (Wrapper Object)
concreteView View
// Id of view
id string
// The controller
ViewModel ViewModel
// Root CanvasObject of the view
CanvasObject fyne.CanvasObject
// ----------- ScreenHandler -------------//
*ScreenHandler
}
// NewBaseView creates a new baseview
// Any wrapper view should call this function in it's own initialization
// function an pass itself.
//
// example:
//
// func NewWrapperView(...) *WrapperView {
// v := new(WrapperView)
// v.BaseView = NewBaseView(v)
// ..
// return v
// }
func NewBaseView(
concreteView View,
viewModel ViewModel,
) *BaseView {
v := new(BaseView)
v.id = uuid.NewString()
v.concreteView = concreteView
v.ViewModel = viewModel
return v
}
func NewBaseViewWithScreen(
concreteView View,
viewModel ViewModel,
filesystem embed.FS,
screenName string,
localizer *i18n.Localizer,
assetLoader func(string) (fs.File, error),
) *BaseView {
v := NewBaseView(concreteView, viewModel)
var err error
v.ScreenHandler, err = NewScreenHandler(
filesystem,
screenName,
viewModel,
localizer,
assetLoader)
if err != nil {
LogWindowError(v, LoadScreen, err)
return nil
}
return v
}
// ID returns tie id of the view
func (v BaseView) ID() string {
return v.id
}
// SetID allows the user to specify the ID of the view
func (v *BaseView) SetID(id string) {
v.id = id
}
// Equals checks equality of two views by comparing their id
func (v BaseView) Equals(other View) bool {
return v.id == other.ID()
}
// Title returns the title of the view
func (v BaseView) Title() string {
return ""
}
// Initialize initializes the view
func (v *BaseView) Initialize() fyne.CanvasObject {
//LogWindowEvent(v, Initialize)
if err := v.ViewModel.Initialize(); err != nil {
LogWindowError(v, Initialize, err)
}
if v.ScreenHandler != nil && v.ScreenDefinition() != nil {
obj, err := v.ScreenDefinition().Initialize()
if err != nil {
LogWindowError(v, Initialize, err)
return nil
}
v.CanvasObject = obj
}
return v.CanvasObject
}
// Refresh is called when the view needs a full update
func (v *BaseView) Refresh() {
//LogWindowEvent(v, Refresh)
if v.CanvasObject != nil {
v.CanvasObject.Refresh()
}
}
// OnShow is called when the view becomes visible on the screen
func (v *BaseView) OnShow() {
//LogWindowEvent(v, OnShow)
}
func (v *BaseView) OnHide() {
//LogWindowEvent(v, OnHide)
}
func (v *BaseView) GetBinding(bindingName string) binding.DataItem {
return v.ViewModel.GetBinding(bindingName)
}
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)
}