provider/dialog: Make use of template callbacks

This commit is contained in:
Bilal Elmoussaoui 2022-06-11 14:12:35 +02:00
parent b51a702e04
commit 853d1f1281
2 changed files with 96 additions and 80 deletions

View file

@ -47,7 +47,11 @@
<object class="GtkStackPage">
<property name="name">search</property>
<property name="child">
<object class="GtkSearchEntry" id="search_entry" />
<object class="GtkSearchEntry" id="search_entry">
<signal name="search-started" handler="on_search_started" swapped="true" />
<signal name="stop-search" handler="on_search_stopped" swapped="true" />
<signal name="search-changed" handler="on_search_changed" swapped="true" />
</object>
</property>
</object>
</child>
@ -58,6 +62,7 @@
<property name="receives-default">True</property>
<property name="icon-name">system-search-symbolic</property>
<property name="tooltip-text" translatable="yes">Search</property>
<signal name="toggled" handler="on_search_btn_toggled" swapped="true" />
</object>
</child>
<style>
@ -82,6 +87,7 @@
<property name="vexpand">true</property>
<property name="activate-on-single-click">True</property>
<property name="selection-mode">browse</property>
<signal name="row-activated" handler="on_row_activated" swapped="true" />
<style>
<class name="navigation-sidebar" />
</style>
@ -155,7 +161,11 @@
<object class="GtkStackPage">
<property name="name">provider</property>
<property name="child">
<object class="ProviderPage" id="page" />
<object class="ProviderPage" id="page">
<signal name="created" handler="on_provider_created" swapped="true" />
<signal name="updated" handler="on_provider_updated" swapped="true" />
<signal name="deleted" handler="on_provider_deleted" swapped="true" />
</object>
</property>
</object>
</child>

View file

@ -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::<gtk::Widget>()
});
imp.providers_list.connect_row_activated(
clone!(@weak self as dialog => move |_list, row| {
let row = row.downcast_ref::<ProviderActionRow>().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::<Provider>().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::<Provider>().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: &gtk::SearchEntry) {
let text = entry.text().to_string();
self.search(text);
}
#[template_callback]
fn on_search_started(&self, _entry: &gtk::SearchEntry) {
self.imp().search_btn.set_active(true);
}
#[template_callback]
fn on_search_stopped(&self, _entry: &gtk::SearchEntry) {
self.imp().search_btn.set_active(false);
}
#[template_callback]
fn on_search_btn_toggled(&self, btn: &gtk::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::<ProvidersModel>()
.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::<ProvidersModel>()
.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 {