[fractal] attachment-dialog: Add method to use in an async context
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] attachment-dialog: Add method to use in an async context
- Date: Wed, 27 Apr 2022 13:17:43 +0000 (UTC)
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]