package gioui import ( "context" "sync" "forge.cadoles.com/arcad/arcast/pkg/browser" "gioui.org/app" "gioui.org/f32" "gioui.org/layout" "github.com/gioui-plugins/gio-plugins/webviewer" "gitlab.com/wpetit/goweb/logger" ) type Browser struct { window *app.Window tag int url string changed bool status browser.Status title string mutex sync.Mutex } func (b *Browser) Layout(gtx layout.Context) { b.mutex.Lock() defer b.mutex.Unlock() events := gtx.Events(&b.tag) for _, evt := range events { switch ev := evt.(type) { case webviewer.TitleEvent: b.title = ev.Title case webviewer.NavigationEvent: b.url = ev.URL } } ctx := context.Background() logger.Debug(ctx, "drawing") webviewer.WebViewOp{Tag: &b.tag}.Push(gtx.Ops) webviewer.OffsetOp{Point: f32.Point{Y: float32(gtx.Constraints.Max.Y - gtx.Constraints.Max.Y)}}.Add(gtx.Ops) webviewer.RectOp{Size: f32.Point{X: float32(gtx.Constraints.Max.X), Y: float32(gtx.Constraints.Max.Y)}}.Add(gtx.Ops) if b.changed { logger.Debug(ctx, "url changed", logger.F("url", b.url)) webviewer.NavigateOp{URL: b.url}.Add(gtx.Ops) b.changed = false } } // Load implements browser.Browser. func (b *Browser) Load(url string) error { b.mutex.Lock() defer b.mutex.Unlock() b.url = url b.changed = true b.status = browser.StatusCasting b.window.Invalidate() return nil } // Status implements browser.Browser. func (b *Browser) Status() (browser.Status, error) { b.mutex.Lock() defer b.mutex.Unlock() return b.status, nil } // Title implements browser.Browser. func (b *Browser) Title() (string, error) { b.mutex.Lock() defer b.mutex.Unlock() return b.title, nil } // URL implements browser.Browser. func (b *Browser) URL() (string, error) { b.mutex.Lock() defer b.mutex.Unlock() return b.url, nil } // Reset implements browser.Browser. func (b *Browser) Reset(url string) error { b.mutex.Lock() defer b.mutex.Unlock() b.url = url b.changed = true b.status = browser.StatusIdle b.window.Invalidate() return nil } func NewBrowser(window *app.Window) *Browser { return &Browser{ window: window, url: "", changed: true, status: browser.StatusIdle, } } var _ browser.Browser = &Browser{}