From 744f59cf3871f41d48d14c595205d81ae29ea2e3 Mon Sep 17 00:00:00 2001 From: diamondburned Date: Wed, 30 Dec 2020 00:31:03 -0800 Subject: [PATCH] (maybe) fix attachment dialog --- internal/gts/gts.go | 73 +++++++++++++++++++++++++++--------- internal/ui/messages/view.go | 3 -- internal/ui/ui.go | 6 +++ 3 files changed, 62 insertions(+), 20 deletions(-) diff --git a/internal/gts/gts.go b/internal/gts/gts.go index a6d5b48..a5d0ead 100644 --- a/internal/gts/gts.go +++ b/internal/gts/gts.go @@ -1,6 +1,7 @@ package gts import ( + "io" "os" "time" @@ -216,8 +217,7 @@ func SpawnUploader(dirpath string, callback func(absolutePaths []string)) { "Upload", "Cancel", ) - App.Throttler.Connect(dialog) - BindPreviewer(dialog) + // BindPreviewer(dialog) if dirpath == "" { p, err := os.Getwd() @@ -231,7 +231,10 @@ func SpawnUploader(dirpath string, callback func(absolutePaths []string)) { dialog.SetCurrentFolder(dirpath) dialog.SetSelectMultiple(true) - if res := dialog.Run(); res != int(gtk.RESPONSE_ACCEPT) { + res := dialog.Run() + dialog.Destroy() + + if res != int(gtk.RESPONSE_ACCEPT) { return } @@ -244,18 +247,54 @@ func BindPreviewer(fc *gtk.FileChooserNativeDialog) { img, _ := gtk.ImageNew() fc.SetPreviewWidget(img) - fc.Connect("update-preview", - func(fc *gtk.FileChooserNativeDialog) { - file := fc.GetPreviewFilename() - - b, err := gdk.PixbufNewFromFileAtScale(file, 256, 256, true) - if err != nil { - fc.SetPreviewWidgetActive(false) - return - } - - img.SetFromPixbuf(b) - fc.SetPreviewWidgetActive(true) - }, - ) + fc.Connect("update-preview", func(interface{}) { loadImage(fc, img) }) +} + +func loadImage(fc *gtk.FileChooserNativeDialog, img *gtk.Image) { + file := fc.GetPreviewFilename() + + go func() { + var animation *gdk.PixbufAnimation + var pixbuf *gdk.Pixbuf + + defer ExecAsync(func() { + if fc.GetPreviewFilename() == file { + if animation == nil && pixbuf == nil { + fc.SetPreviewWidgetActive(false) + return + } + + if animation != nil { + img.SetFromAnimation(animation) + } else { + img.SetFromPixbuf(pixbuf) + } + + fc.SetPreviewWidgetActive(true) + } + }) + + l, err := gdk.PixbufLoaderNew() + if err != nil { + return + } + + f, err := os.Open(file) + if err != nil { + return + } + defer f.Close() + + if _, err := io.Copy(l, f); err != nil { + return + } + + if err := l.Close(); err != nil { + return + } + + if pixbuf == nil { + return + } + }() } diff --git a/internal/ui/messages/view.go b/internal/ui/messages/view.go index 0d70ba6..5b7c26c 100644 --- a/internal/ui/messages/view.go +++ b/internal/ui/messages/view.go @@ -254,9 +254,6 @@ func (v *View) SetFolded(folded bool) { // Change to a mini breadcrumb if we're collapsed. v.Header.SetMiniBreadcrumb(folded) - // Show the right back button if we're collapsed. - v.Header.SetShowBackButton(folded) - // Hide the username in the input bar if we're collapsed. v.InputView.Username.SetRevealChild(!folded) diff --git a/internal/ui/ui.go b/internal/ui/ui.go index 32f47ef..f6517a0 100644 --- a/internal/ui/ui.go +++ b/internal/ui/ui.go @@ -7,6 +7,7 @@ import ( "github.com/diamondburned/cchat-gtk/internal/log" "github.com/diamondburned/cchat-gtk/internal/ui/config/preferences" "github.com/diamondburned/cchat-gtk/internal/ui/messages" + "github.com/diamondburned/cchat-gtk/internal/ui/primitives" "github.com/diamondburned/cchat-gtk/internal/ui/service" "github.com/diamondburned/cchat-gtk/internal/ui/service/auth" "github.com/diamondburned/cchat-gtk/internal/ui/service/session" @@ -115,6 +116,11 @@ func NewApplication() *App { } }) + // We'd still want to control the visibility of the back button when we + // fold, however. + primitives.LeafletOnFold(&app.Leaflet, + app.MessageView.Header.SetShowBackButton) + return app }