133 lines
2.7 KiB
Go
133 lines
2.7 KiB
Go
package ui
|
|
|
|
import (
|
|
"embed"
|
|
|
|
"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 -------------//
|
|
*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,
|
|
controller Controller,
|
|
) *BaseView {
|
|
v := new(BaseView)
|
|
v.id = uuid.NewString()
|
|
v.concreteView = concreteView
|
|
v.Ctrl = controller
|
|
return v
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
// 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.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.Ctrl.GetBinding(bindingName)
|
|
}
|