diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f8bc40..cc39ceb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,3 +4,4 @@ Changes: - Autofocus on new tab input - Add tab when pressing enter instead of click - Fix tab removal not saving +- (Broken) Emote menu for 7tv emotes diff --git a/components/emote_gif.go b/components/emote_gif.go index 72fced5..06db8b1 100644 --- a/components/emote_gif.go +++ b/components/emote_gif.go @@ -165,6 +165,12 @@ func (g *EmoteGif) SetMinSize(min fyne.Size) { func (g *EmoteGif) draw(dst draw.Image, index int) { defer g.dst.Refresh() + if g.src == nil || g.src.Image == nil || len(g.src.Image) == 0 { + return + } + if g.dst == nil || g.dst.Image == nil { + return + } if index == 0 { // first frame draw.Draw(dst, g.dst.Image.Bounds(), g.src.Image[index], image.Point{}, draw.Src) @@ -203,17 +209,26 @@ func (g *EmoteGif) Start() { if g.isRunning() { return } - g.runLock.Lock() - if g.lazyLoad { + if g.lazyLoad && g.src == nil { res, err := tempFileResource(g.emote) if err != nil { - panic(err) + log.Println("Error loading lazy gif", err) + g.LoadResource(emptyImageResource) + } else { + err = g.LoadResource(res) + if err != nil { + log.Println("Error loading lazy gif", err) + g.LoadResource(emptyImageResource) + } } - g.LoadResource(res) } + g.runLock.Lock() g.running = true g.runLock.Unlock() + if g.dst.Image == nil || g.src.Image == nil { + return + } buffer := image.NewNRGBA(g.dst.Image.Bounds()) g.draw(buffer, 0) diff --git a/fyne_ui.go b/fyne_ui.go index 79cbcb5..e1271e3 100644 --- a/fyne_ui.go +++ b/fyne_ui.go @@ -347,8 +347,12 @@ func NewChatTab( defer wg.Done() for _, emote := range emoteSlice { + if !emote.Animated { // TODO: remove + continue + } imgCanvas, err := components.NewEmoteGif(emote, func(text string) error { - msgEntry.SetText(text + msgEntry.Text + " ") + msgEntry.SetText(msgEntry.Text + text + " ") + newWindow.Close() return nil }, true) if err != nil { @@ -363,9 +367,28 @@ func NewChatTab( } wg.Wait() grid := container.NewGridWrap(defaultEmoteSize, images...) + stvScroll := container.NewScroll(grid) + stvScroll.OnScrolled = func(scrollOffset fyne.Position) { + for _, comp := range images { + go func(comp fyne.CanvasObject) { + w := comp.(*components.EmoteGif) + scrollSize := stvScroll.Size() + widgetPos := w.Position() + widgetSize := w.Size() + isVisible := widgetPos.Y+widgetSize.Height > scrollOffset.Y && + widgetPos.Y < scrollOffset.Y+scrollSize.Height + if isVisible { + w.Start() + } else { + w.Stop() + } + }(comp) + } + } + accordion := widget.NewAccordion( widget.NewAccordionItem("Twitch Emotes", widget.NewLabel("Not implemented")), - widget.NewAccordionItem("7TV Emotes"+strings.Repeat(" ", 80), container.NewScroll(grid)), + widget.NewAccordionItem("7TV Emotes"+strings.Repeat(" ", 80), stvScroll), widget.NewAccordionItem("FFZ Emotes", widget.NewLabel("Not implemented")), widget.NewAccordionItem("BTTV Emotes", widget.NewLabel("Not implemented")), widget.NewAccordionItem("Emoji", widget.NewLabel("Not implemented")),