Add factory for dropdowns

Replace ListEntry with libadwaita components
This commit is contained in:
takotori 2023-11-21 14:21:56 +01:00
parent ba48f5ba33
commit babc0e8cc4
10 changed files with 182 additions and 307 deletions

View file

@ -2,44 +2,48 @@ use std::time::Duration;
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ComboRowExt, PreferencesRowExt};
use dbus::blocking::Connection;
use dbus::Error;
use glib::{Cast, clone};
use glib::subclass::types::ObjectSubclassIsExt;
use glib::{clone, Cast};
use gtk::{gio, StringObject};
use gtk::{Align, gio, SignalListItemFactory, StringList, StringObject};
use gtk::prelude::{GObjectPropertyExpressionExt, ListItemExt, WidgetExt};
use ReSet_Lib::audio::audio::Card;
use super::cardEntryImpl;
glib::wrapper! {
pub struct CardEntry(ObjectSubclass<cardEntryImpl::CardEntry>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
@extends adw::ComboRow, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable, adw::PreferencesRow;
}
impl CardEntry {
pub fn new(card: Card) -> Self {
let entry: Self = Object::builder().build();
let entry: CardEntry = Object::builder().build();
{
let imp = entry.imp();
let mut map = imp.resetCardMap.borrow_mut();
imp.resetCardName.set_text(&card.name);
entry.set_title(&card.name);
let mut i: u32 = 0;
let mut index: u32 = 0;
let list = StringList::new(&[]);
for profile in card.profiles.iter() {
if profile.name == card.active_profile {
index = i;
}
imp.resetCardList.append(&profile.description);
list.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| {
entry.set_model(Some(&list));
entry.set_selected(index);
entry.set_use_subtitle(true);
entry.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
return;
@ -51,6 +55,19 @@ impl CardEntry {
let (device_index, profile_name) = map.get(&selected).unwrap();
set_card_profile_of_device(*device_index, profile_name.clone());
}));
let factory = &SignalListItemFactory::new();
factory.connect_setup(|_, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let label = gtk::Label::new(None);
label.set_halign(Align::Start);
item.property_expression("item")
.chain_property::<StringObject>("string")
.bind(&label, "label", gtk::Widget::NONE);
item.set_child(Some(&label));
});
entry.set_factory(Some(factory));
}
entry
}

View file

@ -1,8 +1,12 @@
use std::cell::RefCell;
use std::collections::HashMap;
use adw::ComboRow;
use adw::subclass::action_row::ActionRowImpl;
use adw::subclass::preferences_row::PreferencesRowImpl;
use adw::subclass::prelude::ComboRowImpl;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate, DropDown, Label, StringList, TemplateChild};
use gtk::{glib, CompositeTemplate};
use super::cardEntry;
@ -10,12 +14,6 @@ use super::cardEntry;
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetCardEntry.ui")]
pub struct CardEntry {
#[template_child]
pub resetCardName: TemplateChild<Label>,
#[template_child]
pub resetCardDropdown: TemplateChild<DropDown>,
#[template_child]
pub resetCardList: TemplateChild<StringList>,
// first string is the alias name, the first return string is the index of the adapter and the
// second the name of the profile
pub resetCardMap: RefCell<HashMap<String, (u32, String)>>,
@ -25,7 +23,7 @@ pub struct CardEntry {
impl ObjectSubclass for CardEntry {
const NAME: &'static str = "resetCardEntry";
type Type = cardEntry::CardEntry;
type ParentType = gtk::Box;
type ParentType = ComboRow;
fn class_init(klass: &mut Self::Class) {
klass.bind_template();
@ -36,7 +34,11 @@ impl ObjectSubclass for CardEntry {
}
}
impl BoxImpl for CardEntry {}
impl ActionRowImpl for CardEntry {}
impl PreferencesRowImpl for CardEntry {}
impl ComboRowImpl for CardEntry {}
impl ObjectImpl for CardEntry {
fn constructed(&self) {}

View file

@ -1,6 +1,18 @@
use std::sync::Arc;
use std::time::{Duration, SystemTime};
use adw::glib;
use adw::glib::Object;
use adw::prelude::{BoxExt, ButtonExt, CheckButtonExt, ComboRowExt, ListBoxRowExt, PreferencesGroupExt, RangeExt};
use dbus::{Error, Path};
use dbus::blocking::Connection;
use dbus::message::SignalArgs;
use glib::{Cast, clone, Propagation, Variant};
use glib::subclass::prelude::ObjectSubclassIsExt;
use gtk::{Align, gio, SignalListItemFactory, StringObject};
use gtk::prelude::{ActionableExt, GObjectPropertyExpressionExt, WidgetExt, ListItemExt};
use ReSet_Lib::audio::audio::{Card, OutputStream, Source};
use crate::components::base::cardEntry::CardEntry;
use crate::components::base::listEntry::ListEntry;
use crate::components::base::utils::{
@ -9,17 +21,6 @@ use crate::components::base::utils::{
};
use crate::components::input::sourceBoxImpl;
use crate::components::input::sourceEntry::set_source_volume;
use adw::glib;
use adw::glib::Object;
use adw::prelude::{BoxExt, ButtonExt, CheckButtonExt, ListBoxRowExt, RangeExt};
use dbus::blocking::Connection;
use dbus::message::SignalArgs;
use dbus::{Error, Path};
use glib::subclass::prelude::ObjectSubclassIsExt;
use glib::{clone, Cast, Propagation, Variant};
use gtk::prelude::ActionableExt;
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::{Card, OutputStream, Source};
use super::outputStreamEntry::OutputStreamEntry;
use super::sourceEntry::{set_default_source, toggle_source_mute, SourceEntry};
@ -40,12 +41,14 @@ impl SourceBox {
pub fn setupCallbacks(&self) {
let selfImp = self.imp();
selfImp.resetSourceRow.set_activatable(true);
selfImp
.resetSourceRow
.set_action_name(Some("navigation.push"));
selfImp
.resetSourceRow
.set_action_target_value(Some(&Variant::from("sources")));
selfImp.resetCardsRow.set_activatable(true);
selfImp
.resetCardsRow
.set_action_name(Some("navigation.push"));
@ -58,6 +61,19 @@ impl SourceBox {
selfImp
.resetInputCardsBackButton
.set_action_name(Some("navigation.pop"));
let factory = &SignalListItemFactory::new();
factory.connect_setup(|_, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let label = gtk::Label::new(None);
label.set_halign(Align::Start);
item.property_expression("item")
.chain_property::<StringObject>("string")
.bind(&label, "label", gtk::Widget::NONE);
item.set_child(Some(&label));
});
selfImp.resetSourceDropdown.set_factory(Some(factory));
}
}
@ -230,7 +246,7 @@ pub fn populate_cards(input_box: Arc<SourceBox>) {
let imp = output_box_ref.imp();
for card in cards {
imp.resetCards
.append(&ListEntry::new(&CardEntry::new(card)));
.add(&CardEntry::new(card));
}
});
});

View file

@ -2,6 +2,7 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use std::time::SystemTime;
use adw::{ActionRow, ComboRow, PreferencesGroup};
use crate::components::base::listEntry::ListEntry;
use crate::components::input::sourceBox;
@ -18,11 +19,11 @@ use super::sourceEntry::SourceEntry;
#[template(resource = "/org/Xetibo/ReSet/resetAudioInput.ui")]
pub struct SourceBox {
#[template_child]
pub resetSourceRow: TemplateChild<ListEntry>,
pub resetSourceRow: TemplateChild<ActionRow>,
#[template_child]
pub resetCardsRow: TemplateChild<ListEntry>,
pub resetCardsRow: TemplateChild<ActionRow>,
#[template_child]
pub resetSourceDropdown: TemplateChild<DropDown>,
pub resetSourceDropdown: TemplateChild<ComboRow>,
#[template_child]
pub resetSourceMute: TemplateChild<Button>,
#[template_child]
@ -40,7 +41,7 @@ pub struct SourceBox {
#[template_child]
pub resetInputCardsBackButton: TemplateChild<ListEntry>,
#[template_child]
pub resetCards: TemplateChild<gtk::Box>,
pub resetCards: TemplateChild<PreferencesGroup>,
pub resetDefaultCheckButton: Arc<CheckButton>,
pub resetDefaultSource: Arc<RefCell<Source>>,
pub resetSourceList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SourceEntry>, String)>>>,

View file

@ -1,27 +1,30 @@
use adw::prelude::PreferencesGroupExt;
use std::sync::Arc;
use std::time::{Duration, SystemTime};
use adw::{glib, prelude::ListBoxRowExt};
use adw::glib::Object;
use adw::prelude::{BoxExt, ButtonExt, CheckButtonExt, ComboRowExt, RangeExt};
use dbus::{Error, Path};
use dbus::blocking::Connection;
use dbus::message::SignalArgs;
use glib::{Cast, clone, Propagation, Variant};
use glib::subclass::prelude::ObjectSubclassIsExt;
use gtk::{Align, gio, SignalListItemFactory, StringObject};
use gtk::prelude::*;
use gtk::prelude::{ActionableExt, GObjectPropertyExpressionExt, ListItemExt};
use ReSet_Lib::audio::audio::{Card, InputStream, Sink};
use crate::components::base::cardEntry::CardEntry;
use crate::components::base::listEntry::ListEntry;
use crate::components::base::utils::{
InputStreamAdded, InputStreamChanged, InputStreamRemoved, SinkAdded, SinkChanged, SinkRemoved,
};
use crate::components::output::sinkEntry::set_sink_volume;
use adw::glib::Object;
use adw::prelude::{BoxExt, ButtonExt, CheckButtonExt, RangeExt};
use adw::{glib, prelude::ListBoxRowExt};
use dbus::blocking::Connection;
use dbus::message::SignalArgs;
use dbus::{Error, Path};
use glib::subclass::prelude::ObjectSubclassIsExt;
use glib::{clone, Cast, Propagation, Variant};
use gtk::prelude::ActionableExt;
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::{Card, InputStream, Sink};
use super::inputStreamEntry::InputStreamEntry;
use super::sinkBoxImpl;
use super::sinkEntry::{set_default_sink, toggle_sink_mute, SinkEntry};
use super::sinkEntry::{set_default_sink, SinkEntry, toggle_sink_mute};
glib::wrapper! {
pub struct SinkBox(ObjectSubclass<sinkBoxImpl::SinkBox>)
@ -45,12 +48,14 @@ impl SinkBox {
pub fn setupCallbacks(&self) {
let selfImp = self.imp();
selfImp.resetSinksRow.set_activatable(true);
selfImp
.resetSinksRow
.set_action_name(Some("navigation.push"));
selfImp
.resetSinksRow
.set_action_target_value(Some(&Variant::from("outputDevices")));
selfImp.resetCardsRow.set_activatable(true);
selfImp
.resetCardsRow
.set_action_name(Some("navigation.push"));
@ -65,6 +70,19 @@ impl SinkBox {
selfImp
.resetInputCardsBackButton
.set_action_name(Some("navigation.pop"));
let factory = &SignalListItemFactory::new();
factory.connect_setup(|_, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let label = gtk::Label::new(None);
label.set_halign(Align::Start);
item.property_expression("item")
.chain_property::<StringObject>("string")
.bind(&label, "label", gtk::Widget::NONE);
item.set_child(Some(&label));
});
selfImp.resetSinkDropdown.set_factory(Some(factory));
}
}
@ -236,7 +254,7 @@ pub fn populate_cards(output_box: Arc<SinkBox>) {
let imp = output_box_ref.imp();
for card in cards {
imp.resetCards
.append(&ListEntry::new(&CardEntry::new(card)));
.add(&CardEntry::new(card));
}
});
});

View file

@ -2,6 +2,7 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use std::time::SystemTime;
use adw::{ActionRow, ComboRow, PreferencesGroup};
use crate::components::base::listEntry::ListEntry;
use crate::components::output::inputStreamEntry::InputStreamEntry;
@ -20,11 +21,11 @@ use super::sinkEntry::SinkEntry;
#[template(resource = "/org/Xetibo/ReSet/resetAudioOutput.ui")]
pub struct SinkBox {
#[template_child]
pub resetSinksRow: TemplateChild<ListEntry>,
pub resetSinksRow: TemplateChild<ActionRow>,
#[template_child]
pub resetCardsRow: TemplateChild<ListEntry>,
pub resetCardsRow: TemplateChild<ActionRow>,
#[template_child]
pub resetSinkDropdown: TemplateChild<DropDown>,
pub resetSinkDropdown: TemplateChild<ComboRow>,
#[template_child]
pub resetSinkMute: TemplateChild<Button>,
#[template_child]
@ -42,7 +43,7 @@ pub struct SinkBox {
#[template_child]
pub resetInputCardsBackButton: TemplateChild<ListEntry>,
#[template_child]
pub resetCards: TemplateChild<Box>,
pub resetCards: TemplateChild<PreferencesGroup>,
pub resetDefaultCheckButton: Arc<CheckButton>,
pub resetDefaultSink: Arc<RefCell<Sink>>,
pub resetSinkList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>,

View file

@ -23,62 +23,29 @@
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkListBox">
<property name="css-classes">boxed-list</property>
<property name="margin-bottom">10</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<property name="show-separators">True</property>
<property name="valign">start</property>
<object class="AdwPreferencesGroup">
<child>
<object class="resetListBoxRow" id="resetSourceRow">
<object class="AdwComboRow" id="resetSourceDropdown">
<property name="title">Input Device</property>
<property name="use-subtitle">True</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetSourceRow">
<property name="title">Devices</property>
<child>
<object class="GtkBox">
<property name="height-request">40</property>
<property name="margin-start">5</property>
<child>
<object class="GtkLabel">
<property name="label">Input Device</property>
</object>
</child>
<child>
<object class="GtkDropDown" id="resetSourceDropdown">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="icon-name">go-previous-symbolic-rtl</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
</object>
</child>
<object class="GtkImage">
<property name="icon-name">go-previous-symbolic-rtl</property>
</object>
</child>
</object>
</child>
<child>
<object class="resetListBoxRow" id="resetCardsRow">
<object class="AdwActionRow" id="resetCardsRow">
<property name="title">Profile Settings</property>
<child>
<object class="GtkBox">
<property name="height-request">40</property>
<child>
<object class="GtkLabel">
<property name="label">Profile Settings</property>
<property name="margin-start">5</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="icon-name">go-previous-symbolic-rtl</property>
<property name="margin-end">5</property>
</object>
</child>
<object class="GtkImage">
<property name="icon-name">go-previous-symbolic-rtl</property>
</object>
</child>
</object>
@ -257,17 +224,8 @@
<object class="GtkLabel"/>
</child>
<child>
<object class="GtkBox" id="resetCards">
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">10</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label">Devices</property>
</object>
</child>
<object class="AdwPreferencesGroup" id="resetCards">
<property name="title">Devices</property>
</object>
</child>
</object>

View file

@ -23,62 +23,29 @@
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkListBox">
<property name="css-classes">boxed-list</property>
<property name="margin-bottom">10</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<property name="show-separators">True</property>
<property name="valign">start</property>
<object class="AdwPreferencesGroup">
<child>
<object class="resetListBoxRow" id="resetSinksRow">
<object class="AdwComboRow" id="resetSinkDropdown">
<property name="title">Output Device</property>
<property name="use-subtitle">True</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetSinksRow">
<property name="title">Devices</property>
<child>
<object class="GtkBox">
<property name="height-request">40</property>
<property name="margin-start">5</property>
<child>
<object class="GtkLabel">
<property name="label">Output Device</property>
</object>
</child>
<child>
<object class="GtkDropDown" id="resetSinkDropdown">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="icon-name">go-previous-symbolic-rtl</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
</object>
</child>
<object class="GtkImage">
<property name="icon-name">go-previous-symbolic-rtl</property>
</object>
</child>
</object>
</child>
<child>
<object class="resetListBoxRow" id="resetCardsRow">
<object class="AdwActionRow" id="resetCardsRow">
<property name="title">Profile Settings</property>
<child>
<object class="GtkBox">
<property name="height-request">40</property>
<child>
<object class="GtkLabel">
<property name="label">Profile Settings</property>
<property name="margin-start">5</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="icon-name">go-previous-symbolic-rtl</property>
<property name="margin-end">5</property>
</object>
</child>
<object class="GtkImage">
<property name="icon-name">go-previous-symbolic-rtl</property>
</object>
</child>
</object>
@ -259,20 +226,11 @@
<child>
<object class="GtkLabel"/>
</child>
<child>
<object class="GtkBox" id="resetCards">
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">10</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label">Devices</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetCards">
<property name="title">Devices</property>
</object>
</child>
</object>

View file

@ -1,34 +1,8 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gtk" version="4.12"/>
<template class="resetCardEntry" parent="GtkBox">
<property name="margin-bottom">5</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="margin-bottom">5</property>
<child>
<object class="GtkLabel" id="resetCardName">
<property name="label">text</property>
<property name="margin-start">5</property>
<property name="wrap">True</property>
</object>
</child>
<child>
<object class="GtkDropDown" id="resetCardDropdown">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="hexpand-set">True</property>
<property name="model">
<object class="GtkStringList" id="resetCardList"/>
</property>
</object>
</child>
</object>
</child>
</template>
<requires lib="libadwaita" version="1.4"/>
<object class="AdwComboRow" id="resetCardEntry">
<property name="use-subtitle">True</property>
</object>
</interface>

View file

@ -18,7 +18,7 @@
(17,1,None,"resetSavedWifiEntry.ui",None,None,None,None,None,None,None),
(18,1,None,"resetSinkEntry.ui",None,None,None,None,None,None,None),
(19,1,None,"resetSourceEntry.ui",None,None,None,None,None,None,None),
(20,1,None,"resetCardEntry.ui",None,None,None,None,None,None,None),
(20,None,None,"resetCardEntry.ui",None,None,None,None,None,None,None),
(21,1,None,"resetWifiOptions.ui",None,None,None,None,None,None,None),
(22,1,None,"resetWifiAddressEntry.ui",None,None,None,None,None,None,None),
(23,1,None,"resetWifiRouteEntry.ui",None,None,None,None,None,None,None)
@ -118,12 +118,6 @@
(8,56,"GtkBox",None,55,None,None,None,None,None),
(8,71,"AdwNavigationPage",None,54,None,None,None,1,None),
(8,72,"GtkBox",None,71,None,None,None,None,None),
(8,73,"GtkListBox",None,56,None,None,None,None,None),
(8,74,"resetListBoxRow","resetSinksRow",73,None,None,None,None,None),
(8,75,"GtkBox",None,74,None,None,None,None,None),
(8,76,"GtkLabel",None,75,None,None,None,None,None),
(8,77,"GtkDropDown","resetSinkDropdown",75,None,None,None,1,None),
(8,78,"GtkImage",None,75,None,None,None,2,None),
(8,81,"GtkLabel",None,72,None,None,None,1,None),
(8,85,"GtkBox","resetInputStreams",56,None,None,None,4,None),
(8,86,"GtkLabel",None,85,None,None,None,None,None),
@ -150,12 +144,13 @@
(8,121,"GtkLabel",None,120,None,None,None,None,None),
(8,122,"GtkImage",None,120,None,None,None,1,None),
(8,123,"GtkLabel",None,117,None,None,None,1,None),
(8,124,"GtkBox","resetCards",117,None,None,None,2,None),
(8,125,"GtkLabel",None,124,None,None,None,None,None),
(8,126,"resetListBoxRow","resetCardsRow",73,None,None,None,1,None),
(8,127,"GtkBox",None,126,None,None,None,None,None),
(8,128,"GtkLabel",None,127,None,None,None,None,None),
(8,129,"GtkImage",None,127,None,None,None,1,None),
(8,130,"AdwPreferencesGroup",None,56,None,None,None,None,None),
(8,131,"AdwComboRow","resetSinkDropdown",130,None,None,None,None,None),
(8,132,"AdwActionRow","resetSinksRow",130,None,None,None,1,None),
(8,133,"GtkImage",None,132,None,None,None,None,None),
(8,134,"AdwActionRow","resetCardsRow",130,None,None,None,2,None),
(8,135,"GtkImage",None,134,None,None,None,None,None),
(8,136,"AdwPreferencesGroup","resetCards",116,None,None,None,1,None),
(10,1,"GtkBox","resetBluetooth",None,None,None,None,None,None),
(10,119,"AdwNavigationView",None,1,None,None,None,1,None),
(10,120,"AdwNavigationPage",None,119,None,None,None,None,None),
@ -201,20 +196,14 @@
(12,13,"AdwNavigationView",None,11,None,None,None,1,None),
(12,14,"AdwNavigationPage",None,13,None,None,None,None,None),
(12,15,"GtkBox",None,14,None,None,None,None,None),
(12,16,"GtkListBox",None,15,None,None,None,None,None),
(12,17,"resetListBoxRow","resetSourceRow",16,None,None,None,None,None),
(12,18,"GtkBox",None,17,None,None,None,None,None),
(12,19,"GtkLabel",None,18,None,None,None,None,None),
(12,20,"GtkDropDown","resetSourceDropdown",18,None,None,None,1,None),
(12,21,"GtkImage",None,18,None,None,None,2,None),
(12,22,"GtkBox",None,15,None,None,None,1,None),
(12,22,"GtkBox",None,15,None,None,None,2,None),
(12,23,"GtkBox",None,22,None,None,None,None,None),
(12,24,"GtkButton","resetSourceMute",23,None,None,None,None,None),
(12,25,"GtkScale","resetVolumeSlider",23,None,None,None,1,None),
(12,27,"GtkLabel","resetVolumePercentage",23,None,None,None,2,None),
(12,28,"GtkProgressBar","resetVolumeMeter",22,None,None,None,1,None),
(12,29,"GtkSeparator",None,15,None,None,None,2,None),
(12,30,"GtkBox","resetOutputStreams",15,None,None,None,3,None),
(12,29,"GtkSeparator",None,15,None,None,None,3,None),
(12,30,"GtkBox","resetOutputStreams",15,None,None,None,4,None),
(12,31,"GtkLabel",None,30,None,None,None,None,None),
(12,34,"AdwNavigationPage",None,13,None,None,None,1,None),
(12,42,"GtkBox",None,34,None,None,None,None,None),
@ -234,12 +223,13 @@
(12,57,"GtkLabel",None,56,None,None,None,None,None),
(12,58,"GtkImage",None,56,None,None,None,1,None),
(12,59,"GtkLabel",None,53,None,None,None,1,None),
(12,60,"GtkBox","resetCards",53,None,None,None,2,None),
(12,61,"GtkLabel",None,60,None,None,None,None,None),
(12,62,"resetListBoxRow","resetCardsRow",16,None,None,None,1,None),
(12,63,"GtkBox",None,62,None,None,None,None,None),
(12,64,"GtkLabel",None,63,None,None,None,None,None),
(12,65,"GtkImage",None,63,None,None,None,1,None),
(12,66,"AdwPreferencesGroup","resetCards",53,None,None,None,2,None),
(12,67,"AdwPreferencesGroup",None,15,None,None,None,None,None),
(12,68,"AdwComboRow","resetSourceDropdown",67,None,None,None,-1,None),
(12,69,"AdwActionRow","resetSourceRow",67,None,None,None,-1,None),
(12,70,"AdwActionRow","resetCardsRow",67,None,None,None,2,None),
(12,71,"GtkImage",None,69,None,None,None,-1,None),
(12,72,"GtkImage",None,70,None,None,None,None,None),
(13,11,"GtkBox","resetOutputStreamEntry",None,None,None,None,None,None),
(13,12,"GtkBox",None,11,None,None,None,None,None),
(13,13,"GtkLabel","resetSourceName",12,None,None,None,None,None),
@ -282,11 +272,7 @@
(19,9,"GtkLabel","resetVolumePercentage",5,None,None,None,2,None),
(19,10,"GtkProgressBar","resetVolumeMeter",1,None,None,None,2,None),
(19,12,"GtkAdjustment",None,7,None,None,None,-1,None),
(20,1,"GtkBox","resetCardEntry",None,None,None,None,None,None),
(20,2,"GtkBox",None,1,None,None,None,None,None),
(20,3,"GtkLabel","resetCardName",2,None,None,None,None,None),
(20,5,"GtkDropDown","resetCardDropdown",2,None,None,None,1,None),
(20,6,"GtkStringList","resetCardList",5,None,None,None,-1,None),
(20,2,"AdwComboRow","resetCardEntry",None,None,None,None,None,None),
(21,1,"AdwNavigationPage","resetWifiOptions",None,None,None,None,-1,None),
(21,2,"GtkNotebook",None,1,None,None,None,-1,None),
(21,5,"GtkBox",None,2,None,None,None,None,None),
@ -561,22 +547,6 @@
(8,56,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(8,71,"AdwNavigationPage","tag","outputDevices",None,None,None,None,None,None,None,None,None),
(8,72,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(8,73,"GtkListBox","show-separators","True",None,None,None,None,None,None,None,None,None),
(8,73,"GtkWidget","css-classes","boxed-list",None,None,None,None,None,None,None,None,None),
(8,73,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(8,73,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(8,73,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(8,73,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(8,73,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(8,75,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
(8,75,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(8,76,"GtkLabel","label","Output Device",None,None,None,None,None,None,None,None,None),
(8,77,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(8,77,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(8,77,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
(8,78,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(8,78,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(8,78,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(8,85,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(8,85,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
(8,86,"GtkLabel","label","Output Streams",None,None,None,None,None,None,None,None,None),
@ -638,19 +608,13 @@
(8,122,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(8,122,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(8,122,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(8,124,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(8,124,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(8,124,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(8,124,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
(8,125,"GtkLabel","label","Devices",None,None,None,None,None,None,None,None,None),
(8,125,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(8,127,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
(8,128,"GtkLabel","label","Profile Settings",None,None,None,None,None,None,None,None,None),
(8,128,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(8,129,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(8,129,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(8,129,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(8,129,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(8,131,"AdwComboRow","use-subtitle","True",None,None,None,None,None,None,None,None,None),
(8,131,"AdwPreferencesRow","title","Output Device",None,None,None,None,None,None,None,None,None),
(8,132,"AdwPreferencesRow","title","Devices",None,None,None,None,None,None,None,None,None),
(8,133,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(8,134,"AdwPreferencesRow","title","Profile Settings",None,None,None,None,None,None,None,None,None),
(8,135,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(8,136,"AdwPreferencesGroup","title","Devices",None,None,None,None,None,None,None,None,None),
(10,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,1,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,120,"AdwNavigationPage","tag","main",None,None,None,None,None,None,None,None,None),
@ -762,22 +726,6 @@
(12,12,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(12,14,"AdwNavigationPage","tag","output",None,None,None,None,None,None,None,None,None),
(12,15,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(12,16,"GtkListBox","show-separators","True",None,None,None,None,None,None,None,None,None),
(12,16,"GtkWidget","css-classes","boxed-list",None,None,None,None,None,None,None,None,None),
(12,16,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(12,16,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(12,16,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(12,16,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(12,16,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(12,18,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
(12,18,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(12,19,"GtkLabel","label","Input Device",None,None,None,None,None,None,None,None,None),
(12,20,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(12,20,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(12,20,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
(12,21,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(12,21,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(12,21,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(12,22,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(12,22,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(12,22,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
@ -841,19 +789,13 @@
(12,58,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(12,58,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(12,58,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(12,60,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(12,60,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(12,60,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(12,60,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
(12,61,"GtkLabel","label","Devices",None,None,None,None,None,None,None,None,None),
(12,61,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(12,63,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
(12,64,"GtkLabel","label","Profile Settings",None,None,None,None,None,None,None,None,None),
(12,64,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(12,65,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(12,65,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(12,65,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(12,65,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(12,66,"AdwPreferencesGroup","title","Devices",None,None,None,None,None,None,None,None,None),
(12,68,"AdwComboRow","use-subtitle","True",None,None,None,None,None,None,None,None,None),
(12,68,"AdwPreferencesRow","title","Input Device",None,None,None,None,None,None,None,None,None),
(12,69,"AdwPreferencesRow","title","Devices",None,None,None,None,None,None,None,None,None),
(12,70,"AdwPreferencesRow","title","Profile Settings",None,None,None,None,None,None,None,None,None),
(12,71,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(12,72,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(13,11,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(13,11,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(13,11,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
@ -966,19 +908,7 @@
(19,12,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
(19,12,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
(19,12,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
(20,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(20,1,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(20,1,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(20,1,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(20,1,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(20,2,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(20,3,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
(20,3,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
(20,3,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(20,5,"GtkDropDown","model",None,None,None,None,None,6,None,None,None,None),
(20,5,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(20,5,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(20,5,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
(20,2,"AdwComboRow","use-subtitle","True",None,None,None,None,None,None,None,None,None),
(21,2,"GtkNotebook","scrollable","True",None,None,None,None,None,None,None,None,None),
(21,2,"GtkNotebook","show-border","False",None,None,None,None,None,None,None,None,None),
(21,5,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),