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

84 lines
1.5 KiB
Go

package ui
import (
"go_dreamfactory/cmd/v2/lib/storage"
"go_dreamfactory/cmd/v2/service"
"go_dreamfactory/cmd/v2/service/observer"
"go_dreamfactory/cmd/v2/theme"
"os"
"sync"
"fyne.io/fyne/v2"
"github.com/BabySid/gobase"
"github.com/sirupsen/logrus"
)
var uid string
type UI interface {
AddWindow(name string, w fyne.Window)
Run()
Stop()
}
type UIImpl struct {
app fyne.App
windows map[string]fyne.Window
winMux *sync.Mutex
connService service.ConnService
pttService service.PttService
obs observer.Observer
storage storage.Storage
config *storage.Config
}
func NewUI(app fyne.App,
connService service.ConnService,
pttService service.PttService,
obs observer.Observer,
) (*UIImpl, error) {
app.Settings().SetTheme(&theme.MyTheme{})
iStorage, err := storage.NewOSStorage()
if err != nil {
logrus.Errorf("new storage err:%v", err)
return nil, err
}
// 加载配置
config, err := iStorage.LoadConfig()
if err != nil {
logrus.Errorf("Load config err:%v", err)
return nil, err
}
return &UIImpl{
app: app,
windows: make(map[string]fyne.Window),
winMux: &sync.Mutex{},
connService: connService,
pttService: pttService,
obs: obs,
storage: iStorage,
config: config,
}, nil
}
func (ui *UIImpl) AddWindow(name string, w fyne.Window) {
ui.winMux.Lock()
defer ui.winMux.Unlock()
ui.windows[name] = w
}
func (ui *UIImpl) Run() {
defer func() {
_ = os.Unsetenv("FYNE_SCALE")
gobase.Exit()
}()
ui.app.Run()
}
func (ui *UIImpl) Stop() {
ui.app.Quit()
}