136 lines
3.0 KiB
Go
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)
|
||
|
}
|