113 lines
2.2 KiB
Go
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
|
|
}
|