mirror of
https://gitlab.gnome.org/World/Authenticator.git
synced 2025-03-04 08:44:40 +01:00
provider/dialog: Make use of template callbacks
This commit is contained in:
parent
b51a702e04
commit
853d1f1281
2 changed files with 96 additions and 80 deletions
|
@ -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>
|
||||
|
|
|
@ -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: >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::<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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue