dreamfactory_cmd/cmd/v2/ui/app_container.go
2023-06-09 21:58:02 +08:00

113 lines
2.2 KiB
Go

package ui
import (
"go_dreamfactory/cmd/v2/service"
"go_dreamfactory/cmd/v2/service/observer"
"fyne.io/fyne/v2/container"
)
type appContainer struct {
appStatusMap map[string]appStatus
container.DocTabs
obs observer.Observer
ai []appInterface
service service.PttService
}
func newAppContainer(ai []appInterface, service service.PttService, obs observer.Observer) *appContainer {
at := &appContainer{ai: ai, service: service, obs: obs}
at.appStatusMap = make(map[string]appStatus)
at.CloseIntercept = at.closeHandle
at.SetTabLocation(container.TabLocationTop)
at.ExtendBaseWidget(at)
at.OnSelected = func(item *container.TabItem) {
item.Content.Refresh()
}
return at
}
type appStatus struct {
lazyInit bool
}
func (at *appContainer) closeHandle(tab *container.TabItem) {
for _, app := range at.ai {
if app.GetAppName() == tab.Text {
if app.OnClose() {
at.Remove(tab)
}
}
}
}
func (at *appContainer) openApp(app appInterface) error {
for _, appItem := range at.Items {
if appItem.Text == app.GetAppName() {
at.Select(appItem)
return nil
}
}
err := at.initApp(app)
if err != nil {
return err
}
tab := app.GetTabItem()
at.Append(tab)
at.Select(tab)
return nil
}
func (at *appContainer) openWelcome() (string, error) {
var firstTab *container.TabItem
app := &appWelcome{}
if err := at.initApp(app); err != nil {
return app.GetAppName(), err
}
tab := app.GetTabItem()
at.Append(tab)
if firstTab == nil {
firstTab = tab
}
if firstTab != nil {
at.Select(firstTab)
}
return "", nil
}
// open default app
func (at *appContainer) openDefaultApp(appName string) (string, error) {
var firstTab *container.TabItem
for _, app := range at.ai {
if app.OpenDefault() == appName {
if err := at.initApp(app); err != nil {
return app.GetAppName(), err
}
tab := app.GetTabItem()
at.Append(tab)
if firstTab == nil {
firstTab = tab
}
}
}
if firstTab != nil {
at.Select(firstTab)
}
return "", nil
}
func (at *appContainer) initApp(app appInterface) error {
st, ok := at.appStatusMap[app.GetAppName()]
if !ok || !st.lazyInit {
err := app.LazyInit(at.service, at.obs)
if err != nil {
return err
}
at.appStatusMap[app.GetAppName()] = appStatus{lazyInit: true}
}
return nil
}