diff --git a/Cargo.toml b/Cargo.toml index 96602b3..2a8cbf1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ tokio = { version = "1.33.0", features = [ "sync", ] } fork = "0.1.22" +regex = "1.10.2" [build-dependencies] glib-build-tools = "0.18.0" diff --git a/src/components/base/cardEntry.rs b/src/components/base/cardEntry.rs index 6f0ce9d..804acac 100644 --- a/src/components/base/cardEntry.rs +++ b/src/components/base/cardEntry.rs @@ -5,12 +5,15 @@ use adw::glib::Object; use adw::prelude::{ComboRowExt, PreferencesRowExt}; use dbus::blocking::Connection; use dbus::Error; -use glib::{Cast, clone, ObjectExt}; +use glib::{Cast, clone}; use glib::subclass::types::ObjectSubclassIsExt; -use gtk::{Align, gio, SignalListItemFactory, StringList, StringObject}; -use gtk::prelude::{GObjectPropertyExpressionExt, ListItemExt, WidgetExt}; +use gtk::{gio, StringList, StringObject}; use ReSet_Lib::audio::audio::Card; +use components::utils::createDropdownLabelFactory; + +use crate::components; + use super::cardEntryImpl; glib::wrapper! { @@ -55,18 +58,7 @@ 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.set_factory(Some(&createDropdownLabelFactory())); } entry } diff --git a/src/components/input/outputStreamEntry.rs b/src/components/input/outputStreamEntry.rs index b47ed21..9e1e231 100644 --- a/src/components/input/outputStreamEntry.rs +++ b/src/components/input/outputStreamEntry.rs @@ -3,20 +3,21 @@ use std::time::{Duration, SystemTime}; use adw::glib; use adw::glib::Object; -use adw::prelude::{ButtonExt, RangeExt}; +use adw::prelude::{ButtonExt, ComboRowExt, PreferencesRowExt, RangeExt}; use dbus::blocking::Connection; use dbus::Error; use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, Cast, Propagation}; use gtk::{gio, StringObject}; use ReSet_Lib::audio::audio::OutputStream; +use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use super::outputStreamEntryImpl; use super::sourceBox::SourceBox; glib::wrapper! { pub struct OutputStreamEntry(ObjectSubclass) - @extends gtk::Box, gtk::Widget, + @extends adw::PreferencesGroup, gtk::Widget, @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; } @@ -31,7 +32,9 @@ impl OutputStreamEntry { let box_imp = source_box.imp(); let imp = obj.imp(); let name = stream.application_name.clone() + ": " + stream.name.as_str(); - imp.resetSourceName.set_text(name.as_str()); + imp.resetSourceSelection.set_title(name.as_str()); + imp.resetSourceSelection.set_factory(Some(&createDropdownLabelFactory())); + setComboRowEllipsis(imp.resetSourceSelection.get()); let volume = stream.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; @@ -69,7 +72,7 @@ impl OutputStreamEntry { // list = box_imp.resetModelList.try_borrow(); // } // let list = list.unwrap(); - imp.resetSelectedSource.set_model(Some(&*list)); + imp.resetSourceSelection.set_model(Some(&*list)); let map = box_imp.resetSourceMap.write().unwrap(); // while map.is_err() { // map = box_imp.resetSourceMap.try_borrow(); @@ -83,10 +86,10 @@ impl OutputStreamEntry { let name = &name.alias; let index = map.get(name); if index.is_some() { - imp.resetSelectedSource.set_selected(index.unwrap().1); + imp.resetSourceSelection.set_selected(index.unwrap().1); } } - imp.resetSelectedSource.connect_selected_notify( + imp.resetSourceSelection.connect_selected_notify( clone!(@weak imp, @weak box_imp => move |dropdown| { let selected = dropdown.selected_item(); if selected.is_none() { diff --git a/src/components/input/outputStreamEntryImpl.rs b/src/components/input/outputStreamEntryImpl.rs index 641db53..0bc4359 100644 --- a/src/components/input/outputStreamEntryImpl.rs +++ b/src/components/input/outputStreamEntryImpl.rs @@ -1,6 +1,8 @@ use std::cell::RefCell; use std::sync::Arc; use std::time::SystemTime; +use adw::{ComboRow, PreferencesGroup}; +use adw::subclass::prelude::PreferencesGroupImpl; use crate::components::input::outputStreamEntry; use gtk::subclass::prelude::*; @@ -12,9 +14,7 @@ use ReSet_Lib::audio::audio::OutputStream; #[template(resource = "/org/Xetibo/ReSet/resetOutputStreamEntry.ui")] pub struct OutputStreamEntry { #[template_child] - pub resetSourceName: TemplateChild