diff --git a/Cargo.lock b/Cargo.lock index 56d0815..71d9068 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -313,22 +313,23 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "cairo-rs" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129e928d3eda625f53ce257589efbe5143416875fd01bddd08c8c6feb8b9962b" +checksum = "a8af54f5d48af1226928adc1f57edd22f5df1349e7da1fc96ae15cf43db0e871" dependencies = [ "bitflags", "cairo-sys-rs", "glib", "libc", + "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "f55382a01d30e5e53f185eee269124f5e21ab526595b872751278dfbb463594e" dependencies = [ "glib-sys", "libc", @@ -821,22 +822,23 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678516f1baef591d270ca10587c01a12542a731a7879cc62391a18191a470831" +checksum = "b023fbe0c6b407bd3d9805d107d9800da3829dc5a676653210f1d5f16d7f59bf" dependencies = [ "bitflags", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "7b41bd2b44ed49d99277d3925652a163038bd5ed943ec9809338ffb2f4391e3b" dependencies = [ "gio-sys", "glib-sys", @@ -847,9 +849,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.4.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a2fc0bd03d59383fc10b71a8cb731a1fac2998732a36a0c03e9b1de1513218" +checksum = "e5042053ee765aeef08d9d7e3f0f1e36a4d37f1659b3f93ad3d6997515dbb64a" dependencies = [ "bitflags", "cairo-rs", @@ -863,9 +865,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.4.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48a39e34abe35ee2cf54a1e29dd983accecd113ad30bdead5050418fa92f2a1b" +checksum = "14f0fb00507af1e9299681dd09965f720e2b5ea95536d49a5681e8994ef10c7a" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -961,26 +963,29 @@ dependencies = [ [[package]] name = "gio" -version = "0.15.10" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cd21a7a674ea811749661012512b0ba5237ba404ccbcab2850db5537549b64" +checksum = "65acfc24267314eee46f49e0a531e08fd6c3025040d1cfb4a7cd8e41c5e06116" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", + "pin-project-lite", + "smallvec", "thiserror", ] [[package]] name = "gio-sys" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "b5d3076ecb86c8c3a672c9843d6232b3a344fb81d304d0ba1ac64b23343efa46" dependencies = [ "glib-sys", "gobject-sys", @@ -991,19 +996,22 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.10" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a826fad715b57834920839d7a594c3b5e416358c7d790bdaba847a40d7c1d96d" +checksum = "a78b6a0901e258cb03c761ca94c84d519427ede489cae12cd5ba0d7d584e69e9" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", "thiserror", @@ -1011,9 +1019,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.10" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac4d47c544af67747652ab1865ace0ffa1155709723ac4f32e97587dd4735b2" +checksum = "55e93d79ed130f0f0b58bc0aa29fb0e40c9dfd63997fec51f8adf780d1520bc4" dependencies = [ "anyhow", "heck", @@ -1026,9 +1034,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.15.10" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "72a0985cf568e18cf63b443c9a14f4bdaa947fed7437476000dba84926a20b25" dependencies = [ "libc", "system-deps", @@ -1048,9 +1056,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "9a0155d388840c77d61b033b66ef4f9bc7f4133d83df83572d6b4fb234a3be7d" dependencies = [ "glib-sys", "libc", @@ -1059,9 +1067,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.15.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c54f9fbbeefdb62c99f892dfca35f83991e2cb5b46a8dc2a715e58612f85570" +checksum = "21cf11565bb0e4dfc2f99d4775b6c329f0d40a2cff9c0066214d31a0e1b46256" dependencies = [ "glib", "graphene-sys", @@ -1070,9 +1078,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa691fc7337ba1df599afb55c3bcb85c04f1b3f17362570e9bb0ff0d1bc3028a" +checksum = "cf80a4849a8d9565410a8fec6fc3678e9c617f4ac7be182ca55ab75016e07af9" dependencies = [ "glib-sys", "libc", @@ -1082,9 +1090,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.4.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d5a47a78c682bb67496b562495ed84972c0512ba0654888c4dc92b80a85bd3" +checksum = "2fa9cd285a72a95124b65c069a9cb1b8fb8e310be71783404c39fccf3bf7774c" dependencies = [ "bitflags", "cairo-rs", @@ -1098,9 +1106,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.4.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31d21d7ce02ba261bb24c50c4ab238a10b41a2c97c32afffae29471b7cca69b" +checksum = "5a445ae1e50cbf181a1d5c61b920a7e7e8657b96e0ecdbbf8911a86fad462a32" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -1120,9 +1128,9 @@ checksum = "da5bf7748fd4cd0b2490df8debcc911809dbcbee4ece9531b96c29a9c729de5a" [[package]] name = "gtk4" -version = "0.4.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5d40303dabe4608fc260de2bd7563da6f85bc90af956323f0cd8ae0abcfe03" +checksum = "e47dca53cb1a8ae3006e869b5711ae7370180db537f6d98e3bcaf23fabfd911f" dependencies = [ "bitflags", "cairo-rs", @@ -1143,24 +1151,23 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.4.7" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3c4aa605fb3d78205c7aef0eeaa6db61d8cc4dd05a465dc6ffdfdaee84f825" +checksum = "db4676c4f90d8b010e88cb4558f61f47d76d6f6b8e6f6b89e62640f443907f61" dependencies = [ "anyhow", "proc-macro-crate", "proc-macro-error", "proc-macro2", - "quick-xml", "quote", "syn", ] [[package]] name = "gtk4-sys" -version = "0.4.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47c075e8f795c38f6e9a47b51a73eab77b325f83c0154979ed4d4245c36490d" +checksum = "65463dc801460e498d5e7ffa6e9ae2cfbed7d05fabd1ca5a8d024adbc89eeda6" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1396,10 +1403,12 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libadwaita" -version = "0.1.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ae453d28e3b91f03749f02b1531e8cfe315a1d0762b77a61797d2ab80bb87d" +checksum = "b1c4efd2020a4fcedbad2c4a97de97bf6045e5dc49d61d5a5d0cfd753db60700" dependencies = [ + "bitflags", + "futures-channel", "gdk-pixbuf", "gdk4", "gio", @@ -1413,9 +1422,9 @@ dependencies = [ [[package]] name = "libadwaita-sys" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18b6ac4cadd252a89f5cba0a5a4e99836131795d6fad37b859ac79e8cb7d2c8" +checksum = "0727b85b4fe2b1bed5ac90df6343de15cbf8118bfb96d7c3cc1512681a4b34ac" dependencies = [ "gdk4-sys", "gio-sys", @@ -1423,6 +1432,7 @@ dependencies = [ "gobject-sys", "gtk4-sys", "libc", + "pango-sys", "system-deps", ] @@ -1523,9 +1533,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -1696,11 +1706,12 @@ dependencies = [ [[package]] name = "pango" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +checksum = "243c048be90312220fb3bd578176eed8290568274a93c95040289d39349384bc" dependencies = [ "bitflags", + "gio", "glib", "libc", "once_cell", @@ -1709,9 +1720,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.10" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "4293d0f0b5525eb5c24734d30b0ed02cd02aa734f216883f376b54de49625de8" dependencies = [ "glib-sys", "gobject-sys", @@ -1987,15 +1998,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-xml" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b" -dependencies = [ - "memchr", -] - [[package]] name = "quote" version = "1.0.17" diff --git a/Cargo.toml b/Cargo.toml index 7aa14d9..4d7e730 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,12 @@ authors = ["Rafael Mardojai CM "] edition = "2018" [dependencies] -adw = { package = "libadwaita", version = "0.1" } +adw = { package = "libadwaita", version = "0.3" } image = "0.23" log = "0.4" pretty_env_logger = "0.4" gettext-rs = { version = "0.6", features = ["gettext-system"] } -gtk = { package = "gtk4", version = "0.4", features = ["v4_6"] } +gtk = { package = "gtk4", version = "0.6", features = ["v4_8"] } gtk-macros = "0.3" once_cell = "1.5" url = "2.2" diff --git a/src/application.rs b/src/application.rs index ee5fb20..077e6d5 100644 --- a/src/application.rs +++ b/src/application.rs @@ -3,14 +3,12 @@ use crate::window::SharePreviewWindow; use adw::subclass::prelude::*; use gettextrs::*; -use gio::ApplicationFlags; use glib::clone; use glib::WeakRef; use gtk::prelude::*; -use gtk::subclass::prelude::*; use gtk::{gio, glib}; use gtk_macros::action; -use log::{debug, info}; +use log::{info}; use once_cell::sync::OnceCell; mod imp { @@ -30,34 +28,28 @@ mod imp { impl ObjectImpl for SharePreviewApplication {} - impl gio::subclass::prelude::ApplicationImpl for SharePreviewApplication { - fn activate(&self, app: &Self::Type) { - debug!("AdwApplication::activate"); - - let priv_ = SharePreviewApplication::from_instance(app); - if let Some(window) = priv_.window.get() { + impl ApplicationImpl for SharePreviewApplication { + fn activate(&self) { + let app = self.obj(); + if let Some(window) = self.window.get() { let window = window.upgrade().unwrap(); window.show(); window.present(); return; } - app.set_resource_base_path(Some("/com/rafaelmardojai/SharePreview/")); - - let window = SharePreviewWindow::new(app); + let window = SharePreviewWindow::new(&app.clone()); + window.present(); self.window .set(window.downgrade()) .expect("Window already set."); app.setup_gactions(); app.setup_accels(); - - app.get_main_window().present(); } - fn startup(&self, app: &Self::Type) { - debug!("GtkApplication::startup"); - self.parent_startup(app); + fn startup(&self) { + self.parent_startup(); } } @@ -73,20 +65,15 @@ glib::wrapper! { impl SharePreviewApplication { pub fn new() -> Self { - glib::Object::new(&[ - ("application-id", &Some(config::APP_ID)), - ("flags", &ApplicationFlags::empty()), - ( - "resource-base-path", - &Some("/com/rafaelmardojai/SharePreview/"), - ), - ]) - .expect("Application initialization failed...") + glib::Object::builder() + .property("application-id", config::APP_ID) + .property("flags", &gio::ApplicationFlags::empty()) + .property("resource-base-path", Some("/com/rafaelmardojai/SharePreview/")) + .build() } fn get_main_window(&self) -> SharePreviewWindow { - let priv_ = imp::SharePreviewApplication::from_instance(self); - priv_.window.get().unwrap().upgrade().unwrap() + self.imp().window.get().unwrap().upgrade().unwrap() } fn setup_gactions(&self) { @@ -118,7 +105,7 @@ impl SharePreviewApplication { } fn show_about_dialog(&self) { - let dialog = gtk::builders::AboutDialogBuilder::new() + let dialog = gtk::AboutDialog::builder() .program_name(&gettext("Share Preview")) .logo_icon_name(config::APP_ID) .license_type(gtk::License::Gpl30) @@ -126,8 +113,8 @@ impl SharePreviewApplication { .version(config::VERSION) .transient_for(&self.get_main_window()) .modal(true) - .authors(vec!["Rafael Mardojai CM".into()]) - .artists(vec!["Rafael Mardojai CM".into(), "Tobias Bernard".into()]) + .authors(vec!["Rafael Mardojai CM".to_string()]) + .artists(vec!["Rafael Mardojai CM".to_string(), "Tobias Bernard".to_string()]) .build(); dialog.show(); diff --git a/src/widgets/card.rs b/src/widgets/card.rs index 750ba80..30efee8 100644 --- a/src/widgets/card.rs +++ b/src/widgets/card.rs @@ -73,7 +73,7 @@ glib::wrapper! { impl CardBox { pub fn new() -> Self { - glib::Object::new(&[]).expect("Failed to create CardBox") + glib::Object::builder().build() } pub fn new_from_card(card: &Card) -> Self { @@ -84,7 +84,6 @@ impl CardBox { pub fn new_from_error(error: &CardError) -> Self { let new = CardBox::new(); - let imp = imp::CardBox::from_instance(&new); let error_text = match error { CardError::NotEnoughData => { @@ -95,29 +94,27 @@ impl CardBox { } }; - imp.error_message.set_label(&error_text); - imp.stack.set_visible_child_name("error"); + new.imp().error_message.set_label(&error_text); + new.imp().stack.set_visible_child_name("error"); new } pub fn set_card(&self, card: &Card) { - let imp = imp::CardBox::from_instance(self); - // Put the card values on the widgets - imp.title.set_label(&card.title); + self.imp().title.set_label(&card.title); if let Some(text) = &card.description { - imp.description.set_label(&text); + self.imp().description.set_label(&text); } - imp.site.set_label(&card.site); + self.imp().site.set_label(&card.site); if let Some(img) = &card.image { - imp.image.set_image(&img, &card.size); - imp.image.set_visible(true); + self.imp().image.set_image(&img, &card.size); + self.imp().image.set_visible(true); } else { match &card.social { Social::Mastodon | Social::Twitter => { - imp.image.set_fallback(&card.size); - imp.image.set_visible(true); + self.imp().image.set_fallback(&card.size); + self.imp().image.set_visible(true); } _ => () } @@ -126,37 +123,37 @@ impl CardBox { // Change widget aparence by social match &card.social { Social::Facebook => { - imp.textbox.reorder_child_after(&*imp.site, None::<>k::Widget>); - imp.title.set_lines(2); - imp.title.set_wrap(true); - imp.title.style_context().add_class("title-4"); + self.imp().textbox.reorder_child_after(&*self.imp().site, None::<>k::Widget>); + self.imp().title.set_lines(2); + self.imp().title.set_wrap(true); + self.imp().title.style_context().add_class("title-4"); if let Some(_) = &card.description { if &card.title.len() <= &65 { - imp.description.set_visible(true); + self.imp().description.set_visible(true); } } if let CardSize::Medium = card.size { - imp.cardbox.set_orientation(gtk::Orientation::Horizontal); + self.imp().cardbox.set_orientation(gtk::Orientation::Horizontal); } } Social::Mastodon => { - imp.cardbox.set_orientation(gtk::Orientation::Horizontal); - imp.title.style_context().add_class("heading"); + self.imp().cardbox.set_orientation(gtk::Orientation::Horizontal); + self.imp().title.style_context().add_class("heading"); } Social::Twitter => { - imp.title.style_context().add_class("heading"); + self.imp().title.style_context().add_class("heading"); if let Some(_) = &card.description { - imp.description.set_visible(true); - imp.description.set_wrap(true); + self.imp().description.set_visible(true); + self.imp().description.set_wrap(true); } match card.size { CardSize::Medium => { - imp.cardbox.set_orientation(gtk::Orientation::Horizontal); - imp.description.set_lines(3); + self.imp().cardbox.set_orientation(gtk::Orientation::Horizontal); + self.imp().description.set_lines(3); } CardSize::Large => { - imp.description.set_lines(2); + self.imp().description.set_lines(2); } _ => {} } diff --git a/src/widgets/data_dialog.rs b/src/widgets/data_dialog.rs index ca46e3a..6161a34 100644 --- a/src/widgets/data_dialog.rs +++ b/src/widgets/data_dialog.rs @@ -6,7 +6,6 @@ use super::MetadataItem; use adw::subclass::prelude::*; use glib::clone; -use gtk::subclass::prelude::*; use gtk::{self, prelude::*}; use gtk::{gio, glib, CompositeTemplate}; @@ -45,7 +44,7 @@ mod imp { fn new() -> Self { Self { model: gio::ListStore::new(MetadataItem::static_type()), - images_model: gtk::StringList::new(&[]), + images_model: gtk::StringList::default(), search: TemplateChild::default(), images_search: TemplateChild::default(), title: TemplateChild::default(), @@ -80,7 +79,7 @@ glib::wrapper! { impl DataDialog { pub fn new(data: &Data) -> Self { - let dialog: Self = glib::Object::new(&[]).expect("Failed to create DataDialog"); + let dialog: Self = glib::Object::builder().build(); dialog.set_metadata(&data); dialog.set_images(&data); @@ -89,21 +88,20 @@ impl DataDialog { } pub fn set_metadata(&self, data: &Data) { - let imp = imp::DataDialog::from_instance(self); - let stack = &*imp.stack; + let stack = &*self.imp().stack; let site_title = match &data.title { Some(title) => title.to_string(), None => data.url.to_string() }; - imp.title.set_label(&site_title); - imp.url.set_label(&data.url); + self.imp().title.set_label(&site_title); + self.imp().url.set_label(&data.url); // imp.model.remove_all(); // Remove previous model items // Add new items from HashMap: for (key, val) in data.get_metadata().iter() { let item = MetadataItem::new(&key, &val); - imp.model.append(&item); + self.imp().model.append(&item); } // Expressions and filters to get properties from MetadataItem: @@ -118,25 +116,28 @@ impl DataDialog { ) )); - // Group filters in one: - let filter = gtk::AnyFilter::new(); - filter.append(&key_filter); - filter.append(&value_filter); - - // Create new filterable model from ListStore and filter: - let filter_model = gtk::FilterListModel::new(Some(&imp.model), Some(&filter)); - filter_model.set_incremental(true); - // Bind search entry text with MetadataItem properties filters - imp.search.bind_property("text", &key_filter, "search") + self.imp().search.bind_property("text", &key_filter, "search") .flags(glib::BindingFlags::SYNC_CREATE) .build(); - imp.search.bind_property("text", &value_filter, "search") + self.imp().search.bind_property("text", &value_filter, "search") .flags(glib::BindingFlags::SYNC_CREATE) .build(); + // Group filters in one: + let filter = gtk::AnyFilter::new(); + filter.append(key_filter); + filter.append(value_filter); + + // Create new filterable model from ListStore and filter: + let filter_model = gtk::FilterListModel::builder() + .model(&self.imp().model) + .filter(&filter) + .incremental(true) + .build(); + // Bind model with ListBox - imp.list.bind_model( + self.imp().list.bind_model( Some(&filter_model), clone!(@weak self as self_ => @default-panic, move |item| { let item = item.downcast_ref::().expect("Couldn't get MetadataItem"); @@ -160,12 +161,11 @@ impl DataDialog { } pub fn set_images(&self, data: &Data) { - let imp = imp::DataDialog::from_instance(self); - let images_stack = &*imp.images_stack; + let images_stack = &*self.imp().images_stack; // Set images into the StringsList for image in &data.images { - imp.images_model.append(&image.url); + self.imp().images_model.append(&image.url); } // Create filter for the StringsList @@ -174,16 +174,20 @@ impl DataDialog { gtk::StringObject::static_type(), None::<>k::Expression>, "string" ) )); - let filter_model = gtk::FilterListModel::new(Some(&imp.images_model), Some(&filter)); - filter_model.set_incremental(true); + + let filter_model = gtk::FilterListModel::builder() + .model(&self.imp().images_model) + .filter(&filter) + .incremental(true) + .build(); // Bind search entry with filter - imp.images_search.bind_property("text", &filter, "search") + self.imp().images_search.bind_property("text", &filter, "search") .flags(glib::BindingFlags::SYNC_CREATE) .build(); // Bind model with ListBox - imp.images_list.bind_model( + self.imp().images_list.bind_model( Some(&filter_model), clone!(@weak self as self_ => @default-panic, move |item| { let item = item.downcast_ref::().expect("Couldn't get MetadataItem"); diff --git a/src/widgets/image.rs b/src/widgets/image.rs index 3ef8c56..5c02a6d 100644 --- a/src/widgets/image.rs +++ b/src/widgets/image.rs @@ -67,17 +67,15 @@ glib::wrapper! { impl CardImage { pub fn new() -> Self { - glib::Object::new(&[]).expect("Failed to create CardImage") + glib::Object::builder().build() } pub fn set_image(&self, img: &Image, size: &CardSize) { - let imp = imp::CardImage::from_instance(self); - // Get Widgets - let stack = imp.stack.clone(); - let spinner = imp.spinner.clone(); - let image = imp.image.clone(); - let error_message = imp.error_message.clone(); + let stack = self.imp().stack.clone(); + let spinner = self.imp().spinner.clone(); + let image = self.imp().image.clone(); + let error_message = self.imp().error_message.clone(); let (width, height) = size.image_size(); // Get image size @@ -116,16 +114,14 @@ impl CardImage { } pub fn set_fallback(&self, size: &CardSize) { - let imp = imp::CardImage::from_instance(self); - let (width, height) = size.image_size(); // Get image size // Set box widget size - imp.fallback_box.set_width_request(width as i32); - imp.fallback_box.set_height_request(height as i32); + self.imp().fallback_box.set_width_request(width as i32); + self.imp().fallback_box.set_height_request(height as i32); - imp.fallback_icon.set_pixel_size(size.icon_size()); + self.imp().fallback_icon.set_pixel_size(size.icon_size()); - imp.stack.set_visible_child_name("fallback"); + self.imp().stack.set_visible_child_name("fallback"); } } diff --git a/src/widgets/metadata_item.rs b/src/widgets/metadata_item.rs index 0eb7dbd..5f4d8c3 100644 --- a/src/widgets/metadata_item.rs +++ b/src/widgets/metadata_item.rs @@ -34,14 +34,18 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("key", "key", "Key", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("value", "value", "Value", None, glib::ParamFlags::READWRITE), + ParamSpecString::builder("key") + .default_value(None) + .build(), + ParamSpecString::builder("value") + .default_value(None) + .build() ] }); PROPERTIES.as_ref() } - fn set_property(&self, _obj: &Self::Type, _id: usize, value: &glib::Value, pspec: &ParamSpec) { + fn set_property(&self, _id: usize, value: &glib::Value, pspec: &ParamSpec) { match pspec.name() { "key" => { let key = value.get().unwrap(); @@ -55,7 +59,7 @@ mod imp { } } - fn property(&self, _obj: &Self::Type, _id: usize, pspec: &ParamSpec) -> glib::Value { + fn property(&self, _id: usize, pspec: &ParamSpec) -> glib::Value { match pspec.name() { "key" => self.key.borrow().to_value(), "value" => self.value.borrow().to_value(), @@ -71,9 +75,9 @@ glib::wrapper! { impl MetadataItem { pub fn new(key: &String, value: &String) -> Self { - glib::Object::new(&[ - ("key", &key), - ("value", &value) - ]).expect("Failed to create MetadataItem") + glib::Object::builder() + .property("key", &key) + .property("value", &value) + .build() } } diff --git a/src/window.rs b/src/window.rs index 0b77821..000131a 100644 --- a/src/window.rs +++ b/src/window.rs @@ -6,7 +6,6 @@ use crate::widgets::{CardBox, DataDialog}; use adw::subclass::prelude::*; use gettextrs::*; use glib::clone; -use gtk::subclass::prelude::*; use gtk::{self, prelude::*}; use gtk::{gio, glib, CompositeTemplate, EntryIconPosition}; use gtk_macros::{action, spawn}; @@ -84,8 +83,9 @@ mod imp { } impl ObjectImpl for SharePreviewWindow { - fn constructed(&self, obj: &Self::Type) { - self.parent_constructed(obj); + fn constructed(&self) { + let obj = self.obj(); + self.parent_constructed(); // Devel Profile if PROFILE == "Devel" { @@ -108,8 +108,7 @@ glib::wrapper! { impl SharePreviewWindow { pub fn new(app: &SharePreviewApplication) -> Self { - let window: Self = - glib::Object::new(&[]).expect("Failed to create SharePreviewWindow"); + let window: Self = glib::Object::builder().build(); window.set_application(Some(app)); // Set icons for shell @@ -125,21 +124,19 @@ impl SharePreviewWindow { } fn setup_widgets(&self) { - let imp = imp::SharePreviewWindow::from_instance(self); - imp.start_page.set_icon_name(Some(APP_ID)); + self.imp().start_page.set_icon_name(Some(APP_ID)); } fn setup_actions(&self) { - let imp = imp::SharePreviewWindow::from_instance(self); - let social = &*imp.social; - let url_box = &*imp.url_box; - let url_entry = &*imp.url_entry; - let url_error = &*imp.url_error; - let stack = &*imp.stack; - let spinner = &*imp.spinner; - let error_title = &*imp.error_title; - let error_message = &*imp.error_message; - let cardbox = &*imp.cardbox; + let social = &*self.imp().social; + let url_box = &*self.imp().url_box; + let url_entry = &*self.imp().url_entry; + let url_error = &*self.imp().url_error; + let stack = &*self.imp().stack; + let spinner = &*self.imp().spinner; + let error_title = &*self.imp().error_title; + let error_message = &*self.imp().error_message; + let cardbox = &*self.imp().cardbox; // Run action!( @@ -170,10 +167,8 @@ impl SharePreviewWindow { spawn!(async move { match scrape(&url).await { Ok(data) => { - let win_ = imp::SharePreviewWindow::from_instance(&win); - - win_.data.replace(data); - win_.active_url.replace(url.to_string()); + win.imp().data.replace(data); + win.imp().active_url.replace(url.to_string()); win.update_card(); stack.set_visible_child_name("card"); } @@ -214,8 +209,7 @@ impl SharePreviewWindow { self, "metadata", clone!(@weak self as win => move |_, _| { - let win_ = imp::SharePreviewWindow::from_instance(&win); - let data = win_.data.borrow(); + let data = win.imp().data.borrow(); let dialog = DataDialog::new(&data); dialog.set_transient_for(Some(&win)); @@ -225,10 +219,9 @@ impl SharePreviewWindow { } fn setup_signals(&self) { - let imp = imp::SharePreviewWindow::from_instance(self); - let url_entry = &*imp.url_entry; + let url_entry = &*self.imp().url_entry; - imp.color_scheme.connect_clicked( + self.imp().color_scheme.connect_clicked( clone!(@weak self as win => move |_| { let style_manager = adw::StyleManager::default(); if style_manager.is_dark() { @@ -239,13 +232,13 @@ impl SharePreviewWindow { }) ); - imp.url_entry.connect_activate( + self.imp().url_entry.connect_activate( clone!(@weak self as win => move |_| { WidgetExt::activate_action(&win, "win.run", None).unwrap(); }) ); - imp.url_entry.connect_icon_press( + self.imp().url_entry.connect_icon_press( clone!(@weak self as win => move |_, icon| { match icon { EntryIconPosition::Secondary => { @@ -256,7 +249,7 @@ impl SharePreviewWindow { }) ); - imp.url_entry.connect_changed( + self.imp().url_entry.connect_changed( clone!(@weak url_entry => move |_| { if url_entry.text().is_empty() { url_entry.set_icon_sensitive(EntryIconPosition::Secondary, false); @@ -266,12 +259,11 @@ impl SharePreviewWindow { }) ); - imp.social.connect_local( + self.imp().social.connect_local( "notify::selected", false, clone!(@weak self as win => @default-return None, move |_| { - let win_ = imp::SharePreviewWindow::from_instance(&win); - let active_url = win_.active_url.borrow().to_string(); + let active_url = win.imp().active_url.borrow().to_string(); if !active_url.is_empty() { win.update_card(); @@ -284,9 +276,8 @@ impl SharePreviewWindow { } pub fn update_card(&self) { - let imp = imp::SharePreviewWindow::from_instance(self); - let social = Self::get_social(&imp.social.selected()); - let data = imp.data.borrow(); + let social = Self::get_social(&self.imp().social.selected()); + let data = self.imp().data.borrow(); let card = data.get_card(social); let card = match card { @@ -294,12 +285,12 @@ impl SharePreviewWindow { Err(error) => CardBox::new_from_error(&error) }; - let old_card = imp.card.replace(Some(card)); + let old_card = self.imp().card.replace(Some(card)); if let Some(c) = old_card { - imp.cardbox.remove(&c); + self.imp().cardbox.remove(&c); } - imp.cardbox.prepend(imp.card.borrow().as_ref().unwrap()); + self.imp().cardbox.prepend(self.imp().card.borrow().as_ref().unwrap()); } fn get_social(i: &u32) -> Social {