From babc0e8cc42206cc6b3994634867de15e64c4495 Mon Sep 17 00:00:00 2001 From: takotori Date: Tue, 21 Nov 2023 14:21:56 +0100 Subject: [PATCH] Add factory for dropdowns Replace ListEntry with libadwaita components --- src/components/base/cardEntry.rs | 37 +++++-- src/components/base/cardEntryImpl.rs | 20 ++-- src/components/input/sourceBox.rs | 40 +++++--- src/components/input/sourceBoxImpl.rs | 9 +- src/components/output/sinkBox.rs | 44 +++++--- src/components/output/sinkBoxImpl.rs | 9 +- src/resources/resetAudioInput.ui | 76 ++++---------- src/resources/resetAudioOutput.ui | 82 ++++----------- src/resources/resetCardEntry.ui | 34 +------ src/resources/resetUI.cmb | 138 +++++++------------------- 10 files changed, 182 insertions(+), 307 deletions(-) diff --git a/src/components/base/cardEntry.rs b/src/components/base/cardEntry.rs index c3948a6..9db049e 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}; 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,19 @@ 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