[fractal] attachment-dialog: Add method to use in an async context



commit acf9feaf96e5b816a21275bb4381d5c4b83f460d
Author: Kévin Commaille <zecakeh tedomum fr>
Date:   Sun Apr 24 16:40:40 2022 +0200

    attachment-dialog: Add method to use in an async context
    
    Part-of: <https://gitlab.gnome.org/GNOME/fractal/-/merge_requests/1085>

 .../content/room_history/attachment_dialog.rs      | 37 +++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)
---
diff --git a/src/session/content/room_history/attachment_dialog.rs 
b/src/session/content/room_history/attachment_dialog.rs
index 6168aeee9..db63a3653 100644
--- a/src/session/content/room_history/attachment_dialog.rs
+++ b/src/session/content/room_history/attachment_dialog.rs
@@ -1,4 +1,6 @@
-use gtk::{gdk, gio, glib, prelude::*, subclass::prelude::*, CompositeTemplate};
+use std::cell::Cell;
+
+use gtk::{gdk, gio, glib, glib::clone, prelude::*, subclass::prelude::*, CompositeTemplate};
 use once_cell::sync::Lazy;
 
 use crate::components::MediaContentViewer;
@@ -9,6 +11,7 @@ mod imp {
     #[derive(Debug, Default, CompositeTemplate)]
     #[template(resource = "/org/gnome/Fractal/attachment-dialog.ui")]
     pub struct AttachmentDialog {
+        pub send: Cell<bool>,
         #[template_child]
         pub media: TemplateChild<MediaContentViewer>,
     }
@@ -23,6 +26,7 @@ mod imp {
             Self::bind_template(klass);
 
             klass.install_action("attachment-dialog.send", None, move |window, _, _| {
+                window.imp().send.set(true);
                 window.emit_by_name::<()>("send", &[]);
                 window.close();
             });
@@ -68,4 +72,35 @@ impl AttachmentDialog {
         obj.imp().media.view_file(file.to_owned());
         obj
     }
+
+    /// Show the dialog asynchronously.
+    ///
+    /// Returns `gtk::ResponseType::Ok` if the user clicked on send, otherwise
+    /// returns `gtk::ResponseType::Cancel`.
+    pub async fn run_future(&self) -> gtk::ResponseType {
+        let (sender, receiver) = futures::channel::oneshot::channel();
+        let sender = Cell::new(Some(sender));
+
+        let handler_id = self.connect_close_request(
+            clone!(@weak self as obj => @default-return gtk::Inhibit(false), move |_| {
+                if let Some(sender) = sender.take() {
+                    let response = if obj.imp().send.get() {
+                        gtk::ResponseType::Ok
+                    } else {
+                        gtk::ResponseType::Cancel
+                    };
+
+                    sender.send(response).unwrap();
+                }
+                gtk::Inhibit(false)
+            }),
+        );
+
+        self.show();
+        let res = receiver.await.unwrap();
+
+        self.disconnect(handler_id);
+
+        res
+    }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]