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) }