diff --git a/Cargo.toml b/Cargo.toml index 98ee8cf..6cbd864 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,8 +5,8 @@ edition = "2021" description = "A wip universal Linux settings application." [dependencies] -reset_daemon = "0.1.9" -ReSet-Lib = "0.3.5" +reset_daemon = "0.2.3" +ReSet-Lib = "0.4.0" adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] } dbus = "0.9.7" gtk = { version = "0.7.3", package = "gtk4", features = ["v4_12"] } diff --git a/src/components/base/cardEntry.rs b/src/components/base/cardEntry.rs index c3948a6..4ecb67e 100644 --- a/src/components/base/cardEntry.rs +++ b/src/components/base/cardEntry.rs @@ -2,44 +2,48 @@ use std::time::Duration; use adw::glib; use adw::glib::Object; +use adw::prelude::{ComboRowExt, PreferencesRowExt}; use dbus::blocking::Connection; use dbus::Error; +use glib::{Cast, clone, ObjectExt, ToValue}; use glib::subclass::types::ObjectSubclassIsExt; -use glib::{clone, Cast}; -use gtk::{gio, StringObject}; +use gtk::{Align, gio, SignalListItemFactory, StringList, StringObject}; +use gtk::prelude::{GObjectPropertyExpressionExt, ListItemExt, WidgetExt}; use ReSet_Lib::audio::audio::Card; use super::cardEntryImpl; glib::wrapper! { pub struct CardEntry(ObjectSubclass) - @extends gtk::Box, gtk::Widget, - @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; + @extends adw::ComboRow, gtk::Widget, + @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable, adw::PreferencesRow; } impl CardEntry { pub fn new(card: Card) -> Self { - let entry: Self = Object::builder().build(); + let entry: CardEntry = Object::builder().build(); { let imp = entry.imp(); let mut map = imp.resetCardMap.borrow_mut(); - imp.resetCardName.set_text(&card.name); + entry.set_title(&card.name); let mut i: u32 = 0; let mut index: u32 = 0; + let list = StringList::new(&[]); for profile in card.profiles.iter() { if profile.name == card.active_profile { index = i; } - imp.resetCardList.append(&profile.description); + list.append(&profile.description); map.insert( profile.description.clone(), (card.index, profile.name.clone()), ); i += 1; } - imp.resetCardDropdown.set_selected(index); - imp.resetCardDropdown - .connect_selected_notify(clone!(@weak imp => move |dropdown| { + entry.set_model(Some(&list)); + entry.set_selected(index); + entry.set_use_subtitle(true); + entry.connect_selected_notify(clone!(@weak imp => move |dropdown| { let selected = dropdown.selected_item(); if selected.is_none() { return; @@ -51,6 +55,18 @@ impl CardEntry { let (device_index, profile_name) = map.get(&selected).unwrap(); set_card_profile_of_device(*device_index, profile_name.clone()); })); + + let factory = &SignalListItemFactory::new(); + factory.connect_setup(|_, item| { + let item = item.downcast_ref::().unwrap(); + let label = gtk::Label::new(None); + label.set_halign(Align::Start); + item.property_expression("item") + .chain_property::("string") + .bind(&label, "label", gtk::Widget::NONE); + item.set_child(Some(&label)); + }); + entry.set_factory(Some(factory)); } entry } diff --git a/src/components/base/cardEntryImpl.rs b/src/components/base/cardEntryImpl.rs index 476d088..df61a08 100644 --- a/src/components/base/cardEntryImpl.rs +++ b/src/components/base/cardEntryImpl.rs @@ -1,8 +1,12 @@ use std::cell::RefCell; use std::collections::HashMap; +use adw::ComboRow; +use adw::subclass::action_row::ActionRowImpl; +use adw::subclass::preferences_row::PreferencesRowImpl; +use adw::subclass::prelude::ComboRowImpl; use gtk::subclass::prelude::*; -use gtk::{glib, CompositeTemplate, DropDown, Label, StringList, TemplateChild}; +use gtk::{glib, CompositeTemplate}; use super::cardEntry; @@ -10,12 +14,6 @@ use super::cardEntry; #[derive(Default, CompositeTemplate)] #[template(resource = "/org/Xetibo/ReSet/resetCardEntry.ui")] pub struct CardEntry { - #[template_child] - pub resetCardName: TemplateChild