Merge branch 'wip/cdavis/remove-get' into 'master'

Update gtk-rs deps and template usage

See merge request World/Authenticator!169
This commit is contained in:
Bilal Elmoussaoui 2021-01-14 21:36:24 +00:00
commit edd2553b33
12 changed files with 193 additions and 226 deletions

51
Cargo.lock generated
View file

@ -377,7 +377,7 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
[[package]]
name = "cairo-rs"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"bitflags",
"cairo-sys-rs",
@ -390,7 +390,7 @@ dependencies = [
[[package]]
name = "cairo-sys-rs"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"glib-sys",
"libc",
@ -941,7 +941,7 @@ dependencies = [
[[package]]
name = "gdk-pixbuf"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"gdk-pixbuf-sys",
"gio",
@ -952,7 +952,7 @@ dependencies = [
[[package]]
name = "gdk-pixbuf-sys"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"gio-sys",
"glib-sys",
@ -964,7 +964,7 @@ dependencies = [
[[package]]
name = "gdk4"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"bitflags",
"cairo-rs",
@ -979,7 +979,7 @@ dependencies = [
[[package]]
name = "gdk4-sys"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@ -994,7 +994,7 @@ dependencies = [
[[package]]
name = "gdk4-wayland"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"gdk4",
"gdk4-wayland-sys",
@ -1007,7 +1007,7 @@ dependencies = [
[[package]]
name = "gdk4-wayland-sys"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"glib-sys",
"libc",
@ -1017,7 +1017,7 @@ dependencies = [
[[package]]
name = "gdk4-x11"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"gdk4",
"gdk4-x11-sys",
@ -1030,7 +1030,7 @@ dependencies = [
[[package]]
name = "gdk4-x11-sys"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"gdk4-sys",
"glib-sys",
@ -1102,7 +1102,7 @@ dependencies = [
[[package]]
name = "gio"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"bitflags",
"futures-channel",
@ -1118,7 +1118,7 @@ dependencies = [
[[package]]
name = "gio-sys"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"glib-sys",
"gobject-sys",
@ -1130,7 +1130,7 @@ dependencies = [
[[package]]
name = "glib"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"bitflags",
"futures-channel",
@ -1148,7 +1148,7 @@ dependencies = [
[[package]]
name = "glib-macros"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"anyhow",
"heck",
@ -1163,7 +1163,7 @@ dependencies = [
[[package]]
name = "glib-sys"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"libc",
"system-deps",
@ -1185,7 +1185,7 @@ dependencies = [
[[package]]
name = "gobject-sys"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"glib-sys",
"libc",
@ -1195,7 +1195,7 @@ dependencies = [
[[package]]
name = "graphene-rs"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"glib",
"graphene-sys",
@ -1205,7 +1205,7 @@ dependencies = [
[[package]]
name = "graphene-sys"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"glib-sys",
"libc",
@ -1216,7 +1216,7 @@ dependencies = [
[[package]]
name = "gsk4"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"bitflags",
"cairo-rs",
@ -1231,7 +1231,7 @@ dependencies = [
[[package]]
name = "gsk4-sys"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"cairo-sys-rs",
"gdk4-sys",
@ -1252,11 +1252,12 @@ checksum = "1874c48e670519ce192093ac906c08a6dde7cb2d18b28722ef237726a39c3a63"
[[package]]
name = "gtk4"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"bitflags",
"cairo-rs",
"field-offset",
"futures-channel",
"gdk-pixbuf",
"gdk4",
"gio",
@ -1273,7 +1274,7 @@ dependencies = [
[[package]]
name = "gtk4-macros"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"anyhow",
"heck",
@ -1288,7 +1289,7 @@ dependencies = [
[[package]]
name = "gtk4-sys"
version = "0.1.0"
source = "git+https://github.com/gtk-rs/gtk4-rs#397e7f9d6ea62b325e9e707dc76cd602a00e006e"
source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@ -1910,7 +1911,7 @@ dependencies = [
[[package]]
name = "pango"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"bitflags",
"glib",
@ -1922,7 +1923,7 @@ dependencies = [
[[package]]
name = "pango-sys"
version = "0.13.0"
source = "git+https://github.com/gtk-rs/gtk-rs#0fc0f84f0e237689b8c051249539a0214c6f3d53"
source = "git+https://github.com/gtk-rs/gtk-rs#e70aacff8ae34a7b5b57f9955490fa81f08e513c"
dependencies = [
"glib-sys",
"gobject-sys",

View file

@ -6,7 +6,7 @@ use crate::{
use anyhow::Result;
use glib::{clone, signal::Inhibit};
use gtk::subclass::prelude::*;
use gtk::{gio, glib, prelude::*, CompositeTemplate};
use gtk::{gdk, gio, glib, prelude::*, CompositeTemplate};
use gtk_macros::{action, get_action};
use once_cell::sync::OnceCell;
@ -90,14 +90,13 @@ mod imp {
Self::bind_template_children(klass);
klass.add_signal("added", glib::SignalFlags::ACTION, &[], glib::Type::Unit);
}
}
impl ObjectImpl for AccountAddDialog {
fn constructed(&self, obj: &Self::Type) {
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
self.parent_constructed(obj);
}
}
impl ObjectImpl for AccountAddDialog {}
impl WidgetImpl for AccountAddDialog {}
impl WindowImpl for AccountAddDialog {}
impl libhandy::subclass::window::WindowImpl for AccountAddDialog {}
@ -121,8 +120,8 @@ impl AccountAddDialog {
fn validate(&self) {
let self_ = imp::AccountAddDialog::from_instance(self);
let username = self_.username_entry.get().get_text().unwrap();
let token = self_.token_entry.get().get_text().unwrap();
let username = self_.username_entry.get_text().unwrap();
let token = self_.token_entry.get_text().unwrap();
let is_valid = !(username.is_empty() || token.is_empty());
get_action!(self_.actions, @save).set_enabled(is_valid);
@ -133,17 +132,15 @@ impl AccountAddDialog {
self_
.username_entry
.get()
.connect_changed(clone!(@weak self as win => move |_| win.validate()));
self_
.token_entry
.get()
.connect_changed(clone!(@weak self as win => move |_| win.validate()));
let event_controller = gtk::EventControllerKey::new();
event_controller.connect_key_pressed(
clone!(@weak self as widget => @default-return Inhibit(false), move |_, k, _, _| {
if k == 65307 {
if k == gdk::keys::Key::from_name("Escape") {
widget.close();
}
Inhibit(false)
@ -167,8 +164,8 @@ impl AccountAddDialog {
fn set_from_otp_uri(&self, otp_uri: OTPUri) {
let self_ = imp::AccountAddDialog::from_instance(self);
self_.token_entry.get().set_text(&otp_uri.secret);
self_.username_entry.get().set_text(&otp_uri.label);
self_.token_entry.set_text(&otp_uri.secret);
self_.username_entry.set_text(&otp_uri.label);
let provider = self_
.model
@ -192,8 +189,8 @@ impl AccountAddDialog {
let self_ = imp::AccountAddDialog::from_instance(self);
if let Some(ref provider) = *self_.selected_provider.borrow() {
let username = self_.username_entry.get().get_text().unwrap();
let token = self_.token_entry.get().get_text().unwrap();
let username = self_.username_entry.get_text().unwrap();
let token = self_.token_entry.get_text().unwrap();
let account = Account::create(&username, &token, provider)?;
@ -206,47 +203,39 @@ impl AccountAddDialog {
fn set_provider(&self, provider: Provider) {
let self_ = imp::AccountAddDialog::from_instance(self);
self_.more_list.get().show();
self_.provider_entry.get().set_text(&provider.name());
self_
.period_label
.get()
.set_text(&provider.period().to_string());
self_.more_list.show();
self_.provider_entry.set_text(&provider.name());
self_.period_label.set_text(&provider.period().to_string());
self_.image.get().set_provider(&provider);
self_.image.set_provider(&provider);
self_
.method_label
.get()
.set_text(&provider.method().to_locale_string());
self_
.algorithm_label
.get()
.set_text(&provider.algorithm().to_locale_string());
self_
.digits_label
.get()
.set_text(&provider.digits().to_string());
self_.digits_label.set_text(&provider.digits().to_string());
match provider.method() {
OTPMethod::TOTP => {
self_.counter_row.get().hide();
self_.period_row.get().show();
self_.counter_row.hide();
self_.period_row.show();
}
OTPMethod::HOTP => {
self_.counter_row.get().show();
self_.period_row.get().hide();
self_.counter_row.show();
self_.period_row.hide();
}
OTPMethod::Steam => {}
};
if let Some(ref website) = provider.website() {
self_.provider_website_row.get().set_uri(website);
self_.provider_website_row.set_uri(website);
}
if let Some(ref help_url) = provider.help_url() {
self_.provider_help_row.get().set_uri(help_url);
self_.provider_help_row.set_uri(help_url);
}
self_.selected_provider.borrow_mut().replace(provider);
}
@ -285,10 +274,9 @@ impl AccountAddDialog {
let self_ = imp::AccountAddDialog::from_instance(self);
self_
.provider_completion
.get()
.set_model(Some(&self_.model.get().unwrap().completion_model()));
self_.provider_completion.get().connect_match_selected(
self_.provider_completion.connect_match_selected(
clone!(@weak self as dialog, @strong self_.model as model => move |_, store, iter| {
let provider_id = store.get_value(iter, 0). get_some::<i32>().unwrap();
let provider = model.get().unwrap().find_by_id(provider_id).unwrap();

View file

@ -49,11 +49,14 @@ mod imp {
);
Self::bind_template_children(klass);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for AccountDetailsPage {
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.init_widgets();
self.parent_constructed(obj);
}
@ -75,7 +78,6 @@ impl AccountDetailsPage {
let self_ = imp::AccountDetailsPage::from_instance(self);
self_
.qrcode_picture
.get()
.set_paintable(Some(&self_.qrcode_paintable));
}
@ -84,17 +86,14 @@ impl AccountDetailsPage {
let qr_code = account.qr_code();
self_.qrcode_paintable.set_qrcode(qr_code);
self_.account_label.get().set_text(&account.name());
self_
.provider_label
.get()
.set_text(&account.provider().name());
self_.account_label.set_text(&account.name());
self_.provider_label.set_text(&account.provider().name());
if let Some(ref website) = account.provider().website() {
self_.website_row.get().set_uri(website);
self_.website_row.get().show();
self_.website_row.set_uri(website);
self_.website_row.show();
} else {
self_.website_row.get().hide();
self_.website_row.hide();
}
}
}

View file

@ -65,6 +65,10 @@ mod imp {
klass.add_signal("removed", glib::SignalFlags::ACTION, &[], glib::Type::Unit);
klass.add_signal("shared", glib::SignalFlags::ACTION, &[], glib::Type::Unit);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for AccountRow {
@ -80,7 +84,7 @@ mod imp {
}
}
fn get_property(&self, _obj: &Self::Type, id: usize) -> glib::Value {
fn get_property(&self, obj: &Self::Type, id: usize) -> glib::Value {
let prop = &PROPERTIES[id];
match *prop {
subclass::Property("account", ..) => self.account.borrow().to_value(),
@ -89,7 +93,6 @@ mod imp {
}
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.setup_actions();
obj.setup_widgets();
self.parent_constructed(obj);
@ -116,37 +119,37 @@ impl AccountRow {
fn setup_widgets(&self) {
let self_ = imp::AccountRow::from_instance(self);
self.account()
.bind_property("name", &self_.name_label.get(), "label")
.bind_property("name", &*self_.name_label, "label")
.flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE)
.build();
self.account()
.bind_property("name", &self_.name_entry.get(), "text")
.bind_property("name", &*self_.name_entry, "text")
.flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE)
.build();
self.account()
.bind_property("otp", &self_.otp_label.get(), "label")
.bind_property("otp", &*self_.otp_label, "label")
.flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE)
.build();
self_.name_entry.get().connect_changed(
clone!(@weak self_.actions as actions => move |entry| {
self_
.name_entry
.connect_changed(clone!(@weak self_.actions as actions => move |entry| {
let name = entry.get_text().unwrap();
get_action!(actions, @save).set_enabled(!name.is_empty());
}),
);
self_.name_entry.get().connect_activate(
clone!(@weak self_.actions as actions => move |_| {
}));
self_
.name_entry
.connect_activate(clone!(@weak self_.actions as actions => move |_| {
actions.activate_action("save", None);
}),
);
}));
}
fn setup_actions(&self) {
let self_ = imp::AccountRow::from_instance(self);
self.insert_action_group("account", Some(&self_.actions));
let copy_btn_stack = self_.copy_btn_stack.get();
let copy_btn_stack = &*self_.copy_btn_stack;
action!(
self_.actions,
"copy-otp",
@ -176,8 +179,8 @@ impl AccountRow {
})
);
let edit_stack = self_.edit_stack.get();
let name_entry = self_.name_entry.get();
let edit_stack = &*self_.edit_stack;
let name_entry = &*self_.name_entry;
action!(
self_.actions,
"rename",

View file

@ -55,15 +55,13 @@ mod imp {
);
Self::bind_template_children(klass);
}
}
impl ObjectImpl for PasswordPage {
fn constructed(&self, obj: &Self::Type) {
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
self.parent_constructed(obj);
}
}
impl ObjectImpl for PasswordPage {}
impl WidgetImpl for PasswordPage {}
impl BoxImpl for PasswordPage {}
}
@ -85,9 +83,9 @@ impl PasswordPage {
fn validate(&self) {
let self_ = imp::PasswordPage::from_instance(self);
let current_password = self_.current_password_entry.get().get_text().unwrap();
let password = self_.password_entry.get().get_text().unwrap();
let password_repeat = self_.confirm_password_entry.get().get_text().unwrap();
let current_password = self_.current_password_entry.get_text().unwrap();
let password = self_.password_entry.get_text().unwrap();
let password_repeat = self_.confirm_password_entry.get_text().unwrap();
let is_valid = if self_.has_set_password.get() {
password_repeat == password && current_password != password && password != ""
@ -101,26 +99,20 @@ impl PasswordPage {
fn setup_widgets(&self) {
let self_ = imp::PasswordPage::from_instance(self);
self_
.password_img
.get()
.set_from_icon_name(Some(config::APP_ID));
self_.password_img.set_from_icon_name(Some(config::APP_ID));
self_
.password_entry
.get()
.connect_changed(clone!(@weak self as page=> move |_| page.validate()));
self_
.confirm_password_entry
.get()
.connect_changed(clone!(@weak self as page => move |_| page.validate()));
if !self_.has_set_password.get() {
self_.current_password_row.get().hide();
self_.current_password_row.hide();
} else {
self_
.current_password_entry
.get()
.connect_changed(clone!(@weak self as page => move |_| page.validate()));
}
}
@ -156,7 +148,7 @@ impl PasswordPage {
get_action!(actions, @close_page).activate(None);
get_action!(actions, @save_password).set_enabled(false);
get_action!(actions, @reset_password).set_enabled(false);
self_.current_password_row.get().hide();
self_.current_password_row.hide();
self_.has_set_password.set(false);
}
}
@ -165,8 +157,8 @@ impl PasswordPage {
let self_ = imp::PasswordPage::from_instance(self);
let actions = self_.actions.get().unwrap();
let current_password = self_.current_password_entry.get().get_text().unwrap();
let password = self_.password_entry.get().get_text().unwrap();
let current_password = self_.current_password_entry.get_text().unwrap();
let password = self_.password_entry.get_text().unwrap();
if Keyring::has_set_password().unwrap_or(false)
&& !Keyring::is_current_password(&current_password).unwrap_or(false)
@ -175,10 +167,10 @@ impl PasswordPage {
}
if Keyring::set_password(&password).is_ok() {
self_.current_password_row.get().show();
self_.current_password_entry.get().set_text("");
self_.password_entry.get().set_text("");
self_.confirm_password_entry.get().set_text("");
self_.current_password_row.show();
self_.current_password_entry.set_text("");
self_.password_entry.set_text("");
self_.confirm_password_entry.set_text("");
get_action!(actions, @save_password).set_enabled(false);
get_action!(actions, @reset_password).set_enabled(true);
get_action!(actions, @close_page).activate(None);

View file

@ -80,11 +80,14 @@ mod imp {
glib::Type::Unit,
);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for PreferencesWindow {
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.setup_actions();
self.parent_constructed(obj);
}
@ -114,17 +117,16 @@ impl PreferencesWindow {
self_
.settings
.bind("dark-theme", &self_.dark_theme.get(), "active")
.bind("dark-theme", &*self_.dark_theme, "active")
.build();
self_
.settings
.bind("auto-lock", &self_.auto_lock.get(), "active")
.bind("auto-lock", &*self_.auto_lock, "active")
.build();
self_
.auto_lock
.get()
.bind_property("active", &self_.lock_timeout.get(), "sensitive")
.bind_property("active", &*self_.lock_timeout, "sensitive")
.flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE)
.build();
@ -163,7 +165,7 @@ impl PreferencesWindow {
})
);
self_.backup_group.get().add(&row);
self_.backup_group.add(&row);
}
fn register_restore<T: Restorable>(&self, filters: &'static [&str]) {
@ -192,7 +194,7 @@ impl PreferencesWindow {
})
);
self_.restore_group.get().add(&row);
self_.restore_group.add(&row);
}
fn restore_items<T: Restorable>(&self, items: Vec<T::Item>) -> Result<()> {

View file

@ -2,7 +2,7 @@ use super::{ProviderPage, ProviderPageMode};
use crate::models::{Provider, ProviderSorter, ProvidersModel};
use glib::{clone, signal::Inhibit};
use gtk::subclass::prelude::*;
use gtk::{gio, glib, prelude::*, CompositeTemplate};
use gtk::{gdk, gio, glib, prelude::*, CompositeTemplate};
use row::ProviderActionRow;
mod imp {
@ -54,6 +54,10 @@ mod imp {
klass.set_template_from_resource("/com/belmoussaoui/Authenticator/providers_dialog.ui");
Self::bind_template_children(klass);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for ProvidersDialog {
@ -86,22 +90,20 @@ impl ProvidersDialog {
self_.filter_model.set_model(Some(&model));
self_
.search_bar
.get()
.bind_property("search-mode-enabled", &self_.search_btn.get(), "active")
.bind_property("search-mode-enabled", &*self_.search_btn, "active")
.flags(glib::BindingFlags::BIDIRECTIONAL | glib::BindingFlags::SYNC_CREATE)
.build();
self_.search_entry.get().connect_search_changed(
clone!(@weak self as dialog => move |entry| {
self_
.search_entry
.connect_search_changed(clone!(@weak self as dialog => move |entry| {
let text = entry.get_text().unwrap().to_string();
dialog.search(text);
}),
);
}));
self_
.search_btn
.get()
.bind_property("active", &self_.search_bar.get(), "search-mode-enabled")
.bind_property("active", &*self_.search_bar, "search-mode-enabled")
.flags(glib::BindingFlags::BIDIRECTIONAL | glib::BindingFlags::SYNC_CREATE)
.build();
@ -121,14 +123,14 @@ impl ProvidersDialog {
row.set_provider(provider);
});
self_.providers_list.get().set_factory(Some(&factory));
self_.providers_list.set_factory(Some(&factory));
let sorter = ProviderSorter::new();
let sort_model = gtk::SortListModel::new(Some(&self_.filter_model), Some(&sorter));
let selection_model = gtk::NoSelection::new(Some(&sort_model));
self_.providers_list.get().set_model(Some(&selection_model));
self_.providers_list.set_model(Some(&selection_model));
self_.providers_list.get().connect_activate(
self_.providers_list.connect_activate(
clone!(@weak self as dialog => move |listview, pos| {
let model = listview.get_model().unwrap();
let provider = model
@ -140,13 +142,13 @@ impl ProvidersDialog {
}),
);
let deck_page = self_.deck.get().append(&self_.page).unwrap();
let deck_page = self_.deck.append(&self_.page).unwrap();
deck_page.set_name("provider");
let event_controller = gtk::EventControllerKey::new();
event_controller.connect_key_pressed(
clone!(@weak self as widget => @default-return Inhibit(false), move |_, k, _, _| {
if k == 65307 {
if k == gdk::keys::Key::from_name("Escape") {
widget.close();
}
Inhibit(false)
@ -158,8 +160,8 @@ impl ProvidersDialog {
fn setup_actions(&self) {
let self_ = imp::ProvidersDialog::from_instance(self);
let deck = self_.deck.get();
let search_bar = self_.search_bar.get();
let deck = &*self_.deck;
let search_bar = &*self_.search_bar;
gtk_macros::action!(
self_.actions,
"search",
@ -201,13 +203,13 @@ impl ProvidersDialog {
fn add_provider(&self) {
let self_ = imp::ProvidersDialog::from_instance(self);
self_.deck.get().set_visible_child_name("provider");
self_.deck.set_visible_child_name("provider");
self_.page.set_mode(ProviderPageMode::Create);
}
fn edit_provider(&self, provider: Provider) {
let self_ = imp::ProvidersDialog::from_instance(self);
self_.deck.get().set_visible_child_name("provider");
self_.deck.set_visible_child_name("provider");
self_.page.set_provider(provider);
self_.page.set_mode(ProviderPageMode::Edit);
}

View file

@ -78,11 +78,14 @@ mod imp {
Self::bind_template_children(klass);
klass.install_properties(&PROPERTIES);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for ProviderImage {
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.setup_widgets();
self.parent_constructed(obj);
}
@ -127,8 +130,8 @@ impl ProviderImage {
pub fn set_provider(&self, provider: &Provider) {
let self_ = imp::ProviderImage::from_instance(self);
self_.stack.get().set_visible_child_name("loading");
self_.spinner.get().start();
self_.stack.set_visible_child_name("loading");
self_.spinner.start();
self.set_property("provider", &provider.clone()).unwrap();
@ -139,9 +142,8 @@ impl ProviderImage {
if uri == "invalid" {
self_
.image
.get()
.set_from_icon_name(Some("image-missing-symbolic"));
self_.stack.get().set_visible_child_name("image");
self_.stack.set_visible_child_name("image");
return;
}
@ -151,8 +153,8 @@ impl ProviderImage {
return;
}
self_.image.get().set_from_file(file.get_path().unwrap());
self_.stack.get().set_visible_child_name("image");
self_.image.set_from_file(file.get_path().unwrap());
self_.stack.set_visible_child_name("image");
}
_ => {
self.fetch();
@ -163,8 +165,8 @@ impl ProviderImage {
fn fetch(&self) {
let self_ = imp::ProviderImage::from_instance(self);
let sender = self_.sender.clone();
self_.stack.get().set_visible_child_name("loading");
self_.spinner.get().start();
self_.stack.set_visible_child_name("loading");
self_.spinner.start();
let p = self.provider();
gtk_macros::spawn!(async move {
match p.favicon().await {
@ -186,7 +188,7 @@ impl ProviderImage {
None,
clone!(@weak self as image => move |action| image.do_action(action)),
);
self.bind_property("size", &self_.image.get(), "pixel-size")
self.bind_property("size", &*self_.image, "pixel-size")
.flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE)
.build();
}
@ -197,17 +199,16 @@ impl ProviderImage {
ImageAction::Failed => {
self_
.image
.get()
.set_from_icon_name(Some("image-missing-symbolic"));
self.provider().set_image_uri("invalid");
}
ImageAction::Ready(image) => {
self_.image.get().set_from_file(image.get_path().unwrap());
self_.image.set_from_file(image.get_path().unwrap());
self.provider().set_image_uri(&image.get_uri());
}
}
self_.stack.get().set_visible_child_name("image");
self_.spinner.get().stop();
self_.stack.set_visible_child_name("image");
self_.spinner.stop();
glib::Continue(true)
}

View file

@ -50,11 +50,14 @@ mod imp {
glib::Type::Unit,
);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for ProvidersList {
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.setup_widgets();
self.parent_constructed(obj);
}
@ -105,14 +108,11 @@ impl ProvidersList {
fn setup_widgets(&self) {
let self_ = imp::ProvidersList::from_instance(self);
self_
.empty_img
.get()
.set_from_icon_name(Some(config::APP_ID));
self_.empty_img.set_from_icon_name(Some(config::APP_ID));
let sort_model = gtk::SortListModel::new(Some(&self_.filter_model), Some(&self_.sorter));
self_.providers_list.get().bind_model(
self_.providers_list.bind_model(
Some(&sort_model),
clone!(@weak self as list => move |obj| {
let provider = obj.clone().downcast::<Provider>().unwrap();

View file

@ -87,11 +87,14 @@ mod imp {
klass.set_template_from_resource("/com/belmoussaoui/Authenticator/provider_page.ui");
Self::bind_template_children(klass);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for ProviderPage {
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.setup_widgets();
self.parent_constructed(obj);
}
@ -111,21 +114,18 @@ impl ProviderPage {
pub fn set_provider(&self, provider: Provider) {
let self_ = imp::ProviderPage::from_instance(self);
self_.name_entry.get().set_text(&provider.name());
self_
.period_spinbutton
.get()
.set_value(provider.period() as f64);
self_.name_entry.set_text(&provider.name());
self_.period_spinbutton.set_value(provider.period() as f64);
if let Some(ref website) = provider.website() {
self_.provider_website_entry.get().set_text(website);
self_.provider_website_entry.set_text(website);
}
if let Some(ref website) = provider.help_url() {
self_.provider_help_entry.get().set_text(website);
self_.provider_help_entry.set_text(website);
}
self_.algorithm_comborow.get().set_selected(
self_.algorithm_comborow.set_selected(
self_
.algorithms_model
.find_position(provider.algorithm().to_glib()),
@ -134,22 +134,17 @@ impl ProviderPage {
self_
.default_counter_spinbutton
.get()
.set_value(provider.default_counter() as f64);
self_
.digits_spinbutton
.get()
.set_value(provider.digits() as f64);
self_.digits_spinbutton.set_value(provider.digits() as f64);
self_.method_comborow.get().set_selected(
self_.method_comborow.set_selected(
self_
.methods_model
.find_position(provider.method().to_glib()),
);
self_.image.get().set_provider(&provider);
self_.image.set_provider(&provider);
self_
.title
.get()
.set_text(&format!("Editing provider: {}", provider.name()));
}
@ -157,33 +152,28 @@ impl ProviderPage {
let self_ = imp::ProviderPage::from_instance(self);
self_
.algorithm_comborow
.get()
.set_model(Some(&self_.algorithms_model));
self_
.algorithm_comborow
.get()
.connect_property_selected_item_notify(clone!(@weak self as page => move |_| {
page.on_algorithm_changed();
}));
self_
.method_comborow
.get()
.set_model(Some(&self_.methods_model));
self_.method_comborow.set_model(Some(&self_.methods_model));
}
fn on_algorithm_changed(&self) {
let self_ = imp::ProviderPage::from_instance(self);
let selected = OTPMethod::from(self_.method_comborow.get().get_selected());
let selected = OTPMethod::from(self_.method_comborow.get_selected());
match selected {
OTPMethod::TOTP => {
self_.default_counter_row.get().hide();
self_.period_row.get().show();
self_.default_counter_row.hide();
self_.period_row.show();
}
OTPMethod::HOTP => {
self_.default_counter_row.get().show();
self_.period_row.get().hide();
self_.default_counter_row.show();
self_.period_row.hide();
}
OTPMethod::Steam => {}
}
@ -193,13 +183,13 @@ impl ProviderPage {
let self_ = imp::ProviderPage::from_instance(self);
match mode {
ProviderPageMode::Create => {
self_.title.get().set_label("New Provider");
self_.name_entry.get().set_text("");
self_.period_spinbutton.get().set_value(30_f64);
self_.provider_website_entry.get().set_text("");
self_.provider_help_entry.get().set_text("");
self_.title.set_label("New Provider");
self_.name_entry.set_text("");
self_.period_spinbutton.set_value(30_f64);
self_.provider_website_entry.set_text("");
self_.provider_help_entry.set_text("");
self_.method_comborow.get().set_selected(0);
self_.method_comborow.set_selected(0);
}
ProviderPageMode::Edit => {}
}

View file

@ -83,6 +83,10 @@ mod imp {
glib::Type::Unit,
);
}
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
}
}
impl ObjectImpl for ProviderRow {
@ -112,7 +116,6 @@ mod imp {
}
fn constructed(&self, obj: &Self::Type) {
obj.init_template();
obj.setup_widgets();
self.parent_constructed(obj);
}
@ -142,7 +145,7 @@ impl ProviderRow {
let self_ = imp::ProviderRow::from_instance(self);
self_.started_at.borrow_mut().replace(Instant::now());
self_.progress.get().set_fraction(1_f64);
self_.progress.set_fraction(1_f64);
self.set_property("remaining-time", &(self.provider().period() as u64))
.unwrap();
}
@ -173,7 +176,7 @@ impl ProviderRow {
let remaining_time = started_at.elapsed().as_millis();
let progress_fraction = (max - (remaining_time as f64)) / max;
self_.progress.get().set_fraction(progress_fraction);
self_.progress.set_fraction(progress_fraction);
if progress_fraction <= 0.0 {
self.restart();
}
@ -184,7 +187,7 @@ impl ProviderRow {
self.add_css_class(&self.provider().method().to_string());
self_.image.get().set_provider(&self.provider());
self_.image.set_provider(&self.provider());
self.restart();
if self.provider().method() == OTPMethod::TOTP {
@ -204,11 +207,11 @@ impl ProviderRow {
}),
);
} else {
self_.progress.get().hide();
self_.progress.hide();
}
self.provider()
.bind_property("name", &self_.name_label.get(), "label")
.bind_property("name", &*self_.name_label, "label")
.flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE)
.build();
@ -255,7 +258,6 @@ impl ProviderRow {
self_
.accounts_list
.get()
.bind_model(Some(&sort_model), create_callback);
}
}

View file

@ -78,16 +78,13 @@ mod imp {
klass.set_template_from_resource("/com/belmoussaoui/Authenticator/window.ui");
Self::bind_template_children(klass);
}
}
impl ObjectImpl for Window {
fn constructed(&self, obj: &Self::Type) {
fn instance_init(obj: &subclass::InitializingObject<Self::Type>) {
obj.init_template();
self.parent_constructed(obj);
}
}
impl ObjectImpl for Window {}
impl WidgetImpl for Window {}
impl WindowImpl for Window {}
impl ApplicationWindowImpl for Window {}
@ -118,24 +115,21 @@ impl Window {
let self_ = imp::Window::from_instance(self);
match view {
View::Login => {
self_.deck.get().set_visible_child_name("login");
self_.deck.get().set_can_swipe_back(false);
self_
.search_entry
.get()
.set_key_capture_widget(gtk::NONE_WIDGET);
self_.password_entry.get().grab_focus();
self_.deck.set_visible_child_name("login");
self_.deck.set_can_swipe_back(false);
self_.search_entry.set_key_capture_widget(gtk::NONE_WIDGET);
self_.password_entry.grab_focus();
}
View::Accounts => {
self_.deck.get().set_visible_child_name("accounts");
self_.deck.get().set_can_swipe_back(false);
self_.deck.set_visible_child_name("accounts");
self_.deck.set_can_swipe_back(false);
//self_.search_entry.get().set_key_capture_widget(Some(self));
//self_.search_entry.set_key_capture_widget(Some(self));
}
View::Account(account) => {
self_.deck.get().set_visible_child_name("account");
self_.deck.get().set_can_swipe_back(true);
self_.account_details.get().set_account(&account);
self_.deck.set_visible_child_name("account");
self_.deck.set_can_swipe_back(true);
self_.account_details.set_account(&account);
}
}
}
@ -185,10 +179,7 @@ impl Window {
.unwrap();
self.set_icon_name(Some(config::APP_ID));
self_
.locked_img
.get()
.set_from_icon_name(Some(config::APP_ID));
self_.locked_img.set_from_icon_name(Some(config::APP_ID));
// load latest window state
window_state::load(&self, &self_.settings);
@ -204,17 +195,16 @@ impl Window {
gtk_macros::get_widget!(builder, gtk::ShortcutsWindow, shortcuts);
self.set_help_overlay(Some(&shortcuts));
self_.container.get().append(&self_.providers);
self_.container.append(&self_.providers);
self_
.search_bar
.get()
.bind_property("search-mode-enabled", &self_.search_btn.get(), "active")
.bind_property("search-mode-enabled", &*self_.search_btn, "active")
.flags(glib::BindingFlags::BIDIRECTIONAL | glib::BindingFlags::SYNC_CREATE)
.build();
let search_btn = self_.search_btn.get();
self_.search_entry.get().connect_search_changed(
let search_btn = &*self_.search_btn;
self_.search_entry.connect_search_changed(
clone!(@weak self_.providers as providers => move |entry| {
let text = entry.get_text().unwrap().to_string();
providers.search(text);
@ -222,13 +212,11 @@ impl Window {
);
self_
.search_entry
.get()
.connect_search_started(clone!(@weak search_btn => move |entry| {
search_btn.set_active(true);
}));
self_
.search_entry
.get()
.connect_stop_search(clone!(@weak search_btn => move |entry| {
entry.set_text("");
search_btn.set_active(false);
@ -247,7 +235,7 @@ impl Window {
fn setup_actions(&self, app: &Application) {
let self_ = imp::Window::from_instance(self);
let search_btn = self_.search_btn.get();
let search_btn = &*self_.search_btn;
action!(
self,
"search",
@ -276,7 +264,7 @@ impl Window {
.flags(glib::BindingFlags::INVERT_BOOLEAN | glib::BindingFlags::SYNC_CREATE)
.build();
let password_entry = self_.password_entry.get();
let password_entry = &*self_.password_entry;
action!(
self,
"unlock",
@ -310,7 +298,6 @@ impl Window {
self_
.password_entry
.get()
.connect_activate(clone!(@weak self as win => move |_| {
win.activate_action("unlock", None);
}));