diff --git a/data/resources/ui/providers_dialog.ui b/data/resources/ui/providers_dialog.ui index 864f925..5545ae4 100644 --- a/data/resources/ui/providers_dialog.ui +++ b/data/resources/ui/providers_dialog.ui @@ -47,7 +47,11 @@ search - + + + + + @@ -58,6 +62,7 @@ True system-search-symbolic Search + @@ -155,7 +161,11 @@ provider - + + + + + diff --git a/src/widgets/providers/dialog.rs b/src/widgets/providers/dialog.rs index df699c3..cf62ab3 100644 --- a/src/widgets/providers/dialog.rs +++ b/src/widgets/providers/dialog.rs @@ -54,6 +54,8 @@ mod imp { fn class_init(klass: &mut Self::Class) { klass.bind_template(); + klass.bind_template_instance_callbacks(); + klass.install_action("providers.back", None, move |dialog, _, _| { dialog.set_view(View::List); }); @@ -95,6 +97,7 @@ glib::wrapper! { @extends gtk::Widget, gtk::Window, adw::Window; } +#[gtk::template_callbacks] impl ProvidersDialog { pub fn new(model: ProvidersModel) -> Self { let dialog = @@ -106,43 +109,16 @@ impl ProvidersDialog { fn setup_widget(&self, model: ProvidersModel) { let imp = self.imp(); - imp.filter_model.set_model(Some(&model)); - - let stack = &*imp.search_stack; - imp.filter_model - .connect_items_changed(clone!(@weak stack => move |model, _, _, _| { + imp.filter_model.connect_items_changed( + clone!(@weak self as dialog => move |model, _, _, _| { if model.n_items() == 0 { - stack.set_visible_child_name("no-results"); + dialog.imp().search_stack.set_visible_child_name("no-results"); } else { - stack.set_visible_child_name("results"); + dialog.imp().search_stack.set_visible_child_name("results"); } - })); - - let search_entry = &*imp.search_entry; - search_entry.connect_search_changed(clone!(@weak self as dialog => move |entry| { - let text = entry.text().to_string(); - dialog.search(text); - })); - - let search_btn = &*imp.search_btn; - search_entry.connect_search_started(clone!(@weak search_btn => move |_| { - search_btn.set_active(true); - })); - search_entry.connect_stop_search(clone!(@weak search_btn => move |_| { - search_btn.set_active(false); - })); - - let title_stack = &*imp.title_stack; - search_btn.connect_toggled(clone!(@weak title_stack, @weak search_entry => move |btn| { - if btn.is_active() { - title_stack.set_visible_child_name("search"); - search_entry.grab_focus(); - } else { - search_entry.set_text(""); - title_stack.set_visible_child_name("title"); - } - })); + }), + ); let sorter = ProviderSorter::default(); let sort_model = gtk::SortListModel::new(Some(&imp.filter_model), Some(&sorter)); @@ -156,51 +132,6 @@ impl ProvidersDialog { row.upcast::() }); - imp.providers_list.connect_row_activated( - clone!(@weak self as dialog => move |_list, row| { - let row = row.downcast_ref::().unwrap(); - let provider = row.provider(); - dialog.edit_provider(provider); - }), - ); - - imp.page.connect_local( - "created", - false, - clone!(@weak model, @weak self as dialog => @default-return None, move |args| { - let provider = args[1].get::().unwrap(); - model.append(&provider); - dialog.emit_by_name::<()>("changed", &[]); - dialog.imp().toast_overlay.add_toast(&adw::Toast::new(&gettext("Provider created successfully"))); - dialog.set_view(View::Placeholder); - None - }), - ); - - imp.page.connect_local( - "updated", - false, - clone!(@weak self as dialog => @default-return None, move |_| { - dialog.set_view(View::List); - dialog.emit_by_name::<()>("changed", &[]); - dialog.imp().toast_overlay.add_toast(&adw::Toast::new(&gettext("Provider updated successfully"))); - None - }), - ); - - imp.page.connect_local( - "deleted", - false, - clone!(@weak model, @weak self as dialog => @default-return None, move |args| { - let provider = args[1].get::().unwrap(); - model.delete_provider(&provider); - dialog.set_view(View::Placeholder); - dialog.emit_by_name::<()>("changed", &[]); - dialog.imp().toast_overlay.add_toast(&adw::Toast::new(&gettext("Provider removed successfully"))); - None - }), - ); - imp.deck .bind_property("folded", &*imp.page.imp().revealer, "reveal-child") .flags(glib::BindingFlags::SYNC_CREATE) @@ -252,6 +183,81 @@ impl ProvidersDialog { } } } + + #[template_callback] + fn on_search_changed(&self, entry: >k::SearchEntry) { + let text = entry.text().to_string(); + self.search(text); + } + + #[template_callback] + fn on_search_started(&self, _entry: >k::SearchEntry) { + self.imp().search_btn.set_active(true); + } + #[template_callback] + fn on_search_stopped(&self, _entry: >k::SearchEntry) { + self.imp().search_btn.set_active(false); + } + + #[template_callback] + fn on_search_btn_toggled(&self, btn: >k::ToggleButton) { + let imp = self.imp(); + if btn.is_active() { + imp.title_stack.set_visible_child_name("search"); + imp.search_entry.grab_focus(); + } else { + imp.search_entry.set_text(""); + imp.title_stack.set_visible_child_name("title"); + } + } + #[template_callback] + fn on_row_activated(&self, row: ProviderActionRow, _list: gtk::ListBox) { + let provider = row.provider(); + self.edit_provider(provider); + } + + #[template_callback] + fn on_provider_created(&self, provider: Provider, _page: ProviderPage) { + let model = self + .imp() + .filter_model + .model() + .unwrap() + .downcast::() + .unwrap(); + model.append(&provider); + self.emit_by_name::<()>("changed", &[]); + self.imp() + .toast_overlay + .add_toast(&adw::Toast::new(&gettext("Provider created successfully"))); + self.set_view(View::Placeholder); + } + + #[template_callback] + fn on_provider_updated(&self, _provider: Provider, _page: ProviderPage) { + self.set_view(View::List); + self.emit_by_name::<()>("changed", &[]); + self.imp() + .toast_overlay + .add_toast(&adw::Toast::new(&gettext("Provider updated successfully"))); + } + + #[template_callback] + fn on_provider_deleted(&self, provider: Provider, _page: ProviderPage) { + let model = self + .imp() + .filter_model + .model() + .unwrap() + .downcast::() + .unwrap(); + model.delete_provider(&provider); + self.set_view(View::Placeholder); + self.emit_by_name::<()>("changed", &[]); + self.imp() + .toast_overlay + .add_toast(&adw::Toast::new(&gettext("Provider removed successfully"))); + } } mod row {