diff --git a/Cargo.toml b/Cargo.toml index 2cdc7a3..98ee8cf 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.7" -ReSet-Lib = "0.2.8" +reset_daemon = "0.1.9" +ReSet-Lib = "0.3.5" 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/flatpak/cargo-sources.json b/flatpak/cargo-sources.json index 9ff0d58..6e6723d 100644 --- a/flatpak/cargo-sources.json +++ b/flatpak/cargo-sources.json @@ -2,14 +2,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/ReSet-Lib/ReSet-Lib-0.2.8.crate", - "sha256": "6761097b3d41653f8ad3b265625c840b6c415282ba20a0491fe6a7a7e817873a", - "dest": "cargo/vendor/ReSet-Lib-0.2.8" + "url": "https://static.crates.io/crates/ReSet-Lib/ReSet-Lib-0.3.5.crate", + "sha256": "a0f2428f460a6604b353461d8244b3ce8841adcd964a2165cd2f9b975462b19d", + "dest": "cargo/vendor/ReSet-Lib-0.3.5" }, { "type": "inline", - "contents": "{\"package\": \"6761097b3d41653f8ad3b265625c840b6c415282ba20a0491fe6a7a7e817873a\", \"files\": {}}", - "dest": "cargo/vendor/ReSet-Lib-0.2.8", + "contents": "{\"package\": \"a0f2428f460a6604b353461d8244b3ce8841adcd964a2165cd2f9b975462b19d\", \"files\": {}}", + "dest": "cargo/vendor/ReSet-Lib-0.3.5", "dest-filename": ".cargo-checksum.json" }, { @@ -1042,14 +1042,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/reset_daemon/reset_daemon-0.1.7.crate", - "sha256": "f7b48ba0698bdb4ead119140a557346907b40ae17cac324687a032b4d6ea9851", - "dest": "cargo/vendor/reset_daemon-0.1.7" + "url": "https://static.crates.io/crates/reset_daemon/reset_daemon-0.1.9.crate", + "sha256": "ff35f2cbd703c80a77a53458e7a3c32ccba9c73b7b8ce65924cdbe291d960f58", + "dest": "cargo/vendor/reset_daemon-0.1.9" }, { "type": "inline", - "contents": "{\"package\": \"f7b48ba0698bdb4ead119140a557346907b40ae17cac324687a032b4d6ea9851\", \"files\": {}}", - "dest": "cargo/vendor/reset_daemon-0.1.7", + "contents": "{\"package\": \"ff35f2cbd703c80a77a53458e7a3c32ccba9c73b7b8ce65924cdbe291d960f58\", \"files\": {}}", + "dest": "cargo/vendor/reset_daemon-0.1.9", "dest-filename": ".cargo-checksum.json" }, { 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..476d088 --- /dev/null +++ b/src/components/base/cardEntryImpl.rs @@ -0,0 +1,51 @@ +use std::cell::RefCell; +use std::collections::HashMap; + +use gtk::subclass::prelude::*; +use gtk::{glib, CompositeTemplate, DropDown, Label, StringList, TemplateChild}; + +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