ui/baseview.go

133 lines
2.7 KiB
Go
Raw Normal View History

2024-03-30 17:45:07 +01:00
package ui
import (
2024-04-03 16:07:24 +02:00
"embed"
2024-03-30 17:45:07 +01:00
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/data/binding"
"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
// ----------- ScreenHandler -------------//
2024-04-03 16:07:24 +02:00
*ScreenHandler
2024-03-30 17:45:07 +01:00
}
// 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
}
2024-04-03 16:07:24 +02:00
func NewBaseViewWithScreen(
concreteView View,
controller Controller,
filesystem embed.FS,
screenName string,
localizer *i18n.Localizer,
) *BaseView {
v := NewBaseView(concreteView, controller)
var err error
v.ScreenHandler, err = NewScreenHandler(
filesystem,
screenName,
controller,
localizer)
if err != nil {
LogWindowError(v, LoadScreen, err)
return nil
}
return v
}
2024-03-30 17:45:07 +01:00
// 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)
}
2024-04-03 16:07:24 +02:00
if v.ScreenHandler != nil && v.ScreenDefinition() != nil {
obj, err := v.ScreenDefinition().Initialize()
2024-03-30 17:45:07 +01:00
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)
}
2024-04-03 16:07:24 +02:00
func (v *BaseView) GetBinding(bindingName string) binding.DataItem {
return v.Ctrl.GetBinding(bindingName)
}