From 9108ab0d744b5b596303cd03ee9d13cf481997f6 Mon Sep 17 00:00:00 2001 From: Fabio Lenherr / DashieTM Date: Sat, 18 Nov 2023 22:15:09 +0100 Subject: [PATCH] feat: Add initial Bluetooth functionality --- Cargo.toml | 2 +- src/components/base/cardEntry.rs | 74 +++++++++++ src/components/base/cardEntryImpl.rs | 52 ++++++++ src/components/base/listEntryImpl.rs | 4 +- src/components/base/mod.rs | 2 + src/components/bluetooth/bluetoothBox.rs | 133 ++++++++++++++++++-- src/components/output/sinkBox.rs | 44 ++++++- src/components/output/sinkBoxImpl.rs | 6 + src/components/window/handleSidebarClick.rs | 10 +- src/resources/resetAudioOutput.ui | 84 +++++++++++++ src/resources/resetCardEntry.ui | 34 +++++ src/resources/resetCards.ui | 20 +++ src/resources/resetUI.cmb | 68 +++++++++- src/resources/resources.gresource.xml | 1 + 14 files changed, 514 insertions(+), 20 deletions(-) create mode 100644 src/components/base/cardEntry.rs create mode 100644 src/components/base/cardEntryImpl.rs create mode 100644 src/resources/resetCardEntry.ui create mode 100644 src/resources/resetCards.ui 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