feat: Add dropdowns

This commit is contained in:
Fabio Lenherr / DashieTM 2023-11-15 14:50:00 +01:00
parent c619284146
commit 0c286af82c
13 changed files with 297 additions and 54 deletions

View file

@ -10,14 +10,14 @@ use adw::{glib, prelude::ListBoxRowExt};
use dbus::blocking::Connection;
use dbus::Error;
use glib::subclass::prelude::ObjectSubclassIsExt;
use glib::{clone, Propagation, Variant};
use gtk::gio;
use glib::{clone, Cast, Propagation, Variant};
use gtk::prelude::ActionableExt;
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::{InputStream, Sink};
use super::inputStreamEntry::InputStreamEntry;
use super::sinkBoxImpl;
use super::sinkEntry::{toggle_sink_mute, SinkEntry};
use super::sinkEntry::{set_default_sink, toggle_sink_mute, SinkEntry};
glib::wrapper! {
pub struct SinkBox(ObjectSubclass<sinkBoxImpl::SinkBox>)
@ -51,20 +51,28 @@ impl SinkBox {
pub fn populate_sinks(output_box: Arc<SinkBox>) {
gio::spawn_blocking(move || {
let output_box_ref = output_box.clone();
let sinks = get_sinks();
{
let output_box_imp = output_box.imp();
output_box_imp.resetDefaultSink.replace(get_default_sink());
let list = output_box_imp.resetModelList.borrow_mut();
let mut map = output_box_imp.resetSinkMap.borrow_mut();
let mut i: u32 = 0;
for sink in sinks.iter() {
dbg!(sink.clone());
list.append(&sink.alias);
map.insert(sink.alias.clone(), (sink.index, i, sink.name.clone()));
i += 1;
}
}
let sinks = get_sinks();
glib::spawn_future(async move {
glib::idle_add_once(move || {
// TODO handle default mapping
let output_box_ref_slider = output_box.clone();
let output_box_ref_mute = output_box.clone();
{
let output_box_imp = output_box_ref.imp();
let default_sink = output_box_imp.resetDefaultSink.clone(); // Clone outside closure
let sink = default_sink.borrow(); //
let default_sink = output_box_imp.resetDefaultSink.clone();
let sink = default_sink.borrow();
let volume = sink.volume.first().unwrap_or_else(|| &(0 as u32));
let fraction = (*volume as f64 / 655.36).round();
@ -72,15 +80,48 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
output_box_imp.resetVolumePercentage.set_text(&percentage);
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
for stream in sinks {
// TODO create sink handler -> currently only allows input streams
let mut is_default = false;
if output_box_imp.resetDefaultSink.borrow().name == stream.name {
is_default = true;
}
let entry = ListEntry::new(&SinkEntry::new(is_default, output_box_imp.resetDefaultCheckButton.clone(), stream));
let entry = ListEntry::new(&SinkEntry::new(
is_default,
output_box_imp.resetDefaultCheckButton.clone(),
stream,
));
entry.set_activatable(false);
output_box_imp.resetSinks.append(&entry);
}
let list = output_box_imp.resetModelList.borrow();
output_box_imp.resetSinkDropdown.set_model(Some(&*list));
let map = output_box_imp.resetSinkMap.borrow();
let name = output_box_imp.resetDefaultSink.borrow();
let name = &name.alias;
let index = map.get(name);
if index.is_some() {
output_box_imp
.resetSinkDropdown
.set_selected(index.unwrap().1);
}
output_box_imp.resetSinkDropdown.connect_selected_notify(
clone!(@weak output_box_imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
return;
}
let selected = selected.unwrap();
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let sink = output_box_imp.resetSinkMap.borrow();
let sink = sink.get(&selected);
if sink.is_none() {
return;
}
let sink = Arc::new(sink.unwrap().2.clone());
set_default_sink(sink);
}),
);
}
output_box_ref
.imp()
@ -121,13 +162,9 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
});
}
pub fn populate_inputstreams(listeners: Arc<Listeners>, output_box: Arc<SinkBox>) {
pub fn populate_inputstreams(_listeners: Arc<Listeners>, output_box: Arc<SinkBox>) {
// TODO add listener
let output_box_ref = output_box.clone();
// let output_box_ref_listener = output_box.clone();
let output_box_imp = output_box.imp();
// let sources = output_box_imp.resetSinks.clone();
// let output_streams = output_box_imp.resetInputStreams.clone();
gio::spawn_blocking(move || {
let streams = get_input_streams();
@ -135,7 +172,7 @@ pub fn populate_inputstreams(listeners: Arc<Listeners>, output_box: Arc<SinkBox>
glib::idle_add_once(move || {
let output_box_imp = output_box_ref.imp();
for stream in streams {
let entry = ListEntry::new(&InputStreamEntry::new(stream));
let entry = ListEntry::new(&InputStreamEntry::new(output_box.clone(), stream));
entry.set_activatable(false);
output_box_imp.resetInputStreams.append(&entry);
}