diff --git a/Cargo.toml b/Cargo.toml index e56a067..a51490f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ description = "A wip universal Linux settings application." [dependencies] reset_daemon = "0.1.8" -ReSet-Lib = "0.2.8" +ReSet-Lib = "0.3.4" 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 new file mode 100644 index 0000000..c3948a6 --- /dev/null +++ b/src/components/base/cardEntry.rs @@ -0,0 +1,74 @@ +use std::time::Duration; + +use adw::glib; +use adw::glib::Object; +use dbus::blocking::Connection; +use dbus::Error; +use glib::subclass::types::ObjectSubclassIsExt; +use glib::{clone, Cast}; +use gtk::{gio, StringObject}; +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; +} + +impl CardEntry { + pub fn new(card: Card) -> Self { + let entry: Self = Object::builder().build(); + { + let imp = entry.imp(); + let mut map = imp.resetCardMap.borrow_mut(); + imp.resetCardName.set_text(&card.name); + let mut i: u32 = 0; + let mut index: u32 = 0; + for profile in card.profiles.iter() { + if profile.name == card.active_profile { + index = i; + } + imp.resetCardList.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| { + let selected = dropdown.selected_item(); + if selected.is_none() { + return; + } + let selected = selected.unwrap(); + let selected = selected.downcast_ref::().unwrap(); + let selected = selected.string().to_string(); + let map = imp.resetCardMap.borrow(); + let (device_index, profile_name) = map.get(&selected).unwrap(); + set_card_profile_of_device(*device_index, profile_name.clone()); + })); + } + entry + } +} + +fn set_card_profile_of_device(device_index: u32, profile_name: String) -> bool { + gio::spawn_blocking(move || { + let conn = Connection::new_session().unwrap(); + let proxy = conn.with_proxy( + "org.xetibo.ReSet", + "/org/xetibo/ReSet", + Duration::from_millis(1000), + ); + let _: Result<(), Error> = proxy.method_call( + "org.xetibo.ReSet", + "SetCardProfileOfDevice", + (device_index, profile_name), + ); + }); + true +} diff --git a/src/components/base/cardEntryImpl.rs b/src/components/base/cardEntryImpl.rs new file mode 100644 index 0000000..673d20a --- /dev/null +++ b/src/components/base/cardEntryImpl.rs @@ -0,0 +1,52 @@ +use std::cell::RefCell; +use std::collections::HashMap; + +use crate::components::base::listEntry::ListEntry; +use gtk::subclass::prelude::*; +use gtk::{glib, CompositeTemplate, TemplateChild, Label, DropDown, StringList}; + +use super::cardEntry; + +#[allow(non_snake_case)] +#[derive(Default, CompositeTemplate)] +#[template(resource = "/org/Xetibo/ReSet/resetCardEntry.ui")] +pub struct CardEntry { + #[template_child] + pub resetCardName: TemplateChild