mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-12-15 10:01:39 +01:00
feat: Add dropdowns
This commit is contained in:
parent
c619284146
commit
0c286af82c
13 changed files with 297 additions and 54 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue