use gtk4::prelude::*; use gtk4::subclass::prelude::*; use gtk4::{gio, glib}; glib::wrapper! { pub struct PreferencesDialog(ObjectSubclass) @extends libadwaita::Dialog, gtk4::Widget, @implements gtk4::Accessible, gtk4::Buildable, gtk4::ConstraintTarget; } impl PreferencesDialog { pub fn new() -> Self { glib::Object::builder().build() } } pub mod imp { use super::*; use gtk4::CompositeTemplate; use libadwaita::subclass::prelude::*; #[derive(CompositeTemplate, Default)] #[template(resource = "/net/jeena/FeedTheMonkey/ui/preferences_dialog.ui")] pub struct PreferencesDialog { #[template_child] pub cache_images_row: TemplateChild, #[template_child] pub filters_text_view: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for PreferencesDialog { const NAME: &'static str = "PreferencesDialog"; type Type = super::PreferencesDialog; type ParentType = libadwaita::Dialog; fn class_init(klass: &mut Self::Class) { klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for PreferencesDialog { fn constructed(&self) { self.parent_constructed(); let settings = gio::Settings::new("net.jeena.FeedTheMonkey"); // Cache images switch self.cache_images_row.set_active(settings.boolean("cache-images")); let s = settings.clone(); self.cache_images_row.connect_active_notify(move |row| { s.set_boolean("cache-images", row.is_active()).ok(); }); // Content filters text view self.filters_text_view.buffer().set_text(&settings.string("content-filters")); let obj_weak = self.obj().downgrade(); self.filters_text_view.buffer().connect_changed(move |_| { if let Some(obj) = obj_weak.upgrade() { obj.imp().save_filters(); } }); } } impl PreferencesDialog { fn save_filters(&self) { let buf = self.filters_text_view.buffer(); let text = buf.text(&buf.start_iter(), &buf.end_iter(), false); let settings = gio::Settings::new("net.jeena.FeedTheMonkey"); settings.set_string("content-filters", &text).ok(); } } impl WidgetImpl for PreferencesDialog {} impl AdwDialogImpl for PreferencesDialog {} }