mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-18 18:48:33 +02:00
feat: Add initial Bluetooth functionality
This commit is contained in:
parent
03fc3790c0
commit
9108ab0d74
|
@ -6,7 +6,7 @@ description = "A wip universal Linux settings application."
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
reset_daemon = "0.1.8"
|
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"] }
|
adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] }
|
||||||
dbus = "0.9.7"
|
dbus = "0.9.7"
|
||||||
gtk = { version = "0.7.3", package = "gtk4", features = ["v4_12"] }
|
gtk = { version = "0.7.3", package = "gtk4", features = ["v4_12"] }
|
||||||
|
|
74
src/components/base/cardEntry.rs
Normal file
74
src/components/base/cardEntry.rs
Normal file
|
@ -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<cardEntryImpl::CardEntry>)
|
||||||
|
@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::<StringObject>().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
|
||||||
|
}
|
52
src/components/base/cardEntryImpl.rs
Normal file
52
src/components/base/cardEntryImpl.rs
Normal file
|
@ -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<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)>>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[glib::object_subclass]
|
||||||
|
impl ObjectSubclass for CardEntry {
|
||||||
|
const NAME: &'static str = "resetCardEntry";
|
||||||
|
type Type = cardEntry::CardEntry;
|
||||||
|
type ParentType = gtk::Box;
|
||||||
|
|
||||||
|
fn class_init(klass: &mut Self::Class) {
|
||||||
|
klass.bind_template();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {
|
||||||
|
obj.init_template();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoxImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl ObjectImpl for CardEntry {
|
||||||
|
fn constructed(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ListBoxRowImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl WidgetImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl WindowImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl ApplicationWindowImpl for CardEntry {}
|
|
@ -1,6 +1,8 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::components::base::listEntry;
|
use crate::components::base::listEntry;
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, CompositeTemplate};
|
use gtk::{glib, CompositeTemplate, DropDown, Label, StringList};
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
|
|
@ -5,3 +5,5 @@ pub mod listEntryImpl;
|
||||||
pub mod popup;
|
pub mod popup;
|
||||||
pub mod popupImpl;
|
pub mod popupImpl;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
pub mod cardEntry;
|
||||||
|
pub mod cardEntryImpl;
|
||||||
|
|
|
@ -1,13 +1,24 @@
|
||||||
|
use std::sync::atomic::Ordering;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::message::SignalArgs;
|
||||||
|
use dbus::{Error, Path};
|
||||||
|
use gtk::gio;
|
||||||
use gtk::glib::Variant;
|
use gtk::glib::Variant;
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
|
use ReSet_Lib::signals::{BluetoothDeviceAdded, BluetoothDeviceRemoved};
|
||||||
|
|
||||||
|
use crate::components::base::listEntry::ListEntry;
|
||||||
|
use crate::components::base::utils::Listeners;
|
||||||
use crate::components::bluetooth::bluetoothBoxImpl;
|
use crate::components::bluetooth::bluetoothBoxImpl;
|
||||||
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
|
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
|
||||||
use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes;
|
use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct BluetoothBox(ObjectSubclass<bluetoothBoxImpl::BluetoothBox>)
|
pub struct BluetoothBox(ObjectSubclass<bluetoothBoxImpl::BluetoothBox>)
|
||||||
|
@ -15,6 +26,9 @@ glib::wrapper! {
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for BluetoothBox {}
|
||||||
|
unsafe impl Sync for BluetoothBox {}
|
||||||
|
|
||||||
impl BluetoothBox {
|
impl BluetoothBox {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Object::builder().build()
|
Object::builder().build()
|
||||||
|
@ -22,19 +36,37 @@ impl BluetoothBox {
|
||||||
|
|
||||||
pub fn setupCallbacks(&self) {
|
pub fn setupCallbacks(&self) {
|
||||||
let selfImp = self.imp();
|
let selfImp = self.imp();
|
||||||
selfImp.resetVisibility.set_action_name(Some("navigation.push"));
|
selfImp
|
||||||
selfImp.resetVisibility.set_action_target_value(Some(&Variant::from("visibility")));
|
.resetVisibility
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetVisibility
|
||||||
|
.set_action_target_value(Some(&Variant::from("visibility")));
|
||||||
|
|
||||||
selfImp.resetBluetoothMainTab.set_action_name(Some("navigation.pop"));
|
selfImp
|
||||||
|
.resetBluetoothMainTab
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn scanForDevices(&self) {
|
pub fn scanForDevices(&self) {
|
||||||
let selfImp = self.imp();
|
let selfImp = self.imp();
|
||||||
let mut wifiEntries = selfImp.availableDevices.borrow_mut();
|
let mut wifiEntries = selfImp.availableDevices.borrow_mut();
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Mouse, "ina mouse")));
|
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Keyboard, "inaboard")));
|
DeviceTypes::Mouse,
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Controller, "ina controller")));
|
"ina mouse",
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Controller, "ina best waifu")));
|
)));
|
||||||
|
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
|
DeviceTypes::Keyboard,
|
||||||
|
"inaboard",
|
||||||
|
)));
|
||||||
|
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
|
DeviceTypes::Controller,
|
||||||
|
"ina controller",
|
||||||
|
)));
|
||||||
|
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
|
DeviceTypes::Controller,
|
||||||
|
"ina best waifu",
|
||||||
|
)));
|
||||||
|
|
||||||
for wifiEntry in wifiEntries.iter() {
|
for wifiEntry in wifiEntries.iter() {
|
||||||
selfImp.resetBluetoothAvailableDevices.append(wifiEntry);
|
selfImp.resetBluetoothAvailableDevices.append(wifiEntry);
|
||||||
|
@ -44,11 +76,90 @@ impl BluetoothBox {
|
||||||
pub fn addConnectedDevices(&self) {
|
pub fn addConnectedDevices(&self) {
|
||||||
let selfImp = self.imp();
|
let selfImp = self.imp();
|
||||||
let mut wifiEntries = selfImp.connectedDevices.borrow_mut();
|
let mut wifiEntries = selfImp.connectedDevices.borrow_mut();
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Mouse, "why are we still here?")));
|
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Keyboard, "just to suffer?")));
|
DeviceTypes::Mouse,
|
||||||
|
"why are we still here?",
|
||||||
|
)));
|
||||||
|
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
|
DeviceTypes::Keyboard,
|
||||||
|
"just to suffer?",
|
||||||
|
)));
|
||||||
|
|
||||||
for wifiEntry in wifiEntries.iter() {
|
for wifiEntry in wifiEntries.iter() {
|
||||||
selfImp.resetBluetoothConnectedDevices.append(wifiEntry);
|
selfImp.resetBluetoothConnectedDevices.append(wifiEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<BluetoothBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
if listeners.bluetooth_listener.load(Ordering::SeqCst) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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", "StartBluetoothSearch", (5000,));
|
||||||
|
let device_added = BluetoothDeviceAdded::match_rule(
|
||||||
|
Some(&"org.xetibo.ReSet".into()),
|
||||||
|
Some(&Path::from("/org/xetibo/ReSet")),
|
||||||
|
)
|
||||||
|
.static_clone();
|
||||||
|
let device_removed = BluetoothDeviceRemoved::match_rule(
|
||||||
|
Some(&"org.xetibo.ReSet".into()),
|
||||||
|
Some(&Path::from("/org/xetibo/ReSet")),
|
||||||
|
)
|
||||||
|
.static_clone();
|
||||||
|
let device_added_box = bluetooth_box.clone();
|
||||||
|
let device_removed_box = bluetooth_box.clone();
|
||||||
|
|
||||||
|
let res = conn.add_match(device_added, move |ir: BluetoothDeviceAdded, _, _| {
|
||||||
|
let bluetooth_box = device_added_box.clone();
|
||||||
|
println!("added");
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
});
|
||||||
|
});
|
||||||
|
true
|
||||||
|
});
|
||||||
|
if res.is_err() {
|
||||||
|
println!("fail on bluetooth device add");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = conn.add_match(device_removed, move |ir: BluetoothDeviceRemoved, _, _| {
|
||||||
|
let bluetooth_box = device_removed_box.clone();
|
||||||
|
println!("removed");
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
});
|
||||||
|
});
|
||||||
|
true
|
||||||
|
});
|
||||||
|
if res.is_err() {
|
||||||
|
println!("fail on bluetooth device remove");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners.bluetooth_listener.store(true, Ordering::SeqCst);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let _ = conn.process(Duration::from_millis(1000));
|
||||||
|
if !listeners.bluetooth_listener.load(Ordering::SeqCst) {
|
||||||
|
println!("stopping bluetooth listener");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
thread::sleep(Duration::from_millis(100));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ use std::sync::atomic::Ordering;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
|
use crate::components::base::cardEntry::CardEntry;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::base::utils::{
|
use crate::components::base::utils::{
|
||||||
InputStreamAdded, InputStreamChanged, InputStreamRemoved, Listeners, SinkAdded, SinkChanged,
|
InputStreamAdded, InputStreamChanged, InputStreamRemoved, Listeners, SinkAdded, SinkChanged,
|
||||||
|
@ -18,7 +19,7 @@ use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use glib::{clone, Cast, Propagation, Variant};
|
use glib::{clone, Cast, Propagation, Variant};
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
use gtk::{gio, StringObject};
|
use gtk::{gio, StringObject};
|
||||||
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
use ReSet_Lib::audio::audio::{Card, InputStream, Sink};
|
||||||
|
|
||||||
use super::inputStreamEntry::InputStreamEntry;
|
use super::inputStreamEntry::InputStreamEntry;
|
||||||
use super::sinkBoxImpl;
|
use super::sinkBoxImpl;
|
||||||
|
@ -52,10 +53,20 @@ impl SinkBox {
|
||||||
selfImp
|
selfImp
|
||||||
.resetSinksRow
|
.resetSinksRow
|
||||||
.set_action_target_value(Some(&Variant::from("outputDevices")));
|
.set_action_target_value(Some(&Variant::from("outputDevices")));
|
||||||
|
selfImp
|
||||||
|
.resetCardsRow
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetCardsRow
|
||||||
|
.set_action_target_value(Some(&Variant::from("profileConfiguration")));
|
||||||
|
selfImp.resetCardsRow.connect_action_name_notify(|_| {});
|
||||||
|
|
||||||
selfImp
|
selfImp
|
||||||
.resetInputStreamButton
|
.resetInputStreamButton
|
||||||
.set_action_name(Some("navigation.pop"));
|
.set_action_name(Some("navigation.pop"));
|
||||||
|
selfImp
|
||||||
|
.resetInputCardsBackButton
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +95,7 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
populate_inputstreams(output_box.clone());
|
populate_inputstreams(output_box.clone());
|
||||||
|
populate_cards(output_box.clone());
|
||||||
glib::spawn_future(async move {
|
glib::spawn_future(async move {
|
||||||
glib::idle_add_once(move || {
|
glib::idle_add_once(move || {
|
||||||
let output_box_ref_slider = output_box.clone();
|
let output_box_ref_slider = output_box.clone();
|
||||||
|
@ -217,6 +229,22 @@ pub fn populate_inputstreams(output_box: Arc<SinkBox>) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn populate_cards(output_box: Arc<SinkBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let output_box_ref = output_box.clone();
|
||||||
|
let cards = get_cards();
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let imp = output_box_ref.imp();
|
||||||
|
for card in cards {
|
||||||
|
imp.resetCards
|
||||||
|
.append(&ListEntry::new(&CardEntry::new(card)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn get_input_streams() -> Vec<InputStream> {
|
fn get_input_streams() -> Vec<InputStream> {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
|
@ -260,6 +288,20 @@ fn get_default_sink() -> Sink {
|
||||||
res.unwrap().0
|
res.unwrap().0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_cards() -> Vec<Card> {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(Vec<Card>,), Error> = proxy.method_call("org.xetibo.ReSet", "ListCards", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
pub fn start_output_box_listener(
|
pub fn start_output_box_listener(
|
||||||
conn: Connection,
|
conn: Connection,
|
||||||
listeners: Arc<Listeners>,
|
listeners: Arc<Listeners>,
|
||||||
|
|
|
@ -22,6 +22,8 @@ pub struct SinkBox {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinksRow: TemplateChild<ListEntry>,
|
pub resetSinksRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
pub resetCardsRow: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
pub resetSinkDropdown: TemplateChild<DropDown>,
|
pub resetSinkDropdown: TemplateChild<DropDown>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinkMute: TemplateChild<Button>,
|
pub resetSinkMute: TemplateChild<Button>,
|
||||||
|
@ -37,6 +39,10 @@ pub struct SinkBox {
|
||||||
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetInputStreams: TemplateChild<Box>,
|
pub resetInputStreams: TemplateChild<Box>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetInputCardsBackButton: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetCards: TemplateChild<Box>,
|
||||||
pub resetDefaultCheckButton: Arc<CheckButton>,
|
pub resetDefaultCheckButton: Arc<CheckButton>,
|
||||||
pub resetDefaultSink: Arc<RefCell<Sink>>,
|
pub resetDefaultSink: Arc<RefCell<Sink>>,
|
||||||
pub resetSinkList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>,
|
pub resetSinkList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>,
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use crate::components::base::settingBox::SettingBox;
|
use crate::components::base::settingBox::SettingBox;
|
||||||
use crate::components::base::utils::{start_event_listener, Listeners};
|
use crate::components::base::utils::{start_event_listener, Listeners};
|
||||||
use crate::components::bluetooth::bluetoothBox::BluetoothBox;
|
use crate::components::bluetooth::bluetoothBox::{start_bluetooth_listener, BluetoothBox};
|
||||||
use crate::components::input::sourceBox::{populate_sources, SourceBox};
|
use crate::components::input::sourceBox::{populate_sources, SourceBox};
|
||||||
use crate::components::output::sinkBox::{populate_sinks, SinkBox};
|
use crate::components::output::sinkBox::{populate_sinks, SinkBox};
|
||||||
use crate::components::wifi::wifiBox::{scanForWifi, show_stored_connections, WifiBox};
|
use crate::components::wifi::wifiBox::{scanForWifi, show_stored_connections, WifiBox};
|
||||||
|
@ -18,7 +18,9 @@ pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
show_stored_connections(wifiBox.clone());
|
show_stored_connections(wifiBox.clone());
|
||||||
scanForWifi(listeners.clone(), wifiBox.clone());
|
scanForWifi(listeners.clone(), wifiBox.clone());
|
||||||
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
||||||
let bluetoothFrame = wrapInFrame(SettingBox::new(&BluetoothBox::new()));
|
let bluetooth_box = Arc::new(BluetoothBox::new());
|
||||||
|
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
|
||||||
|
let bluetoothFrame = wrapInFrame(SettingBox::new(&*bluetooth_box));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&wifiFrame, -1);
|
resetMain.insert(&wifiFrame, -1);
|
||||||
resetMain.insert(&bluetoothFrame, -1);
|
resetMain.insert(&bluetoothFrame, -1);
|
||||||
|
@ -41,7 +43,9 @@ pub const HANDLE_BLUETOOTH_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
||||||
let bluetoothFrame = wrapInFrame(SettingBox::new(&BluetoothBox::new()));
|
let bluetooth_box = Arc::new(BluetoothBox::new());
|
||||||
|
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
|
||||||
|
let bluetoothFrame = wrapInFrame(SettingBox::new(&*bluetooth_box));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&bluetoothFrame, -1);
|
resetMain.insert(&bluetoothFrame, -1);
|
||||||
resetMain.set_max_children_per_line(1);
|
resetMain.set_max_children_per_line(1);
|
||||||
|
|
|
@ -60,6 +60,29 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="resetListBoxRow" id="resetCardsRow">
|
||||||
|
<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>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
@ -193,6 +216,67 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwNavigationPage">
|
||||||
|
<property name="tag">profileConfiguration</property>
|
||||||
|
<child>
|
||||||
|
<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>
|
||||||
|
<child>
|
||||||
|
<object class="resetListBoxRow" id="resetInputCardsBackButton">
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="height-request">40</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label">Output Streams</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</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<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">Output Devices</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</template>
|
</template>
|
||||||
|
|
34
src/resources/resetCardEntry.ui
Normal file
34
src/resources/resetCardEntry.ui
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?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>
|
||||||
|
</interface>
|
20
src/resources/resetCards.ui
Normal file
20
src/resources/resetCards.ui
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Created with Cambalache 0.17.0 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk" version="4.0"/>
|
||||||
|
<template class="resetCards" parent="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox" id="resetCardList">
|
||||||
|
<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>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
|
@ -17,7 +17,8 @@
|
||||||
(16,6,None,"resetPopup.ui",None,None,None,None,None,None,None),
|
(16,6,None,"resetPopup.ui",None,None,None,None,None,None,None),
|
||||||
(17,1,None,"resetSavedWifiEntry.ui",None,None,None,None,None,None,None),
|
(17,1,None,"resetSavedWifiEntry.ui",None,None,None,None,None,None,None),
|
||||||
(18,1,None,"resetSinkEntry.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)
|
(19,1,None,"resetSourceEntry.ui",None,None,None,None,None,None,None),
|
||||||
|
(20,1,None,"resetCardEntry.ui",None,None,None,None,None,None,None)
|
||||||
</ui>
|
</ui>
|
||||||
<object>
|
<object>
|
||||||
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," <child>\n <object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\">\n </object>\n </child>"),
|
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," <child>\n <object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\">\n </object>\n </child>"),
|
||||||
|
@ -134,6 +135,20 @@
|
||||||
(8,112,"GtkLabel",None,111,None,None,None,None,None),
|
(8,112,"GtkLabel",None,111,None,None,None,None,None),
|
||||||
(8,113,"GtkImage",None,111,None,None,None,1,None),
|
(8,113,"GtkImage",None,111,None,None,None,1,None),
|
||||||
(8,115,"GtkAdjustment",None,99,None,None,None,-1,None),
|
(8,115,"GtkAdjustment",None,99,None,None,None,-1,None),
|
||||||
|
(8,116,"AdwNavigationPage",None,54,None,None,None,2,None),
|
||||||
|
(8,117,"GtkBox",None,116,None,None,None,None,None),
|
||||||
|
(8,118,"GtkListBox",None,117,None,None,None,None,None),
|
||||||
|
(8,119,"resetListBoxRow","resetInputCardsBackButton",118,None,None,None,None,None),
|
||||||
|
(8,120,"GtkBox",None,119,None,None,None,None,None),
|
||||||
|
(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),
|
||||||
(10,1,"GtkBox","resetBluetooth",None,None,None,None,None,None),
|
(10,1,"GtkBox","resetBluetooth",None,None,None,None,None,None),
|
||||||
(10,119,"AdwNavigationView",None,1,None,None,None,1,None),
|
(10,119,"AdwNavigationView",None,1,None,None,None,1,None),
|
||||||
(10,120,"AdwNavigationPage",None,119,None,None,None,None,None),
|
(10,120,"AdwNavigationPage",None,119,None,None,None,None,None),
|
||||||
|
@ -243,7 +258,12 @@
|
||||||
(19,7,"GtkScale","resetVolumeSlider",5,None,None,None,1,None),
|
(19,7,"GtkScale","resetVolumeSlider",5,None,None,None,1,None),
|
||||||
(19,9,"GtkLabel","resetVolumePercentage",5,None,None,None,2,None),
|
(19,9,"GtkLabel","resetVolumePercentage",5,None,None,None,2,None),
|
||||||
(19,10,"GtkProgressBar","resetVolumeMeter",1,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)
|
(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)
|
||||||
</object>
|
</object>
|
||||||
<object_property>
|
<object_property>
|
||||||
(3,1,"GtkWidget","height-request","200",None,None,None,None,None,None,None,None,None),
|
(3,1,"GtkWidget","height-request","200",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -521,6 +541,35 @@
|
||||||
(8,115,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(8,115,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(8,115,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(8,115,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(8,115,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
(8,115,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,116,"AdwNavigationPage","tag","profileConfiguration",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,117,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkListBox","show-separators","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","css-classes","boxed-list",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,120,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,121,"GtkLabel","label","Output Streams",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,121,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,122,"GtkImage","icon-name","go-previous-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(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","Output 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),
|
||||||
(10,1,"GtkOrientable","orientation","vertical",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,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),
|
(10,120,"AdwNavigationPage","tag","main",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -794,7 +843,20 @@
|
||||||
(19,10,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
(19,10,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
(19,12,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(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","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)
|
(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)
|
||||||
</object_property>
|
</object_property>
|
||||||
<object_data>
|
<object_data>
|
||||||
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),
|
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),
|
||||||
|
|
|
@ -17,5 +17,6 @@
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetSinkEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetSinkEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetSourceEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetSourceEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
|
||||||
|
<file compressed="true" preprocess="xml-stripblanks">resetCardEntry.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|
Loading…
Reference in a new issue