Replace some of the deprecated APIs

This commit is contained in:
Bilal Elmoussaoui 2022-12-25 09:27:05 +01:00
parent d5bd010043
commit 87dd3b2243
5 changed files with 65 additions and 82 deletions

View file

@ -13,7 +13,7 @@ diesel_migrations = {version = "2.0", features = ["sqlite"]}
gettext-rs = {version = "0.7", features = ["gettext-system"]}
gst = {package = "gstreamer", version = "0.19"}
gst4gtk = { package = "gst-plugin-gtk4", version = "0.9"}
gtk = {package = "gtk4", version = "0.5"}
gtk = {package = "gtk4", version = "0.5", features = ["v4_10"]}
gtk-macros = "0.3"
search-provider = "0.4"
hex = { version = "0.4.3", features = [ "serde" ] }

View file

@ -1,8 +1,8 @@
use adw::prelude::*;
use gettextrs::gettext;
use gtk::{
gdk,
glib::{self, clone},
prelude::*,
subclass::prelude::*,
CompositeTemplate,
};
@ -161,21 +161,24 @@ impl AccountDetailsPage {
fn delete_account(&self) {
let parent = self.root().unwrap().downcast::<gtk::Window>().unwrap();
let dialog = gtk::MessageDialog::builder()
.message_type(gtk::MessageType::Warning)
.buttons(gtk::ButtonsType::YesNo)
.text(&gettext("Are you sure you want to delete the account?"))
.secondary_text(&gettext("This action is irreversible"))
let dialog = adw::MessageDialog::builder()
.heading(&gettext("Are you sure you want to delete the account?"))
.body(&gettext("This action is irreversible"))
.modal(true)
.transient_for(&parent)
.build();
dialog.connect_response(clone!(@weak self as page => move |dialog, response| {
if response == gtk::ResponseType::Yes {
let account = page.imp().account.borrow().as_ref().unwrap().clone();
page.emit_by_name::<()>("removed", &[&account]);
}
dialog.close();
}));
dialog.add_responses(&[("no", &gettext("No")), ("yes", &gettext("Yes"))]);
dialog.set_response_appearance("yes", adw::ResponseAppearance::Destructive);
dialog.connect_response(
None,
clone!(@weak self as page => move |dialog, response| {
if response == "yes" {
let account = page.imp().account.borrow().as_ref().unwrap().clone();
page.emit_by_name::<()>("removed", &[&account]);
}
dialog.close();
}),
);
dialog.show();
}

View file

@ -39,7 +39,6 @@ mod imp {
pub actions: gio::SimpleActionGroup,
pub backup_actions: gio::SimpleActionGroup,
pub restore_actions: gio::SimpleActionGroup,
pub file_chooser: RefCell<Option<gtk::FileChooserNative>>,
pub camera_page: CameraPage,
pub password_page: PasswordPage,
#[template_child]
@ -82,7 +81,6 @@ mod imp {
backup_group: TemplateChild::default(),
restore_group: TemplateChild::default(),
dark_mode_group: TemplateChild::default(),
file_chooser: RefCell::default(),
key_entries: RefCell::default(),
}
}
@ -279,17 +277,16 @@ impl PreferencesWindow {
imp.backup_actions,
&T::identifier(),
clone!(@weak self as win, @weak model => move |_, _| {
let dialog = win.select_file(filters, Operation::Backup);
dialog.connect_response(clone!(@weak model, @weak win => move |d, response| {
if response == gtk::ResponseType::Accept {
let ctx = glib::MainContext::default();
ctx.spawn_local(clone!(@weak win, @weak model => async move {
if let Ok(Some(file)) = win.select_file(filters, Operation::Backup).await {
let key = T::ENCRYPTABLE.then(|| {
win.encyption_key(Operation::Backup, &T::identifier())
}).flatten();
if let Err(err) = T::backup(&model, &d.file().unwrap(), key.as_deref()) {
if let Err(err) = T::backup(&model, &file, key.as_deref()) {
tracing::warn!("Failed to create a backup {}", err);
}
}
d.destroy();
}));
})
);
@ -444,14 +441,14 @@ impl PreferencesWindow {
imp.restore_actions,
&T::identifier(),
clone!(@weak self as win => move |_, _| {
let dialog = win.select_file(filters, Operation::Restore);
dialog.connect_response(clone!(@weak win => move |d, response| {
if response == gtk::ResponseType::Accept {
let ctx = glib::MainContext::default();
ctx.spawn_local(clone!(@weak win => async move {
if let Ok(Some(file)) = win.select_file(filters, Operation::Restore).await {
let key = T::ENCRYPTABLE.then(|| {
win.encyption_key(Operation::Restore, &T::identifier())
}).flatten();
match T::restore_from_file(&d.file().unwrap(), key.as_deref()) {
match T::restore_from_file(&file, key.as_deref()) {
Ok(items) => {
win.restore_items::<T, T::Item>(items);
},
@ -460,7 +457,6 @@ impl PreferencesWindow {
}
}
}
d.destroy();
}));
})
);
@ -493,42 +489,37 @@ impl PreferencesWindow {
self.close();
}
fn select_file(
async fn select_file(
&self,
filters: &'static [&str],
operation: Operation,
) -> gtk::FileChooserNative {
let native = match operation {
Operation::Backup => gtk::FileChooserNative::new(
Some(&gettext("Backup")),
gtk::Window::NONE,
gtk::FileChooserAction::Save,
Some(&gettext("Select")),
Some(&gettext("Cancel")),
),
Operation::Restore => gtk::FileChooserNative::new(
Some(&gettext("Restore")),
gtk::Window::NONE,
gtk::FileChooserAction::Open,
Some(&gettext("Select")),
Some(&gettext("Cancel")),
),
};
native.set_modal(true);
native.set_transient_for(Some(self));
) -> Result<Option<gio::File>, glib::Error> {
let filters_model = gio::ListStore::new(gtk::FileFilter::static_type());
filters.iter().for_each(|f| {
let filter = gtk::FileFilter::new();
filter.add_mime_type(f);
filter.set_name(Some(f));
native.add_filter(&filter);
filters_model.append(&filter);
});
// Hold a reference to the file chooser
self.imp().file_chooser.replace(Some(native.clone()));
native.show();
native
match operation {
Operation::Backup => {
let dialog = gtk::FileDialog::builder()
.modal(true)
.filters(&filters_model)
.title(&gettext("Backup"))
.build();
dialog.save_future(Some(self), gio::File::NONE, None).await
}
Operation::Restore => {
let dialog = gtk::FileDialog::builder()
.modal(true)
.filters(&filters_model)
.title(&gettext("Restore"))
.build();
dialog.open_future(Some(self), gio::File::NONE).await
}
}
}
fn setup_actions(&self) {

View file

@ -1,6 +1,6 @@
use adw::prelude::*;
use gettextrs::gettext;
use glib::{clone, translate::IntoGlib};
use glib::translate::IntoGlib;
use gtk::{gdk_pixbuf, gio, glib, subclass::prelude::*, CompositeTemplate};
use crate::{
@ -55,8 +55,6 @@ mod imp {
#[template_child]
pub delete_button: TemplateChild<gtk::Button>,
pub selected_provider: RefCell<Option<Provider>>,
// We need to hold a reference to the native file chooser
pub file_chooser: RefCell<Option<gtk::FileChooserNative>>,
pub selected_image: RefCell<Option<gio::File>>,
#[template_child]
pub back_btn: TemplateChild<gtk::Button>,
@ -94,7 +92,6 @@ mod imp {
methods_model,
algorithms_model,
selected_provider: RefCell::default(),
file_chooser: RefCell::default(),
selected_image: RefCell::default(),
}
}
@ -119,8 +116,8 @@ mod imp {
klass.install_action("providers.reset_image", None, move |page, _, _| {
page.reset_image();
});
klass.install_action("providers.select_image", None, move |page, _, _| {
page.open_select_image();
klass.install_action_async("providers.select_image", None, |page, _, _| async move {
page.open_select_image().await;
});
}
@ -304,34 +301,26 @@ impl ProviderPage {
Ok(())
}
fn open_select_image(&self) {
let imp = self.imp();
async fn open_select_image(&self) {
let parent = self.root().unwrap().downcast::<gtk::Window>().unwrap();
let file_chooser = gtk::FileChooserNative::builder()
.accept_label(&gettext("Select"))
.cancel_label(&gettext("Cancel"))
.modal(true)
.action(gtk::FileChooserAction::Open)
.transient_for(&parent)
.build();
let images_filter = gtk::FileFilter::new();
images_filter.set_name(Some(&gettext("Image")));
images_filter.add_pixbuf_formats();
file_chooser.add_filter(&images_filter);
let model = gio::ListStore::new(gtk::FileFilter::static_type());
model.append(&images_filter);
file_chooser.connect_response(clone!(@weak self as page => move |dialog, response| {
if response == gtk::ResponseType::Accept {
let file = dialog.file().unwrap();
page.set_image(file);
}
page.imp().file_chooser.replace(None);
dialog.destroy();
}));
let file_chooser = gtk::FileDialog::builder()
.modal(true)
.filters(&model)
.build();
file_chooser.show();
imp.file_chooser.replace(Some(file_chooser));
if let Ok(Some(file)) = file_chooser
.open_future(Some(&parent), gio::File::NONE)
.await
{
self.set_image(file);
};
}
fn set_image(&self, file: gio::File) {
@ -367,7 +356,7 @@ impl ProviderPage {
// save action Note that we don't validate the urls other than: does `url`
// crate can parse it or not
#[template_callback]
fn entry_validate(&self, _entry: gtk::Entry) {
fn entry_validate(&self, _entry: adw::EntryRow) {
let imp = self.imp();
let provider_name = imp.name_entry.text();

View file

@ -173,7 +173,7 @@ impl Window {
app.add_window(&window);
if config::PROFILE == "Devel" {
window.style_context().add_class("devel");
window.add_css_class("devel");
}
window.init(model, app);
window.setup_actions(app);