ui/baseview.go
Maarten Heremans 864255113c Initial Commit
2024-03-30 17:45:07 +01:00

136 lines
3.0 KiB
Go

package ui
import (
"time"
"bitbucket.org/hevanto/ui/screen"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/widget"
"github.com/google/uuid"
"github.com/nicksnyder/go-i18n/v2/i18n"
)
// 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
Ctrl Controller
// Root CanvasObject of the view
CanvasObject fyne.CanvasObject
// The screen definition
screenDefinition *screen.Screen
// ----------- ScreenHandler -------------//
// Localizer to translate screen labels
localizer *i18n.Localizer
// Map of screen elements that got an id assigned
screenElementMap map[string]fyne.CanvasObject
// Map of list item template
listItemTemplates map[string]func() fyne.CanvasObject
// Map of list data item renderers
listDataItemRenderers map[string]func(binding.DataItem, fyne.CanvasObject)
// Map of list item renderers
listItemRenderers map[string]func(int, fyne.CanvasObject)
// Map of list length functions
listLenghts map[string]func() int
// Handlers
onSelectedHandlers map[string]func(widget.ListItemID)
onUnselectedHandlers map[string]func(widget.ListItemID)
onClickedHandlers map[string]func()
onCheckChangedHandlers map[string]func(bool)
onDateSelectedHandlers map[string]func(time.Time)
}
// 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,
controller Controller,
) *BaseView {
v := new(BaseView)
v.id = uuid.NewString()
v.concreteView = concreteView
v.Ctrl = controller
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.Ctrl.Initialize(); err != nil {
LogWindowError(v, Initialize, err)
}
if 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)
}