diff --git a/data/icons/paper-plane-symbolic.svg b/data/icons/paper-plane-symbolic.svg new file mode 100644 index 0000000..d62ac49 --- /dev/null +++ b/data/icons/paper-plane-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/data/resources/resources.gresource.xml b/data/resources/resources.gresource.xml index 651be08..dff7bdd 100644 --- a/data/resources/resources.gresource.xml +++ b/data/resources/resources.gresource.xml @@ -10,5 +10,6 @@ ../icons/dice3-symbolic.svg + ../icons/paper-plane-symbolic.svg diff --git a/data/resources/ui/window.blp b/data/resources/ui/window.blp index 2264e09..a0cd37d 100644 --- a/data/resources/ui/window.blp +++ b/data/resources/ui/window.blp @@ -132,8 +132,19 @@ template $NotifyWindow : Adw.ApplicationWindow { margin-start: 8; margin-end: 8; Adw.Clamp { - Entry entry { - placeholder-text: "Message..."; + Gtk.Box { + spacing: 8; + Entry entry { + placeholder-text: "Message..."; + hexpand: true; + } + Gtk.Button send_btn { + styles [ + "circular", + "suggested-action" + ] + icon-name: "paper-plane-symbolic"; + } } } } diff --git a/src/widgets/add_subscription_dialog.rs b/src/widgets/add_subscription_dialog.rs index 375bf8e..1bdfb67 100644 --- a/src/widgets/add_subscription_dialog.rs +++ b/src/widgets/add_subscription_dialog.rs @@ -126,6 +126,7 @@ impl AddSubscriptionDialog { add_css_class: "suggested-action", add_css_class: "pill", set_halign: gtk::Align::Center, + set_sensitive: false, connect_clicked[obj] => move |_| { obj.emit_subscribe_request(); obj.close(); diff --git a/src/widgets/window.rs b/src/widgets/window.rs index 8fbdd64..b042923 100644 --- a/src/widgets/window.rs +++ b/src/widgets/window.rs @@ -72,6 +72,8 @@ mod imp { pub message_scroll: TemplateChild, #[template_child] pub banner: TemplateChild, + #[template_child] + pub send_btn: TemplateChild, pub notifier: OnceCell, pub conn: OnceCell, pub settings: gio::Settings, @@ -81,24 +83,25 @@ mod imp { impl Default for NotifyWindow { fn default() -> Self { let this = Self { - headerbar: TemplateChild::default(), - message_list: TemplateChild::default(), - entry: TemplateChild::default(), - subscription_view: TemplateChild::default(), - navigation_split_view: TemplateChild::default(), - subscription_menu_btn: TemplateChild::default(), - subscription_list: TemplateChild::default(), - toast_overlay: TemplateChild::default(), - stack: TemplateChild::default(), - welcome_view: TemplateChild::default(), - list_view: TemplateChild::default(), - message_scroll: TemplateChild::default(), - banner: TemplateChild::default(), + headerbar: Default::default(), + message_list: Default::default(), + entry: Default::default(), + subscription_view: Default::default(), + navigation_split_view: Default::default(), + subscription_menu_btn: Default::default(), + subscription_list: Default::default(), + toast_overlay: Default::default(), + stack: Default::default(), + welcome_view: Default::default(), + list_view: Default::default(), + message_scroll: Default::default(), + banner: Default::default(), subscription_list_model: gio::ListStore::new::(), settings: gio::Settings::new(APP_ID), - notifier: OnceCell::new(), - conn: OnceCell::new(), - banner_binding: Cell::new(None), + notifier: Default::default(), + conn: Default::default(), + banner_binding: Default::default(), + send_btn: Default::default(), }; this @@ -139,7 +142,6 @@ mod imp { this.show_subscription_info(); }); klass.install_action("win.clear-notifications", None, |this, _, _| { - /*spawn_local(this.subscription().clear_notifications().map_err(this.near_toast_overlay().error_handler()));*/ this.selected_subscription().map(|sub| { this.spawn_with_near_toast(sub.clear_notifications()); }); @@ -203,23 +205,27 @@ impl NotifyWindow { // Load latest window state obj.load_window_size(); obj.bind_message_list(); - obj.connect_entry_changed(); + obj.connect_entry_and_send_btn(); obj.connect_items_changed(); obj.selected_subscription_changed(None); obj.bind_flag_read(); obj } - fn connect_entry_changed(&self) { + fn connect_entry_and_send_btn(&self) { let imp = self.imp(); let this = self.clone(); - imp.entry.connect_activate(move |entry| { + let entry = imp.entry.clone(); + let publish = move || { let p = this .selected_subscription() .unwrap() .publish(entry.text().as_str()); entry.spawn_with_near_toast(async move { p.await }); - }); + }; + let publishc = publish.clone(); + imp.entry.connect_activate(move |_| publishc()); + imp.send_btn.connect_clicked(move |_| publish()); } fn show_subscription_info(&self) { let sub = SubscriptionInfoDialog::new(self.selected_subscription().unwrap());