Merge pull request #71 from Xetibo/dashie

chore: snake_case all
This commit is contained in:
Dashie 2023-12-05 16:26:39 +01:00 committed by GitHub
commit 512cba018b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
74 changed files with 2046 additions and 2019 deletions

View file

@ -10,14 +10,14 @@ use glib::{clone, Cast};
use gtk::{gio, StringList, StringObject};
use ReSet_Lib::audio::audio::Card;
use components::utils::createDropdownLabelFactory;
use components::utils::create_dropdown_label_factory;
use crate::components;
use super::cardEntryImpl;
use super::card_entry_impl;
glib::wrapper! {
pub struct CardEntry(ObjectSubclass<cardEntryImpl::CardEntry>)
pub struct CardEntry(ObjectSubclass<card_entry_impl::CardEntry>)
@extends adw::ComboRow, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable, adw::PreferencesRow;
}
@ -27,7 +27,7 @@ impl CardEntry {
let entry: CardEntry = Object::builder().build();
{
let imp = entry.imp();
let mut map = imp.resetCardMap.borrow_mut();
let mut map = imp.reset_card_map.borrow_mut();
entry.set_title(&card.name);
let mut index: u32 = 0;
let list = StringList::new(&[]);
@ -52,11 +52,11 @@ impl CardEntry {
let selected = selected.unwrap();
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let map = imp.resetCardMap.borrow();
let map = imp.reset_card_map.borrow();
let (device_index, profile_name) = map.get(&selected).unwrap();
set_card_profile_of_device(*device_index, profile_name.clone());
}));
entry.set_factory(Some(&createDropdownLabelFactory()));
entry.set_factory(Some(&create_dropdown_label_factory()));
}
entry
}

View file

@ -8,22 +8,21 @@ use std::collections::HashMap;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate};
use super::cardEntry;
use super::card_entry;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetCardEntry.ui")]
pub struct CardEntry {
// 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)>>,
pub reset_card_map: RefCell<HashMap<String, (u32, String)>>,
}
#[glib::object_subclass]
impl ObjectSubclass for CardEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetCardEntry";
type Type = cardEntry::CardEntry;
type Type = card_entry::CardEntry;
type ParentType = ComboRow;
fn class_init(klass: &mut Self::Class) {

View file

@ -1,11 +1,11 @@
use crate::components::base::listEntryImpl;
use crate::components::base::list_entry_impl;
use adw::glib;
use adw::glib::{IsA, Object};
use gtk::prelude::ListBoxRowExt;
use gtk::Widget;
glib::wrapper! {
pub struct ListEntry(ObjectSubclass<listEntryImpl::ListEntry>)
pub struct ListEntry(ObjectSubclass<list_entry_impl::ListEntry>)
@extends gtk::ListBoxRow, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Actionable;
}

View file

@ -1,8 +1,7 @@
use crate::components::base::listEntry;
use crate::components::base::list_entry;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate};
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetListBoxRow.ui")]
pub struct ListEntry {}
@ -11,7 +10,7 @@ pub struct ListEntry {}
impl ObjectSubclass for ListEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetListBoxRow";
type Type = listEntry::ListEntry;
type Type = list_entry::ListEntry;
type ParentType = gtk::ListBoxRow;
fn class_init(klass: &mut Self::Class) {

View file

@ -1,9 +1,9 @@
pub mod cardEntry;
pub mod cardEntryImpl;
pub mod listEntry;
pub mod listEntryImpl;
pub mod card_entry;
pub mod card_entry_impl;
pub mod list_entry;
pub mod list_entry_impl;
pub mod popup;
pub mod popupImpl;
pub mod settingBox;
pub mod settingBoxImpl;
pub mod popup_impl;
pub mod setting_box;
pub mod setting_box_impl;
pub mod utils;

View file

@ -2,10 +2,10 @@ use adw::glib;
use adw::glib::Object;
use gtk::{gdk, Editable, Popover};
use super::popupImpl;
use super::popup_impl;
glib::wrapper! {
pub struct Popup(ObjectSubclass<popupImpl::Popup>)
pub struct Popup(ObjectSubclass<popup_impl::Popup>)
@extends Popover, gtk::Widget,
@implements Editable,gdk::Popup, gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}

View file

@ -6,17 +6,16 @@ use gtk::{glib, Button, CompositeTemplate, Label, PasswordEntry, PasswordEntryBu
use super::popup;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetPopup.ui")]
pub struct Popup {
#[template_child]
pub resetPopupLabel: TemplateChild<Label>,
pub reset_popup_label: TemplateChild<Label>,
#[template_child]
pub resetPopupEntry: TemplateChild<PasswordEntry>,
pub reset_popup_entry: TemplateChild<PasswordEntry>,
#[template_child]
pub resetPopupButton: TemplateChild<Button>,
pub resetPopupText: Arc<RefCell<PasswordEntryBuffer>>,
pub reset_popup_button: TemplateChild<Button>,
pub reset_popup_text: Arc<RefCell<PasswordEntryBuffer>>,
}
unsafe impl Send for Popup {}

View file

@ -1,11 +1,11 @@
use crate::components::base::settingBoxImpl;
use crate::components::base::setting_box_impl;
use adw::glib;
use adw::glib::{IsA, Object};
use gtk::prelude::BoxExt;
use gtk::Widget;
glib::wrapper! {
pub struct SettingBox(ObjectSubclass<settingBoxImpl::SettingBox>)
pub struct SettingBox(ObjectSubclass<setting_box_impl::SettingBox>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget;
}

View file

@ -1,8 +1,7 @@
use crate::components::base::settingBox;
use crate::components::base::setting_box;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate};
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetSettingBox.ui")]
pub struct SettingBox {}
@ -11,7 +10,7 @@ pub struct SettingBox {}
impl ObjectSubclass for SettingBox {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetSettingBox";
type Type = settingBox::SettingBox;
type Type = setting_box::SettingBox;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {

View file

@ -19,8 +19,8 @@ use ReSet_Lib::{
};
use crate::components::{
input::sourceBox::{start_input_box_listener, SourceBox},
output::sinkBox::{start_output_box_listener, SinkBox},
input::source_box::{start_input_box_listener, SourceBox},
output::sink_box::{start_output_box_listener, SinkBox},
};
#[derive(Default)]

View file

@ -17,13 +17,13 @@ use gtk::{gio, StringObject, Widget};
use ReSet_Lib::bluetooth::bluetooth::{BluetoothAdapter, BluetoothDevice};
use ReSet_Lib::signals::{BluetoothDeviceAdded, BluetoothDeviceChanged, BluetoothDeviceRemoved};
use crate::components::base::listEntry::ListEntry;
use crate::components::base::list_entry::ListEntry;
use crate::components::base::utils::Listeners;
use crate::components::bluetooth::bluetoothBoxImpl;
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
use crate::components::bluetooth::bluetooth_box_impl;
use crate::components::bluetooth::bluetooth_entry::BluetoothEntry;
glib::wrapper! {
pub struct BluetoothBox(ObjectSubclass<bluetoothBoxImpl::BluetoothBox>)
pub struct BluetoothBox(ObjectSubclass<bluetooth_box_impl::BluetoothBox>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -34,45 +34,50 @@ unsafe impl Sync for BluetoothBox {}
impl BluetoothBox {
pub fn new(listeners: Arc<Listeners>) -> Arc<Self> {
let obj: Arc<Self> = Arc::new(Object::builder().build());
setupCallbacks(listeners, obj)
setup_callbacks(listeners, obj)
}
pub fn setupCallbacks(&self) {}
}
fn setupCallbacks(
fn setup_callbacks(
listeners: Arc<Listeners>,
bluetooth_box: Arc<BluetoothBox>,
) -> Arc<BluetoothBox> {
let bluetooth_box_ref = bluetooth_box.clone();
let imp = bluetooth_box.imp();
// let bluetooth_box_ref = bluetooth_box.clone();
imp.resetVisibility.set_activatable(true);
imp.resetVisibility.set_action_name(Some("navigation.push"));
imp.resetVisibility
imp.reset_visibility.set_activatable(true);
imp.reset_visibility.set_action_name(Some("navigation.push"));
imp.reset_visibility
.set_action_target_value(Some(&Variant::from("visibility")));
imp.resetBluetoothMainTab
imp.reset_bluetooth_main_tab
.set_action_name(Some("navigation.pop"));
// TODO add a manual search button here
imp.resetBluetoothSwitch.connect_state_set(move |_, state| {
imp.reset_bluetooth_switch.connect_state_set(move |_, state| {
if !state {
let imp = bluetooth_box_ref.imp();
for x in imp.resetBluetoothConnectedDevices.observe_children().iter::<Object>() {
if let Ok(entry) = x { // todo test this
if let Some(item) = entry.downcast_ref::<Widget>() {
imp.resetBluetoothAvailableDevices.remove(item);
}
for x in imp
.reset_bluetooth_connected_devices
.observe_children()
.iter::<Object>()
.flatten()
{
// todo test this
if let Some(item) = x.downcast_ref::<Widget>() {
imp.reset_bluetooth_available_devices.remove(item);
}
};
}
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
set_adapter_enabled(
imp.resetCurrentBluetoothAdapter.borrow().path.clone(),
imp.reset_current_bluetooth_adapter.borrow().path.clone(),
false,
);
} else {
let imp = bluetooth_box_ref.imp();
set_adapter_enabled(imp.resetCurrentBluetoothAdapter.borrow().path.clone(), true);
set_adapter_enabled(
imp.reset_current_bluetooth_adapter.borrow().path.clone(),
true,
);
start_bluetooth_listener(listeners.clone(), bluetooth_box_ref.clone());
}
glib::Propagation::Proceed
@ -87,10 +92,10 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
let adapters = get_bluetooth_adapters();
{
let imp = bluetooth_box.imp();
let list = imp.resetModelList.write().unwrap();
let mut model_index = imp.resetModelIndex.write().unwrap();
let mut map = imp.resetBluetoothAdapters.write().unwrap();
imp.resetCurrentBluetoothAdapter
let list = imp.reset_model_list.write().unwrap();
let mut model_index = imp.reset_model_index.write().unwrap();
let mut map = imp.reset_bluetooth_adapters.write().unwrap();
imp.reset_current_bluetooth_adapter
.replace(adapters.last().unwrap().clone());
for (index, adapter) in adapters.into_iter().enumerate() {
list.append(&adapter.alias);
@ -102,14 +107,14 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
glib::idle_add_once(move || {
let imp = ref_box.imp();
let list = imp.resetModelList.read().unwrap();
imp.resetBluetoothAdapter.set_model(Some(&*list));
let map = imp.resetBluetoothAdapters.read().unwrap();
let device = imp.resetCurrentBluetoothAdapter.borrow();
let list = imp.reset_model_list.read().unwrap();
imp.reset_bluetooth_adapter.set_model(Some(&*list));
let map = imp.reset_bluetooth_adapters.read().unwrap();
let device = imp.reset_current_bluetooth_adapter.borrow();
if let Some(index) = map.get(&device.alias) {
imp.resetBluetoothAdapter.set_selected(index.1);
imp.reset_bluetooth_adapter.set_selected(index.1);
}
imp.resetBluetoothAdapter.connect_selected_notify(
imp.reset_bluetooth_adapter.connect_selected_notify(
clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
@ -119,7 +124,7 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let device = imp.resetBluetoothAdapters.read().unwrap();
let device = imp.reset_bluetooth_adapters.read().unwrap();
let device = device.get(&selected);
if device.is_none() {
return;
@ -133,13 +138,13 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
let connected = device.connected;
let bluetooth_entry = Arc::new(BluetoothEntry::new(&device));
let entry = Arc::new(ListEntry::new(&*bluetooth_entry));
imp.availableDevices
imp.available_devices
.borrow_mut()
.insert(path, (bluetooth_entry.clone(), entry.clone(), device));
if connected {
imp.resetBluetoothConnectedDevices.append(&*entry);
imp.reset_bluetooth_connected_devices.append(&*entry);
} else {
imp.resetBluetoothAvailableDevices.append(&*entry);
imp.reset_bluetooth_available_devices.append(&*entry);
}
}
});
@ -197,14 +202,14 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
let connected = ir.bluetooth_device.connected;
let bluetooth_entry = Arc::new(BluetoothEntry::new(&ir.bluetooth_device));
let entry = Arc::new(ListEntry::new(&*bluetooth_entry));
imp.availableDevices.borrow_mut().insert(
imp.available_devices.borrow_mut().insert(
path,
(bluetooth_entry.clone(), entry.clone(), ir.bluetooth_device),
);
if connected {
imp.resetBluetoothConnectedDevices.append(&*entry);
imp.reset_bluetooth_connected_devices.append(&*entry);
} else {
imp.resetBluetoothAvailableDevices.append(&*entry);
imp.reset_bluetooth_available_devices.append(&*entry);
}
});
});
@ -221,9 +226,9 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = bluetooth_box.imp();
let map = imp.availableDevices.borrow_mut();
let map = imp.available_devices.borrow_mut();
if let Some(list_entry) = map.get(&ir.bluetooth_device) {
imp.resetBluetoothConnectedDevices.remove(&*list_entry.1);
imp.reset_bluetooth_connected_devices.remove(&*list_entry.1);
}
});
});
@ -240,22 +245,22 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = bluetooth_box.imp();
let map = imp.availableDevices.borrow_mut();
let map = imp.available_devices.borrow_mut();
if let Some(list_entry) = map.get(&ir.bluetooth_device.path) {
if list_entry.2.connected != ir.bluetooth_device.connected {
if ir.bluetooth_device.connected {
imp.resetBluetoothConnectedDevices.append(&*list_entry.1);
imp.resetBluetoothAvailableDevices.remove(&*list_entry.1);
imp.reset_bluetooth_connected_devices.append(&*list_entry.1);
imp.reset_bluetooth_available_devices.remove(&*list_entry.1);
} else {
imp.resetBluetoothAvailableDevices.append(&*list_entry.1);
imp.resetBluetoothConnectedDevices.remove(&*list_entry.1);
imp.reset_bluetooth_available_devices.append(&*list_entry.1);
imp.reset_bluetooth_connected_devices.remove(&*list_entry.1);
}
}
if list_entry.2.paired != ir.bluetooth_device.paired {
if ir.bluetooth_device.paired {
list_entry.0.imp().resetBluetoothButton.set_sensitive(true);
list_entry.0.imp().reset_bluetooth_button.set_sensitive(true);
} else {
list_entry.0.imp().resetBluetoothButton.set_sensitive(false);
list_entry.0.imp().reset_bluetooth_button.set_sensitive(false);
}
}
}
@ -279,13 +284,16 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = loop_box.imp();
for x in imp.resetBluetoothAvailableDevices.observe_children().iter::<Object>() {
if let Ok(entry) = x { // todo test this
if let Some(item) = entry.downcast_ref::<Widget>() {
imp.resetBluetoothAvailableDevices.remove(item);
}
for x in imp
.reset_bluetooth_available_devices
.observe_children()
.iter::<Object>()
.flatten()
{
if let Some(item) = x.downcast_ref::<Widget>() {
imp.reset_bluetooth_available_devices.remove(item);
}
};
}
});
});
println!("stopping bluetooth listener");

View file

@ -1,51 +1,50 @@
use adw::{ActionRow, ComboRow};
use dbus::Path;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate, ListBox, Switch, Button};
use gtk::{glib, Button, CompositeTemplate, Switch};
use gtk::{prelude::*, StringList};
use std::cell::RefCell;
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use ReSet_Lib::bluetooth::bluetooth::{BluetoothAdapter, BluetoothDevice};
use crate::components::base::listEntry::ListEntry;
use crate::components::bluetooth::bluetoothBox;
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
use crate::components::base::list_entry::ListEntry;
use crate::components::bluetooth::bluetooth_box;
use crate::components::bluetooth::bluetooth_entry::BluetoothEntry;
type BluetoothMap =
RefCell<HashMap<Path<'static>, (Arc<BluetoothEntry>, Arc<ListEntry>, BluetoothDevice)>>;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetBluetooth.ui")]
pub struct BluetoothBox {
#[template_child]
pub resetBluetoothSwitch: TemplateChild<Switch>,
pub reset_bluetooth_switch: TemplateChild<Switch>,
#[template_child]
pub resetBluetoothAvailableDevices: TemplateChild<gtk::Box>,
pub reset_bluetooth_available_devices: TemplateChild<gtk::Box>,
#[template_child]
pub resetBluetoothRefreshButton: TemplateChild<Button>,
pub reset_bluetooth_refresh_button: TemplateChild<Button>,
#[template_child]
pub resetBluetoothAdapter: TemplateChild<ComboRow>,
pub reset_bluetooth_adapter: TemplateChild<ComboRow>,
#[template_child]
pub resetBluetoothConnectedDevices: TemplateChild<gtk::Box>,
pub reset_bluetooth_connected_devices: TemplateChild<gtk::Box>,
#[template_child]
pub resetVisibility: TemplateChild<ActionRow>,
pub reset_visibility: TemplateChild<ActionRow>,
#[template_child]
pub resetBluetoothMainTab: TemplateChild<ListEntry>,
pub availableDevices: BluetoothMap,
pub connectedDevices: BluetoothMap,
pub resetBluetoothAdapters: Arc<RwLock<HashMap<String, (BluetoothAdapter, u32)>>>,
pub resetCurrentBluetoothAdapter: Arc<RefCell<BluetoothAdapter>>,
pub resetModelList: Arc<RwLock<StringList>>,
pub resetModelIndex: Arc<RwLock<u32>>,
pub reset_bluetooth_main_tab: TemplateChild<ListEntry>,
pub available_devices: BluetoothMap,
pub connected_devices: BluetoothMap,
pub reset_bluetooth_adapters: Arc<RwLock<HashMap<String, (BluetoothAdapter, u32)>>>,
pub reset_current_bluetooth_adapter: Arc<RefCell<BluetoothAdapter>>,
pub reset_model_list: Arc<RwLock<StringList>>,
pub reset_model_index: Arc<RwLock<u32>>,
}
#[glib::object_subclass]
impl ObjectSubclass for BluetoothBox {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetBluetooth";
type Type = bluetoothBox::BluetoothBox;
type Type = bluetooth_box::BluetoothBox;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {
@ -62,8 +61,6 @@ impl ObjectSubclass for BluetoothBox {
impl ObjectImpl for BluetoothBox {
fn constructed(&self) {
self.parent_constructed();
let obj = self.obj();
obj.setupCallbacks();
}
}

View file

@ -1,7 +1,7 @@
use std::sync::Arc;
use std::time::Duration;
use crate::components::bluetooth::bluetoothEntryImpl;
use crate::components::bluetooth::bluetooth_entry_impl;
use adw::glib;
use adw::glib::Object;
use adw::subclass::prelude::ObjectSubclassIsExt;
@ -12,7 +12,7 @@ use gtk::{gio, GestureClick};
use ReSet_Lib::bluetooth::bluetooth::BluetoothDevice;
glib::wrapper! {
pub struct BluetoothEntry(ObjectSubclass<bluetoothEntryImpl::BluetoothEntry>)
pub struct BluetoothEntry(ObjectSubclass<bluetooth_entry_impl::BluetoothEntry>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::Actionable, gtk::ConstraintTarget;
}
@ -23,28 +23,28 @@ unsafe impl Sync for BluetoothEntry {}
impl BluetoothEntry {
pub fn new(device: &BluetoothDevice) -> Self {
let entry: BluetoothEntry = Object::builder().build();
let entryImp = entry.imp();
entryImp.resetBluetoothLabel.get().set_text(&device.alias);
entryImp
.resetBluetoothAddress
let entry_imp = entry.imp();
entry_imp.reset_bluetooth_label.get().set_text(&device.alias);
entry_imp
.reset_bluetooth_address
.get()
.set_text(&device.address);
if device.icon.is_empty() {
entryImp
.resetBluetoothDeviceType
entry_imp
.reset_bluetooth_device_type
.set_icon_name(Some("dialog-question-symbolic"));
} else {
entryImp
.resetBluetoothDeviceType
entry_imp
.reset_bluetooth_device_type
.set_icon_name(Some(&device.icon));
}
if device.paired {
entryImp.resetBluetoothButton.set_sensitive(true);
entry_imp.reset_bluetooth_button.set_sensitive(true);
} else {
entryImp.resetBluetoothButton.set_sensitive(false);
entry_imp.reset_bluetooth_button.set_sensitive(false);
}
let path = Arc::new(device.path.clone());
entryImp.resetBluetoothButton.connect_clicked(move |_| {
entry_imp.reset_bluetooth_button.connect_clicked(move |_| {
remove_device_pairing((*path).clone());
});
let gesture = GestureClick::new();

View file

@ -1,28 +1,27 @@
use crate::components::bluetooth::bluetoothEntry;
use crate::components::bluetooth::bluetooth_entry;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, Image, Label};
use std::cell::RefCell;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetBluetoothEntry.ui")]
pub struct BluetoothEntry {
#[template_child]
pub resetBluetoothDeviceType: TemplateChild<Image>,
pub reset_bluetooth_device_type: TemplateChild<Image>,
#[template_child]
pub resetBluetoothLabel: TemplateChild<Label>,
pub reset_bluetooth_label: TemplateChild<Label>,
#[template_child]
pub resetBluetoothAddress: TemplateChild<Label>,
pub reset_bluetooth_address: TemplateChild<Label>,
#[template_child]
pub resetBluetoothButton: TemplateChild<Button>,
pub deviceName: RefCell<String>,
pub reset_bluetooth_button: TemplateChild<Button>,
pub device_name: RefCell<String>,
}
#[glib::object_subclass]
impl ObjectSubclass for BluetoothEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetBluetoothEntry";
type Type = bluetoothEntry::BluetoothEntry;
type Type = bluetooth_entry::BluetoothEntry;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {

View file

@ -1,5 +1,4 @@
#![allow(non_snake_case)]
pub mod bluetoothBox;
pub mod bluetoothBoxImpl;
pub mod bluetoothEntry;
pub mod bluetoothEntryImpl;
pub mod bluetooth_box;
pub mod bluetooth_box_impl;
pub mod bluetooth_entry;
pub mod bluetooth_entry_impl;

View file

@ -1,7 +1,6 @@
#![allow(non_snake_case)]
pub mod outputStreamEntry;
pub mod outputStreamEntryImpl;
pub mod sourceBox;
pub mod sourceBoxImpl;
pub mod sourceEntry;
pub mod sourceEntryImpl;
pub mod output_stream_entry;
pub mod output_stream_entry_impl;
pub mod source_box;
pub mod source_box_impl;
pub mod source_entry;
pub mod source_entry_impl;

View file

@ -1,7 +1,7 @@
use std::sync::Arc;
use std::time::{Duration, SystemTime};
use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis};
use crate::components::utils::{create_dropdown_label_factory, set_combo_row_ellipsis};
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ButtonExt, ComboRowExt, PreferencesRowExt, RangeExt};
@ -12,11 +12,11 @@ use glib::{clone, Cast, Propagation};
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::OutputStream;
use super::outputStreamEntryImpl;
use super::sourceBox::SourceBox;
use super::output_stream_entry_impl;
use super::source_box::SourceBox;
glib::wrapper! {
pub struct OutputStreamEntry(ObjectSubclass<outputStreamEntryImpl::OutputStreamEntry>)
pub struct OutputStreamEntry(ObjectSubclass<output_stream_entry_impl::OutputStreamEntry>)
@extends adw::PreferencesGroup, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -32,21 +32,21 @@ impl OutputStreamEntry {
let box_imp = source_box.imp();
let imp = obj.imp();
let name = stream.application_name.clone() + ": " + stream.name.as_str();
imp.resetSourceSelection.set_title(name.as_str());
imp.resetSourceSelection
.set_factory(Some(&createDropdownLabelFactory()));
setComboRowEllipsis(imp.resetSourceSelection.get());
imp.reset_source_selection.set_title(name.as_str());
imp.reset_source_selection
.set_factory(Some(&create_dropdown_label_factory()));
set_combo_row_ellipsis(imp.reset_source_selection.get());
let volume = stream.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
imp.stream.replace(stream);
imp.resetVolumeSlider.connect_change_value(
imp.reset_volume_slider.connect_change_value(
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
let fraction = (value / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.reset_volume_percentage.set_text(&percentage);
let mut stream = imp.stream.try_borrow();
while stream.is_err() {
stream = imp.stream.try_borrow();
@ -55,7 +55,7 @@ impl OutputStreamEntry {
let index = stream.index;
let channels = stream.channels;
{
let mut time = imp.volumeTimeStamp.borrow_mut();
let mut time = imp.volume_time_stamp.borrow_mut();
if time.is_some()
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
{
@ -68,21 +68,21 @@ impl OutputStreamEntry {
}),
);
{
let list = box_imp.resetModelList.read().unwrap();
imp.resetSourceSelection.set_model(Some(&*list));
let map = box_imp.resetSourceMap.write().unwrap();
let mut name = box_imp.resetDefaultSource.try_borrow();
let list = box_imp.reset_model_list.read().unwrap();
imp.reset_source_selection.set_model(Some(&*list));
let map = box_imp.reset_source_map.write().unwrap();
let mut name = box_imp.reset_default_source.try_borrow();
while name.is_err() {
name = box_imp.resetDefaultSource.try_borrow();
name = box_imp.reset_default_source.try_borrow();
}
let name = name.unwrap();
let name = &name.alias;
let index = map.get(name);
if let Some(index) = index {
imp.resetSourceSelection.set_selected(index.1);
imp.reset_source_selection.set_selected(index.1);
}
}
imp.resetSourceSelection.connect_selected_notify(
imp.reset_source_selection.connect_selected_notify(
clone!(@weak imp, @weak box_imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
@ -91,7 +91,7 @@ impl OutputStreamEntry {
let selected = selected.unwrap();
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let source = box_imp.resetSourceMap.write().unwrap();
let source = box_imp.reset_source_map.write().unwrap();
let source = source.get(&selected);
if source.is_none() {
return;
@ -105,7 +105,7 @@ impl OutputStreamEntry {
set_source_of_output_stream(stream.index, source);
}),
);
imp.resetSourceMute
imp.reset_source_mute
.connect_clicked(clone!(@weak imp => move |_| {
let stream = imp.stream.clone();
let mut stream = stream.try_borrow_mut();
@ -117,10 +117,10 @@ impl OutputStreamEntry {
let muted = stream.muted;
let index = stream.index;
if muted {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("microphone-disabled-symbolic");
} else {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("audio-input-microphone-symbolic");
}
toggle_output_stream_mute(index, muted);

View file

@ -4,35 +4,34 @@ use std::cell::RefCell;
use std::sync::Arc;
use std::time::SystemTime;
use crate::components::input::outputStreamEntry;
use crate::components::input::output_stream_entry;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale};
use ReSet_Lib::audio::audio::OutputStream;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetOutputStreamEntry.ui")]
pub struct OutputStreamEntry {
#[template_child]
pub resetSourceSelection: TemplateChild<ComboRow>,
pub reset_source_selection: TemplateChild<ComboRow>,
#[template_child]
pub resetSourceMute: TemplateChild<Button>,
pub reset_source_mute: TemplateChild<Button>,
#[template_child]
pub resetVolumeSlider: TemplateChild<Scale>,
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub resetVolumePercentage: TemplateChild<Label>,
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub resetVolumeMeter: TemplateChild<ProgressBar>,
pub reset_volume_meter: TemplateChild<ProgressBar>,
pub stream: Arc<RefCell<OutputStream>>,
pub associatedSource: Arc<RefCell<(u32, String)>>,
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
pub associated_source: Arc<RefCell<(u32, String)>>,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}
#[glib::object_subclass]
impl ObjectSubclass for OutputStreamEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetOutputStreamEntry";
type Type = outputStreamEntry::OutputStreamEntry;
type Type = output_stream_entry::OutputStreamEntry;
type ParentType = PreferencesGroup;
fn class_init(klass: &mut Self::Class) {

View file

@ -16,21 +16,21 @@ use gtk::prelude::ActionableExt;
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::{Card, OutputStream, Source};
use crate::components::base::cardEntry::CardEntry;
use crate::components::base::listEntry::ListEntry;
use crate::components::base::card_entry::CardEntry;
use crate::components::base::list_entry::ListEntry;
use crate::components::base::utils::{
OutputStreamAdded, OutputStreamChanged, OutputStreamRemoved, SourceAdded, SourceChanged,
SourceRemoved,
};
use crate::components::input::sourceBoxImpl;
use crate::components::input::sourceEntry::set_source_volume;
use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis};
use crate::components::input::source_box_impl;
use crate::components::input::source_entry::set_source_volume;
use crate::components::utils::{create_dropdown_label_factory, set_combo_row_ellipsis};
use super::outputStreamEntry::OutputStreamEntry;
use super::sourceEntry::{set_default_source, toggle_source_mute, SourceEntry};
use super::output_stream_entry::OutputStreamEntry;
use super::source_entry::{set_default_source, toggle_source_mute, SourceEntry};
glib::wrapper! {
pub struct SourceBox(ObjectSubclass<sourceBoxImpl::SourceBox>)
pub struct SourceBox(ObjectSubclass<source_box_impl::SourceBox>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -43,37 +43,37 @@ impl SourceBox {
Object::builder().build()
}
pub fn setupCallbacks(&self) {
let selfImp = self.imp();
selfImp.resetSourceRow.set_activatable(true);
selfImp
.resetSourceRow
pub fn setup_callbacks(&self) {
let self_imp = self.imp();
self_imp.reset_source_row.set_activatable(true);
self_imp
.reset_source_row
.set_action_name(Some("navigation.push"));
selfImp
.resetSourceRow
self_imp
.reset_source_row
.set_action_target_value(Some(&Variant::from("sources")));
selfImp.resetCardsRow.set_activatable(true);
selfImp
.resetCardsRow
self_imp.reset_cards_row.set_activatable(true);
self_imp
.reset_cards_row
.set_action_name(Some("navigation.push"));
selfImp
.resetCardsRow
self_imp
.reset_cards_row
.set_action_target_value(Some(&Variant::from("profileConfiguration")));
selfImp.resetOutputStreamButton.set_activatable(true);
selfImp
.resetOutputStreamButton
self_imp.reset_output_stream_button.set_activatable(true);
self_imp
.reset_output_stream_button
.set_action_name(Some("navigation.pop"));
selfImp.resetInputCardsBackButton.set_activatable(true);
selfImp
.resetInputCardsBackButton
self_imp.reset_input_cards_back_button.set_activatable(true);
self_imp
.reset_input_cards_back_button
.set_action_name(Some("navigation.pop"));
selfImp
.resetSourceDropdown
.set_factory(Some(&createDropdownLabelFactory()));
setComboRowEllipsis(selfImp.resetSourceDropdown.get());
self_imp
.reset_source_dropdown
.set_factory(Some(&create_dropdown_label_factory()));
set_combo_row_ellipsis(self_imp.reset_source_dropdown.get());
}
}
@ -88,9 +88,9 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
let output_box_imp = input_box.imp();
let sources = get_sources();
{
let list = output_box_imp.resetModelList.write().unwrap();
let mut map = output_box_imp.resetSourceMap.write().unwrap();
let mut model_index = output_box_imp.resetModelIndex.write().unwrap();
let list = output_box_imp.reset_model_list.write().unwrap();
let mut map = output_box_imp.reset_source_map.write().unwrap();
let mut model_index = output_box_imp.reset_model_index.write().unwrap();
for (i, source) in (0_u32..).zip(sources.iter()) {
list.append(&source.alias);
map.insert(source.alias.clone(), (source.index, i, source.name.clone()));
@ -98,7 +98,7 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
}
}
output_box_imp
.resetDefaultSource
.reset_default_source
.replace(get_default_source());
populate_outputstreams(input_box.clone());
@ -110,41 +110,41 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
let output_box_ref = input_box.clone();
{
let output_box_imp = output_box_ref.imp();
let default_sink = output_box_imp.resetDefaultSource.clone();
let default_sink = output_box_imp.reset_default_source.clone();
let source = default_sink.borrow();
let volume = source.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
output_box_imp.resetVolumePercentage.set_text(&percentage);
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
let mut list = output_box_imp.resetSourceList.write().unwrap();
output_box_imp.reset_volume_percentage.set_text(&percentage);
output_box_imp.reset_volume_slider.set_value(*volume as f64);
let mut list = output_box_imp.reset_source_list.write().unwrap();
for stream in sources {
let index = source.index;
let alias = source.alias.clone();
let mut is_default = false;
if output_box_imp.resetDefaultSource.borrow().name == stream.name {
if output_box_imp.reset_default_source.borrow().name == stream.name {
is_default = true;
}
let source_entry = Arc::new(SourceEntry::new(
is_default,
output_box_imp.resetDefaultCheckButton.clone(),
output_box_imp.reset_default_check_button.clone(),
stream,
));
let source_clone = source_entry.clone();
let entry = Arc::new(ListEntry::new(&*source_entry));
entry.set_activatable(false);
list.insert(index, (entry.clone(), source_clone, alias));
output_box_imp.resetSources.append(&*entry);
output_box_imp.reset_sources.append(&*entry);
}
let list = output_box_imp.resetModelList.read().unwrap();
output_box_imp.resetSourceDropdown.set_model(Some(&*list));
let map = output_box_imp.resetSourceMap.read().unwrap();
let name = output_box_imp.resetDefaultSource.borrow();
let list = output_box_imp.reset_model_list.read().unwrap();
output_box_imp.reset_source_dropdown.set_model(Some(&*list));
let map = output_box_imp.reset_source_map.read().unwrap();
let name = output_box_imp.reset_default_source.borrow();
if let Some(index) = map.get(&name.alias) {
output_box_imp.resetSourceDropdown.set_selected(index.1);
output_box_imp.reset_source_dropdown.set_selected(index.1);
}
output_box_imp.resetSourceDropdown.connect_selected_notify(
output_box_imp.reset_source_dropdown.connect_selected_notify(
clone!(@weak output_box_imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
@ -154,7 +154,7 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let source = output_box_imp.resetSourceMap.read().unwrap();
let source = output_box_imp.reset_source_map.read().unwrap();
let source = source.get(&selected);
if source.is_none() {
return;
@ -166,17 +166,17 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
}
output_box_ref
.imp()
.resetVolumeSlider
.reset_volume_slider
.connect_change_value(move |_, _, value| {
let imp = output_box_ref_slider.imp();
let fraction = (value / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
let source = imp.resetDefaultSource.borrow();
imp.reset_volume_percentage.set_text(&percentage);
let source = imp.reset_default_source.borrow();
let index = source.index;
let channels = source.channels;
{
let mut time = imp.volumeTimeStamp.borrow_mut();
let mut time = imp.volume_time_stamp.borrow_mut();
if time.is_some()
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
{
@ -190,19 +190,19 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
output_box_ref
.imp()
.resetSourceMute
.reset_source_mute
.connect_clicked(move |_| {
let imp = output_box_ref_mute.imp();
let stream = imp.resetDefaultSource.clone();
let stream = imp.reset_default_source.clone();
let mut stream = stream.borrow_mut();
stream.muted = !stream.muted;
let muted = stream.muted;
let index = stream.index;
if muted {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("microphone-disabled-symbolic");
} else {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("audio-input-microphone-symbolic");
}
toggle_source_mute(index, muted);
@ -220,7 +220,7 @@ pub fn populate_outputstreams(input_box: Arc<SourceBox>) {
glib::spawn_future(async move {
glib::idle_add_once(move || {
let input_box_imp = input_box_ref.imp();
let mut list = input_box_imp.resetOutputStreamList.write().unwrap();
let mut list = input_box_imp.reset_output_stream_list.write().unwrap();
for stream in streams {
let index = stream.index;
let input_stream = Arc::new(OutputStreamEntry::new(input_box.clone(), stream));
@ -228,7 +228,7 @@ pub fn populate_outputstreams(input_box: Arc<SourceBox>) {
let entry = Arc::new(ListEntry::new(&*input_stream));
entry.set_activatable(false);
list.insert(index, (entry.clone(), input_stream_clone));
input_box_imp.resetOutputStreams.append(&*entry);
input_box_imp.reset_output_streams.append(&*entry);
}
});
});
@ -243,7 +243,7 @@ pub fn populate_cards(input_box: Arc<SourceBox>) {
glib::idle_add_once(move || {
let imp = output_box_ref.imp();
for card in cards {
imp.resetCards.add(&CardEntry::new(card));
imp.reset_cards.add(&CardEntry::new(card));
}
});
});
@ -355,28 +355,28 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
glib::idle_add_once(move || {
let output_box = source_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetSourceList.write().unwrap();
let mut list = output_box_imp.reset_source_list.write().unwrap();
let source_index = ir.source.index;
let alias = ir.source.alias.clone();
let name = ir.source.name.clone();
let mut is_default = false;
if output_box_imp.resetDefaultSource.borrow().name == ir.source.name {
if output_box_imp.reset_default_source.borrow().name == ir.source.name {
is_default = true;
}
let source_entry = Arc::new(SourceEntry::new(
is_default,
output_box_imp.resetDefaultCheckButton.clone(),
output_box_imp.reset_default_check_button.clone(),
ir.source,
));
let source_clone = source_entry.clone();
let entry = Arc::new(ListEntry::new(&*source_entry));
entry.set_activatable(false);
list.insert(source_index, (entry.clone(), source_clone, alias.clone()));
output_box_imp.resetSources.append(&*entry);
let mut map = output_box_imp.resetSourceMap.write().unwrap();
let mut index = output_box_imp.resetModelIndex.write().unwrap();
output_box_imp.reset_sources.append(&*entry);
let mut map = output_box_imp.reset_source_map.write().unwrap();
let mut index = output_box_imp.reset_model_index.write().unwrap();
output_box_imp
.resetModelList
.reset_model_list
.write()
.unwrap()
.append(&alias);
@ -398,27 +398,27 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
glib::idle_add_once(move || {
let output_box = source_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetSourceList.write().unwrap();
let mut list = output_box_imp.reset_source_list.write().unwrap();
let entry = list.get(&ir.index);
if entry.is_none() {
return;
}
output_box_imp.resetSources.remove(&*entry.unwrap().0);
output_box_imp.reset_sources.remove(&*entry.unwrap().0);
list.remove(&ir.index);
let alias = list.remove(&ir.index);
if alias.is_none() {
return;
}
let mut map = output_box_imp.resetSourceMap.write().unwrap();
let mut map = output_box_imp.reset_source_map.write().unwrap();
let entry_index = map.remove(&alias.unwrap().2);
if let Some(entry_index) = entry_index {
output_box_imp
.resetModelList
.reset_model_list
.write()
.unwrap()
.remove(entry_index.1);
}
let mut index = output_box_imp.resetModelIndex.write().unwrap();
let mut index = output_box_imp.reset_model_index.write().unwrap();
if *index != 0 {
*index -= 1;
}
@ -442,23 +442,23 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
let volume = ir.source.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
let list = output_box_imp.resetSourceList.read().unwrap();
let list = output_box_imp.reset_source_list.read().unwrap();
let entry = list.get(&ir.source.index);
if entry.is_none() {
return;
}
let imp = entry.unwrap().1.imp();
if is_default {
output_box_imp.resetVolumePercentage.set_text(&percentage);
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
imp.resetSelectedSource.set_active(true);
output_box_imp.reset_volume_percentage.set_text(&percentage);
output_box_imp.reset_volume_slider.set_value(*volume as f64);
imp.reset_selected_source.set_active(true);
} else {
imp.resetSelectedSource.set_active(false);
imp.reset_selected_source.set_active(false);
}
imp.resetSourceName
imp.reset_source_name
.set_title(ir.source.alias.clone().as_str());
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
});
});
true
@ -474,14 +474,14 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
glib::idle_add_once(move || {
let output_box = source_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
let mut list = output_box_imp.reset_output_stream_list.write().unwrap();
let index = ir.stream.index;
let output_stream = Arc::new(OutputStreamEntry::new(output_box.clone(), ir.stream));
let output_stream_clone = output_stream.clone();
let entry = Arc::new(ListEntry::new(&*output_stream));
entry.set_activatable(false);
list.insert(index, (entry.clone(), output_stream_clone));
output_box_imp.resetOutputStreams.append(&*entry);
output_box_imp.reset_output_streams.append(&*entry);
});
});
true
@ -497,7 +497,7 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
let imp = output_stream_changed_box.imp();
let alias: String;
{
let source_list = imp.resetSourceList.read().unwrap();
let source_list = imp.reset_source_list.read().unwrap();
if let Some(alias_opt) = source_list.get(&ir.stream.source_index) {
alias = alias_opt.2.clone();
} else {
@ -511,7 +511,7 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
let output_box_imp = output_box.imp();
let entry: Arc<OutputStreamEntry>;
{
let list = output_box_imp.resetOutputStreamList.read().unwrap();
let list = output_box_imp.reset_output_stream_list.read().unwrap();
let entry_opt = list.get(&ir.stream.index);
if entry_opt.is_none() {
return;
@ -520,22 +520,22 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
}
let imp = entry.imp();
if ir.stream.muted {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("microphone-disabled-symbolic");
} else {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("audio-input-microphone-symbolic");
}
let name = ir.stream.application_name.clone() + ": " + ir.stream.name.as_str();
imp.resetSourceSelection.set_title(name.as_str());
imp.reset_source_selection.set_title(name.as_str());
let volume = ir.stream.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
let map = output_box_imp.resetSourceMap.read().unwrap();
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
let map = output_box_imp.reset_source_map.read().unwrap();
if let Some(index) = map.get(&alias) {
imp.resetSourceSelection.set_selected(index.1);
imp.reset_source_selection.set_selected(index.1);
}
});
});
@ -555,12 +555,12 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) ->
glib::idle_add_once(move || {
let output_box = source_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
let mut list = output_box_imp.reset_output_stream_list.write().unwrap();
let entry = list.remove(&ir.index);
if entry.is_none() {
return;
}
output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0);
output_box_imp.reset_output_streams.remove(&*entry.unwrap().0);
});
});
true

View file

@ -4,65 +4,64 @@ use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use std::time::SystemTime;
use crate::components::base::listEntry::ListEntry;
use crate::components::input::sourceBox;
use crate::components::base::list_entry::ListEntry;
use crate::components::input::source_box;
use gtk::subclass::prelude::*;
use gtk::{glib, CheckButton, CompositeTemplate, StringList, TemplateChild};
use gtk::{prelude::*, Button, Label, ProgressBar, Scale};
use ReSet_Lib::audio::audio::Source;
use super::outputStreamEntry::OutputStreamEntry;
use super::sourceEntry::SourceEntry;
use super::output_stream_entry::OutputStreamEntry;
use super::source_entry::SourceEntry;
type SourceEntryMap = Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SourceEntry>, String)>>>;
type OutputStreamEntryMap = Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<OutputStreamEntry>)>>>;
type SourceMap = Arc<RwLock<HashMap<String, (u32, u32, String)>>>;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetAudioInput.ui")]
pub struct SourceBox {
#[template_child]
pub resetSourceRow: TemplateChild<ActionRow>,
pub reset_source_row: TemplateChild<ActionRow>,
#[template_child]
pub resetCardsRow: TemplateChild<ActionRow>,
pub reset_cards_row: TemplateChild<ActionRow>,
#[template_child]
pub resetSourceDropdown: TemplateChild<ComboRow>,
pub reset_source_dropdown: TemplateChild<ComboRow>,
#[template_child]
pub resetSourceMute: TemplateChild<Button>,
pub reset_source_mute: TemplateChild<Button>,
#[template_child]
pub resetVolumeSlider: TemplateChild<Scale>,
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub resetVolumePercentage: TemplateChild<Label>,
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub resetVolumeMeter: TemplateChild<ProgressBar>,
pub reset_volume_meter: TemplateChild<ProgressBar>,
#[template_child]
pub resetSources: TemplateChild<gtk::Box>,
pub reset_sources: TemplateChild<gtk::Box>,
#[template_child]
pub resetOutputStreamButton: TemplateChild<ActionRow>,
pub reset_output_stream_button: TemplateChild<ActionRow>,
#[template_child]
pub resetOutputStreams: TemplateChild<gtk::Box>,
pub reset_output_streams: TemplateChild<gtk::Box>,
#[template_child]
pub resetInputCardsBackButton: TemplateChild<ActionRow>,
pub reset_input_cards_back_button: TemplateChild<ActionRow>,
#[template_child]
pub resetCards: TemplateChild<PreferencesGroup>,
pub resetDefaultCheckButton: Arc<CheckButton>,
pub resetDefaultSource: Arc<RefCell<Source>>,
pub resetSourceList: SourceEntryMap,
pub resetOutputStreamList: OutputStreamEntryMap,
pub resetModelList: Arc<RwLock<StringList>>,
pub resetModelIndex: Arc<RwLock<u32>>,
pub reset_cards: TemplateChild<PreferencesGroup>,
pub reset_default_check_button: Arc<CheckButton>,
pub reset_default_source: Arc<RefCell<Source>>,
pub reset_source_list: SourceEntryMap,
pub reset_output_stream_list: OutputStreamEntryMap,
pub reset_model_list: Arc<RwLock<StringList>>,
pub reset_model_index: Arc<RwLock<u32>>,
// first u32 is the index of the source, the second the index in the model list and the third is
// the full name
pub resetSourceMap: SourceMap,
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
pub reset_source_map: SourceMap,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}
#[glib::object_subclass]
impl ObjectSubclass for SourceBox {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetAudioInput";
type Type = sourceBox::SourceBox;
type Type = source_box::SourceBox;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {
@ -82,7 +81,7 @@ impl BoxImpl for SourceBox {}
impl ObjectImpl for SourceBox {
fn constructed(&self) {
let obj = self.obj();
obj.setupCallbacks();
obj.setup_callbacks();
}
}

View file

@ -11,10 +11,10 @@ use glib::{clone, Propagation};
use gtk::{gio, CheckButton};
use ReSet_Lib::audio::audio::Source;
use super::sourceEntryImpl;
use super::source_entry_impl;
glib::wrapper! {
pub struct SourceEntry(ObjectSubclass<sourceEntryImpl::SourceEntry>)
pub struct SourceEntry(ObjectSubclass<source_entry_impl::SourceEntry>)
@extends adw::PreferencesGroup, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -28,24 +28,24 @@ impl SourceEntry {
// TODO use event callback for progress bar -> this is the "im speaking" indicator
{
let imp = obj.imp();
imp.resetSourceName.set_title(stream.alias.clone().as_str());
imp.reset_source_name.set_title(stream.alias.clone().as_str());
let name = Arc::new(stream.name.clone());
let volume = stream.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
imp.stream.replace(stream);
imp.resetVolumeSlider.connect_change_value(
imp.reset_volume_slider.connect_change_value(
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
let fraction = (value / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.reset_volume_percentage.set_text(&percentage);
let source = imp.stream.borrow();
let index = source.index;
let channels = source.channels;
{
let mut time = imp.volumeTimeStamp.borrow_mut();
let mut time = imp.volume_time_stamp.borrow_mut();
if time.is_some()
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
{
@ -57,19 +57,19 @@ impl SourceEntry {
Propagation::Proceed
}),
);
imp.resetSelectedSource.set_group(Some(&*check_group));
imp.reset_selected_source.set_group(Some(&*check_group));
// check_group.set_group(Some(&*imp.resetSelectedSink));
if is_default {
imp.resetSelectedSource.set_active(true);
imp.reset_selected_source.set_active(true);
} else {
imp.resetSelectedSource.set_active(false);
imp.reset_selected_source.set_active(false);
}
imp.resetSelectedSource.connect_toggled(move |button| {
imp.reset_selected_source.connect_toggled(move |button| {
if button.is_active() {
set_default_source(name.clone());
}
});
imp.resetSourceMute
imp.reset_source_mute
.connect_clicked(clone!(@weak imp => move |_| {
let stream = imp.stream.clone();
let mut stream = stream.borrow_mut();
@ -77,10 +77,10 @@ impl SourceEntry {
let muted = stream.muted;
let index = stream.index;
if muted {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("microphone-disabled-symbolic");
} else {
imp.resetSourceMute
imp.reset_source_mute
.set_icon_name("audio-input-microphone-symbolic");
}
toggle_source_mute(index, muted);

View file

@ -8,33 +8,32 @@ use gtk::subclass::prelude::*;
use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, ProgressBar, Scale};
use ReSet_Lib::audio::audio::Source;
use super::sourceEntry;
use super::source_entry;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetSourceEntry.ui")]
pub struct SourceEntry {
#[template_child]
pub resetSourceName: TemplateChild<ActionRow>,
pub reset_source_name: TemplateChild<ActionRow>,
#[template_child]
pub resetSelectedSource: TemplateChild<CheckButton>,
pub reset_selected_source: TemplateChild<CheckButton>,
#[template_child]
pub resetSourceMute: TemplateChild<Button>,
pub reset_source_mute: TemplateChild<Button>,
#[template_child]
pub resetVolumeSlider: TemplateChild<Scale>,
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub resetVolumePercentage: TemplateChild<Label>,
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub resetVolumeMeter: TemplateChild<ProgressBar>,
pub reset_volume_meter: TemplateChild<ProgressBar>,
pub stream: Arc<RefCell<Source>>,
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}
#[glib::object_subclass]
impl ObjectSubclass for SourceEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetSourceEntry";
type Type = sourceEntry::SourceEntry;
type Type = source_entry::SourceEntry;
type ParentType = PreferencesGroup;
fn class_init(klass: &mut Self::Class) {

View file

@ -1,7 +1,7 @@
use std::sync::Arc;
use std::time::{Duration, SystemTime};
use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis};
use crate::components::utils::{create_dropdown_label_factory, set_combo_row_ellipsis};
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ButtonExt, ComboRowExt, PreferencesRowExt, RangeExt};
@ -12,11 +12,11 @@ use glib::{clone, Cast, Propagation};
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::InputStream;
use super::inputStreamEntryImpl;
use super::sinkBox::SinkBox;
use super::input_stream_entry_impl;
use super::sink_box::SinkBox;
glib::wrapper! {
pub struct InputStreamEntry(ObjectSubclass<inputStreamEntryImpl::InputStreamEntry>)
pub struct InputStreamEntry(ObjectSubclass<input_stream_entry_impl::InputStreamEntry>)
@extends adw::PreferencesGroup, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -33,32 +33,32 @@ impl InputStreamEntry {
let box_imp = sink_box.imp();
let imp = obj.imp();
if stream.muted {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-muted-symbolic");
} else {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-high-symbolic");
}
let name = stream.application_name.clone() + ": " + stream.name.as_str();
imp.resetSinkSelection.set_title(name.as_str());
imp.resetSinkSelection
.set_factory(Some(&createDropdownLabelFactory()));
setComboRowEllipsis(imp.resetSinkSelection.get());
imp.reset_sink_selection.set_title(name.as_str());
imp.reset_sink_selection
.set_factory(Some(&create_dropdown_label_factory()));
set_combo_row_ellipsis(imp.reset_sink_selection.get());
let volume = stream.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
imp.stream.replace(stream);
{
let sink = box_imp.resetDefaultSink.borrow();
imp.associatedSink.replace((sink.index, sink.name.clone()));
let sink = box_imp.reset_default_sink.borrow();
imp.associated_sink.replace((sink.index, sink.name.clone()));
}
imp.resetVolumeSlider.connect_change_value(
imp.reset_volume_slider.connect_change_value(
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
let fraction = (value / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.reset_volume_percentage.set_text(&percentage);
let mut stream = imp.stream.try_borrow();
while stream.is_err() {
stream = imp.stream.try_borrow();
@ -67,7 +67,7 @@ impl InputStreamEntry {
let index = stream.index;
let channels = stream.channels;
{
let mut time = imp.volumeTimeStamp.borrow_mut();
let mut time = imp.volume_time_stamp.borrow_mut();
if time.is_some() && time.unwrap().elapsed().unwrap() < Duration::from_millis(50) {
return Propagation::Proceed;
}
@ -78,34 +78,34 @@ impl InputStreamEntry {
}),
);
{
let list = box_imp.resetModelList.read().unwrap();
let list = box_imp.reset_model_list.read().unwrap();
// while list.is_err() {
// list = box_imp.resetModelList.try_borrow();
// }
// let list = list.unwrap();
imp.resetSinkSelection.set_model(Some(&*list));
let map = box_imp.resetSinkMap.read().unwrap();
let sink_list = box_imp.resetSinkList.read().unwrap();
imp.reset_sink_selection.set_model(Some(&*list));
let map = box_imp.reset_sink_map.read().unwrap();
let sink_list = box_imp.reset_sink_list.read().unwrap();
let name = sink_list.get(&index);
if let Some(name) = name {
let name = &name.2;
let index = map.get(name);
if let Some(index) = index {
imp.resetSinkSelection.set_selected(index.1);
imp.reset_sink_selection.set_selected(index.1);
}
} else {
let mut name = box_imp.resetDefaultSink.try_borrow();
let mut name = box_imp.reset_default_sink.try_borrow();
while name.is_err() {
name = box_imp.resetDefaultSink.try_borrow();
name = box_imp.reset_default_sink.try_borrow();
}
let name = &name.unwrap().alias;
let index = map.get(name);
if let Some(index) = index {
imp.resetSinkSelection.set_selected(index.1);
imp.reset_sink_selection.set_selected(index.1);
}
}
}
imp.resetSinkSelection.connect_selected_notify(
imp.reset_sink_selection.connect_selected_notify(
clone!(@weak imp, @weak box_imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
@ -114,7 +114,7 @@ impl InputStreamEntry {
let selected = selected.unwrap();
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let sink = box_imp.resetSinkMap.read().unwrap();
let sink = box_imp.reset_sink_map.read().unwrap();
// if sink.is_err() {
// return;
// }
@ -132,7 +132,7 @@ impl InputStreamEntry {
set_sink_of_input_stream(stream.index, sink);
}),
);
imp.resetSinkMute
imp.reset_sink_mute
.connect_clicked(clone!(@weak imp => move |_| {
let stream = imp.stream.clone();
let mut stream = stream.try_borrow_mut();
@ -144,10 +144,10 @@ impl InputStreamEntry {
let muted = stream.muted;
let index = stream.index;
if muted {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-muted-symbolic");
} else {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-high-symbolic");
}
toggle_input_stream_mute(index, muted);

View file

@ -8,32 +8,31 @@ use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale};
use ReSet_Lib::audio::audio::InputStream;
use super::inputStreamEntry;
use super::input_stream_entry;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetInputStreamEntry.ui")]
pub struct InputStreamEntry {
#[template_child]
pub resetSinkSelection: TemplateChild<ComboRow>,
pub reset_sink_selection: TemplateChild<ComboRow>,
#[template_child]
pub resetSinkMute: TemplateChild<Button>,
pub reset_sink_mute: TemplateChild<Button>,
#[template_child]
pub resetVolumeSlider: TemplateChild<Scale>,
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub resetVolumePercentage: TemplateChild<Label>,
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub resetVolumeMeter: TemplateChild<ProgressBar>,
pub reset_volume_meter: TemplateChild<ProgressBar>,
pub stream: Arc<RefCell<InputStream>>,
pub associatedSink: Arc<RefCell<(u32, String)>>,
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
pub associated_sink: Arc<RefCell<(u32, String)>>,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}
#[glib::object_subclass]
impl ObjectSubclass for InputStreamEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetInputStreamEntry";
type Type = inputStreamEntry::InputStreamEntry;
type Type = input_stream_entry::InputStreamEntry;
type ParentType = PreferencesGroup;
fn class_init(klass: &mut Self::Class) {

View file

@ -1,7 +1,6 @@
#![allow(non_snake_case)]
pub mod inputStreamEntry;
pub mod inputStreamEntryImpl;
pub mod sinkBox;
pub mod sinkBoxImpl;
pub mod sinkEntry;
pub mod sinkEntryImpl;
pub mod input_stream_entry;
pub mod input_stream_entry_impl;
pub mod sink_box;
pub mod sink_box_impl;
pub mod sink_entry;
pub mod sink_entry_impl;

View file

@ -15,20 +15,20 @@ use gtk::prelude::ActionableExt;
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::{Card, InputStream, Sink};
use crate::components::base::cardEntry::CardEntry;
use crate::components::base::listEntry::ListEntry;
use crate::components::base::card_entry::CardEntry;
use crate::components::base::list_entry::ListEntry;
use crate::components::base::utils::{
InputStreamAdded, InputStreamChanged, InputStreamRemoved, SinkAdded, SinkChanged, SinkRemoved,
};
use crate::components::output::sinkEntry::set_sink_volume;
use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis};
use crate::components::output::sink_entry::set_sink_volume;
use crate::components::utils::{create_dropdown_label_factory, set_combo_row_ellipsis};
use super::inputStreamEntry::InputStreamEntry;
use super::sinkBoxImpl;
use super::sinkEntry::{set_default_sink, toggle_sink_mute, SinkEntry};
use super::input_stream_entry::InputStreamEntry;
use super::sink_box_impl;
use super::sink_entry::{set_default_sink, toggle_sink_mute, SinkEntry};
glib::wrapper! {
pub struct SinkBox(ObjectSubclass<sinkBoxImpl::SinkBox>)
pub struct SinkBox(ObjectSubclass<sink_box_impl::SinkBox>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -41,44 +41,44 @@ impl SinkBox {
let obj: Self = Object::builder().build();
{
let imp = obj.imp();
let mut model_index = imp.resetModelIndex.write().unwrap();
let mut model_index = imp.reset_model_index.write().unwrap();
*model_index = 0;
}
obj
}
pub fn setupCallbacks(&self) {
let selfImp = self.imp();
selfImp.resetSinksRow.set_activatable(true);
selfImp
.resetSinksRow
pub fn setup_callbacks(&self) {
let self_imp = self.imp();
self_imp.reset_sinks_row.set_activatable(true);
self_imp
.reset_sinks_row
.set_action_name(Some("navigation.push"));
selfImp
.resetSinksRow
self_imp
.reset_sinks_row
.set_action_target_value(Some(&Variant::from("outputDevices")));
selfImp.resetCardsRow.set_activatable(true);
selfImp
.resetCardsRow
self_imp.reset_cards_row.set_activatable(true);
self_imp
.reset_cards_row
.set_action_name(Some("navigation.push"));
selfImp
.resetCardsRow
self_imp
.reset_cards_row
.set_action_target_value(Some(&Variant::from("profileConfiguration")));
selfImp.resetCardsRow.connect_action_name_notify(|_| {});
self_imp.reset_cards_row.connect_action_name_notify(|_| {});
selfImp.resetInputStreamButton.set_activatable(true);
selfImp
.resetInputStreamButton
self_imp.reset_input_stream_button.set_activatable(true);
self_imp
.reset_input_stream_button
.set_action_name(Some("navigation.pop"));
selfImp.resetInputCardsBackButton.set_activatable(true);
selfImp
.resetInputCardsBackButton
self_imp.reset_input_cards_back_button.set_activatable(true);
self_imp
.reset_input_cards_back_button
.set_action_name(Some("navigation.pop"));
selfImp
.resetSinkDropdown
.set_factory(Some(&createDropdownLabelFactory()));
setComboRowEllipsis(selfImp.resetSinkDropdown.get());
self_imp
.reset_sink_dropdown
.set_factory(Some(&create_dropdown_label_factory()));
set_combo_row_ellipsis(self_imp.reset_sink_dropdown.get());
}
}
@ -94,10 +94,12 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
let sinks = get_sinks();
{
let output_box_imp = output_box.imp();
let mut map = output_box_imp.resetSinkMap.write().unwrap();
let list = output_box_imp.resetModelList.write().unwrap();
let mut model_index = output_box_imp.resetModelIndex.write().unwrap();
output_box_imp.resetDefaultSink.replace(get_default_sink());
let mut map = output_box_imp.reset_sink_map.write().unwrap();
let list = output_box_imp.reset_model_list.write().unwrap();
let mut model_index = output_box_imp.reset_model_index.write().unwrap();
output_box_imp
.reset_default_sink
.replace(get_default_sink());
for (i, sink) in (0_u32..).zip(sinks.iter()) {
list.append(&sink.alias);
map.insert(sink.alias.clone(), (sink.index, i, sink.name.clone()));
@ -112,43 +114,43 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
let output_box_ref_mute = output_box.clone();
{
let output_box_imp = output_box_ref.imp();
let default_sink = output_box_imp.resetDefaultSink.clone();
let default_sink = output_box_imp.reset_default_sink.clone();
let sink = default_sink.borrow();
let volume = sink.volume.first().unwrap_or(&0);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
output_box_imp.resetVolumePercentage.set_text(&percentage);
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
let mut list = output_box_imp.resetSinkList.write().unwrap();
output_box_imp.reset_volume_percentage.set_text(&percentage);
output_box_imp.reset_volume_slider.set_value(*volume as f64);
let mut list = output_box_imp.reset_sink_list.write().unwrap();
for sink in sinks {
let index = sink.index;
let alias = sink.alias.clone();
let mut is_default = false;
if output_box_imp.resetDefaultSink.borrow().name == sink.name {
if output_box_imp.reset_default_sink.borrow().name == sink.name {
is_default = true;
}
let sink_entry = Arc::new(SinkEntry::new(
is_default,
output_box_imp.resetDefaultCheckButton.clone(),
output_box_imp.reset_default_check_button.clone(),
sink,
));
let sink_clone = sink_entry.clone();
let entry = Arc::new(ListEntry::new(&*sink_entry));
entry.set_activatable(false);
list.insert(index, (entry.clone(), sink_clone, alias));
output_box_imp.resetSinks.append(&*entry);
output_box_imp.reset_sinks.append(&*entry);
}
let list = output_box_imp.resetModelList.read().unwrap();
output_box_imp.resetSinkDropdown.set_model(Some(&*list));
let map = output_box_imp.resetSinkMap.read().unwrap();
let name = output_box_imp.resetDefaultSink.borrow();
let list = output_box_imp.reset_model_list.read().unwrap();
output_box_imp.reset_sink_dropdown.set_model(Some(&*list));
let map = output_box_imp.reset_sink_map.read().unwrap();
let name = output_box_imp.reset_default_sink.borrow();
let name = &name.alias;
let index = map.get(name);
if let Some(index) = index {
output_box_imp.resetSinkDropdown.set_selected(index.1);
output_box_imp.reset_sink_dropdown.set_selected(index.1);
}
output_box_imp.resetSinkDropdown.connect_selected_notify(
output_box_imp.reset_sink_dropdown.connect_selected_notify(
clone!(@weak output_box_imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
@ -158,7 +160,7 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let sink = output_box_imp.resetSinkMap.read().unwrap();
let sink = output_box_imp.reset_sink_map.read().unwrap();
let sink = sink.get(&selected);
if sink.is_none() {
return;
@ -170,17 +172,17 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
}
output_box_ref
.imp()
.resetVolumeSlider
.reset_volume_slider
.connect_change_value(move |_, _, value| {
let imp = output_box_ref_slider.imp();
let fraction = (value / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
let sink = imp.resetDefaultSink.borrow();
imp.reset_volume_percentage.set_text(&percentage);
let sink = imp.reset_default_sink.borrow();
let index = sink.index;
let channels = sink.channels;
{
let mut time = imp.volumeTimeStamp.borrow_mut();
let mut time = imp.volume_time_stamp.borrow_mut();
if time.is_some()
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
{
@ -193,19 +195,19 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
});
output_box_ref
.imp()
.resetSinkMute
.reset_sink_mute
.connect_clicked(move |_| {
let imp = output_box_ref_mute.imp();
let stream = imp.resetDefaultSink.clone();
let stream = imp.reset_default_sink.clone();
let mut stream = stream.borrow_mut();
stream.muted = !stream.muted;
let muted = stream.muted;
let index = stream.index;
if muted {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-muted-symbolic");
} else {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-high-symbolic");
}
toggle_sink_mute(index, muted);
@ -223,14 +225,14 @@ pub fn populate_inputstreams(output_box: Arc<SinkBox>) {
glib::spawn_future(async move {
glib::idle_add_once(move || {
let output_box_imp = output_box_ref.imp();
let mut list = output_box_imp.resetInputStreamList.write().unwrap();
let mut list = output_box_imp.reset_input_stream_list.write().unwrap();
for stream in streams {
let index = stream.index;
let input_stream = Arc::new(InputStreamEntry::new(output_box.clone(), stream));
let entry = Arc::new(ListEntry::new(&*input_stream));
entry.set_activatable(false);
list.insert(index, (entry.clone(), input_stream.clone()));
output_box_imp.resetInputStreams.append(&*entry);
output_box_imp.reset_input_streams.append(&*entry);
}
});
});
@ -245,7 +247,7 @@ pub fn populate_cards(output_box: Arc<SinkBox>) {
glib::idle_add_once(move || {
let imp = output_box_ref.imp();
for card in cards {
imp.resetCards.add(&CardEntry::new(card));
imp.reset_cards.add(&CardEntry::new(card));
}
});
});
@ -357,28 +359,28 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
glib::idle_add_once(move || {
let output_box = sink_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetSinkList.write().unwrap();
let mut list = output_box_imp.reset_sink_list.write().unwrap();
let sink_index = ir.sink.index;
let alias = ir.sink.alias.clone();
let name = ir.sink.name.clone();
let mut is_default = false;
if output_box_imp.resetDefaultSink.borrow().name == ir.sink.name {
if output_box_imp.reset_default_sink.borrow().name == ir.sink.name {
is_default = true;
}
let sink_entry = Arc::new(SinkEntry::new(
is_default,
output_box_imp.resetDefaultCheckButton.clone(),
output_box_imp.reset_default_check_button.clone(),
ir.sink,
));
let sink_clone = sink_entry.clone();
let entry = Arc::new(ListEntry::new(&*sink_entry));
entry.set_activatable(false);
list.insert(sink_index, (entry.clone(), sink_clone, alias.clone()));
output_box_imp.resetSinks.append(&*entry);
let mut map = output_box_imp.resetSinkMap.write().unwrap();
let mut index = output_box_imp.resetModelIndex.write().unwrap();
output_box_imp.reset_sinks.append(&*entry);
let mut map = output_box_imp.reset_sink_map.write().unwrap();
let mut index = output_box_imp.reset_model_index.write().unwrap();
output_box_imp
.resetModelList
.reset_model_list
.write()
.unwrap()
.append(&alias);
@ -399,26 +401,26 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
glib::idle_add_once(move || {
let output_box = sink_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetSinkList.write().unwrap();
let mut list = output_box_imp.reset_sink_list.write().unwrap();
let entry = list.get(&ir.index);
if entry.is_none() {
return;
}
output_box_imp.resetSinks.remove(&*entry.unwrap().0);
output_box_imp.reset_sinks.remove(&*entry.unwrap().0);
let alias = list.remove(&ir.index);
if alias.is_none() {
return;
}
let mut map = output_box_imp.resetSinkMap.write().unwrap();
let mut map = output_box_imp.reset_sink_map.write().unwrap();
let entry_index = map.remove(&alias.unwrap().2);
if let Some(entry_index) = entry_index {
output_box_imp
.resetModelList
.reset_model_list
.write()
.unwrap()
.remove(entry_index.1);
}
let mut index = output_box_imp.resetModelIndex.write().unwrap();
let mut index = output_box_imp.reset_model_index.write().unwrap();
if *index != 0 {
*index -= 1;
}
@ -443,22 +445,22 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
let list = output_box_imp.resetSinkList.read().unwrap();
let list = output_box_imp.reset_sink_list.read().unwrap();
let entry = list.get(&ir.sink.index);
if entry.is_none() {
return;
}
let imp = entry.unwrap().1.imp();
if is_default {
output_box_imp.resetVolumePercentage.set_text(&percentage);
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
imp.resetSelectedSink.set_active(true);
output_box_imp.reset_volume_percentage.set_text(&percentage);
output_box_imp.reset_volume_slider.set_value(*volume as f64);
imp.reset_selected_sink.set_active(true);
} else {
imp.resetSelectedSink.set_active(false);
imp.reset_selected_sink.set_active(false);
}
imp.resetSinkName.set_title(ir.sink.alias.clone().as_str());
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
imp.reset_sink_name.set_title(ir.sink.alias.clone().as_str());
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
});
});
true
@ -474,13 +476,13 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
glib::idle_add_once(move || {
let output_box = sink_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetInputStreamList.write().unwrap();
let mut list = output_box_imp.reset_input_stream_list.write().unwrap();
let index = ir.stream.index;
let input_stream = Arc::new(InputStreamEntry::new(output_box.clone(), ir.stream));
let entry = Arc::new(ListEntry::new(&*input_stream));
entry.set_activatable(false);
list.insert(index, (entry.clone(), input_stream.clone()));
output_box_imp.resetInputStreams.append(&*entry);
output_box_imp.reset_input_streams.append(&*entry);
});
});
true
@ -494,7 +496,7 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
let imp = input_stream_changed_box.imp();
let alias: String;
{
let sink_list = imp.resetSinkList.read().unwrap();
let sink_list = imp.reset_sink_list.read().unwrap();
let alias_opt = sink_list.get(&ir.stream.sink_index);
if let Some(alias_opt) = alias_opt {
alias = alias_opt.2.clone();
@ -509,7 +511,7 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
let output_box_imp = output_box.imp();
let entry: Arc<InputStreamEntry>;
{
let list = output_box_imp.resetInputStreamList.read().unwrap();
let list = output_box_imp.reset_input_stream_list.read().unwrap();
let entry_opt = list.get(&ir.stream.index);
if entry_opt.is_none() {
return;
@ -518,23 +520,23 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
}
let imp = entry.imp();
if ir.stream.muted {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-muted-symbolic");
} else {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-high-symbolic");
}
let name = ir.stream.application_name.clone() + ": " + ir.stream.name.as_str();
imp.resetSinkSelection.set_title(name.as_str());
imp.reset_sink_selection.set_title(name.as_str());
let volume = ir.stream.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
let map = output_box_imp.resetSinkMap.read().unwrap();
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
let map = output_box_imp.reset_sink_map.read().unwrap();
let index = map.get(&alias);
if let Some(index) = index {
imp.resetSinkSelection.set_selected(index.1);
imp.reset_sink_selection.set_selected(index.1);
}
});
});
@ -551,12 +553,12 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Co
glib::idle_add_once(move || {
let output_box = sink_box.clone();
let output_box_imp = output_box.imp();
let mut list = output_box_imp.resetInputStreamList.write().unwrap();
let mut list = output_box_imp.reset_input_stream_list.write().unwrap();
let entry = list.get(&ir.index);
if entry.is_none() {
return;
}
output_box_imp.resetInputStreams.remove(&*entry.unwrap().0);
output_box_imp.reset_input_streams.remove(&*entry.unwrap().0);
list.remove(&ir.index);
});
});

View file

@ -4,65 +4,64 @@ use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use std::time::SystemTime;
use crate::components::base::listEntry::ListEntry;
use crate::components::output::inputStreamEntry::InputStreamEntry;
use crate::components::base::list_entry::ListEntry;
use crate::components::output::input_stream_entry::InputStreamEntry;
use gtk::subclass::prelude::*;
use gtk::{glib, Box, Button, CheckButton, CompositeTemplate, Label, StringList, TemplateChild};
use gtk::{prelude::*, ProgressBar, Scale};
use ReSet_Lib::audio::audio::Sink;
use super::sinkBox;
use super::sinkEntry::SinkEntry;
use super::sink_box;
use super::sink_entry::SinkEntry;
type SinkEntryMap = Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>;
type InputStreamEntryMap = Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<InputStreamEntry>)>>>;
type SinkMap = Arc<RwLock<HashMap<String, (u32, u32, String)>>>;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetAudioOutput.ui")]
pub struct SinkBox {
#[template_child]
pub resetSinksRow: TemplateChild<ActionRow>,
pub reset_sinks_row: TemplateChild<ActionRow>,
#[template_child]
pub resetCardsRow: TemplateChild<ActionRow>,
pub reset_cards_row: TemplateChild<ActionRow>,
#[template_child]
pub resetSinkDropdown: TemplateChild<ComboRow>,
pub reset_sink_dropdown: TemplateChild<ComboRow>,
#[template_child]
pub resetSinkMute: TemplateChild<Button>,
pub reset_sink_mute: TemplateChild<Button>,
#[template_child]
pub resetVolumeSlider: TemplateChild<Scale>,
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub resetVolumePercentage: TemplateChild<Label>,
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub resetVolumeMeter: TemplateChild<ProgressBar>,
pub reset_volume_meter: TemplateChild<ProgressBar>,
#[template_child]
pub resetSinks: TemplateChild<Box>,
pub reset_sinks: TemplateChild<Box>,
#[template_child]
pub resetInputStreamButton: TemplateChild<ActionRow>,
pub reset_input_stream_button: TemplateChild<ActionRow>,
#[template_child]
pub resetInputStreams: TemplateChild<Box>,
pub reset_input_streams: TemplateChild<Box>,
#[template_child]
pub resetInputCardsBackButton: TemplateChild<ActionRow>,
pub reset_input_cards_back_button: TemplateChild<ActionRow>,
#[template_child]
pub resetCards: TemplateChild<PreferencesGroup>,
pub resetDefaultCheckButton: Arc<CheckButton>,
pub resetDefaultSink: Arc<RefCell<Sink>>,
pub resetSinkList: SinkEntryMap,
pub resetInputStreamList: InputStreamEntryMap,
pub resetModelList: Arc<RwLock<StringList>>,
pub resetModelIndex: Arc<RwLock<u32>>,
pub reset_cards: TemplateChild<PreferencesGroup>,
pub reset_default_check_button: Arc<CheckButton>,
pub reset_default_sink: Arc<RefCell<Sink>>,
pub reset_sink_list: SinkEntryMap,
pub reset_input_stream_list: InputStreamEntryMap,
pub reset_model_list: Arc<RwLock<StringList>>,
pub reset_model_index: Arc<RwLock<u32>>,
// first u32 is the index of the sink, the second the index in the model list and the third is
// the full name
pub resetSinkMap: SinkMap,
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
pub reset_sink_map: SinkMap,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}
#[glib::object_subclass]
impl ObjectSubclass for SinkBox {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetAudioOutput";
type Type = sinkBox::SinkBox;
type Type = sink_box::SinkBox;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {
@ -82,7 +81,7 @@ impl BoxImpl for SinkBox {}
impl ObjectImpl for SinkBox {
fn constructed(&self) {
let obj = self.obj();
obj.setupCallbacks();
obj.setup_callbacks();
}
}

View file

@ -11,10 +11,10 @@ use glib::{clone, Propagation};
use gtk::{gio, CheckButton};
use ReSet_Lib::audio::audio::Sink;
use super::sinkEntryImpl;
use super::sink_entry_impl;
glib::wrapper! {
pub struct SinkEntry(ObjectSubclass<sinkEntryImpl::SinkEntry>)
pub struct SinkEntry(ObjectSubclass<sink_entry_impl::SinkEntry>)
@extends adw::PreferencesGroup, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -28,24 +28,24 @@ impl SinkEntry {
// TODO use event callback for progress bar -> this is the "im speaking" indicator
{
let imp = obj.imp();
imp.resetSinkName.set_title(stream.alias.clone().as_str());
imp.reset_sink_name.set_title(stream.alias.clone().as_str());
let name = Arc::new(stream.name.clone());
let volume = stream.volume.first().unwrap_or(&0_u32);
let fraction = (*volume as f64 / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.resetVolumeSlider.set_value(*volume as f64);
imp.reset_volume_percentage.set_text(&percentage);
imp.reset_volume_slider.set_value(*volume as f64);
imp.stream.replace(stream);
imp.resetVolumeSlider.connect_change_value(
imp.reset_volume_slider.connect_change_value(
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
let fraction = (value / 655.36).round();
let percentage = (fraction).to_string() + "%";
imp.resetVolumePercentage.set_text(&percentage);
imp.reset_volume_percentage.set_text(&percentage);
let sink = imp.stream.borrow();
let index = sink.index;
let channels = sink.channels;
{
let mut time = imp.volumeTimeStamp.borrow_mut();
let mut time = imp.volume_time_stamp.borrow_mut();
if time.is_some() && time.unwrap().elapsed().unwrap() < Duration::from_millis(50) {
return Propagation::Proceed;
}
@ -55,18 +55,18 @@ impl SinkEntry {
Propagation::Proceed
}),
);
imp.resetSelectedSink.set_group(Some(&*check_group));
imp.reset_selected_sink.set_group(Some(&*check_group));
if is_default {
imp.resetSelectedSink.set_active(true);
imp.reset_selected_sink.set_active(true);
} else {
imp.resetSelectedSink.set_active(false);
imp.reset_selected_sink.set_active(false);
}
imp.resetSelectedSink.connect_toggled(move |button| {
imp.reset_selected_sink.connect_toggled(move |button| {
if button.is_active() {
set_default_sink(name.clone());
}
});
imp.resetSinkMute
imp.reset_sink_mute
.connect_clicked(clone!(@weak imp => move |_| {
let stream = imp.stream.clone();
let mut stream = stream.borrow_mut();
@ -74,10 +74,10 @@ impl SinkEntry {
let muted = stream.muted;
let index = stream.index;
if muted {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-muted-symbolic");
} else {
imp.resetSinkMute
imp.reset_sink_mute
.set_icon_name("audio-volume-high-symbolic");
}
toggle_sink_mute(index, muted);

View file

@ -4,36 +4,35 @@ use std::cell::RefCell;
use std::sync::Arc;
use std::time::SystemTime;
use crate::components::output::sinkEntry;
use crate::components::output::sink_entry;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, ProgressBar, Scale};
use ReSet_Lib::audio::audio::Sink;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetSinkEntry.ui")]
pub struct SinkEntry {
#[template_child]
pub resetSinkName: TemplateChild<ActionRow>,
pub reset_sink_name: TemplateChild<ActionRow>,
#[template_child]
pub resetSelectedSink: TemplateChild<CheckButton>,
pub reset_selected_sink: TemplateChild<CheckButton>,
#[template_child]
pub resetSinkMute: TemplateChild<Button>,
pub reset_sink_mute: TemplateChild<Button>,
#[template_child]
pub resetVolumeSlider: TemplateChild<Scale>,
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub resetVolumePercentage: TemplateChild<Label>,
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub resetVolumeMeter: TemplateChild<ProgressBar>,
pub reset_volume_meter: TemplateChild<ProgressBar>,
pub stream: Arc<RefCell<Sink>>,
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}
#[glib::object_subclass]
impl ObjectSubclass for SinkEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetSinkEntry";
type Type = sinkEntry::SinkEntry;
type Type = sink_entry::SinkEntry;
type ParentType = PreferencesGroup;
fn class_init(klass: &mut Self::Class) {

View file

@ -5,7 +5,7 @@ use glib::{Cast, Object};
use gtk::prelude::{GObjectPropertyExpressionExt, ListBoxRowExt, ListItemExt, WidgetExt};
use gtk::{Align, SignalListItemFactory, StringObject};
pub fn createDropdownLabelFactory() -> SignalListItemFactory {
pub fn create_dropdown_label_factory() -> SignalListItemFactory {
let factory = SignalListItemFactory::new();
factory.connect_setup(|_, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
@ -19,7 +19,7 @@ pub fn createDropdownLabelFactory() -> SignalListItemFactory {
factory
}
pub fn setComboRowEllipsis(element: ComboRow) {
pub fn set_combo_row_ellipsis(element: ComboRow) {
for (i, child) in element
.child()
.unwrap()

View file

@ -1,14 +1,13 @@
#![allow(non_snake_case)]
pub mod savedWifiEntry;
pub mod savedWifiEntryImpl;
pub mod saved_wifi_entry;
pub mod saved_wifi_entry_impl;
pub mod utils;
pub mod wifiAddressEntry;
pub mod wifiAddressEntryImpl;
pub mod wifiBox;
pub mod wifiBoxImpl;
pub mod wifiEntry;
pub mod wifiEntryImpl;
pub mod wifiOptions;
pub mod wifiOptionsImpl;
pub mod wifiRouteEntry;
pub mod wifiRouteEntryImpl;
pub mod wifi_address_entry;
pub mod wifi_address_entry_impl;
pub mod wifi_box;
pub mod wifi_box_impl;
pub mod wifi_entry;
pub mod wifi_entry_impl;
pub mod wifi_options;
pub mod wifi_options_impl;
pub mod wifi_route_entry;
pub mod wifi_route_entry_impl;

View file

@ -1,7 +1,7 @@
use std::time::Duration;
use crate::components::wifi::savedWifiEntryImpl;
use crate::components::wifi::wifiBoxImpl::WifiBox;
use crate::components::wifi::saved_wifi_entry_impl;
use crate::components::wifi::wifi_box_impl::WifiBox;
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ButtonExt, WidgetExt};
@ -13,30 +13,30 @@ use gtk::gio;
use gtk::prelude::ListBoxRowExt;
glib::wrapper! {
pub struct SavedWifiEntry(ObjectSubclass<savedWifiEntryImpl::SavedWifiEntry>)
pub struct SavedWifiEntry(ObjectSubclass<saved_wifi_entry_impl::SavedWifiEntry>)
@extends adw::ActionRow, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::Actionable, gtk::ConstraintTarget, gtk::ListBoxRow;
}
impl SavedWifiEntry {
pub fn new(name: &str, path: Path<'static>, wifiBox: &WifiBox) -> Self {
pub fn new(name: &str, path: Path<'static>, wifi_box: &WifiBox) -> Self {
let entry: SavedWifiEntry = Object::builder().build();
entry.set_activatable(false);
let entryImp = entry.imp();
let entry_imp = entry.imp();
entryImp.resetEditSavedWifiButton.connect_clicked(
clone!(@ weak entryImp, @ weak wifiBox => move |_| {
entry_imp.reset_edit_saved_wifi_button.connect_clicked(
clone!(@ weak entry_imp, @ weak wifi_box => move |_| {
// TODO accesspoint has to be saved somewhere i guess
// let _option = getConnectionSettings(entryImp.accessPoint.borrow().associated_connection.clone());
// wifiBox.resetWifiNavigation.push(&*WifiOptions::new(_option));
}),
);
entryImp.resetSavedWifiLabel.set_text(name);
entryImp.resetConnectionPath.set(path);
entryImp.resetDeleteSavedWifiButton.connect_clicked(
entry_imp.reset_saved_wifi_label.set_text(name);
entry_imp.reset_connection_path.set(path);
entry_imp.reset_delete_saved_wifi_button.connect_clicked(
clone!(@weak entry as entry => move |_| {
delete_connection(entry.imp().resetConnectionPath.take());
delete_connection(entry.imp().reset_connection_path.take());
// TODO handle error
let parent = entry.parent().unwrap();
parent.set_visible(false);

View file

@ -8,20 +8,19 @@ use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, Label};
use ReSet_Lib::network::network::AccessPoint;
use super::savedWifiEntry;
use super::saved_wifi_entry;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetSavedWifiEntry.ui")]
pub struct SavedWifiEntry {
#[template_child]
pub resetDeleteSavedWifiButton: TemplateChild<Button>,
pub reset_delete_saved_wifi_button: TemplateChild<Button>,
#[template_child]
pub resetEditSavedWifiButton: TemplateChild<Button>,
pub reset_edit_saved_wifi_button: TemplateChild<Button>,
#[template_child]
pub resetSavedWifiLabel: TemplateChild<Label>,
pub resetConnectionPath: RefCell<Path<'static>>,
pub accessPoint: RefCell<AccessPoint>,
pub reset_saved_wifi_label: TemplateChild<Label>,
pub reset_connection_path: RefCell<Path<'static>>,
pub access_point: RefCell<AccessPoint>,
}
unsafe impl Send for SavedWifiEntry {}
@ -31,7 +30,7 @@ unsafe impl Sync for SavedWifiEntry {}
impl ObjectSubclass for SavedWifiEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetSavedWifiEntry";
type Type = savedWifiEntry::SavedWifiEntry;
type Type = saved_wifi_entry::SavedWifiEntry;
type ParentType = ActionRow;
fn class_init(klass: &mut Self::Class) {

View file

@ -16,7 +16,7 @@ pub enum IpProtocol {
type ResultType =
Result<(HashMap<String, HashMap<String, dbus::arg::Variant<Box<dyn RefArg>>>>,), Error>;
pub fn getConnectionSettings(path: Path<'static>) -> ResetConnection {
pub fn get_connection_settings(path: Path<'static>) -> ResetConnection {
let conn = Connection::new_session().unwrap();
let proxy = conn.with_proxy(
"org.Xetibo.ReSetDaemon",

View file

@ -1,160 +0,0 @@
use std::cell::RefCell;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::rc::Rc;
use std::str::FromStr;
use adw::glib;
use adw::glib::Object;
use adw::prelude::PreferencesRowExt;
use glib::clone;
use glib::subclass::prelude::ObjectSubclassIsExt;
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
use ReSet_Lib::network::connection::{Address, Connection};
use crate::components::wifi::utils::IpProtocol;
use crate::components::wifi::wifiAddressEntryImpl;
use crate::components::wifi::wifiAddressEntryImpl::WifiAddressEntryImpl;
glib::wrapper! {
pub struct WifiAddressEntry(ObjectSubclass<wifiAddressEntryImpl::WifiAddressEntryImpl>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
impl WifiAddressEntry {
pub fn new(
address: Option<usize>,
conn: Rc<RefCell<Connection>>,
protocol: IpProtocol,
) -> Self {
let entry: WifiAddressEntry = Object::builder().build();
let entryImp = entry.imp();
if let Some(address) = address {
let conn = conn.borrow();
let address = unsafe { conn.ipv4.address_data.get_unchecked(address) };
entryImp.resetAddressAddress.set_text(&address.address);
entryImp
.resetAddressPrefix
.set_text(&address.prefix_length.to_string());
entryImp
.resetAddressRow
.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
}
entryImp.protocol.set(protocol);
entry.setupCallbacks(conn);
entry
}
pub fn setupCallbacks(&self, connection: Rc<RefCell<Connection>>) {
let selfImp = self.imp();
let conn = connection.clone();
selfImp.resetAddressAddress.connect_changed(clone!(@weak selfImp => move |entry| {
let addressInput = entry.text();
let mut conn = conn.borrow_mut();
if addressInput.is_empty() {
selfImp.resetAddressAddress.remove_css_class("error");
selfImp.resetAddressRow.set_title("Add new address");
return;
}
let result = match selfImp.protocol.get() {
IpProtocol::IPv4 => Ipv4Addr::from_str(addressInput.as_str()).map(IpAddr::V4),
IpProtocol::IPv6 => Ipv6Addr::from_str(addressInput.as_str()).map(IpAddr::V6),
};
match result {
Ok(ipAddr) => {
selfImp.resetAddressAddress.remove_css_class("error");
let addressData = match selfImp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.address_data,
IpProtocol::IPv6 => &mut conn.ipv6.address_data,
};
addressData.push(Address::theBetterNew(ipAddr.to_string(), selfImp.prefix.get().1 as u32));
*selfImp.address.borrow_mut() = (true, ipAddr.to_string());
}
Err(_) => {
selfImp.resetAddressAddress.add_css_class("error");
*selfImp.address.borrow_mut() = (false, String::default());
}
}
setRowName(&selfImp);
}));
let conn = connection.clone();
selfImp.resetAddressPrefix.connect_changed(clone!(@weak selfImp => move |entry| {
let prefixInput = entry.text();
let prefix = prefixInput.parse::<u8>();
let mut conn = conn.borrow_mut();
let handleError = || {
if selfImp.resetAddressPrefix.text().is_empty() {
selfImp.resetAddressPrefix.remove_css_class("error");
} else {
selfImp.resetAddressPrefix.add_css_class("error");
}
selfImp.prefix.set((false, 0));
setRowName(&selfImp);
};
if prefixInput.is_empty() || prefix.is_err() {
handleError();
return;
}
let prefix = prefix.unwrap();
match selfImp.protocol.get() {
IpProtocol::IPv4 if prefix <= 32 => {
selfImp.prefix.set((true, prefix as u32));
selfImp.resetAddressPrefix.remove_css_class("error");
if let Ok(address2) = Ipv4Addr::from_str(selfImp.resetAddressAddress.text().as_str()) {
if let Some(addr) = conn.ipv4.address_data.iter_mut()
.find(|connAddr| *connAddr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
IpProtocol::IPv6 if prefix <= 128 => {
selfImp.prefix.set((true, prefix as u32));
selfImp.resetAddressPrefix.remove_css_class("error");
if let Ok(address2) = Ipv6Addr::from_str(selfImp.resetAddressAddress.text().as_str()) {
if let Some(addr) = conn.ipv6.address_data.iter_mut()
.find(|connAddr| *connAddr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
_ => handleError()
}
setRowName(&selfImp);
}));
let conn = connection.clone();
selfImp.resetAddressRemove.connect_clicked(
clone!(@weak selfImp, @weak self as what => move |_| {
let address = selfImp.resetAddressAddress.text();
let mut conn = conn.borrow_mut();
conn.ipv4.address_data.retain(|addr| addr.address != address);
what.unparent();
}),
);
}
}
fn setRowName(selfImp: &WifiAddressEntryImpl) {
if selfImp.resetAddressAddress.text().is_empty() {
return;
}
let address = selfImp.address.borrow();
let prefix = selfImp.prefix.get();
let title = match (address.0, prefix.0) {
(true, true) => {
format!("{}/{}", address.1, prefix.1)
}
(true, false) => "Prefix wrong".to_string(),
(false, true) => "Address wrong".to_string(),
(false, false) => "Address and Prefix wrong".to_string(),
};
selfImp.resetAddressRow.set_title(&title);
}

View file

@ -1,342 +0,0 @@
use std::net::{Ipv4Addr, Ipv6Addr};
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use adw::{gio, glib};
use adw::glib::Object;
use adw::prelude::{ActionRowExt, ComboRowExt, PreferencesGroupExt};
use adw::subclass::prelude::ObjectSubclassIsExt;
use dbus::{Error, Path};
use dbus::arg::PropMap;
use glib::{clone, PropertySet};
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
use ReSet_Lib::network::connection::{Connection, DNSMethod4, DNSMethod6, Enum, TypeSettings};
use IpProtocol::{IPv4, IPv6};
use crate::components::wifi::utils::IpProtocol;
use crate::components::wifi::wifiAddressEntry::WifiAddressEntry;
use crate::components::wifi::wifiOptionsImpl;
use crate::components::wifi::wifiRouteEntry::WifiRouteEntry;
glib::wrapper! {
pub struct WifiOptions(ObjectSubclass<wifiOptionsImpl::WifiOptions>)
@extends adw::NavigationPage, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget;
}
unsafe impl Send for WifiOptions {}
unsafe impl Sync for WifiOptions {}
impl WifiOptions {
pub fn new(connection: Connection, accessPoint: Path<'static>) -> Arc<Self> {
let wifiOption: Arc<WifiOptions> = Arc::new(Object::builder().build());
wifiOption.imp().connection.set(connection);
wifiOption.initializeUI();
setupCallbacks(&wifiOption, accessPoint);
wifiOption
}
pub fn initializeUI(&self) {
let selfImp = self.imp();
let ip4AddressLength;
let ip4RouteLength;
let ip6AddressLength;
let ip6RouteLength;
{
let conn = selfImp.connection.borrow();
ip4AddressLength = conn.ipv4.address_data.len();
ip4RouteLength = conn.ipv4.route_data.len();
ip6AddressLength = conn.ipv4.address_data.len();
ip6RouteLength = conn.ipv4.route_data.len();
// General
selfImp.resetWifiAutoConnect.set_active(conn.settings.autoconnect);
selfImp.resetWifiMetered.set_active(conn.settings.metered != -1);
match &conn.device {
TypeSettings::WIFI(wifi) => {
selfImp.resetWifiLinkSpeed.set_visible(false);
selfImp.resetWifiIP4Addr.set_visible(false);
selfImp.resetWifiIP6Addr.set_visible(false);
selfImp.resetWifiDNS.set_visible(false);
selfImp.resetWifiGateway.set_visible(false);
selfImp.resetWifiLastUsed.set_visible(true);
selfImp.resetWifiMac.set_subtitle(&*wifi.cloned_mac_address);
selfImp.resetWifiName.set_subtitle(&*String::from_utf8(wifi.ssid.clone())
.unwrap_or(String::default()));
}
TypeSettings::ETHERNET(ethernet) => {
selfImp.resetWifiLinkSpeed.set_visible(true);
selfImp.resetWifiIP4Addr.set_visible(true);
selfImp.resetWifiIP6Addr.set_visible(true);
selfImp.resetWifiDNS.set_visible(true);
selfImp.resetWifiGateway.set_visible(true);
selfImp.resetWifiLastUsed.set_visible(false);
selfImp.resetWifiMac.set_subtitle(&*ethernet.cloned_mac_address);
selfImp.resetWifiLinkSpeed.set_subtitle(&*ethernet.speed.to_string());
}
TypeSettings::VPN(_vpn) => {}
TypeSettings::None => {}
};
// IPv4
selfImp.resetIP4Method.set_selected(conn.ipv4.dns_method.to_i32() as u32);
self.setIP4Visibility(conn.ipv4.dns_method.to_i32() as u32);
let ipv4Dns: Vec<String> = conn.ipv4.dns.iter().map(|addr| {
addr.iter().map(|octet| octet.to_string()).collect::<Vec<String>>().join(".")
}).collect();
selfImp.resetIP4DNS.set_text(&ipv4Dns.join(", "));
selfImp.resetIP4Gateway.set_text(&conn.ipv4.gateway);
// IPv6
selfImp.resetIP6Method.set_selected(conn.ipv6.dns_method.to_i32() as u32);
self.setIP6Visibility(conn.ipv6.dns_method.to_i32() as u32);
let ipv6Dns: Vec<String> = conn.ipv6.dns.iter().map(|addr| {
addr.iter().map(|octet| octet.to_string()).collect::<Vec<String>>().join(":")
}).collect();
selfImp.resetIP6DNS.set_text(&ipv6Dns.join(", "));
selfImp.resetIP6Gateway.set_text(&conn.ipv6.gateway);
// Security
if let TypeSettings::WIFI(wifi) = &conn.device {
match wifi.security_settings.key_management.as_str() {
"none" => {
selfImp.resetWifiSecurityDropdown.set_selected(0);
selfImp.resetWifiPassword.set_visible(false);
selfImp.resetWifiPassword.set_text("");
}
"wpa-psk" => {
selfImp.resetWifiSecurityDropdown.set_selected(1);
selfImp.resetWifiPassword.set_visible(true);
selfImp.resetWifiPassword.set_text(&wifi.security_settings.psk);
}
_ => {}
}
}
}
// IPv4
for i in 0..ip4AddressLength {
let address = &WifiAddressEntry::new(Some(i), selfImp.connection.clone(), IPv4);
selfImp.resetIP4AddressGroup.add(address);
}
let address = &WifiAddressEntry::new(None, selfImp.connection.clone(), IPv4);
selfImp.resetIP4AddressGroup.add(address);
for i in 0..ip4RouteLength {
let route = &WifiRouteEntry::new(Some(i), selfImp.connection.clone(), IPv4);
selfImp.resetIP4RoutesGroup.add(route)
}
let route = &WifiRouteEntry::new(None, selfImp.connection.clone(), IPv4);
selfImp.resetIP4RoutesGroup.add(route);
// IPv6
for i in 0..ip6AddressLength {
let address = &WifiAddressEntry::new(Some(i), selfImp.connection.clone(), IPv6);
selfImp.resetIP6AddressGroup.add(address);
}
let address = &WifiAddressEntry::new(None, selfImp.connection.clone(), IPv6);
selfImp.resetIP6AddressGroup.add(address);
for i in 0..ip6RouteLength {
let route = &WifiRouteEntry::new(Some(i), selfImp.connection.clone(), IPv6);
selfImp.resetIP6RoutesGroup.add(route);
}
let route = &WifiRouteEntry::new(None, selfImp.connection.clone(), IPv6);
selfImp.resetIP6RoutesGroup.add(route);
// Security
}
pub fn setIP4Visibility(&self, method: u32) {
let selfImp = self.imp();
match method {
0 => { // auto
selfImp.resetIP4AddressGroup.set_visible(false);
selfImp.resetIP4RoutesGroup.set_visible(true);
selfImp.resetIP4Gateway.set_visible(false);
}
1 => { // manual
selfImp.resetIP4AddressGroup.set_visible(true);
selfImp.resetIP4RoutesGroup.set_visible(true);
selfImp.resetIP4Gateway.set_visible(true);
}
_ => {
selfImp.resetIP4AddressGroup.set_visible(false);
selfImp.resetIP4RoutesGroup.set_visible(false);
selfImp.resetIP4Gateway.set_visible(false);
}
}
}
pub fn setIP6Visibility(&self, method: u32) {
let selfImp = self.imp();
match method {
0 | 1 => { // auto, dhcp
selfImp.resetIP6AddressGroup.set_visible(false);
selfImp.resetIP6RoutesGroup.set_visible(true);
selfImp.resetIP6Gateway.set_visible(false);
}
2 => { // manual
selfImp.resetIP6AddressGroup.set_visible(true);
selfImp.resetIP6RoutesGroup.set_visible(true);
selfImp.resetIP6Gateway.set_visible(true);
}
_ => {
selfImp.resetIP6AddressGroup.set_visible(false);
selfImp.resetIP6RoutesGroup.set_visible(false);
selfImp.resetIP6Gateway.set_visible(false);
}
}
}
}
fn setupCallbacks(wifiOptions: &Arc<WifiOptions>, path: Path<'static>) {
let imp = wifiOptions.imp();
// General
imp.resetWifiAutoConnect.connect_active_notify(clone!(@weak imp => move |x| {
imp.connection.borrow_mut().settings.autoconnect = x.is_active();
}));
imp.resetWifiMetered.connect_active_notify(clone!(@weak imp => move |x| {
imp.connection.borrow_mut().settings.metered = if x.is_active() { 1 } else { 2 };
}));
imp.wifiOptionsApplyButton.connect_clicked(clone!(@weak imp => move |_| {
let prop = imp.connection.borrow().convert_to_propmap();
setConnectionSettings(path.clone(), prop);
}));
// IPv4
let wifiOptionsIP4 = wifiOptions.clone();
imp.resetIP4Method.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected();
let mut conn = imp.connection.borrow_mut();
conn.ipv4.dns_method = DNSMethod4::from_i32(selected as i32);
wifiOptionsIP4.setIP4Visibility(selected);
}));
imp.resetIP4DNS.connect_changed(clone!(@weak imp => move |entry| {
let dnsInput = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv4.dns.clear();
if dnsInput.is_empty() {
imp.resetIP4DNS.remove_css_class("error");
return;
}
for dnsEntry in dnsInput.as_str().split(',').map(|s| s.trim()) {
if let Ok(addr) = Ipv4Addr::from_str(dnsEntry) {
imp.resetIP4DNS.remove_css_class("error");
conn.ipv4.dns.push(addr.octets().to_vec());
} else {
imp.resetIP4DNS.add_css_class("error");
}
}
}));
imp.resetIP4AddressAddButton.connect_clicked(clone!(@weak imp => move |_| {
let address = &WifiAddressEntry::new(None, imp.connection.clone(), IpProtocol::IPv4);
imp.resetIP4AddressGroup.add(address);
}));
imp.resetIP4Gateway.connect_changed(clone!(@weak imp => move |entry| {
let gatewayInput = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv4.gateway.clear();
if gatewayInput.is_empty() {
imp.resetIP4Gateway.remove_css_class("error");
return;
}
if let Ok(_) = Ipv4Addr::from_str(gatewayInput.as_str()) {
imp.resetIP4Gateway.remove_css_class("error");
conn.ipv4.gateway = gatewayInput.to_string();
} else {
imp.resetIP4Gateway.add_css_class("error");
}
}));
// IPv6
let wifiOptionsIP6 = wifiOptions.clone();
imp.resetIP6Method.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected();
let mut conn = imp.connection.borrow_mut();
conn.ipv6.dns_method = DNSMethod6::from_i32(selected as i32);
wifiOptionsIP6.setIP6Visibility(selected);
}));
imp.resetIP6DNS.connect_changed(clone!(@weak imp => move |entry| {
let dnsInput = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv6.dns.clear();
if dnsInput.is_empty() {
imp.resetIP6DNS.remove_css_class("error");
return;
}
for dnsEntry in dnsInput.as_str().split(',').map(|s| s.trim()) {
if let Ok(addr) = Ipv6Addr::from_str(dnsEntry) {
imp.resetIP6DNS.remove_css_class("error");
conn.ipv6.dns.push(addr.octets().to_vec());
} else {
imp.resetIP6DNS.add_css_class("error");
}
}
}));
imp.resetIP6AddressAddButton.connect_clicked(clone!(@weak imp => move |_| {
let address = &WifiAddressEntry::new(None, imp.connection.clone(), IpProtocol::IPv4);
imp.resetIP6AddressGroup.add(address);
}));
imp.resetIP6Gateway.connect_changed(clone!(@weak imp => move |entry| {
let gatewayInput = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv6.gateway.clear();
if gatewayInput.is_empty() {
imp.resetIP6Gateway.remove_css_class("error");
return;
}
if let Ok(_) = Ipv6Addr::from_str(gatewayInput.as_str()) {
imp.resetIP6Gateway.remove_css_class("error");
conn.ipv6.gateway = gatewayInput.to_string();
} else {
imp.resetIP6Gateway.add_css_class("error");
}
}));
// Security
imp.resetWifiSecurityDropdown.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected();
let mut conn = imp.connection.borrow_mut();
match (selected, &mut conn.device) {
(0 , TypeSettings::WIFI(wifi)) => { // None
imp.resetWifiPassword.set_visible(false);
wifi.security_settings.key_management = String::from("none");
wifi.security_settings.authentication_algorithm = String::from("open");
},
(1 , TypeSettings::WIFI(wifi)) => { // WPA/WPA2 Personal
imp.resetWifiPassword.set_visible(true);
wifi.security_settings.key_management = String::from("wpa-psk");
wifi.security_settings.authentication_algorithm = String::from("");
},
(_, _) => {}
}
}));
imp.resetWifiPassword.connect_changed(clone!(@weak imp => move |entry| {
let passwordInput = entry.text();
let mut conn = imp.connection.borrow_mut();
if let TypeSettings::WIFI(wifi) = &mut conn.device {
wifi.security_settings.psk = passwordInput.to_string();
}
}));
}
fn setConnectionSettings(path: Path<'static>, prop: PropMap) {
gio::spawn_blocking(move || {
let conn = dbus::blocking::Connection::new_session().unwrap();
let proxy = conn.with_proxy(
"org.Xetibo.ReSetDaemon",
"/org/Xetibo/ReSetDaemon",
Duration::from_millis(1000),
);
let _: Result<(bool,), Error> = proxy.method_call(
"org.Xetibo.ReSetWireless",
"SetConnectionSettings",
(path, prop),
);
});
}

View file

@ -1,242 +0,0 @@
use crate::components::wifi::utils::IpProtocol;
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ExpanderRowExt, PreferencesRowExt};
use glib::clone;
use glib::subclass::prelude::ObjectSubclassIsExt;
use gtk::prelude::{EditableExt, WidgetExt};
use std::cell::RefCell;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::rc::Rc;
use std::str::FromStr;
use ReSet_Lib::network::connection::{Address, Connection};
use crate::components::wifi::wifiRouteEntryImpl;
use crate::components::wifi::wifiRouteEntryImpl::WifiRouteEntryImpl;
glib::wrapper! {
pub struct WifiRouteEntry(ObjectSubclass<wifiRouteEntryImpl::WifiRouteEntryImpl>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
impl WifiRouteEntry {
pub fn new(
address: Option<usize>,
conn: Rc<RefCell<Connection>>,
protocol: IpProtocol,
) -> Self {
let entry: WifiRouteEntry = Object::builder().build();
let entryImp = entry.imp();
if let Some(address) = address {
let conn = conn.borrow();
let address = unsafe { conn.ipv4.route_data.get_unchecked(address) };
entryImp.resetRouteAddress.set_text(&address.address);
entryImp
.resetRoutePrefix
.set_text(&address.prefix_length.to_string());
if let Some(gateway) = &address.gateway {
entryImp.resetRouteGateway.set_text(gateway);
}
if let Some(metric) = address.metric {
entryImp.resetRouteMetric.set_text(&metric.to_string());
}
entryImp
.resetRouteRow
.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
}
entryImp.protocol.set(protocol);
entry.setupCallbacks(conn);
entry
}
fn setupCallbacks(&self, connection: Rc<RefCell<Connection>>) {
let selfImp = self.imp();
let conn = connection.clone();
selfImp.resetRouteAddress.connect_changed(clone!(@weak selfImp => move |entry| {
let addressInput = entry.text();
let mut conn = conn.borrow_mut();
if addressInput.is_empty() {
selfImp.resetRouteAddress.remove_css_class("error");
selfImp.resetRouteRow.set_title("Add new address");
return;
}
let result = match selfImp.protocol.get() {
IpProtocol::IPv4 => Ipv4Addr::from_str(addressInput.as_str()).map(IpAddr::V4),
IpProtocol::IPv6 => Ipv6Addr::from_str(addressInput.as_str()).map(IpAddr::V6),
};
match result {
Ok(ipAddr) => {
selfImp.resetRouteAddress.remove_css_class("error");
let addressData = match selfImp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.route_data,
IpProtocol::IPv6 => &mut conn.ipv6.route_data,
};
addressData.push(Address::new(ipAddr.to_string(), selfImp.prefix.get().1 as u32, selfImp.gateway.borrow().clone(), selfImp.metric.get()));
*selfImp.address.borrow_mut() = (true, ipAddr.to_string());
}
Err(_) => {
selfImp.resetRouteAddress.add_css_class("error");
*selfImp.address.borrow_mut() = (false, String::default());
}
}
setRowTitle(&selfImp);
}));
let conn = connection.clone();
selfImp.resetRoutePrefix.connect_changed(clone!(@weak selfImp => move |entry| {
let prefixInput = entry.text();
let prefix = prefixInput.parse::<u8>();
let mut conn = conn.borrow_mut();
let handleError = || {
if selfImp.resetRoutePrefix.text().is_empty() {
selfImp.resetRoutePrefix.remove_css_class("error");
} else {
selfImp.resetRoutePrefix.add_css_class("error");
}
selfImp.prefix.set((false, 0));
setRowTitle(&selfImp);
};
if prefixInput.is_empty() || prefix.is_err() {
handleError();
return;
}
let prefix = prefix.unwrap();
match selfImp.protocol.get() {
IpProtocol::IPv4 if prefix <= 32 => {
selfImp.prefix.set((true, prefix as u32));
selfImp.resetRoutePrefix.remove_css_class("error");
if let Ok(address2) = Ipv4Addr::from_str(selfImp.resetRouteAddress.text().as_str()) {
if let Some(addr) = conn.ipv4.route_data.iter_mut()
.find(|connAddr| *connAddr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
IpProtocol::IPv6 if prefix <= 128 => {
selfImp.prefix.set((true, prefix as u32));
selfImp.resetRoutePrefix.remove_css_class("error");
if let Ok(address2) = Ipv6Addr::from_str(selfImp.resetRouteAddress.text().as_str()) {
if let Some(addr) = conn.ipv6.route_data.iter_mut()
.find(|connAddr| *connAddr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
_ => handleError()
}
setRowTitle(&selfImp);
}));
let conn = connection.clone();
selfImp
.resetRouteGateway
.connect_changed(clone!(@weak selfImp => move |entry| {
let gatewayInput = entry.text();
let mut conn = conn.borrow_mut();
if gatewayInput.is_empty() {
selfImp.resetRouteGateway.remove_css_class("error");
*selfImp.gateway.borrow_mut() = None;
setRowSubtitle(&selfImp);
return;
}
let result = match selfImp.protocol.get() {
IpProtocol::IPv4 => Ipv4Addr::from_str(gatewayInput.as_str()).map(IpAddr::V4),
IpProtocol::IPv6 => Ipv6Addr::from_str(gatewayInput.as_str()).map(IpAddr::V6),
};
match result {
Ok(ipAddr) => {
selfImp.resetRouteGateway.remove_css_class("error");
let addressData = match selfImp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.route_data,
IpProtocol::IPv6 => &mut conn.ipv6.route_data,
};
if let Some(address) = addressData.iter_mut()
.find(|connAddr| *connAddr.address == selfImp.resetRouteAddress.text()) {
address.gateway = Some(ipAddr.to_string());
}
*selfImp.gateway.borrow_mut() = Some(ipAddr.to_string());
}
Err(_) => {
selfImp.resetRouteGateway.add_css_class("error");
*selfImp.gateway.borrow_mut() = None;
}
}
setRowSubtitle(&selfImp);
}));
let conn = connection.clone();
selfImp
.resetRouteMetric
.connect_changed(clone!(@weak selfImp => move |entry| {
let metricInput = entry.text();
let mut conn = conn.borrow_mut();
if metricInput.is_empty() {
selfImp.resetRouteMetric.remove_css_class("error");
selfImp.metric.set(None);
setRowSubtitle(&selfImp);
return;
}
let result = metricInput.parse::<u32>();
match result {
Ok(metric) => {
selfImp.resetRouteMetric.remove_css_class("error");
let addressData = match selfImp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.route_data,
IpProtocol::IPv6 => &mut conn.ipv6.route_data,
};
if let Some(address) = addressData.iter_mut()
.find(|connAddr| *connAddr.address == selfImp.resetRouteAddress.text()) {
address.metric = Some(metric);
}
selfImp.metric.set(Some(metric));
}
Err(_) => {
selfImp.resetRouteMetric.add_css_class("error");
selfImp.metric.set(None);
}
}
setRowSubtitle(&selfImp);
}));
}
}
fn setRowTitle(selfImp: &WifiRouteEntryImpl) {
if selfImp.resetRouteAddress.text().is_empty() {
return;
}
let address = selfImp.address.borrow();
let prefix = selfImp.prefix.get();
let title = match (address.0, prefix.0) {
(true, true) => {
format!("{}/{}", address.1, prefix.1)
}
(true, false) => "Prefix wrong".to_string(),
(false, true) => "Address wrong".to_string(),
(false, false) => "Address and Prefix wrong".to_string(),
};
selfImp.resetRouteRow.set_title(&title);
}
fn setRowSubtitle(selfImp: &WifiRouteEntryImpl) {
let gateway = selfImp.gateway.borrow().clone();
let metric = selfImp.metric.get();
let title = match (gateway, metric) {
(Some(gateway), Some(metric)) => {
format!("{}, {}", gateway, metric)
}
(Some(gateway), None) => gateway,
(None, Some(metric)) => metric.to_string(),
(None, None) => String::default(),
};
selfImp.resetRouteRow.set_subtitle(&title);
}

View file

@ -0,0 +1,160 @@
use std::cell::RefCell;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::rc::Rc;
use std::str::FromStr;
use adw::glib;
use adw::glib::Object;
use adw::prelude::PreferencesRowExt;
use glib::clone;
use glib::subclass::prelude::ObjectSubclassIsExt;
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
use ReSet_Lib::network::connection::{Address, Connection};
use crate::components::wifi::utils::IpProtocol;
use crate::components::wifi::wifi_address_entry_impl;
use crate::components::wifi::wifi_address_entry_impl::WifiAddressEntryImpl;
glib::wrapper! {
pub struct WifiAddressEntry(ObjectSubclass<wifi_address_entry_impl::WifiAddressEntryImpl>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
impl WifiAddressEntry {
pub fn new(
address: Option<usize>,
conn: Rc<RefCell<Connection>>,
protocol: IpProtocol,
) -> Self {
let entry: WifiAddressEntry = Object::builder().build();
let entry_imp = entry.imp();
if let Some(address) = address {
let conn = conn.borrow();
let address = unsafe { conn.ipv4.address_data.get_unchecked(address) };
entry_imp.reset_address_address.set_text(&address.address);
entry_imp
.reset_address_prefix
.set_text(&address.prefix_length.to_string());
entry_imp
.reset_address_row
.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
}
entry_imp.protocol.set(protocol);
entry.setup_callbacks(conn);
entry
}
pub fn setup_callbacks(&self, connection: Rc<RefCell<Connection>>) {
let self_imp = self.imp();
let conn = connection.clone();
self_imp.reset_address_address.connect_changed(clone!(@weak self_imp => move |entry| {
let address_input = entry.text();
let mut conn = conn.borrow_mut();
if address_input.is_empty() {
self_imp.reset_address_address.remove_css_class("error");
self_imp.reset_address_row.set_title("Add new address");
return;
}
let result = match self_imp.protocol.get() {
IpProtocol::IPv4 => Ipv4Addr::from_str(address_input.as_str()).map(IpAddr::V4),
IpProtocol::IPv6 => Ipv6Addr::from_str(address_input.as_str()).map(IpAddr::V6),
};
match result {
Ok(ip_addr) => {
self_imp.reset_address_address.remove_css_class("error");
let address_data = match self_imp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.address_data,
IpProtocol::IPv6 => &mut conn.ipv6.address_data,
};
address_data.push(Address::theBetterNew(ip_addr.to_string(), self_imp.prefix.get().1 as u32));
*self_imp.address.borrow_mut() = (true, ip_addr.to_string());
}
Err(_) => {
self_imp.reset_address_address.add_css_class("error");
*self_imp.address.borrow_mut() = (false, String::default());
}
}
set_row_name(&self_imp);
}));
let conn = connection.clone();
self_imp.reset_address_prefix.connect_changed(clone!(@weak self_imp => move |entry| {
let prefix_input = entry.text();
let prefix = prefix_input.parse::<u8>();
let mut conn = conn.borrow_mut();
let handle_error = || {
if self_imp.reset_address_prefix.text().is_empty() {
self_imp.reset_address_prefix.remove_css_class("error");
} else {
self_imp.reset_address_prefix.add_css_class("error");
}
self_imp.prefix.set((false, 0));
set_row_name(&self_imp);
};
if prefix_input.is_empty() || prefix.is_err() {
handle_error();
return;
}
let prefix = prefix.unwrap();
match self_imp.protocol.get() {
IpProtocol::IPv4 if prefix <= 32 => {
self_imp.prefix.set((true, prefix as u32));
self_imp.reset_address_prefix.remove_css_class("error");
if let Ok(address2) = Ipv4Addr::from_str(self_imp.reset_address_address.text().as_str()) {
if let Some(addr) = conn.ipv4.address_data.iter_mut()
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
IpProtocol::IPv6 if prefix <= 128 => {
self_imp.prefix.set((true, prefix as u32));
self_imp.reset_address_prefix.remove_css_class("error");
if let Ok(address2) = Ipv6Addr::from_str(self_imp.reset_address_address.text().as_str()) {
if let Some(addr) = conn.ipv6.address_data.iter_mut()
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
_ => handle_error()
}
set_row_name(&self_imp);
}));
let conn = connection.clone();
self_imp.reset_address_remove.connect_clicked(
clone!(@weak self_imp, @weak self as what => move |_| {
let address = self_imp.reset_address_address.text();
let mut conn = conn.borrow_mut();
conn.ipv4.address_data.retain(|addr| addr.address != address);
what.unparent();
}),
);
}
}
fn set_row_name(self_imp: &WifiAddressEntryImpl) {
if self_imp.reset_address_address.text().is_empty() {
return;
}
let address = self_imp.address.borrow();
let prefix = self_imp.prefix.get();
let title = match (address.0, prefix.0) {
(true, true) => {
format!("{}/{}", address.1, prefix.1)
}
(true, false) => "Prefix wrong".to_string(),
(false, true) => "Address wrong".to_string(),
(false, false) => "Address and Prefix wrong".to_string(),
};
self_imp.reset_address_row.set_title(&title);
}

View file

@ -1,22 +1,21 @@
use crate::components::wifi::utils::IpProtocol;
use crate::components::wifi::wifiAddressEntry;
use crate::components::wifi::wifi_address_entry;
use adw::{EntryRow, ExpanderRow};
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate};
use std::cell::{Cell, RefCell};
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetWifiAddressEntry.ui")]
pub struct WifiAddressEntryImpl {
#[template_child]
pub resetAddressRow: TemplateChild<ExpanderRow>,
pub reset_address_row: TemplateChild<ExpanderRow>,
#[template_child]
pub resetAddressAddress: TemplateChild<EntryRow>,
pub reset_address_address: TemplateChild<EntryRow>,
#[template_child]
pub resetAddressPrefix: TemplateChild<EntryRow>,
pub reset_address_prefix: TemplateChild<EntryRow>,
#[template_child]
pub resetAddressRemove: TemplateChild<Button>,
pub reset_address_remove: TemplateChild<Button>,
pub address: RefCell<(bool, String)>,
pub prefix: Cell<(bool, u32)>,
pub protocol: Cell<IpProtocol>,
@ -26,7 +25,7 @@ pub struct WifiAddressEntryImpl {
impl ObjectSubclass for WifiAddressEntryImpl {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetWifiAddressEntry";
type Type = wifiAddressEntry::WifiAddressEntry;
type Type = wifi_address_entry::WifiAddressEntry;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {

View file

@ -5,7 +5,7 @@ use std::sync::Arc;
use std::time::Duration;
use crate::components::base::utils::Listeners;
use crate::components::utils::setComboRowEllipsis;
use crate::components::utils::set_combo_row_ellipsis;
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ComboRowExt, ListBoxRowExt, PreferencesGroupExt};
@ -16,19 +16,19 @@ use dbus::Error;
use dbus::Path;
use glib::{clone, Cast, PropertySet};
use gtk::glib::Variant;
use gtk::prelude::{ActionableExt, WidgetExt, BoxExt};
use gtk::prelude::{ActionableExt, WidgetExt};
use gtk::{gio, StringObject};
use ReSet_Lib::network::network::{AccessPoint, WifiDevice, WifiStrength};
use ReSet_Lib::signals::{AccessPointAdded, WifiDeviceChanged};
use ReSet_Lib::signals::{AccessPointChanged, AccessPointRemoved};
use crate::components::wifi::wifiBoxImpl;
use crate::components::wifi::wifiEntry::WifiEntry;
use crate::components::wifi::wifi_box_impl;
use crate::components::wifi::wifi_entry::WifiEntry;
use super::savedWifiEntry::SavedWifiEntry;
use super::saved_wifi_entry::SavedWifiEntry;
glib::wrapper! {
pub struct WifiBox(ObjectSubclass<wifiBoxImpl::WifiBox>)
pub struct WifiBox(ObjectSubclass<wifi_box_impl::WifiBox>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
@ -41,62 +41,62 @@ unsafe impl Sync for WifiBox {}
impl WifiBox {
pub fn new(listeners: Arc<Listeners>) -> Arc<Self> {
let obj: Arc<WifiBox> = Arc::new(Object::builder().build());
setupCallbacks(listeners, obj)
setup_callbacks(listeners, obj)
}
pub fn setupCallbacks(&self) {}
pub fn setup_callbacks(&self) {}
}
fn setupCallbacks(listeners: Arc<Listeners>, wifiBox: Arc<WifiBox>) -> Arc<WifiBox> {
let imp = wifiBox.imp();
let wifibox_ref = wifiBox.clone();
imp.resetSavedNetworks.set_activatable(true);
imp.resetSavedNetworks
fn setup_callbacks(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) -> Arc<WifiBox> {
let imp = wifi_box.imp();
let wifibox_ref = wifi_box.clone();
imp.reset_saved_networks.set_activatable(true);
imp.reset_saved_networks
.set_action_name(Some("navigation.push"));
imp.resetSavedNetworks
imp.reset_saved_networks
.set_action_target_value(Some(&Variant::from("saved")));
imp.resetAvailableNetworks.set_activatable(true);
imp.resetAvailableNetworks
imp.reset_available_networks.set_activatable(true);
imp.reset_available_networks
.set_action_name(Some("navigation.pop"));
setComboRowEllipsis(imp.resetWiFiDevice.get());
imp.resetWifiSwitch.connect_state_set(
set_combo_row_ellipsis(imp.reset_wifi_device.get());
imp.reset_wifi_switch.connect_state_set(
clone!(@weak imp => @default-return glib::Propagation::Proceed, move |_, value| {
set_wifi_enabled(value);
if !value {
let mut map = imp.wifiEntries.lock().unwrap();
let mut map = imp.wifi_entries.lock().unwrap();
for entry in map.iter() {
imp.resetWifiList.remove(&*(*entry.1));
imp.reset_wifi_list.remove(&*(*entry.1));
}
map.clear();
imp.wifiEntriesPath.lock().unwrap().clear();
imp.wifi_entries_path.lock().unwrap().clear();
listeners.network_listener.store(false, Ordering::SeqCst);
} else {
start_event_listener(listeners.clone(), wifibox_ref.clone());
show_stored_connections(wifibox_ref.clone());
scanForWifi(wifibox_ref.clone());
scan_for_wifi(wifibox_ref.clone());
}
glib::Propagation::Proceed
}),
);
wifiBox
wifi_box
}
pub fn scanForWifi(wifiBox: Arc<WifiBox>) {
let wifibox_ref = wifiBox.clone();
let _wifibox_ref_listener = wifiBox.clone();
let wifiEntries = wifiBox.imp().wifiEntries.clone();
let wifiEntriesPath = wifiBox.imp().wifiEntriesPath.clone();
pub fn scan_for_wifi(wifi_box: Arc<WifiBox>) {
let wifibox_ref = wifi_box.clone();
let _wifibox_ref_listener = wifi_box.clone();
let wifi_entries = wifi_box.imp().wifi_entries.clone();
let wifi_entries_path = wifi_box.imp().wifi_entries_path.clone();
gio::spawn_blocking(move || {
let accessPoints = get_access_points();
let access_points = get_access_points();
let devices = get_wifi_devices();
{
let imp = wifibox_ref.imp();
let list = imp.resetModelList.write().unwrap();
let mut model_index = imp.resetModelIndex.write().unwrap();
let mut map = imp.resetWifiDevices.write().unwrap();
imp.resetCurrentWifiDevice
let list = imp.reset_model_list.write().unwrap();
let mut model_index = imp.reset_model_index.write().unwrap();
let mut map = imp.reset_wifi_devices.write().unwrap();
imp.reset_current_wifi_device
.replace(devices.last().unwrap().clone());
for (index, device) in devices.into_iter().enumerate() {
list.append(&device.name);
@ -104,23 +104,23 @@ pub fn scanForWifi(wifiBox: Arc<WifiBox>) {
*model_index += 1;
}
}
let wifiEntries = wifiEntries.clone();
let wifiEntriesPath = wifiEntriesPath.clone();
let wifi_entries = wifi_entries.clone();
let wifi_entries_path = wifi_entries_path.clone();
dbus_start_network_events();
glib::spawn_future(async move {
glib::idle_add_once(move || {
let mut wifiEntries = wifiEntries.lock().unwrap();
let mut wifiEntriesPath = wifiEntriesPath.lock().unwrap();
let mut wifi_entries = wifi_entries.lock().unwrap();
let mut wifi_entries_path = wifi_entries_path.lock().unwrap();
let imp = wifibox_ref.imp();
let list = imp.resetModelList.read().unwrap();
imp.resetWiFiDevice.set_model(Some(&*list));
let map = imp.resetWifiDevices.read().unwrap();
let device = imp.resetCurrentWifiDevice.borrow();
let list = imp.reset_model_list.read().unwrap();
imp.reset_wifi_device.set_model(Some(&*list));
let map = imp.reset_wifi_devices.read().unwrap();
let device = imp.reset_current_wifi_device.borrow();
if let Some(index) = map.get(&device.name) {
imp.resetWiFiDevice.set_selected(index.1);
imp.reset_wifi_device.set_selected(index.1);
}
imp.resetWiFiDevice
imp.reset_wifi_device
.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected_item();
if selected.is_none() {
@ -130,40 +130,41 @@ pub fn scanForWifi(wifiBox: Arc<WifiBox>) {
let selected = selected.downcast_ref::<StringObject>().unwrap();
let selected = selected.string().to_string();
let device = imp.resetWifiDevices.read().unwrap();
let device = imp.reset_wifi_devices.read().unwrap();
let device = device.get(&selected);
if device.is_none() {
return;
}
set_wifi_device(device.unwrap().0.path.clone());
}));
for accessPoint in accessPoints {
let ssid = accessPoint.ssid.clone();
let path = accessPoint.dbus_path.clone();
let connected = imp.resetCurrentWifiDevice.borrow().active_access_point == path;
let entry = WifiEntry::new(connected, accessPoint, imp);
wifiEntries.insert(ssid, entry.clone());
wifiEntriesPath.insert(path, entry.clone());
imp.resetWifiList.add(&*entry);
for access_point in access_points {
let ssid = access_point.ssid.clone();
let path = access_point.dbus_path.clone();
let connected =
imp.reset_current_wifi_device.borrow().active_access_point == path;
let entry = WifiEntry::new(connected, access_point, imp);
wifi_entries.insert(ssid, entry.clone());
wifi_entries_path.insert(path, entry.clone());
imp.reset_wifi_list.add(&*entry);
}
});
});
});
}
pub fn show_stored_connections(wifiBox: Arc<WifiBox>) {
let wifibox_ref = wifiBox.clone();
pub fn show_stored_connections(wifi_box: Arc<WifiBox>) {
let wifibox_ref = wifi_box.clone();
gio::spawn_blocking(move || {
let connections = get_stored_connections();
glib::spawn_future(async move {
glib::idle_add_once(move || {
let selfImp = wifibox_ref.imp();
let self_imp = wifibox_ref.imp();
for connection in connections {
// TODO include button for settings
let name =
&String::from_utf8(connection.1).unwrap_or_else(|_| String::from(""));
let entry = SavedWifiEntry::new(name, connection.0, selfImp);
selfImp.resetStoredWifiList.add(&entry);
let entry = SavedWifiEntry::new(name, connection.0, self_imp);
self_imp.reset_stored_wifi_list.add(&entry);
}
});
});
@ -193,8 +194,8 @@ pub fn get_access_points() -> Vec<AccessPoint> {
if res.is_err() {
return Vec::new();
}
let (accessPoints,) = res.unwrap();
accessPoints
let (access_points,) = res.unwrap();
access_points
}
pub fn set_wifi_device(path: Path<'static>) {
@ -289,19 +290,19 @@ pub fn start_event_listener(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) {
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = wifi_box.imp();
let mut wifiEntries = imp.wifiEntries.lock().unwrap();
let mut wifiEntriesPath = imp.wifiEntriesPath.lock().unwrap();
let mut wifi_entries = imp.wifi_entries.lock().unwrap();
let mut wifi_entries_path = imp.wifi_entries_path.lock().unwrap();
let ssid = ir.access_point.ssid.clone();
let path = ir.access_point.dbus_path.clone();
if wifiEntries.get(&ssid).is_some() {
if wifi_entries.get(&ssid).is_some() {
return;
}
let connected = imp.resetCurrentWifiDevice.borrow().active_access_point
let connected = imp.reset_current_wifi_device.borrow().active_access_point
== ir.access_point.dbus_path;
let entry = WifiEntry::new(connected, ir.access_point, imp);
wifiEntries.insert(ssid, entry.clone());
wifiEntriesPath.insert(path, entry.clone());
imp.resetWifiList.add(&*entry);
wifi_entries.insert(ssid, entry.clone());
wifi_entries_path.insert(path, entry.clone());
imp.reset_wifi_list.add(&*entry);
});
});
true
@ -316,16 +317,16 @@ pub fn start_event_listener(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) {
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = wifi_box.imp();
let mut wifiEntries = imp.wifiEntries.lock().unwrap();
let mut wifiEntriesPath = imp.wifiEntriesPath.lock().unwrap();
let entry = wifiEntriesPath.remove(&ir.access_point);
let mut wifi_entries = imp.wifi_entries.lock().unwrap();
let mut wifi_entries_path = imp.wifi_entries_path.lock().unwrap();
let entry = wifi_entries_path.remove(&ir.access_point);
if entry.is_none() {
return;
}
let entry = entry.unwrap();
let ssid = entry.imp().accessPoint.borrow().ssid.clone();
wifiEntries.remove(&ssid);
imp.resetWifiList.remove(&*entry);
let ssid = entry.imp().access_point.borrow().ssid.clone();
wifi_entries.remove(&ssid);
imp.reset_wifi_list.remove(&*entry);
});
});
true
@ -341,23 +342,23 @@ pub fn start_event_listener(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) {
glib::spawn_future(async move {
glib::idle_add_local_once(move || {
let imp = wifi_box.imp();
let wifiEntries = imp.wifiEntries.lock().unwrap();
let entry = wifiEntries.get(&ir.access_point.ssid);
let wifi_entries = imp.wifi_entries.lock().unwrap();
let entry = wifi_entries.get(&ir.access_point.ssid);
if entry.is_none() {
return;
}
let entry = entry.unwrap();
let entryImp = entry.imp();
let entry_imp = entry.imp();
let strength = WifiStrength::from_u8(ir.access_point.strength);
let ssid = ir.access_point.ssid.clone();
let name_opt = String::from_utf8(ssid).unwrap_or_else(|_| String::from(""));
let name = name_opt.as_str();
entryImp.wifiStrength.set(strength);
entryImp.resetWifiLabel.get().set_text(name);
entryImp.resetWifiEncrypted.set_visible(false);
entry_imp.wifi_strength.set(strength);
entry_imp.reset_wifi_label.get().set_text(name);
entry_imp.reset_wifi_encrypted.set_visible(false);
// TODO handle encryption thing
entryImp
.resetWifiStrength
entry_imp
.reset_wifi_strength
.get()
.set_from_icon_name(match strength {
WifiStrength::Excellent => {
@ -368,18 +369,18 @@ pub fn start_event_listener(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) {
WifiStrength::None => Some("network-wireless-signal-none-symbolic"),
});
if !ir.access_point.stored {
entryImp.resetWifiEditButton.set_sensitive(false);
entry_imp.reset_wifi_edit_button.set_sensitive(false);
}
if ir.access_point.dbus_path
== imp.resetCurrentWifiDevice.borrow().active_access_point
== imp.reset_current_wifi_device.borrow().active_access_point
{
entryImp.resetWifiConnected.set_text("Connected");
entry_imp.reset_wifi_connected.set_text("Connected");
} else {
entryImp.resetWifiConnected.set_text("");
entry_imp.reset_wifi_connected.set_text("");
}
{
let mut wifiName = entryImp.wifiName.borrow_mut();
*wifiName = String::from(name);
let mut wifi_name = entry_imp.wifi_name.borrow_mut();
*wifi_name = String::from(name);
}
});
});
@ -395,17 +396,17 @@ pub fn start_event_listener(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) {
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = wifi_box.imp();
let mut current_device = imp.resetCurrentWifiDevice.borrow_mut();
let mut current_device = imp.reset_current_wifi_device.borrow_mut();
if current_device.path == ir.wifi_device.path {
current_device.active_access_point = ir.wifi_device.active_access_point;
} else {
*current_device = ir.wifi_device;
}
let mut wifiEntries = imp.wifiEntries.lock().unwrap();
for entry in wifiEntries.iter_mut() {
let mut wifi_entries = imp.wifi_entries.lock().unwrap();
for entry in wifi_entries.iter_mut() {
let imp = entry.1.imp();
let mut connected = imp.connected.borrow_mut();
*connected = imp.accessPoint.borrow().dbus_path == current_device.path;
*connected = imp.access_point.borrow().dbus_path == current_device.path;
}
});
});

View file

@ -1,4 +1,4 @@
use crate::components::wifi::wifiBox;
use crate::components::wifi::wifi_box;
use adw::{ActionRow, ComboRow, NavigationView, PreferencesGroup};
use dbus::Path;
use gtk::subclass::prelude::*;
@ -9,36 +9,35 @@ use std::collections::HashMap;
use std::sync::{Arc, Mutex, RwLock};
use ReSet_Lib::network::network::WifiDevice;
use crate::components::base::listEntry::ListEntry;
use crate::components::wifi::wifiEntry::WifiEntry;
use crate::components::base::list_entry::ListEntry;
use crate::components::wifi::wifi_entry::WifiEntry;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetWiFi.ui")]
pub struct WifiBox {
#[template_child]
pub resetWifiNavigation: TemplateChild<NavigationView>,
pub reset_wifi_navigation: TemplateChild<NavigationView>,
#[template_child]
pub resetWifiDetails: TemplateChild<PreferencesGroup>,
pub reset_wifi_details: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetWiFiDevice: TemplateChild<ComboRow>,
pub reset_wifi_device: TemplateChild<ComboRow>,
#[template_child]
pub resetSavedNetworks: TemplateChild<ActionRow>,
pub reset_saved_networks: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiSwitch: TemplateChild<Switch>,
pub reset_wifi_switch: TemplateChild<Switch>,
#[template_child]
pub resetWifiList: TemplateChild<PreferencesGroup>,
pub reset_wifi_list: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetStoredWifiList: TemplateChild<PreferencesGroup>,
pub reset_stored_wifi_list: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetAvailableNetworks: TemplateChild<ActionRow>,
pub wifiEntries: Arc<Mutex<HashMap<Vec<u8>, Arc<WifiEntry>>>>,
pub wifiEntriesPath: Arc<Mutex<HashMap<Path<'static>, Arc<WifiEntry>>>>,
pub savedWifiEntries: Arc<Mutex<Vec<ListEntry>>>,
pub resetWifiDevices: Arc<RwLock<HashMap<String, (WifiDevice, u32)>>>,
pub resetCurrentWifiDevice: Arc<RefCell<WifiDevice>>,
pub resetModelList: Arc<RwLock<StringList>>,
pub resetModelIndex: Arc<RwLock<u32>>,
pub reset_available_networks: TemplateChild<ActionRow>,
pub wifi_entries: Arc<Mutex<HashMap<Vec<u8>, Arc<WifiEntry>>>>,
pub wifi_entries_path: Arc<Mutex<HashMap<Path<'static>, Arc<WifiEntry>>>>,
pub saved_wifi_entries: Arc<Mutex<Vec<ListEntry>>>,
pub reset_wifi_devices: Arc<RwLock<HashMap<String, (WifiDevice, u32)>>>,
pub reset_current_wifi_device: Arc<RefCell<WifiDevice>>,
pub reset_model_list: Arc<RwLock<StringList>>,
pub reset_model_index: Arc<RwLock<u32>>,
}
unsafe impl Send for WifiBox {}
@ -48,7 +47,7 @@ unsafe impl Sync for WifiBox {}
impl ObjectSubclass for WifiBox {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetWifi";
type Type = wifiBox::WifiBox;
type Type = wifi_box::WifiBox;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {
@ -67,7 +66,7 @@ impl ObjectImpl for WifiBox {
self.parent_constructed();
let obj = self.obj();
obj.setupCallbacks();
obj.setup_callbacks();
}
}

View file

@ -1,7 +1,7 @@
use std::sync::Arc;
use std::time::Duration;
use crate::components::wifi::utils::getConnectionSettings;
use crate::components::wifi::utils::get_connection_settings;
use adw::glib;
use adw::glib::{Object, PropertySet};
use adw::prelude::{ActionRowExt, ButtonExt, EditableExt, PopoverExt};
@ -13,12 +13,12 @@ use gtk::gio;
use gtk::prelude::{ListBoxRowExt, WidgetExt};
use ReSet_Lib::network::network::{AccessPoint, WifiStrength};
use crate::components::wifi::wifiBoxImpl::WifiBox;
use crate::components::wifi::wifiEntryImpl;
use crate::components::wifi::wifiOptions::WifiOptions;
use crate::components::wifi::wifi_box_impl::WifiBox;
use crate::components::wifi::wifi_entry_impl;
use crate::components::wifi::wifi_options::WifiOptions;
glib::wrapper! {
pub struct WifiEntry(ObjectSubclass<wifiEntryImpl::WifiEntry>)
pub struct WifiEntry(ObjectSubclass<wifi_entry_impl::WifiEntry>)
@extends adw::ActionRow, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::Actionable, gtk::ConstraintTarget, gtk::ListBoxRow;
}
@ -27,22 +27,22 @@ unsafe impl Send for WifiEntry {}
unsafe impl Sync for WifiEntry {}
impl WifiEntry {
pub fn new(connected: bool, access_point: AccessPoint, wifiBox: &WifiBox) -> Arc<Self> {
pub fn new(connected: bool, access_point: AccessPoint, wifi_box: &WifiBox) -> Arc<Self> {
let entry: Arc<WifiEntry> = Arc::new(Object::builder().build());
let stored_entry = entry.clone();
let new_entry = entry.clone();
let entryImp = entry.imp();
let entry_imp = entry.imp();
let strength = WifiStrength::from_u8(access_point.strength);
let ssid = access_point.ssid.clone();
let name_opt = String::from_utf8(ssid).unwrap_or_else(|_| String::from(""));
let name = name_opt.as_str();
entryImp.wifiStrength.set(strength);
entryImp.resetWifiLabel.get().set_text(name);
entryImp.resetWifiEncrypted.set_visible(false);
entryImp.connected.set(connected);
entry_imp.wifi_strength.set(strength);
entry_imp.reset_wifi_label.get().set_text(name);
entry_imp.reset_wifi_encrypted.set_visible(false);
entry_imp.connected.set(connected);
// TODO handle encryption thing
entryImp
.resetWifiStrength
entry_imp
.reset_wifi_strength
.get()
.set_from_icon_name(match strength {
WifiStrength::Excellent => Some("network-wireless-signal-excellent-symbolic"),
@ -51,22 +51,21 @@ impl WifiEntry {
WifiStrength::None => Some("network-wireless-signal-none-symbolic"),
});
if !access_point.stored {
entryImp.resetWifiEditButton.set_sensitive(false);
entry_imp.reset_wifi_edit_button.set_sensitive(false);
}
if connected {
entryImp
.resetWifiConnected.set_text("Connected");
entry_imp.reset_wifi_connected.set_text("Connected");
}
{
let mut wifiName = entryImp.wifiName.borrow_mut();
*wifiName = String::from(name);
let mut wifi_name = entry_imp.wifi_name.borrow_mut();
*wifi_name = String::from(name);
}
entryImp.accessPoint.set(access_point);
entry_imp.access_point.set(access_point);
entry.set_activatable(true);
entry.connect_activated(clone!(@weak entryImp => move |_| {
let access_point = entryImp.accessPoint.borrow();
if *entryImp.connected.borrow() {
entry.connect_activated(clone!(@weak entry_imp => move |_| {
let access_point = entry_imp.access_point.borrow();
if *entry_imp.connected.borrow() {
click_disconnect(stored_entry.clone());
} else if access_point.stored {
click_stored_network(stored_entry.clone());
@ -74,15 +73,15 @@ impl WifiEntry {
click_new_network(new_entry.clone());
}
}));
entry.setupCallbacks(wifiBox);
entry.setup_callbacks(wifi_box);
entry
}
pub fn setupCallbacks(&self, wifiBox: &WifiBox) {
let selfImp = self.imp();
selfImp.resetWifiEditButton.connect_clicked(clone!(@ weak selfImp, @ weak wifiBox => move |_| {
let _option = getConnectionSettings(selfImp.accessPoint.borrow().associated_connection.clone());
wifiBox.resetWifiNavigation.push(&*WifiOptions::new(_option, selfImp.accessPoint.borrow().dbus_path.clone()));
pub fn setup_callbacks(&self, wifi_box: &WifiBox) {
let self_imp = self.imp();
self_imp.reset_wifi_edit_button.connect_clicked(clone!(@ weak self_imp, @ weak wifi_box => move |_| {
let _option = get_connection_settings(self_imp.access_point.borrow().associated_connection.clone());
wifi_box.reset_wifi_navigation.push(&*WifiOptions::new(_option, self_imp.access_point.borrow().dbus_path.clone()));
}));
}
}
@ -108,7 +107,7 @@ pub fn click_disconnect(entry: Arc<WifiEntry>) {
imp.connected.replace(false);
return;
}
imp.resetWifiConnected.set_text("");
imp.reset_wifi_connected.set_text("");
imp.connected.replace(false);
glib::spawn_future(async move {
glib::idle_add_once(move || {
@ -119,8 +118,8 @@ pub fn click_disconnect(entry: Arc<WifiEntry>) {
}
pub fn click_stored_network(entry: Arc<WifiEntry>) {
let entryImp = entry.imp();
let access_point = entryImp.accessPoint.borrow().clone();
let entry_imp = entry.imp();
let access_point = entry_imp.access_point.borrow().clone();
let entry_ref = entry.clone();
entry.set_activatable(false);
gio::spawn_blocking(move || {
@ -150,7 +149,7 @@ pub fn click_stored_network(entry: Arc<WifiEntry>) {
return;
}
let imp = entry_ref.imp();
imp.resetWifiConnected.set_text("Connected");
imp.reset_wifi_connected.set_text("Connected");
imp.connected.replace(true);
});
});
@ -162,11 +161,11 @@ pub fn click_new_network(entry: Arc<WifiEntry>) {
let connect_new_network =
|entry: Arc<WifiEntry>, access_point: AccessPoint, password: String| {
let entry_ref = entry.clone();
let popup = entry.imp().resetWifiPopup.imp();
popup.resetPopupLabel.set_text("Connecting...");
popup.resetPopupLabel.set_visible(true);
popup.resetPopupEntry.set_sensitive(false);
popup.resetPopupButton.set_sensitive(false);
let popup = entry.imp().reset_wifi_popup.imp();
popup.reset_popup_label.set_text("Connecting...");
popup.reset_popup_label.set_visible(true);
popup.reset_popup_entry.set_sensitive(false);
popup.reset_popup_button.set_sensitive(false);
gio::spawn_blocking(move || {
let conn = Connection::new_session().unwrap();
@ -184,27 +183,27 @@ pub fn click_new_network(entry: Arc<WifiEntry>) {
glib::idle_add_once(move || {
if res.is_err() {
let imp = entry_ref.imp();
imp.resetWifiPopup
imp.reset_wifi_popup
.imp()
.resetPopupLabel
.reset_popup_label
.set_text("Could not connect to dbus.");
imp.connected.replace(false);
return;
}
if res.unwrap() == (false,) {
let imp = entry_ref.imp();
imp.resetWifiPopup
imp.reset_wifi_popup
.imp()
.resetPopupLabel
.reset_popup_label
.set_text("Could not connect to access point.");
imp.connected.replace(false);
return;
}
println!("worked?");
let imp = entry_ref.imp();
imp.resetWifiPopup.popdown();
imp.resetWifiEditButton.set_sensitive(true);
imp.resetWifiConnected.set_text("Connected");
imp.reset_wifi_popup.popdown();
imp.reset_wifi_edit_button.set_sensitive(true);
imp.reset_wifi_connected.set_text("Connected");
imp.connected.replace(true);
});
});
@ -212,18 +211,18 @@ pub fn click_new_network(entry: Arc<WifiEntry>) {
// TODO crate spinner animation and block UI
};
let entryImp = entry.imp();
let popupImp = entryImp.resetWifiPopup.imp();
popupImp
.resetPopupEntry
.connect_activate(clone!(@weak entry as origEntry, @weak entryImp => move |entry| {
connect_new_network(origEntry, entryImp.accessPoint.clone().take(), entry.text().to_string());
let entry_imp = entry.imp();
let popup_imp = entry_imp.reset_wifi_popup.imp();
popup_imp
.reset_popup_entry
.connect_activate(clone!(@weak entry as orig_entry, @weak entry_imp => move |entry| {
connect_new_network(orig_entry, entry_imp.access_point.clone().take(), entry.text().to_string());
}));
popupImp.resetPopupButton.connect_clicked(
clone!(@weak entry as origEntry,@weak entryImp, @weak popupImp => move |_| {
let entry = entryImp.resetWifiPopup.imp().resetPopupEntry.text().to_string();
connect_new_network(origEntry, entryImp.accessPoint.clone().take(), entry);
popup_imp.reset_popup_button.connect_clicked(
clone!(@weak entry as orig_entry,@weak entry_imp, @weak popup_imp => move |_| {
let entry = entry_imp.reset_wifi_popup.imp().reset_popup_entry.text().to_string();
connect_new_network(orig_entry, entry_imp.access_point.clone().take(), entry);
}),
);
entryImp.resetWifiPopup.popup();
entry_imp.reset_wifi_popup.popup();
}

View file

@ -1,5 +1,5 @@
use crate::components::base::popup::Popup;
use crate::components::wifi::wifiEntry;
use crate::components::wifi::wifi_entry;
use adw::subclass::preferences_row::PreferencesRowImpl;
use adw::subclass::prelude::ActionRowImpl;
use adw::ActionRow;
@ -8,25 +8,24 @@ use gtk::{glib, Button, CompositeTemplate, Image, Label};
use std::cell::RefCell;
use ReSet_Lib::network::network::{AccessPoint, WifiStrength};
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetWifiEntry.ui")]
pub struct WifiEntry {
#[template_child]
pub resetWifiStrength: TemplateChild<Image>,
pub reset_wifi_strength: TemplateChild<Image>,
#[template_child]
pub resetWifiEncrypted: TemplateChild<Image>,
pub reset_wifi_encrypted: TemplateChild<Image>,
#[template_child]
pub resetWifiLabel: TemplateChild<Label>,
pub reset_wifi_label: TemplateChild<Label>,
#[template_child]
pub resetWifiEditButton: TemplateChild<Button>,
pub reset_wifi_edit_button: TemplateChild<Button>,
#[template_child]
pub resetWifiConnected: TemplateChild<Label>,
pub reset_wifi_connected: TemplateChild<Label>,
#[template_child]
pub resetWifiPopup: TemplateChild<Popup>,
pub wifiName: RefCell<String>,
pub wifiStrength: RefCell<WifiStrength>,
pub accessPoint: RefCell<AccessPoint>,
pub reset_wifi_popup: TemplateChild<Popup>,
pub wifi_name: RefCell<String>,
pub wifi_strength: RefCell<WifiStrength>,
pub access_point: RefCell<AccessPoint>,
pub connected: RefCell<bool>,
}
@ -37,7 +36,7 @@ unsafe impl Sync for WifiEntry {}
impl ObjectSubclass for WifiEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetWifiEntry";
type Type = wifiEntry::WifiEntry;
type Type = wifi_entry::WifiEntry;
type ParentType = ActionRow;
fn class_init(klass: &mut Self::Class) {

View file

@ -0,0 +1,390 @@
use std::net::{Ipv4Addr, Ipv6Addr};
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use adw::glib::Object;
use adw::prelude::{ActionRowExt, ComboRowExt, PreferencesGroupExt};
use adw::subclass::prelude::ObjectSubclassIsExt;
use adw::{gio, glib};
use dbus::arg::PropMap;
use dbus::{Error, Path};
use glib::{clone, PropertySet};
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
use IpProtocol::{IPv4, IPv6};
use ReSet_Lib::network::connection::{Connection, DNSMethod4, DNSMethod6, Enum, TypeSettings};
use crate::components::wifi::utils::IpProtocol;
use crate::components::wifi::wifi_address_entry::WifiAddressEntry;
use crate::components::wifi::wifi_options_impl;
use crate::components::wifi::wifi_route_entry::WifiRouteEntry;
glib::wrapper! {
pub struct WifiOptions(ObjectSubclass<wifi_options_impl::WifiOptions>)
@extends adw::NavigationPage, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget;
}
unsafe impl Send for WifiOptions {}
unsafe impl Sync for WifiOptions {}
impl WifiOptions {
pub fn new(connection: Connection, access_point: Path<'static>) -> Arc<Self> {
let wifi_option: Arc<WifiOptions> = Arc::new(Object::builder().build());
wifi_option.imp().connection.set(connection);
wifi_option.initialize_ui();
setup_callbacks(&wifi_option, access_point);
wifi_option
}
pub fn initialize_ui(&self) {
let self_imp = self.imp();
let ip4_address_length;
let ip4_route_length;
let ip6_address_length;
let ip6_route_length;
{
let conn = self_imp.connection.borrow();
ip4_address_length = conn.ipv4.address_data.len();
ip4_route_length = conn.ipv4.route_data.len();
ip6_address_length = conn.ipv4.address_data.len();
ip6_route_length = conn.ipv4.route_data.len();
// General
self_imp
.reset_wifi_auto_connect
.set_active(conn.settings.autoconnect);
self_imp
.reset_wifi_metered
.set_active(conn.settings.metered != -1);
match &conn.device {
TypeSettings::WIFI(wifi) => {
self_imp.reset_wifi_link_speed.set_visible(false);
self_imp.reset_wifi_ip4_addr.set_visible(false);
self_imp.reset_wifi_ip6_addr.set_visible(false);
self_imp.reset_wifi_dns.set_visible(false);
self_imp.reset_wifi_gateway.set_visible(false);
self_imp.reset_wifi_last_used.set_visible(true);
self_imp.reset_wifi_mac.set_subtitle(&wifi.cloned_mac_address);
self_imp
.reset_wifi_name
.set_subtitle(&String::from_utf8(wifi.ssid.clone()).unwrap_or_default());
}
TypeSettings::ETHERNET(ethernet) => {
self_imp.reset_wifi_link_speed.set_visible(true);
self_imp.reset_wifi_ip4_addr.set_visible(true);
self_imp.reset_wifi_ip6_addr.set_visible(true);
self_imp.reset_wifi_dns.set_visible(true);
self_imp.reset_wifi_gateway.set_visible(true);
self_imp.reset_wifi_last_used.set_visible(false);
self_imp
.reset_wifi_mac
.set_subtitle(&ethernet.cloned_mac_address);
self_imp
.reset_wifi_link_speed
.set_subtitle(&ethernet.speed.to_string());
}
TypeSettings::VPN(_vpn) => {}
TypeSettings::None => {}
};
// IPv4
self_imp
.reset_ip4_method
.set_selected(conn.ipv4.dns_method.to_i32() as u32);
self.set_ip4_visibility(conn.ipv4.dns_method.to_i32() as u32);
let ipv4_dns: Vec<String> = conn
.ipv4
.dns
.iter()
.map(|addr| {
addr.iter()
.map(|octet| octet.to_string())
.collect::<Vec<String>>()
.join(".")
})
.collect();
self_imp.reset_ip4_dns.set_text(&ipv4_dns.join(", "));
self_imp.reset_ip4_gateway.set_text(&conn.ipv4.gateway);
// IPv6
self_imp
.reset_ip6_method
.set_selected(conn.ipv6.dns_method.to_i32() as u32);
self.set_ip6_visibility(conn.ipv6.dns_method.to_i32() as u32);
let ipv6_dns: Vec<String> = conn
.ipv6
.dns
.iter()
.map(|addr| {
addr.iter()
.map(|octet| octet.to_string())
.collect::<Vec<String>>()
.join(":")
})
.collect();
self_imp.reset_ip6_dns.set_text(&ipv6_dns.join(", "));
self_imp.reset_ip6_gateway.set_text(&conn.ipv6.gateway);
// Security
if let TypeSettings::WIFI(wifi) = &conn.device {
match wifi.security_settings.key_management.as_str() {
"none" => {
self_imp.reset_wifi_security_dropdown.set_selected(0);
self_imp.reset_wifi_password.set_visible(false);
self_imp.reset_wifi_password.set_text("");
}
"wpa-psk" => {
self_imp.reset_wifi_security_dropdown.set_selected(1);
self_imp.reset_wifi_password.set_visible(true);
self_imp
.reset_wifi_password
.set_text(&wifi.security_settings.psk);
}
_ => {}
}
}
}
// IPv4
for i in 0..ip4_address_length {
let address = &WifiAddressEntry::new(Some(i), self_imp.connection.clone(), IPv4);
self_imp.reset_ip4_address_group.add(address);
}
let address = &WifiAddressEntry::new(None, self_imp.connection.clone(), IPv4);
self_imp.reset_ip4_address_group.add(address);
for i in 0..ip4_route_length {
let route = &WifiRouteEntry::new(Some(i), self_imp.connection.clone(), IPv4);
self_imp.reset_ip4_routes_group.add(route)
}
let route = &WifiRouteEntry::new(None, self_imp.connection.clone(), IPv4);
self_imp.reset_ip4_routes_group.add(route);
// IPv6
for i in 0..ip6_address_length {
let address = &WifiAddressEntry::new(Some(i), self_imp.connection.clone(), IPv6);
self_imp.reset_ip6_address_group.add(address);
}
let address = &WifiAddressEntry::new(None, self_imp.connection.clone(), IPv6);
self_imp.reset_ip6_address_group.add(address);
for i in 0..ip6_route_length {
let route = &WifiRouteEntry::new(Some(i), self_imp.connection.clone(), IPv6);
self_imp.reset_ip6_routes_group.add(route);
}
let route = &WifiRouteEntry::new(None, self_imp.connection.clone(), IPv6);
self_imp.reset_ip6_routes_group.add(route);
// Security
}
pub fn set_ip4_visibility(&self, method: u32) {
let self_imp = self.imp();
match method {
0 => {
// auto
self_imp.reset_ip4_address_group.set_visible(false);
self_imp.reset_ip4_routes_group.set_visible(true);
self_imp.reset_ip4_gateway.set_visible(false);
}
1 => {
// manual
self_imp.reset_ip4_address_group.set_visible(true);
self_imp.reset_ip4_routes_group.set_visible(true);
self_imp.reset_ip4_gateway.set_visible(true);
}
_ => {
self_imp.reset_ip4_address_group.set_visible(false);
self_imp.reset_ip4_routes_group.set_visible(false);
self_imp.reset_ip4_gateway.set_visible(false);
}
}
}
pub fn set_ip6_visibility(&self, method: u32) {
let self_imp = self.imp();
match method {
0 | 1 => {
// auto, dhcp
self_imp.reset_ip6_address_group.set_visible(false);
self_imp.reset_ip6_routes_group.set_visible(true);
self_imp.reset_ip6_gateway.set_visible(false);
}
2 => {
// manual
self_imp.reset_ip6_address_group.set_visible(true);
self_imp.reset_ip6_routes_group.set_visible(true);
self_imp.reset_ip6_gateway.set_visible(true);
}
_ => {
self_imp.reset_ip6_address_group.set_visible(false);
self_imp.reset_ip6_routes_group.set_visible(false);
self_imp.reset_ip6_gateway.set_visible(false);
}
}
}
}
fn setup_callbacks(wifi_options: &Arc<WifiOptions>, path: Path<'static>) {
let imp = wifi_options.imp();
// General
imp.reset_wifi_auto_connect
.connect_active_notify(clone!(@weak imp => move |x| {
imp.connection.borrow_mut().settings.autoconnect = x.is_active();
}));
imp.reset_wifi_metered
.connect_active_notify(clone!(@weak imp => move |x| {
imp.connection.borrow_mut().settings.metered = if x.is_active() { 1 } else { 2 };
}));
imp.wifi_options_apply_button
.connect_clicked(clone!(@weak imp => move |_| {
let prop = imp.connection.borrow().convert_to_propmap();
set_connection_settings(path.clone(), prop);
}));
// IPv4
let wifi_options_ip4 = wifi_options.clone();
imp.reset_ip4_method
.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected();
let mut conn = imp.connection.borrow_mut();
conn.ipv4.dns_method = DNSMethod4::from_i32(selected as i32);
wifi_options_ip4.set_ip4_visibility(selected);
}));
imp.reset_ip4_dns
.connect_changed(clone!(@weak imp => move |entry| {
let dns_input = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv4.dns.clear();
if dns_input.is_empty() {
imp.reset_ip4_dns.remove_css_class("error");
return;
}
for dns_entry in dns_input.as_str().split(',').map(|s| s.trim()) {
if let Ok(addr) = Ipv4Addr::from_str(dns_entry) {
imp.reset_ip4_dns.remove_css_class("error");
conn.ipv4.dns.push(addr.octets().to_vec());
} else {
imp.reset_ip4_dns.add_css_class("error");
}
}
}));
imp.reset_ip4_address_add_button
.connect_clicked(clone!(@weak imp => move |_| {
let address = &WifiAddressEntry::new(None, imp.connection.clone(), IpProtocol::IPv4);
imp.reset_ip4_address_group.add(address);
}));
imp.reset_ip4_gateway
.connect_changed(clone!(@weak imp => move |entry| {
let gateway_input = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv4.gateway.clear();
if gateway_input.is_empty() {
imp.reset_ip4_gateway.remove_css_class("error");
return;
}
if Ipv4Addr::from_str(gateway_input.as_str()).is_ok() {
imp.reset_ip4_gateway.remove_css_class("error");
conn.ipv4.gateway = gateway_input.to_string();
} else {
imp.reset_ip4_gateway.add_css_class("error");
}
}));
// IPv6
let wifi_options_ip6 = wifi_options.clone();
imp.reset_ip6_method
.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected();
let mut conn = imp.connection.borrow_mut();
conn.ipv6.dns_method = DNSMethod6::from_i32(selected as i32);
wifi_options_ip6.set_ip6_visibility(selected);
}));
imp.reset_ip6_dns
.connect_changed(clone!(@weak imp => move |entry| {
let dns_input = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv6.dns.clear();
if dns_input.is_empty() {
imp.reset_ip6_dns.remove_css_class("error");
return;
}
for dns_entry in dns_input.as_str().split(',').map(|s| s.trim()) {
if let Ok(addr) = Ipv6Addr::from_str(dns_entry) {
imp.reset_ip6_dns.remove_css_class("error");
conn.ipv6.dns.push(addr.octets().to_vec());
} else {
imp.reset_ip6_dns.add_css_class("error");
}
}
}));
imp.reset_ip6_address_add_button
.connect_clicked(clone!(@weak imp => move |_| {
let address = &WifiAddressEntry::new(None, imp.connection.clone(), IpProtocol::IPv4);
imp.reset_ip6_address_group.add(address);
}));
imp.reset_ip6_gateway
.connect_changed(clone!(@weak imp => move |entry| {
let gateway_input = entry.text();
let mut conn = imp.connection.borrow_mut();
conn.ipv6.gateway.clear();
if gateway_input.is_empty() {
imp.reset_ip6_gateway.remove_css_class("error");
return;
}
if Ipv6Addr::from_str(gateway_input.as_str()).is_ok() {
imp.reset_ip6_gateway.remove_css_class("error");
conn.ipv6.gateway = gateway_input.to_string();
} else {
imp.reset_ip6_gateway.add_css_class("error");
}
}));
// Security
imp.reset_wifi_security_dropdown
.connect_selected_notify(clone!(@weak imp => move |dropdown| {
let selected = dropdown.selected();
let mut conn = imp.connection.borrow_mut();
match (selected, &mut conn.device) {
(0 , TypeSettings::WIFI(wifi)) => { // None
imp.reset_wifi_password.set_visible(false);
wifi.security_settings.key_management = String::from("none");
wifi.security_settings.authentication_algorithm = String::from("open");
},
(1 , TypeSettings::WIFI(wifi)) => { // WPA/WPA2 Personal
imp.reset_wifi_password.set_visible(true);
wifi.security_settings.key_management = String::from("wpa-psk");
wifi.security_settings.authentication_algorithm = String::from("");
},
(_, _) => {}
}
}));
imp.reset_wifi_password
.connect_changed(clone!(@weak imp => move |entry| {
let password_input = entry.text();
let mut conn = imp.connection.borrow_mut();
if let TypeSettings::WIFI(wifi) = &mut conn.device {
wifi.security_settings.psk = password_input.to_string();
}
}));
}
fn set_connection_settings(path: Path<'static>, prop: PropMap) {
gio::spawn_blocking(move || {
let conn = dbus::blocking::Connection::new_session().unwrap();
let proxy = conn.with_proxy(
"org.Xetibo.ReSetDaemon",
"/org/Xetibo/ReSetDaemon",
Duration::from_millis(1000),
);
let _: Result<(bool,), Error> = proxy.method_call(
"org.Xetibo.ReSetWireless",
"SetConnectionSettings",
(path, prop),
);
});
}

View file

@ -1,76 +1,76 @@
use crate::components::wifi::wifiOptions;
use crate::components::wifi::wifi_options;
use adw::subclass::prelude::NavigationPageImpl;
use adw::{ActionRow, ComboRow, EntryRow, NavigationPage, PasswordEntryRow, PreferencesGroup, SwitchRow};
use adw::{
ActionRow, ComboRow, EntryRow, NavigationPage, PasswordEntryRow, PreferencesGroup, SwitchRow,
};
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate};
use std::cell::RefCell;
use std::rc::Rc;
use ReSet_Lib::network::connection::Connection;
use ReSet_Lib::network::network::AccessPoint;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetWifiOptions.ui")]
pub struct WifiOptions {
// General
#[template_child]
pub resetWifiName: TemplateChild<ActionRow>,
pub reset_wifi_name: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiMac: TemplateChild<ActionRow>,
pub reset_wifi_mac: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiLinkSpeed: TemplateChild<ActionRow>,
pub reset_wifi_link_speed: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiIP4Addr: TemplateChild<ActionRow>,
pub reset_wifi_ip4_addr: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiIP6Addr: TemplateChild<ActionRow>,
pub reset_wifi_ip6_addr: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiGateway: TemplateChild<ActionRow>,
pub reset_wifi_gateway: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiDNS: TemplateChild<ActionRow>,
pub reset_wifi_dns: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiLastUsed: TemplateChild<ActionRow>,
pub reset_wifi_last_used: TemplateChild<ActionRow>,
#[template_child]
pub resetWifiAutoConnect: TemplateChild<SwitchRow>,
pub reset_wifi_auto_connect: TemplateChild<SwitchRow>,
#[template_child]
pub resetWifiMetered: TemplateChild<SwitchRow>,
pub reset_wifi_metered: TemplateChild<SwitchRow>,
// IPv4
#[template_child]
pub resetIP4Method: TemplateChild<ComboRow>,
pub reset_ip4_method: TemplateChild<ComboRow>,
#[template_child]
pub resetIP4DNS: TemplateChild<EntryRow>,
pub reset_ip4_dns: TemplateChild<EntryRow>,
#[template_child]
pub resetIP4Gateway: TemplateChild<EntryRow>,
pub reset_ip4_gateway: TemplateChild<EntryRow>,
#[template_child]
pub resetIP4AddressGroup: TemplateChild<PreferencesGroup>,
pub reset_ip4_address_group: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetIP4AddressAddButton: TemplateChild<Button>,
pub reset_ip4_address_add_button: TemplateChild<Button>,
#[template_child]
pub resetIP4RoutesGroup: TemplateChild<PreferencesGroup>,
pub reset_ip4_routes_group: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetIP4RouteAddButton: TemplateChild<Button>,
pub reset_ip4_route_add_button: TemplateChild<Button>,
// IPv6
#[template_child]
pub resetIP6Method: TemplateChild<ComboRow>,
pub reset_ip6_method: TemplateChild<ComboRow>,
#[template_child]
pub resetIP6DNS: TemplateChild<EntryRow>,
pub reset_ip6_dns: TemplateChild<EntryRow>,
#[template_child]
pub resetIP6Gateway: TemplateChild<EntryRow>,
pub reset_ip6_gateway: TemplateChild<EntryRow>,
#[template_child]
pub resetIP6AddressGroup: TemplateChild<PreferencesGroup>,
pub reset_ip6_address_group: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetIP6AddressAddButton: TemplateChild<Button>,
pub reset_ip6_address_add_button: TemplateChild<Button>,
#[template_child]
pub resetIP6RoutesGroup: TemplateChild<PreferencesGroup>,
pub reset_ip6_routes_group: TemplateChild<PreferencesGroup>,
#[template_child]
pub resetIP6RouteAddButton: TemplateChild<Button>,
pub reset_ip6_route_add_button: TemplateChild<Button>,
// Security
#[template_child]
pub resetWifiSecurityDropdown: TemplateChild<ComboRow>,
pub reset_wifi_security_dropdown: TemplateChild<ComboRow>,
#[template_child]
pub resetWifiPassword: TemplateChild<PasswordEntryRow>,
pub reset_wifi_password: TemplateChild<PasswordEntryRow>,
// Misc
#[template_child]
pub wifiOptionsApplyButton: TemplateChild<Button>,
pub wifi_options_apply_button: TemplateChild<Button>,
pub connection: Rc<RefCell<Connection>>,
}
@ -78,7 +78,7 @@ pub struct WifiOptions {
impl ObjectSubclass for WifiOptions {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetWifiOptions";
type Type = wifiOptions::WifiOptions;
type Type = wifi_options::WifiOptions;
type ParentType = NavigationPage;
fn class_init(klass: &mut Self::Class) {

View file

@ -0,0 +1,242 @@
use crate::components::wifi::utils::IpProtocol;
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ExpanderRowExt, PreferencesRowExt};
use glib::clone;
use glib::subclass::prelude::ObjectSubclassIsExt;
use gtk::prelude::{EditableExt, WidgetExt};
use std::cell::RefCell;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::rc::Rc;
use std::str::FromStr;
use ReSet_Lib::network::connection::{Address, Connection};
use crate::components::wifi::wifi_route_entry_impl;
use crate::components::wifi::wifi_route_entry_impl::WifiRouteEntryImpl;
glib::wrapper! {
pub struct WifiRouteEntry(ObjectSubclass<wifi_route_entry_impl::WifiRouteEntryImpl>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
impl WifiRouteEntry {
pub fn new(
address: Option<usize>,
conn: Rc<RefCell<Connection>>,
protocol: IpProtocol,
) -> Self {
let entry: WifiRouteEntry = Object::builder().build();
let entry_imp = entry.imp();
if let Some(address) = address {
let conn = conn.borrow();
let address = unsafe { conn.ipv4.route_data.get_unchecked(address) };
entry_imp.reset_route_address.set_text(&address.address);
entry_imp
.reset_route_prefix
.set_text(&address.prefix_length.to_string());
if let Some(gateway) = &address.gateway {
entry_imp.reset_route_gateway.set_text(gateway);
}
if let Some(metric) = address.metric {
entry_imp.reset_route_metric.set_text(&metric.to_string());
}
entry_imp
.reset_route_row
.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
}
entry_imp.protocol.set(protocol);
entry.setup_callbacks(conn);
entry
}
fn setup_callbacks(&self, connection: Rc<RefCell<Connection>>) {
let self_imp = self.imp();
let conn = connection.clone();
self_imp.reset_route_address.connect_changed(clone!(@weak self_imp => move |entry| {
let address_input = entry.text();
let mut conn = conn.borrow_mut();
if address_input.is_empty() {
self_imp.reset_route_address.remove_css_class("error");
self_imp.reset_route_row.set_title("Add new address");
return;
}
let result = match self_imp.protocol.get() {
IpProtocol::IPv4 => Ipv4Addr::from_str(address_input.as_str()).map(IpAddr::V4),
IpProtocol::IPv6 => Ipv6Addr::from_str(address_input.as_str()).map(IpAddr::V6),
};
match result {
Ok(ip_addr) => {
self_imp.reset_route_address.remove_css_class("error");
let address_data = match self_imp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.route_data,
IpProtocol::IPv6 => &mut conn.ipv6.route_data,
};
address_data.push(Address::new(ip_addr.to_string(), self_imp.prefix.get().1 as u32,self_imp.gateway.borrow().clone() ,self_imp.metric.get()));
*self_imp.address.borrow_mut() = (true, ip_addr.to_string());
}
Err(_) => {
self_imp.reset_route_address.add_css_class("error");
*self_imp.address.borrow_mut() = (false, String::default());
}
}
set_row_title(&self_imp);
}));
let conn = connection.clone();
self_imp.reset_route_prefix.connect_changed(clone!(@weak self_imp => move |entry| {
let prefix_input = entry.text();
let prefix = prefix_input.parse::<u8>();
let mut conn = conn.borrow_mut();
let handle_error = || {
if self_imp.reset_route_prefix.text().is_empty() {
self_imp.reset_route_prefix.remove_css_class("error");
} else {
self_imp.reset_route_prefix.add_css_class("error");
}
self_imp.prefix.set((false, 0));
set_row_title(&self_imp);
};
if prefix_input.is_empty() || prefix.is_err() {
handle_error();
return;
}
let prefix = prefix.unwrap();
match self_imp.protocol.get() {
IpProtocol::IPv4 if prefix <= 32 => {
self_imp.prefix.set((true, prefix as u32));
self_imp.reset_route_prefix.remove_css_class("error");
if let Ok(address2) = Ipv4Addr::from_str(self_imp.reset_route_address.text().as_str()) {
if let Some(addr) = conn.ipv4.route_data.iter_mut()
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
IpProtocol::IPv6 if prefix <= 128 => {
self_imp.prefix.set((true, prefix as u32));
self_imp.reset_route_prefix.remove_css_class("error");
if let Ok(address2) = Ipv6Addr::from_str(self_imp.reset_route_address.text().as_str()) {
if let Some(addr) = conn.ipv6.route_data.iter_mut()
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
addr.prefix_length = prefix as u32;
}
}
}
_ => handle_error()
}
set_row_title(&self_imp);
}));
let conn = connection.clone();
self_imp
.reset_route_gateway
.connect_changed(clone!(@weak self_imp => move |entry| {
let gateway_input = entry.text();
let mut conn = conn.borrow_mut();
if gateway_input.is_empty() {
self_imp.reset_route_gateway.remove_css_class("error");
*self_imp.gateway.borrow_mut() = None;
set_row_subtitle(&self_imp);
return;
}
let result = match self_imp.protocol.get() {
IpProtocol::IPv4 => Ipv4Addr::from_str(gateway_input.as_str()).map(IpAddr::V4),
IpProtocol::IPv6 => Ipv6Addr::from_str(gateway_input.as_str()).map(IpAddr::V6),
};
match result {
Ok(ip_addr) => {
self_imp.reset_route_gateway.remove_css_class("error");
let address_data = match self_imp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.route_data,
IpProtocol::IPv6 => &mut conn.ipv6.route_data,
};
if let Some(address) = address_data.iter_mut()
.find(|conn_addr| *conn_addr.address == self_imp.reset_route_address.text()) {
address.gateway = Some(ip_addr.to_string());
}
*self_imp.gateway.borrow_mut() = Some(ip_addr.to_string());
}
Err(_) => {
self_imp.reset_route_gateway.add_css_class("error");
*self_imp.gateway.borrow_mut() = None;
}
}
set_row_subtitle(&self_imp);
}));
let conn = connection.clone();
self_imp
.reset_route_metric
.connect_changed(clone!(@weak self_imp => move |entry| {
let metric_input = entry.text();
let mut conn = conn.borrow_mut();
if metric_input.is_empty() {
self_imp.reset_route_metric.remove_css_class("error");
self_imp.metric.set(None);
set_row_subtitle(&self_imp);
return;
}
let result = metric_input.parse::<u32>();
match result {
Ok(metric) => {
self_imp.reset_route_metric.remove_css_class("error");
let address_data = match self_imp.protocol.get() {
IpProtocol::IPv4 => &mut conn.ipv4.route_data,
IpProtocol::IPv6 => &mut conn.ipv6.route_data,
};
if let Some(address) = address_data.iter_mut()
.find(|conn_addr| *conn_addr.address == self_imp.reset_route_address.text()) {
address.metric = Some(metric);
}
self_imp.metric.set(Some(metric));
}
Err(_) => {
self_imp.reset_route_metric.add_css_class("error");
self_imp.metric.set(None);
}
}
set_row_subtitle(&self_imp);
}));
}
}
fn set_row_title(self_imp: &WifiRouteEntryImpl) {
if self_imp.reset_route_address.text().is_empty() {
return;
}
let address = self_imp.address.borrow();
let prefix = self_imp.prefix.get();
let title = match (address.0, prefix.0) {
(true, true) => {
format!("{}/{}", address.1, prefix.1)
}
(true, false) => "Prefix wrong".to_string(),
(false, true) => "Address wrong".to_string(),
(false, false) => "Address and Prefix wrong".to_string(),
};
self_imp.reset_route_row.set_title(&title);
}
fn set_row_subtitle(self_imp: &WifiRouteEntryImpl) {
let gateway = self_imp.gateway.borrow().clone();
let metric = self_imp.metric.get();
let title = match (gateway, metric) {
(Some(gateway), Some(metric)) => {
format!("{}, {}", gateway, metric)
}
(Some(gateway), None) => gateway,
(None, Some(metric)) => metric.to_string(),
(None, None) => String::default(),
};
self_imp.reset_route_row.set_subtitle(&title);
}

View file

@ -1,26 +1,25 @@
use crate::components::wifi::utils::IpProtocol;
use crate::components::wifi::wifiRouteEntry;
use crate::components::wifi::wifi_route_entry;
use adw::{EntryRow, ExpanderRow};
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate};
use std::cell::{Cell, RefCell};
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/Xetibo/ReSet/resetWifiRouteEntry.ui")]
pub struct WifiRouteEntryImpl {
#[template_child]
pub resetRouteRow: TemplateChild<ExpanderRow>,
pub reset_route_row: TemplateChild<ExpanderRow>,
#[template_child]
pub resetRouteAddress: TemplateChild<EntryRow>,
pub reset_route_address: TemplateChild<EntryRow>,
#[template_child]
pub resetRoutePrefix: TemplateChild<EntryRow>,
pub reset_route_prefix: TemplateChild<EntryRow>,
#[template_child]
pub resetRouteGateway: TemplateChild<EntryRow>,
pub reset_route_gateway: TemplateChild<EntryRow>,
#[template_child]
pub resetRouteMetric: TemplateChild<EntryRow>,
pub reset_route_metric: TemplateChild<EntryRow>,
#[template_child]
pub resetRouteRemove: TemplateChild<Button>,
pub reset_route_remove: TemplateChild<Button>,
pub address: RefCell<(bool, String)>,
pub prefix: Cell<(bool, u32)>,
pub gateway: RefCell<Option<String>>,
@ -32,7 +31,7 @@ pub struct WifiRouteEntryImpl {
impl ObjectSubclass for WifiRouteEntryImpl {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetWifiRouteEntry";
type Type = wifiRouteEntry::WifiRouteEntry;
type Type = wifi_route_entry::WifiRouteEntry;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {

View file

@ -2,123 +2,123 @@ use gtk::prelude::FrameExt;
use std::sync::atomic::Ordering;
use std::sync::Arc;
use crate::components::base::settingBox::SettingBox;
use crate::components::base::setting_box::SettingBox;
use crate::components::base::utils::{start_audio_listener, Listeners};
use crate::components::bluetooth::bluetoothBox::{
use crate::components::bluetooth::bluetooth_box::{
populate_conntected_bluetooth_devices, start_bluetooth_listener, BluetoothBox,
};
use crate::components::input::sourceBox::{populate_sources, SourceBox};
use crate::components::output::sinkBox::{populate_sinks, SinkBox};
use crate::components::wifi::wifiBox::{
scanForWifi, show_stored_connections, start_event_listener, WifiBox,
use crate::components::input::source_box::{populate_sources, SourceBox};
use crate::components::output::sink_box::{populate_sinks, SinkBox};
use crate::components::wifi::wifi_box::{
scan_for_wifi, show_stored_connections, start_event_listener, WifiBox,
};
use gtk::prelude::WidgetExt;
use gtk::{FlowBox, Frame};
pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_audio_listener();
let wifiBox = WifiBox::new(listeners.clone());
start_event_listener(listeners.clone(), wifiBox.clone());
show_stored_connections(wifiBox.clone());
scanForWifi(wifiBox.clone());
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
let wifi_box = WifiBox::new(listeners.clone());
start_event_listener(listeners.clone(), wifi_box.clone());
show_stored_connections(wifi_box.clone());
scan_for_wifi(wifi_box.clone());
let wifi_frame = wrap_in_frame(SettingBox::new(&*wifi_box));
let bluetooth_box = BluetoothBox::new(listeners.clone());
populate_conntected_bluetooth_devices(bluetooth_box.clone());
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
let bluetoothFrame = wrapInFrame(SettingBox::new(&*bluetooth_box));
resetMain.remove_all();
resetMain.insert(&wifiFrame, -1);
resetMain.insert(&bluetoothFrame, -1);
resetMain.set_max_children_per_line(2);
let bluetooth_frame = wrap_in_frame(SettingBox::new(&*bluetooth_box));
reset_main.remove_all();
reset_main.insert(&wifi_frame, -1);
reset_main.insert(&bluetooth_frame, -1);
reset_main.set_max_children_per_line(2);
};
pub const HANDLE_WIFI_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_audio_listener();
listeners.stop_bluetooth_listener();
let wifiBox = WifiBox::new(listeners.clone());
start_event_listener(listeners.clone(), wifiBox.clone());
show_stored_connections(wifiBox.clone());
scanForWifi(wifiBox.clone());
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
resetMain.remove_all();
resetMain.insert(&wifiFrame, -1);
resetMain.set_max_children_per_line(1);
let wifi_box = WifiBox::new(listeners.clone());
start_event_listener(listeners.clone(), wifi_box.clone());
show_stored_connections(wifi_box.clone());
scan_for_wifi(wifi_box.clone());
let wifi_frame = wrap_in_frame(SettingBox::new(&*wifi_box));
reset_main.remove_all();
reset_main.insert(&wifi_frame, -1);
reset_main.set_max_children_per_line(1);
};
pub const HANDLE_BLUETOOTH_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_network_listener();
listeners.stop_audio_listener();
let bluetooth_box = BluetoothBox::new(listeners.clone());
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
populate_conntected_bluetooth_devices(bluetooth_box.clone());
let bluetoothFrame = wrapInFrame(SettingBox::new(&*bluetooth_box));
resetMain.remove_all();
resetMain.insert(&bluetoothFrame, -1);
resetMain.set_max_children_per_line(1);
let bluetooth_frame = wrap_in_frame(SettingBox::new(&*bluetooth_box));
reset_main.remove_all();
reset_main.insert(&bluetooth_frame, -1);
reset_main.set_max_children_per_line(1);
};
pub const HANDLE_AUDIO_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_network_listener();
listeners.stop_bluetooth_listener();
let audioOutput = Arc::new(SinkBox::new());
let audioInput = Arc::new(SourceBox::new());
let audio_output = Arc::new(SinkBox::new());
let audio_input = Arc::new(SourceBox::new());
start_audio_listener(
listeners.clone(),
Some(audioOutput.clone()),
Some(audioInput.clone()),
Some(audio_output.clone()),
Some(audio_input.clone()),
);
populate_sinks(audioOutput.clone());
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
populate_sources(audioInput.clone());
let sourceFrame = wrapInFrame(SettingBox::new(&*audioInput));
resetMain.remove_all();
resetMain.insert(&audioFrame, -1);
resetMain.insert(&sourceFrame, -1);
resetMain.set_max_children_per_line(2);
populate_sinks(audio_output.clone());
let audio_frame = wrap_in_frame(SettingBox::new(&*audio_output));
populate_sources(audio_input.clone());
let source_frame = wrap_in_frame(SettingBox::new(&*audio_input));
reset_main.remove_all();
reset_main.insert(&audio_frame, -1);
reset_main.insert(&source_frame, -1);
reset_main.set_max_children_per_line(2);
};
pub const HANDLE_VOLUME_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_network_listener();
listeners.stop_bluetooth_listener();
let audioOutput = Arc::new(SinkBox::new());
start_audio_listener(listeners.clone(), Some(audioOutput.clone()), None);
let audio_output = Arc::new(SinkBox::new());
start_audio_listener(listeners.clone(), Some(audio_output.clone()), None);
while !listeners.pulse_listener.load(Ordering::SeqCst) {
std::hint::spin_loop()
}
populate_sinks(audioOutput.clone());
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
resetMain.remove_all();
resetMain.insert(&audioFrame, -1);
resetMain.set_max_children_per_line(1);
populate_sinks(audio_output.clone());
let audio_frame = wrap_in_frame(SettingBox::new(&*audio_output));
reset_main.remove_all();
reset_main.insert(&audio_frame, -1);
reset_main.set_max_children_per_line(1);
};
pub const HANDLE_MICROPHONE_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_network_listener();
listeners.stop_bluetooth_listener();
let audioInput = Arc::new(SourceBox::new());
start_audio_listener(listeners.clone(), None, Some(audioInput.clone()));
populate_sources(audioInput.clone());
let sourceFrame = wrapInFrame(SettingBox::new(&*audioInput));
resetMain.remove_all();
resetMain.insert(&sourceFrame, -1);
resetMain.set_max_children_per_line(1);
let audio_input = Arc::new(SourceBox::new());
start_audio_listener(listeners.clone(), None, Some(audio_input.clone()));
populate_sources(audio_input.clone());
let source_frame = wrap_in_frame(SettingBox::new(&*audio_input));
reset_main.remove_all();
reset_main.insert(&source_frame, -1);
reset_main.set_max_children_per_line(1);
};
pub const HANDLE_HOME: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|listeners: Arc<Listeners>, reset_main: FlowBox| {
listeners.stop_network_listener();
listeners.stop_audio_listener();
listeners.stop_bluetooth_listener();
resetMain.remove_all();
reset_main.remove_all();
};
fn wrapInFrame(widget: SettingBox) -> Frame {
fn wrap_in_frame(widget: SettingBox) -> Frame {
let frame = Frame::new(None);
frame.set_child(Some(&widget));
frame.add_css_class("resetSettingFrame");

View file

@ -1,6 +1,5 @@
#![allow(non_snake_case)]
pub mod handleSidebarClick;
pub mod resetWindow;
pub mod resetWindowImpl;
pub mod sidebarEntry;
pub mod sidebarEntryImpl;
pub mod handle_sidebar_click;
pub mod reset_window;
pub mod reset_window_impl;
pub mod sidebar_entry;
pub mod sidebar_entry_impl;

View file

@ -5,13 +5,13 @@ use glib::Object;
use gtk::prelude::*;
use gtk::{gio, glib, Application, ListBoxRow, Orientation};
use crate::components::window::handleSidebarClick::*;
use crate::components::window::resetWindowImpl;
use crate::components::window::sidebarEntry::SidebarEntry;
use crate::components::window::sidebarEntryImpl::Categories;
use crate::components::window::handle_sidebar_click::*;
use crate::components::window::reset_window_impl;
use crate::components::window::sidebar_entry::SidebarEntry;
use crate::components::window::sidebar_entry_impl::Categories;
glib::wrapper! {
pub struct ReSetWindow(ObjectSubclass<resetWindowImpl::ReSetWindow>)
pub struct ReSetWindow(ObjectSubclass<reset_window_impl::ReSetWindow>)
@extends gtk::ApplicationWindow, gtk::Window, gtk::Widget,
@implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable,
gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager;
@ -21,37 +21,36 @@ unsafe impl Send for ReSetWindow {}
unsafe impl Sync for ReSetWindow {}
#[allow(non_snake_case)]
impl ReSetWindow {
pub fn new(app: &Application) -> Self {
Object::builder().property("application", app).build()
}
pub fn setupCallback(&self) {
let selfImp = self.imp();
pub fn setup_callback(&self) {
let self_imp = self.imp();
selfImp
.resetSearchEntry
.connect_search_changed(clone!(@ weak self as window => move |_| {
window.filterList();
}));
selfImp
.resetSideBarToggle
.connect_clicked(clone!(@ weak self as window => move |_| {
window.toggleSidebar();
}));
selfImp.resetSidebarList.connect_row_activated(
clone!(@ weak selfImp as flowbox => move |_, y| {
let result = y.downcast_ref::<SidebarEntry>().unwrap();
let clickEvent = result.imp().onClickEvent.borrow().onClickEvent;
(clickEvent)(flowbox.listeners.clone(), flowbox.resetMain.get());
self_imp.reset_search_entry.connect_search_changed(
clone!(@ weak self as window => move |_| {
window.filter_list();
}),
);
selfImp
.resetClose
self_imp
.reset_sidebar_toggle
.connect_clicked(clone!(@ weak self as window => move |_| {
window.toggle_sidebar();
}));
self_imp.reset_sidebar_list.connect_row_activated(
clone!(@ weak self_imp as flowbox => move |_, y| {
let result = y.downcast_ref::<SidebarEntry>().unwrap();
let click_event = result.imp().on_click_event.borrow().on_click_event;
(click_event)(flowbox.listeners.clone(), flowbox.reset_main.get());
}),
);
self_imp
.reset_close
.connect_clicked(clone!(@ weak self as window => move |_| {
window.close();
}));
@ -62,74 +61,74 @@ impl ReSetWindow {
// });
}
pub fn handleDynamicSidebar(&self) {
let selfImp = self.imp();
selfImp
.resetSidebarBreakpoint
pub fn handle_dynamic_sidebar(&self) {
let self_imp = self.imp();
self_imp
.reset_sidebar_breakpoint
.set_condition(BreakpointCondition::parse("max-width: 700sp").as_ref().ok());
selfImp.resetSidebarBreakpoint.add_setter(
&Object::from(selfImp.resetOverlaySplitView.get()),
self_imp.reset_sidebar_breakpoint.add_setter(
&Object::from(self_imp.reset_overlay_split_view.get()),
"collapsed",
&true.to_value(),
);
selfImp.resetSidebarBreakpoint.add_setter(
&Object::from(selfImp.resetSideBarToggle.get()),
self_imp.reset_sidebar_breakpoint.add_setter(
&Object::from(self_imp.reset_sidebar_toggle.get()),
"visible",
&true.to_value(),
);
}
pub fn filterList(&self) {
let text = self.imp().resetSearchEntry.text().to_string();
for (mainEntry, subEntries) in self.imp().sidebarEntries.borrow().iter() {
pub fn filter_list(&self) {
let text = self.imp().reset_search_entry.text().to_string();
for (main_entry, sub_entriess) in self.imp().sidebar_entries.borrow().iter() {
if text.is_empty() {
mainEntry.set_visible(true);
for subEntry in subEntries {
subEntry.set_visible(true);
main_entry.set_visible(true);
for sub_entry in sub_entriess {
sub_entry.set_visible(true);
}
continue;
}
if mainEntry
if main_entry
.imp()
.name
.borrow()
.to_lowercase()
.contains(&text.to_lowercase())
{
mainEntry.set_visible(true);
main_entry.set_visible(true);
} else {
mainEntry.set_visible(false);
main_entry.set_visible(false);
}
for subEntry in subEntries {
if subEntry
for sub_entry in sub_entriess {
if sub_entry
.imp()
.name
.borrow()
.to_lowercase()
.contains(&text.to_lowercase())
{
subEntry.set_visible(true);
mainEntry.set_visible(true);
sub_entry.set_visible(true);
main_entry.set_visible(true);
} else {
subEntry.set_visible(false);
sub_entry.set_visible(false);
}
}
}
}
pub fn toggleSidebar(&self) {
if self.imp().resetOverlaySplitView.shows_sidebar() {
self.imp().resetOverlaySplitView.set_show_sidebar(false);
pub fn toggle_sidebar(&self) {
if self.imp().reset_overlay_split_view.shows_sidebar() {
self.imp().reset_overlay_split_view.set_show_sidebar(false);
} else {
self.imp().resetOverlaySplitView.set_show_sidebar(true);
self.imp().reset_overlay_split_view.set_show_sidebar(true);
}
}
pub fn setupSidebarEntries(&self) {
let selfImp = self.imp();
let mut sidebarEntries = selfImp.sidebarEntries.borrow_mut();
pub fn setup_sidebar_entries(&self) {
let self_imp = self.imp();
let mut sidebar_entries = self_imp.sidebar_entries.borrow_mut();
let connectivityList = vec![
let connectivity_list = vec![
SidebarEntry::new(
"WiFi",
"network-wireless-symbolic",
@ -153,7 +152,7 @@ impl ReSetWindow {
// ),
];
sidebarEntries.push((
sidebar_entries.push((
SidebarEntry::new(
"Connectivity",
"network-wired-symbolic",
@ -161,10 +160,10 @@ impl ReSetWindow {
false,
HANDLE_CONNECTIVITY_CLICK,
),
connectivityList,
connectivity_list,
));
let audioList = vec![
let audio_list = vec![
SidebarEntry::new(
"Output",
"audio-volume-high-symbolic",
@ -181,7 +180,7 @@ impl ReSetWindow {
),
];
sidebarEntries.push((
sidebar_entries.push((
SidebarEntry::new(
"Audio",
"audio-headset-symbolic",
@ -189,7 +188,7 @@ impl ReSetWindow {
false,
HANDLE_AUDIO_CLICK,
),
audioList,
audio_list,
));
// let peripheralsList = vec![
@ -227,29 +226,29 @@ impl ReSetWindow {
// peripheralsList,
// ));
selfImp
.resetSidebarList
.connect_row_activated(clone!(@ weak selfImp => move |_, _| {
selfImp.resetSearchEntry.set_text("");
self_imp
.reset_sidebar_list
.connect_row_activated(clone!(@ weak self_imp => move |_, _| {
self_imp.reset_search_entry.set_text("");
}));
for (mainEntry, subEntries) in sidebarEntries.iter() {
selfImp.resetSidebarList.append(mainEntry);
for subEntry in subEntries {
selfImp.resetSidebarList.append(subEntry);
for (main_entry, sub_entries) in sidebar_entries.iter() {
self_imp.reset_sidebar_list.append(main_entry);
for sub_entry in sub_entries {
self_imp.reset_sidebar_list.append(sub_entry);
}
let separator = ListBoxRow::new();
separator.set_child(Some(&gtk::Separator::new(Orientation::Horizontal)));
separator.set_selectable(false);
separator.set_activatable(false);
selfImp.resetSidebarList.append(&separator);
self_imp.reset_sidebar_list.append(&separator);
}
}
pub fn setupPopoverButtons(&self) {
let selfImp = self.imp();
selfImp
.resetAboutButton
pub fn setup_popover_buttons(&self) {
let self_imp = self.imp();
self_imp
.reset_about_button
.connect_clicked(clone!(@ weak self as window => move |_| {
let dialog = adw::AboutWindow::builder()
.application_name("ReSet")
@ -266,21 +265,21 @@ impl ReSetWindow {
.developers(vec!["DashieTM".to_string(), "Takotori".to_string()])
.designers(vec!["DashieTM".to_string(), "Takotori".to_string()])
.build();
window.imp().resetPopoverMenu.popdown();
window.imp().reset_popover_menu.popdown();
dialog.present();
}));
selfImp
.resetPreferenceButton
self_imp
.reset_preference_button
.connect_clicked(clone!(@weak self as window => move |_| {
let preferences = adw::PreferencesWindow::builder().build();
window.imp().resetPopoverMenu.popdown();
window.imp().reset_popover_menu.popdown();
preferences.present();
}));
selfImp
.resetShortcutsButton
self_imp
.reset_shortcuts_button
.connect_clicked(clone!(@weak self as window => move |_| {
let shortcuts = gtk::ShortcutsWindow::builder().build();
window.imp().resetPopoverMenu.popdown();
window.imp().reset_popover_menu.popdown();
shortcuts.present();
}));
}

View file

@ -9,37 +9,36 @@ use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, FlowBox, ListBox, PopoverMenu, SearchEntry};
use crate::components::base::utils::Listeners;
use crate::components::wifi::wifiBox::WifiBox;
use crate::components::window::resetWindow;
use crate::components::window::sidebarEntry::SidebarEntry;
use crate::components::wifi::wifi_box::WifiBox;
use crate::components::window::reset_window;
use crate::components::window::sidebar_entry::SidebarEntry;
#[allow(non_snake_case)]
#[derive(CompositeTemplate, Default)]
#[template(resource = "/org/Xetibo/ReSet/resetMainWindow.ui")]
pub struct ReSetWindow {
#[template_child]
pub resetMain: TemplateChild<FlowBox>,
pub reset_main: TemplateChild<FlowBox>,
#[template_child]
pub resetSidebarBreakpoint: TemplateChild<Breakpoint>,
pub reset_sidebar_breakpoint: TemplateChild<Breakpoint>,
#[template_child]
pub resetOverlaySplitView: TemplateChild<OverlaySplitView>,
pub reset_overlay_split_view: TemplateChild<OverlaySplitView>,
#[template_child]
pub resetSearchEntry: TemplateChild<SearchEntry>,
pub reset_search_entry: TemplateChild<SearchEntry>,
#[template_child]
pub resetSidebarList: TemplateChild<ListBox>,
pub reset_sidebar_list: TemplateChild<ListBox>,
#[template_child]
pub resetSideBarToggle: TemplateChild<Button>,
pub reset_sidebar_toggle: TemplateChild<Button>,
#[template_child]
pub resetPopoverMenu: TemplateChild<PopoverMenu>,
pub reset_popover_menu: TemplateChild<PopoverMenu>,
#[template_child]
pub resetClose: TemplateChild<Button>,
pub reset_close: TemplateChild<Button>,
#[template_child]
pub resetAboutButton: TemplateChild<Button>,
pub reset_about_button: TemplateChild<Button>,
#[template_child]
pub resetPreferenceButton: TemplateChild<Button>,
pub reset_preference_button: TemplateChild<Button>,
#[template_child]
pub resetShortcutsButton: TemplateChild<Button>,
pub sidebarEntries: RefCell<Vec<(SidebarEntry, Vec<SidebarEntry>)>>,
pub reset_shortcuts_button: TemplateChild<Button>,
pub sidebar_entries: RefCell<Vec<(SidebarEntry, Vec<SidebarEntry>)>>,
pub listeners: Arc<Listeners>,
}
@ -50,7 +49,7 @@ unsafe impl Sync for ReSetWindow {}
impl ObjectSubclass for ReSetWindow {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetUI";
type Type = resetWindow::ReSetWindow;
type Type = reset_window::ReSetWindow;
type ParentType = adw::ApplicationWindow;
fn class_init(klass: &mut Self::Class) {
@ -68,10 +67,10 @@ impl ObjectImpl for ReSetWindow {
self.parent_constructed();
let obj = self.obj();
obj.setupCallback();
obj.setupPopoverButtons();
obj.handleDynamicSidebar();
obj.setupSidebarEntries();
obj.setup_callback();
obj.setup_popover_buttons();
obj.handle_dynamic_sidebar();
obj.setup_sidebar_entries();
}
}

View file

@ -1,51 +0,0 @@
use std::sync::Arc;
use crate::components::base::utils::Listeners;
use crate::components::window::sidebarEntryImpl;
use crate::components::window::sidebarEntryImpl::{Categories, SidebarAction};
use adw::subclass::prelude::ObjectSubclassIsExt;
use glib::Object;
use gtk::prelude::*;
use gtk::{glib, FlowBox};
glib::wrapper! {
pub struct SidebarEntry(ObjectSubclass<sidebarEntryImpl::SidebarEntry>)
@extends gtk::ListBoxRow, gtk::Widget,
@implements gtk::Accessible, gtk::Actionable, gtk::Buildable, gtk::ConstraintTarget;
}
impl SidebarEntry {
pub fn new(
entryName: &str,
iconName: &str,
category: Categories,
isSubcategory: bool,
clickEvent: fn(Arc<Listeners>, FlowBox),
) -> Self {
let entry: SidebarEntry = Object::builder().build();
let entryImp = entry.imp();
entryImp.resetSidebarLabel.get().set_text(entryName);
entryImp
.resetSidebarImage
.set_from_icon_name(Some(iconName));
entryImp.category.set(category);
entryImp.isSubcategory.set(isSubcategory);
{
let mut name = entryImp.name.borrow_mut();
*name = String::from(entryName);
let mut action = entryImp.onClickEvent.borrow_mut();
*action = SidebarAction {
onClickEvent: clickEvent,
};
}
Self::setMargin(&entry);
entry
}
fn setMargin(entry: &SidebarEntry) {
if entry.imp().isSubcategory.get() {
let option = entry.child().unwrap();
option.set_margin_start(30);
}
}
}

View file

@ -0,0 +1,51 @@
use std::sync::Arc;
use crate::components::base::utils::Listeners;
use crate::components::window::sidebar_entry_impl;
use crate::components::window::sidebar_entry_impl::{Categories, SidebarAction};
use adw::subclass::prelude::ObjectSubclassIsExt;
use glib::Object;
use gtk::prelude::*;
use gtk::{glib, FlowBox};
glib::wrapper! {
pub struct SidebarEntry(ObjectSubclass<sidebar_entry_impl::SidebarEntry>)
@extends gtk::ListBoxRow, gtk::Widget,
@implements gtk::Accessible, gtk::Actionable, gtk::Buildable, gtk::ConstraintTarget;
}
impl SidebarEntry {
pub fn new(
entry_name: &str,
icon_name: &str,
category: Categories,
is_subcategory: bool,
click_event: fn(Arc<Listeners>, FlowBox),
) -> Self {
let entry: SidebarEntry = Object::builder().build();
let entry_imp = entry.imp();
entry_imp.reset_sidebar_label.get().set_text(entry_name);
entry_imp
.reset_sidebar_image
.set_from_icon_name(Some(icon_name));
entry_imp.category.set(category);
entry_imp.is_subcategory.set(is_subcategory);
{
let mut name = entry_imp.name.borrow_mut();
*name = String::from(entry_name);
let mut action = entry_imp.on_click_event.borrow_mut();
*action = SidebarAction {
on_click_event: click_event,
};
}
Self::set_margin(&entry);
entry
}
fn set_margin(entry: &SidebarEntry) {
if entry.imp().is_subcategory.get() {
let option = entry.child().unwrap();
option.set_margin_start(30);
}
}
}

View file

@ -6,8 +6,8 @@ use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate, FlowBox, Image, Label, ListBoxRow};
use crate::components::base::utils::Listeners;
use crate::components::window::handleSidebarClick::HANDLE_HOME;
use crate::components::window::sidebarEntry;
use crate::components::window::handle_sidebar_click::HANDLE_HOME;
use crate::components::window::sidebar_entry;
#[derive(Default)]
pub enum Categories {
@ -18,29 +18,27 @@ pub enum Categories {
Misc,
}
#[allow(non_snake_case)]
#[derive(CompositeTemplate, Default)]
#[template(resource = "/org/Xetibo/ReSet/resetSidebarEntry.ui")]
pub struct SidebarEntry {
#[template_child]
pub resetSidebarLabel: TemplateChild<Label>,
pub reset_sidebar_label: TemplateChild<Label>,
#[template_child]
pub resetSidebarImage: TemplateChild<Image>,
pub reset_sidebar_image: TemplateChild<Image>,
pub category: Cell<Categories>,
pub isSubcategory: Cell<bool>,
pub onClickEvent: RefCell<SidebarAction>,
pub is_subcategory: Cell<bool>,
pub on_click_event: RefCell<SidebarAction>,
pub name: RefCell<String>,
}
#[allow(non_snake_case)]
pub struct SidebarAction {
pub onClickEvent: fn(Arc<Listeners>, FlowBox),
pub on_click_event: fn(Arc<Listeners>, FlowBox),
}
impl Default for SidebarAction {
fn default() -> Self {
Self {
onClickEvent: HANDLE_HOME,
on_click_event: HANDLE_HOME,
}
}
}
@ -49,7 +47,7 @@ impl Default for SidebarAction {
impl ObjectSubclass for SidebarEntry {
const ABSTRACT: bool = false;
const NAME: &'static str = "resetSidebarEntry";
type Type = sidebarEntry::SidebarEntry;
type Type = sidebar_entry::SidebarEntry;
type ParentType = ListBoxRow;
fn class_init(klass: &mut Self::Class) {

View file

@ -1,9 +1,7 @@
#![allow(non_snake_case)]
use std::thread;
use std::time::Duration;
use components::window::resetWindow::ReSetWindow;
use components::window::reset_window::ReSetWindow;
use dbus::blocking::Connection;
use dbus::Error;
use gtk::gdk::Display;
@ -27,15 +25,15 @@ async fn main() {
app.connect_startup(move |_| {
adw::init().unwrap();
loadCss();
load_css();
});
app.connect_activate(buildUI);
app.connect_activate(build_ui);
app.connect_shutdown(shutdown);
app.run();
}
fn loadCss() {
fn load_css() {
let provider = CssProvider::new();
provider.load_from_resource("/org/Xetibo/ReSet/style/style.css");
@ -46,8 +44,7 @@ fn loadCss() {
);
}
#[allow(non_snake_case)]
fn buildUI(app: &Application) {
fn build_ui(app: &Application) {
let window = ReSetWindow::new(app);
window.present();
}

View file

@ -26,7 +26,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetSourceRow">
<object class="AdwActionRow" id="reset_source_row">
<property name="title">Input Devices</property>
<child>
<object class="GtkImage">
@ -36,7 +36,7 @@
</object>
</child>
<child>
<object class="AdwActionRow" id="resetCardsRow">
<object class="AdwActionRow" id="reset_cards_row">
<property name="title">Profile Settings</property>
<child>
<object class="GtkImage">
@ -46,7 +46,7 @@
</object>
</child>
<child>
<object class="AdwComboRow" id="resetSourceDropdown">
<object class="AdwComboRow" id="reset_source_dropdown">
<property name="title">Default Input Device</property>
<property name="use-subtitle">True</property>
</object>
@ -65,14 +65,14 @@
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<child>
<object class="GtkButton" id="resetSourceMute">
<object class="GtkButton" id="reset_source_mute">
<property name="icon-name">audio-input-microphone-symbolic</property>
<property name="margin-end">5</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkScale" id="resetVolumeSlider">
<object class="GtkScale" id="reset_volume_slider">
<property name="adjustment">
<object class="GtkAdjustment">
<property name="page-increment">2005.4016</property>
@ -89,7 +89,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetVolumePercentage">
<object class="GtkLabel" id="reset_volume_percentage">
<property name="label">100%</property>
<property name="lines">1</property>
<property name="width-request">40</property>
@ -98,7 +98,7 @@
</object>
</child>
<child>
<object class="GtkProgressBar" id="resetVolumeMeter">
<object class="GtkProgressBar" id="reset_volume_meter">
<property name="margin-top">5</property>
</object>
</child>
@ -108,7 +108,7 @@
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkBox" id="resetOutputStreams">
<object class="GtkBox" id="reset_output_streams">
<property name="margin-top">10</property>
<property name="orientation">vertical</property>
<child>
@ -133,7 +133,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetOutputStreamButton">
<object class="AdwActionRow" id="reset_output_stream_button">
<property name="title">Input Streams</property>
<child>
<object class="GtkImage">
@ -148,7 +148,7 @@
</object>
</child>
<child>
<object class="GtkBox" id="resetSources">
<object class="GtkBox" id="reset_sources">
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">10</property>
@ -175,7 +175,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetInputCardsBackButton">
<object class="AdwActionRow" id="reset_input_cards_back_button">
<property name="title">Input Streams</property>
<child>
<object class="GtkImage">
@ -193,7 +193,7 @@
<object class="GtkLabel"/>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetCards">
<object class="AdwPreferencesGroup" id="reset_cards">
<property name="title">Devices</property>
</object>
</child>

View file

@ -26,7 +26,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetSinksRow">
<object class="AdwActionRow" id="reset_sinks_row">
<property name="title">Output Devices</property>
<child>
<object class="GtkImage">
@ -36,7 +36,7 @@
</object>
</child>
<child>
<object class="AdwActionRow" id="resetCardsRow">
<object class="AdwActionRow" id="reset_cards_row">
<property name="title">Profile Settings</property>
<child>
<object class="GtkImage">
@ -46,7 +46,7 @@
</object>
</child>
<child>
<object class="AdwComboRow" id="resetSinkDropdown">
<object class="AdwComboRow" id="reset_sink_dropdown">
<property name="title">Default Output Device</property>
<property name="use-subtitle">True</property>
</object>
@ -65,14 +65,14 @@
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<child>
<object class="GtkButton" id="resetSinkMute">
<object class="GtkButton" id="reset_sink_mute">
<property name="icon-name">audio-volume-high-symbolic</property>
<property name="margin-end">5</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkScale" id="resetVolumeSlider">
<object class="GtkScale" id="reset_volume_slider">
<property name="adjustment">
<object class="GtkAdjustment">
<property name="page-increment">2005.4016</property>
@ -89,7 +89,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetVolumePercentage">
<object class="GtkLabel" id="reset_volume_percentage">
<property name="label">100%</property>
<property name="lines">1</property>
<property name="width-request">40</property>
@ -98,7 +98,7 @@
</object>
</child>
<child>
<object class="GtkProgressBar" id="resetVolumeMeter">
<object class="GtkProgressBar" id="reset_volume_meter">
<property name="margin-top">5</property>
</object>
</child>
@ -108,7 +108,7 @@
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkBox" id="resetInputStreams">
<object class="GtkBox" id="reset_input_streams">
<property name="margin-top">10</property>
<property name="orientation">vertical</property>
<child>
@ -133,7 +133,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetInputStreamButton">
<object class="AdwActionRow" id="reset_input_stream_button">
<property name="title">Output Streams</property>
<child>
<object class="GtkImage">
@ -151,7 +151,7 @@
<object class="GtkLabel"/>
</child>
<child>
<object class="GtkBox" id="resetSinks">
<object class="GtkBox" id="reset_sinks">
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">10</property>
@ -178,7 +178,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetInputCardsBackButton">
<object class="AdwActionRow" id="reset_input_cards_back_button">
<property name="title">Output Streams</property>
<child>
<object class="GtkImage">
@ -196,7 +196,7 @@
<object class="GtkLabel"/>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetCards">
<object class="AdwPreferencesGroup" id="reset_cards">
<property name="title">Devices</property>
</object>
</child>

View file

@ -17,7 +17,7 @@
</object>
</child>
<child>
<object class="GtkSwitch" id="resetBluetoothSwitch">
<object class="GtkSwitch" id="reset_bluetooth_switch">
<property name="active">True</property>
<property name="halign">end</property>
<property name="hexpand">True</property>
@ -37,14 +37,14 @@
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="AdwPreferencesGroup" id="resetBluetoothDetails">
<object class="AdwPreferencesGroup" id="reset_bluetooth_details">
<child>
<object class="AdwComboRow" id="resetBluetoothAdapter">
<object class="AdwComboRow" id="reset_bluetooth_adapter">
<property name="title">Bluetooth Adapter</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetVisibility">
<object class="AdwActionRow" id="reset_visibility">
<property name="title">Visibility Settings</property>
<child>
<object class="GtkImage">
@ -61,7 +61,7 @@
<child>
<object class="AdwPreferencesGroup">
<property name="header-suffix">
<object class="GtkButton" id="resetBluetoothRefreshButton">
<object class="GtkButton" id="reset_bluetooth_refresh_button">
<property name="icon-name">view-refresh-symbolic</property>
</object>
</property>
@ -74,7 +74,7 @@
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox" id="resetBluetoothAvailableDevices">
<object class="GtkBox" id="reset_bluetooth_available_devices">
<property name="orientation">vertical</property>
</object>
</child>
@ -94,7 +94,7 @@
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox" id="resetBluetoothConnectedDevices">
<object class="GtkBox" id="reset_bluetooth_connected_devices">
<property name="orientation">vertical</property>
</object>
</child>
@ -125,7 +125,7 @@
<property name="show-separators">True</property>
<property name="valign">start</property>
<child>
<object class="resetListBoxRow" id="resetBluetoothMainTab">
<object class="resetListBoxRow" id="reset_bluetooth_main_tab">
<child>
<object class="GtkBox">
<property name="height-request">40</property>

View file

@ -5,7 +5,7 @@
<template class="resetBluetoothEntry" parent="GtkBox">
<property name="margin-start">5</property>
<child>
<object class="GtkImage" id="resetBluetoothDeviceType">
<object class="GtkImage" id="reset_bluetooth_device_type">
<property name="icon-name">input-mouse-symbolic</property>
<property name="margin-end">15</property>
</object>
@ -14,7 +14,7 @@
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="resetBluetoothLabel">
<object class="GtkLabel" id="reset_bluetooth_label">
<property name="ellipsize">end</property>
<property name="hexpand">True</property>
<property name="hexpand-set">True</property>
@ -28,7 +28,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetBluetoothAddress">
<object class="GtkLabel" id="reset_bluetooth_address">
<property name="ellipsize">end</property>
<property name="halign">start</property>
<property name="label">LoremIpsum Wireless Mouse</property>
@ -42,7 +42,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetBluetoothButton">
<object class="GtkButton" id="reset_bluetooth_button">
<property name="has-frame">False</property>
<property name="icon-name">emblem-system-symbolic</property>
</object>

View file

@ -2,7 +2,7 @@
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="libadwaita" version="1.4"/>
<object class="AdwComboRow" id="resetCardEntry">
<object class="AdwComboRow" id="reset_card_entry">
<property name="use-subtitle">True</property>
</object>
</interface>

View file

@ -11,7 +11,7 @@
</object>
</child>
<child>
<object class="AdwComboRow" id="resetSinkSelection">
<object class="AdwComboRow" id="reset_sink_selection">
<property name="css-classes">audioRow</property>
<property name="title">asadf</property>
<property name="use-subtitle">True</property>
@ -27,14 +27,14 @@
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<child>
<object class="GtkButton" id="resetSinkMute">
<object class="GtkButton" id="reset_sink_mute">
<property name="icon-name">audio-input-microphone-symbolic</property>
<property name="margin-end">5</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkScale" id="resetVolumeSlider">
<object class="GtkScale" id="reset_volume_slider">
<property name="adjustment">
<object class="GtkAdjustment">
<property name="page-increment">2005.4016</property>
@ -51,7 +51,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetVolumePercentage">
<object class="GtkLabel" id="reset_volume_percentage">
<property name="label">100%</property>
<property name="lines">1</property>
<property name="width-request">40</property>
@ -60,7 +60,7 @@
</object>
</child>
<child>
<object class="GtkProgressBar" id="resetVolumeMeter">
<object class="GtkProgressBar" id="reset_volume_meter">
<property name="margin-top">5</property>
</object>
</child>

View file

@ -12,7 +12,7 @@
<object class="GtkWindowHandle"/>
</child>
<child>
<object class="AdwOverlaySplitView" id="resetOverlaySplitView">
<object class="AdwOverlaySplitView" id="reset_overlay_split_view">
<property name="content">
<object class="GtkBox">
<property name="margin-end">5</property>
@ -25,7 +25,7 @@
<object class="GtkBox">
<property name="valign">start</property>
<child>
<object class="GtkButton" id="resetSideBarToggle">
<object class="GtkButton" id="reset_sidebar_toggle">
<property name="icon-name">sidebar-show-symbolic</property>
<property name="visible">False</property>
</object>
@ -39,24 +39,24 @@
<property name="hexpand-set">True</property>
<property name="icon-name">open-menu-symbolic</property>
<property name="popover">
<object class="GtkPopoverMenu" id="resetPopoverMenu">
<object class="GtkPopoverMenu" id="reset_popover_menu">
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkButton" id="resetShortcutsButton">
<object class="GtkButton" id="reset_shortcuts_button">
<property name="has-frame">False</property>
<property name="label">Shortcuts</property>
</object>
</child>
<child>
<object class="GtkButton" id="resetPreferenceButton">
<object class="GtkButton" id="reset_preference_button">
<property name="has-frame">False</property>
<property name="label">Preferences</property>
</object>
</child>
<child>
<object class="GtkButton" id="resetAboutButton">
<object class="GtkButton" id="reset_about_button">
<property name="has-frame">False</property>
<property name="label">About</property>
</object>
@ -70,7 +70,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetClose">
<object class="GtkButton" id="reset_close">
<property name="css-classes">resetClose</property>
<property name="halign">start</property>
<property name="has-frame">False</property>
@ -88,7 +88,7 @@
<child>
<object class="GtkViewport">
<child>
<object class="GtkFlowBox" id="resetMain">
<object class="GtkFlowBox" id="reset_main">
<property name="column-spacing">25</property>
<property name="halign">center</property>
<property name="hexpand">True</property>
@ -117,7 +117,7 @@
<object class="GtkWindowHandle">
<property name="valign">start</property>
<child>
<object class="GtkSearchEntry" id="resetSearchEntry">
<object class="GtkSearchEntry" id="reset_search_entry">
<property name="placeholder-text">Search</property>
<property name="valign">start</property>
</object>
@ -131,7 +131,7 @@
<child>
<object class="GtkViewport">
<child>
<object class="GtkListBox" id="resetSidebarList">
<object class="GtkListBox" id="reset_sidebar_list">
<property name="css-name">resetList</property>
<property name="width-request">150</property>
<style>
@ -150,7 +150,7 @@
</child>
<!-- Custom fragments -->
<child>
<object id="resetSidebarBreakpoint" class="AdwBreakpoint">
<object id="reset_sidebar_breakpoint" class="AdwBreakpoint">
</object>
</child>
</template>

View file

@ -10,7 +10,7 @@
</object>
</child>
<child>
<object class="AdwComboRow" id="resetSourceSelection">
<object class="AdwComboRow" id="reset_source_selection">
<property name="css-classes">audioRow</property>
<property name="title">asadf</property>
<property name="use-subtitle">True</property>
@ -26,14 +26,14 @@
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<child>
<object class="GtkButton" id="resetSourceMute">
<object class="GtkButton" id="reset_source_mute">
<property name="icon-name">audio-input-microphone-symbolic</property>
<property name="margin-end">5</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkScale" id="resetVolumeSlider">
<object class="GtkScale" id="reset_volume_slider">
<property name="adjustment">
<object class="GtkAdjustment">
<property name="page-increment">2005.4016</property>
@ -50,7 +50,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetVolumePercentage">
<object class="GtkLabel" id="reset_volume_percentage">
<property name="label">100%</property>
<property name="lines">1</property>
<property name="width-request">40</property>
@ -59,7 +59,7 @@
</object>
</child>
<child>
<object class="GtkProgressBar" id="resetVolumeMeter">
<object class="GtkProgressBar" id="reset_volume_meter">
<property name="margin-top">5</property>
</object>
</child>

View file

@ -8,14 +8,14 @@
<property name="homogeneous">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="resetPopupLabel">
<object class="GtkLabel" id="reset_popup_label">
<property name="visible">False</property>
</object>
</child>
<child>
<object class="GtkBox">
<child>
<object class="GtkPasswordEntry" id="resetPopupEntry">
<object class="GtkPasswordEntry" id="reset_popup_entry">
<property name="activates-default">True</property>
<property name="margin-bottom">5</property>
<property name="margin-end">5</property>
@ -26,7 +26,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetPopupButton">
<object class="GtkButton" id="reset_popup_button">
<property name="label">connect</property>
<property name="margin-bottom">5</property>
<property name="margin-end">5</property>

View file

@ -8,7 +8,7 @@
<property name="child">
<object class="GtkBox">
<child>
<object class="GtkLabel" id="resetSavedWifiLabel">
<object class="GtkLabel" id="reset_saved_wifi_label">
<property name="ellipsize">end</property>
<property name="hexpand">True</property>
<property name="label">LoremIpsumInternet</property>
@ -19,7 +19,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetEditSavedWifiButton">
<object class="GtkButton" id="reset_edit_saved_wifi_button">
<property name="halign">end</property>
<property name="has-frame">False</property>
<property name="hexpand">True</property>
@ -27,7 +27,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetDeleteSavedWifiButton">
<object class="GtkButton" id="reset_delete_saved_wifi_button">
<property name="halign">start</property>
<property name="has-frame">False</property>
<property name="icon-name">user-trash-symbolic</property>

View file

@ -9,12 +9,12 @@
<property name="margin-start">10</property>
<property name="margin-top">10</property>
<child>
<object class="GtkImage" id="resetSidebarImage">
<object class="GtkImage" id="reset_sidebar_image">
<property name="margin-end">10</property>
</object>
</child>
<child>
<object class="GtkLabel" id="resetSidebarLabel"/>
<object class="GtkLabel" id="reset_sidebar_label"/>
</child>
</object>
</property>

View file

@ -5,12 +5,12 @@
<requires lib="libadwaita" version="1.3"/>
<template class="resetSinkEntry" parent="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetSinkName">
<object class="AdwActionRow" id="reset_sink_name">
<property name="css-classes">audioRow</property>
<property name="title">aaaaaaaaaaaaaaa</property>
<property name="title-lines">3</property>
<child>
<object class="GtkCheckButton" id="resetSelectedSink">
<object class="GtkCheckButton" id="reset_selected_sink">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="hexpand-set">True</property>
@ -28,14 +28,14 @@
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<child>
<object class="GtkButton" id="resetSinkMute">
<object class="GtkButton" id="reset_sink_mute">
<property name="icon-name">audio-input-microphone-symbolic</property>
<property name="margin-end">5</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkScale" id="resetVolumeSlider">
<object class="GtkScale" id="reset_volume_slider">
<property name="adjustment">
<object class="GtkAdjustment">
<property name="page-increment">2005.4016</property>
@ -52,7 +52,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetVolumePercentage">
<object class="GtkLabel" id="reset_volume_percentage">
<property name="label">100%</property>
<property name="lines">1</property>
<property name="width-request">40</property>
@ -61,7 +61,7 @@
</object>
</child>
<child>
<object class="GtkProgressBar" id="resetVolumeMeter">
<object class="GtkProgressBar" id="reset_volume_meter">
<property name="margin-top">5</property>
</object>
</child>

View file

@ -5,12 +5,12 @@
<requires lib="libadwaita" version="1.3"/>
<template class="resetSourceEntry" parent="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetSourceName">
<object class="AdwActionRow" id="reset_source_name">
<property name="css-classes">audioRow</property>
<property name="title">text</property>
<property name="title-lines">3</property>
<child>
<object class="GtkCheckButton" id="resetSelectedSource">
<object class="GtkCheckButton" id="reset_selected_source">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="hexpand-set">True</property>
@ -28,14 +28,14 @@
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<child>
<object class="GtkButton" id="resetSourceMute">
<object class="GtkButton" id="reset_source_mute">
<property name="icon-name">audio-input-microphone-symbolic</property>
<property name="margin-end">5</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkScale" id="resetVolumeSlider">
<object class="GtkScale" id="reset_volume_slider">
<property name="adjustment">
<object class="GtkAdjustment">
<property name="page-increment">2005.4016</property>
@ -52,7 +52,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetVolumePercentage">
<object class="GtkLabel" id="reset_volume_percentage">
<property name="label">100%</property>
<property name="lines">1</property>
<property name="width-request">40</property>
@ -61,7 +61,7 @@
</object>
</child>
<child>
<object class="GtkProgressBar" id="resetVolumeMeter">
<object class="GtkProgressBar" id="reset_volume_meter">
<property name="margin-top">5</property>
</object>
</child>

View file

@ -29,70 +29,70 @@
(21,"libadwaita","1.4",None)
</ui_library>
<object>
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," &lt;child&gt;\n &lt;object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\"&gt;\n &lt;/object&gt;\n &lt;/child&gt;"),
(3,2,"AdwOverlaySplitView","resetOverlaySplitView",1,None,None,None,2,""),
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," &lt;child&gt;\n &lt;object id=\"reset_sidebar_breakpoint\" class=\"AdwBreakpoint\"&gt;\n &lt;/object&gt;\n &lt;/child&gt;"),
(3,2,"AdwOverlaySplitView","reset_overlay_split_view",1,None,None,None,2,""),
(3,3,"GtkBox",None,2,None,None,None,None,None),
(3,17,"GtkWindowHandle",None,1,None,None,None,1,None),
(3,18,"GtkBox",None,2,None,None,None,-1,None),
(3,19,"GtkWindowHandle",None,18,None,None,None,None,None),
(3,20,"GtkSearchEntry","resetSearchEntry",19,None,None,None,None,None),
(3,20,"GtkSearchEntry","reset_search_entry",19,None,None,None,None,None),
(3,24,"GtkWindowHandle",None,3,None,None,None,None,None),
(3,25,"GtkBox",None,24,None,None,None,None,None),
(3,26,"GtkButton","resetSideBarToggle",25,None,None,None,None,None),
(3,31,"GtkButton","resetClose",25,None,None,None,2,None),
(3,26,"GtkButton","reset_sidebar_toggle",25,None,None,None,None,None),
(3,31,"GtkButton","reset_close",25,None,None,None,2,None),
(3,33,"GtkMenuButton",None,25,None,None,None,1,None),
(3,35,"GtkPopoverMenu","resetPopoverMenu",33,None,None,None,-1,None),
(3,35,"GtkPopoverMenu","reset_popover_menu",33,None,None,None,-1,None),
(3,36,"GtkBox",None,35,None,None,None,-1,None),
(3,38,"GtkButton","resetPreferenceButton",36,None,None,None,1,None),
(3,39,"GtkButton","resetAboutButton",36,None,None,None,2,None),
(3,38,"GtkButton","reset_preference_button",36,None,None,None,1,None),
(3,39,"GtkButton","reset_about_button",36,None,None,None,2,None),
(3,40,"GtkScrolledWindow",None,18,None,None,None,1,None),
(3,41,"GtkViewport",None,40,None,None,None,None,None),
(3,42,"GtkListBox","resetSidebarList",41,None,None,None,None,None),
(3,42,"GtkListBox","reset_sidebar_list",41,None,None,None,None,None),
(3,43,"GtkScrolledWindow",None,3,None,None,None,1,None),
(3,44,"GtkViewport",None,43,None,None,None,None,None),
(3,45,"GtkFlowBox","resetMain",44,None,None,None,None,None),
(3,51,"GtkButton","resetShortcutsButton",36,None,None,None,None,None),
(3,45,"GtkFlowBox","reset_main",44,None,None,None,None,None),
(3,51,"GtkButton","reset_shortcuts_button",36,None,None,None,None,None),
(4,7,"GtkBox","resetWifi",None,None,None,None,None,None),
(4,152,"AdwNavigationView","resetWifiNavigation",7,None,None,None,1,None),
(4,152,"AdwNavigationView","reset_wifi_navigation",7,None,None,None,1,None),
(4,153,"AdwNavigationPage",None,152,None,None,None,None,None),
(4,154,"GtkBox",None,153,None,None,None,1,None),
(4,174,"AdwNavigationPage",None,152,None,None,None,2,None),
(4,175,"GtkBox",None,174,None,None,None,None,None),
(4,182,"GtkBox",None,7,None,None,None,None,None),
(4,183,"GtkLabel",None,182,None,None,None,None,None),
(4,184,"GtkSwitch","resetWifiSwitch",182,None,None,None,1,None),
(4,199,"AdwPreferencesGroup","resetWifiDetails",154,None,None,None,None,None),
(4,200,"AdwComboRow","resetWiFiDevice",199,None,None,None,-1,None),
(4,201,"AdwActionRow","resetSavedNetworks",199,None,None,None,-1,None),
(4,184,"GtkSwitch","reset_wifi_switch",182,None,None,None,1,None),
(4,199,"AdwPreferencesGroup","reset_wifi_details",154,None,None,None,None,None),
(4,200,"AdwComboRow","reset_wifi_device",199,None,None,None,-1,None),
(4,201,"AdwActionRow","reset_saved_networks",199,None,None,None,-1,None),
(4,202,"GtkImage",None,201,None,None,None,None,None),
(4,204,"AdwPreferencesGroup","resetStoredWifiList",175,None,None,None,2,None),
(4,204,"AdwPreferencesGroup","reset_stored_wifi_list",175,None,None,None,2,None),
(4,205,"AdwPreferencesGroup",None,175,None,None,None,None,None),
(4,206,"AdwActionRow","resetAvailableNetworks",205,None,None,None,-1,None),
(4,206,"AdwActionRow","reset_available_networks",205,None,None,None,-1,None),
(4,207,"GtkImage",None,206,None,None,None,None,None),
(4,208,"AdwPreferencesGroup","resetWifiList",154,None,None,None,1,None),
(4,208,"AdwPreferencesGroup","reset_wifi_list",154,None,None,None,1,None),
(5,12,"AdwActionRow","resetWifiEntry",None,None,None,None,-1,None),
(5,13,"GtkBox",None,12,None,None,None,None,None),
(5,14,"GtkBox",None,13,None,None,None,None,None),
(5,15,"GtkImage","resetWifiStrength",14,None,None,None,None,None),
(5,16,"GtkImage","resetWifiEncrypted",14,None,None,None,1,None),
(5,18,"GtkLabel","resetWifiLabel",13,None,None,None,1,None),
(5,20,"GtkButton","resetWifiEditButton",13,None,None,None,3,None),
(5,21,"resetPopup","resetWifiPopup",13,None,None,None,4,None),
(5,22,"GtkLabel","resetWifiConnected",13,None,None,None,2,None),
(5,15,"GtkImage","reset_wifi_strength",14,None,None,None,None,None),
(5,16,"GtkImage","reset_wifi_encrypted",14,None,None,None,1,None),
(5,18,"GtkLabel","reset_wifi_label",13,None,None,None,1,None),
(5,20,"GtkButton","reset_wifi_edit_button",13,None,None,None,3,None),
(5,21,"resetPopup","reset_wifi_popup",13,None,None,None,4,None),
(5,22,"GtkLabel","reset_wifi_connected",13,None,None,None,2,None),
(6,1,"GtkListBoxRow","resetSidebarEntry",None,None,None,None,None,None),
(6,2,"GtkBox",None,1,None,None,None,-1,None),
(6,6,"GtkImage","resetSidebarImage",2,None,None,None,None,None),
(6,7,"GtkLabel","resetSidebarLabel",2,None,None,None,1,None),
(6,6,"GtkImage","reset_sidebar_image",2,None,None,None,None,None),
(6,7,"GtkLabel","reset_sidebar_label",2,None,None,None,1,None),
(7,14,"AdwPreferencesGroup","resetInputStreamEntry",None,None,None,None,None,None),
(7,15,"AdwComboRow","resetSinkSelection",14,None,None,None,None,None),
(7,15,"AdwComboRow","reset_sink_selection",14,None,None,None,None,None),
(7,16,"AdwActionRow",None,14,None,None,None,1,None),
(7,17,"GtkBox",None,16,None,None,None,None,None),
(7,18,"GtkBox",None,17,None,None,None,None,None),
(7,19,"GtkButton","resetSinkMute",18,None,None,None,None,None),
(7,20,"GtkScale","resetVolumeSlider",18,None,None,None,1,None),
(7,19,"GtkButton","reset_sink_mute",18,None,None,None,None,None),
(7,20,"GtkScale","reset_volume_slider",18,None,None,None,1,None),
(7,21,"GtkAdjustment",None,20,None,None,None,None,None),
(7,22,"GtkLabel","resetVolumePercentage",18,None,None,None,2,None),
(7,23,"GtkProgressBar","resetVolumeMeter",17,None,None,None,1,None),
(7,22,"GtkLabel","reset_volume_percentage",18,None,None,None,2,None),
(7,23,"GtkProgressBar","reset_volume_meter",17,None,None,None,1,None),
(7,24,"GtkSeparator",None,14,None,None,None,-1,None),
(8,1,"GtkBox","resetAudioOutput",None,None,None,None,None,None),
(8,53,"GtkLabel",None,1,None,None,None,None,None),
@ -102,34 +102,34 @@
(8,71,"AdwNavigationPage",None,54,None,None,None,1,None),
(8,72,"GtkBox",None,71,None,None,None,None,None),
(8,81,"GtkLabel",None,72,None,None,None,2,None),
(8,85,"GtkBox","resetInputStreams",56,None,None,None,4,None),
(8,85,"GtkBox","reset_input_streams",56,None,None,None,4,None),
(8,86,"GtkLabel",None,85,None,None,None,None,None),
(8,89,"GtkBox","resetSinks",72,None,None,None,3,None),
(8,89,"GtkBox","reset_sinks",72,None,None,None,3,None),
(8,90,"GtkLabel",None,89,None,None,None,None,None),
(8,93,"GtkBox",None,56,None,None,None,2,None),
(8,97,"GtkBox",None,93,None,None,None,None,None),
(8,98,"GtkButton","resetSinkMute",97,None,None,None,None,None),
(8,99,"GtkScale","resetVolumeSlider",97,None,None,None,1,None),
(8,101,"GtkLabel","resetVolumePercentage",97,None,None,None,2,None),
(8,102,"GtkProgressBar","resetVolumeMeter",93,None,None,None,1,None),
(8,98,"GtkButton","reset_sink_mute",97,None,None,None,None,None),
(8,99,"GtkScale","reset_volume_slider",97,None,None,None,1,None),
(8,101,"GtkLabel","reset_volume_percentage",97,None,None,None,2,None),
(8,102,"GtkProgressBar","reset_volume_meter",93,None,None,None,1,None),
(8,103,"GtkSeparator",None,56,None,None,None,3,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,123,"GtkLabel",None,117,None,None,None,2,None),
(8,130,"AdwPreferencesGroup",None,56,None,None,None,None,None),
(8,132,"AdwActionRow","resetSinksRow",130,None,None,None,1,None),
(8,132,"AdwActionRow","reset_sinks_row",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,134,"AdwActionRow","reset_cards_row",130,None,None,None,2,None),
(8,135,"GtkImage",None,134,None,None,None,None,None),
(8,137,"AdwComboRow","resetSinkDropdown",130,None,None,None,2,None),
(8,137,"AdwComboRow","reset_sink_dropdown",130,None,None,None,2,None),
(8,138,"AdwPreferencesGroup",None,72,None,None,None,None,None),
(8,139,"AdwActionRow","resetInputStreamButton",138,None,None,None,None,None),
(8,139,"AdwActionRow","reset_input_stream_button",138,None,None,None,None,None),
(8,140,"GtkImage",None,139,None,None,None,None,None),
(8,141,"AdwPreferencesGroup",None,117,None,None,None,None,None),
(8,142,"AdwActionRow","resetInputCardsBackButton",141,None,None,None,None,None),
(8,142,"AdwActionRow","reset_input_cards_back_button",141,None,None,None,None,None),
(8,143,"GtkImage",None,142,None,None,None,None,None),
(8,144,"AdwPreferencesGroup","resetCards",117,None,None,None,2,None),
(8,144,"AdwPreferencesGroup","reset_cards",117,None,None,None,2,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),
@ -137,33 +137,33 @@
(10,138,"AdwNavigationPage",None,119,None,None,None,1,None),
(10,142,"GtkBox",None,1,None,None,None,None,None),
(10,143,"GtkLabel",None,142,None,None,None,None,None),
(10,144,"GtkSwitch","resetBluetoothSwitch",142,None,None,None,1,None),
(10,144,"GtkSwitch","reset_bluetooth_switch",142,None,None,None,1,None),
(10,153,"GtkBox",None,138,None,None,None,None,None),
(10,154,"GtkListBox",None,153,None,None,None,None,None),
(10,155,"resetListBoxRow","resetBluetoothMainTab",154,None,None,None,None,None),
(10,155,"resetListBoxRow","reset_bluetooth_main_tab",154,None,None,None,None,None),
(10,156,"GtkBox",None,155,None,None,None,None,None),
(10,157,"GtkLabel",None,156,None,None,None,None,None),
(10,158,"GtkImage",None,156,None,None,None,1,None),
(10,159,"GtkLabel",None,153,None,None,None,1,None),
(10,172,"AdwPreferencesGroup","resetBluetoothDetails",121,None,None,None,None,None),
(10,173,"AdwComboRow","resetBluetoothAdapter",172,None,None,None,None,None),
(10,174,"AdwActionRow","resetVisibility",172,None,None,None,1,None),
(10,172,"AdwPreferencesGroup","reset_bluetooth_details",121,None,None,None,None,None),
(10,173,"AdwComboRow","reset_bluetooth_adapter",172,None,None,None,None,None),
(10,174,"AdwActionRow","reset_visibility",172,None,None,None,1,None),
(10,175,"GtkImage",None,174,None,None,None,None,None),
(10,176,"AdwPreferencesGroup",None,121,None,None,None,1,None),
(10,177,"GtkButton","resetBluetoothRefreshButton",176,None,None,None,None,None),
(10,177,"GtkButton","reset_bluetooth_refresh_button",176,None,None,None,None,None),
(10,178,"GtkScrolledWindow",None,176,None,None,None,None,None),
(10,179,"GtkViewport",None,178,None,None,None,None,None),
(10,180,"GtkBox","resetBluetoothAvailableDevices",179,None,None,None,None,None),
(10,180,"GtkBox","reset_bluetooth_available_devices",179,None,None,None,None,None),
(10,181,"AdwPreferencesGroup",None,121,None,None,None,2,None),
(10,183,"GtkScrolledWindow",None,181,None,None,None,None,None),
(10,184,"GtkViewport",None,183,None,None,None,None,None),
(10,185,"GtkBox","resetBluetoothConnectedDevices",184,None,None,None,None,None),
(10,185,"GtkBox","reset_bluetooth_connected_devices",184,None,None,None,None,None),
(11,2,"GtkBox","resetBluetoothEntry",None,None,None,None,None,None),
(11,3,"GtkImage","resetBluetoothDeviceType",2,None,None,None,None,None),
(11,5,"GtkButton","resetBluetoothButton",2,None,None,None,3,None),
(11,3,"GtkImage","reset_bluetooth_device_type",2,None,None,None,None,None),
(11,5,"GtkButton","reset_bluetooth_button",2,None,None,None,3,None),
(11,6,"GtkBox",None,2,None,None,None,2,None),
(11,7,"GtkLabel","resetBluetoothLabel",6,None,None,None,None,None),
(11,8,"GtkLabel","resetBluetoothAddress",6,None,None,None,1,None),
(11,7,"GtkLabel","reset_bluetooth_label",6,None,None,None,None,None),
(11,8,"GtkLabel","reset_bluetooth_address",6,None,None,None,1,None),
(12,11,"GtkBox","resetAudioInput",None,None,None,None,None,None),
(12,12,"GtkLabel",None,11,None,None,None,None,None),
(12,13,"AdwNavigationView",None,11,None,None,None,1,None),
@ -171,149 +171,149 @@
(12,15,"GtkBox",None,14,None,None,None,None,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,24,"GtkButton","reset_source_mute",23,None,None,None,None,None),
(12,25,"GtkScale","reset_volume_slider",23,None,None,None,1,None),
(12,27,"GtkLabel","reset_volume_percentage",23,None,None,None,2,None),
(12,28,"GtkProgressBar","reset_volume_meter",22,None,None,None,1,None),
(12,29,"GtkSeparator",None,15,None,None,None,3,None),
(12,30,"GtkBox","resetOutputStreams",15,None,None,None,4,None),
(12,30,"GtkBox","reset_output_streams",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,1,None),
(12,49,"GtkBox","resetSources",42,None,None,None,2,None),
(12,49,"GtkBox","reset_sources",42,None,None,None,2,None),
(12,50,"GtkLabel",None,49,None,None,None,None,None),
(12,51,"GtkAdjustment",None,25,None,None,None,-1,None),
(12,52,"AdwNavigationPage",None,13,None,None,None,2,None),
(12,53,"GtkBox",None,52,None,None,None,None,None),
(12,59,"GtkLabel",None,53,None,None,None,2,None),
(12,66,"AdwPreferencesGroup","resetCards",53,None,None,None,3,None),
(12,66,"AdwPreferencesGroup","reset_cards",53,None,None,None,3,None),
(12,67,"AdwPreferencesGroup",None,15,None,None,None,None,None),
(12,69,"AdwActionRow","resetSourceRow",67,None,None,None,-1,None),
(12,70,"AdwActionRow","resetCardsRow",67,None,None,None,2,None),
(12,69,"AdwActionRow","reset_source_row",67,None,None,None,-1,None),
(12,70,"AdwActionRow","reset_cards_row",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),
(12,73,"AdwComboRow","resetSourceDropdown",67,None,None,None,2,None),
(12,73,"AdwComboRow","reset_source_dropdown",67,None,None,None,2,None),
(12,74,"AdwPreferencesGroup",None,42,None,None,None,None,None),
(12,75,"AdwActionRow","resetOutputStreamButton",74,None,None,None,None,None),
(12,75,"AdwActionRow","reset_output_stream_button",74,None,None,None,None,None),
(12,76,"GtkImage",None,75,None,None,None,None,None),
(12,77,"AdwPreferencesGroup",None,53,None,None,None,None,None),
(12,78,"AdwActionRow","resetInputCardsBackButton",77,None,None,None,None,None),
(12,78,"AdwActionRow","reset_input_cards_back_button",77,None,None,None,None,None),
(12,79,"GtkImage",None,78,None,None,None,None,None),
(13,22,"AdwPreferencesGroup","resetOutputStreamEntry",None,None,None,None,None,None),
(13,23,"AdwComboRow","resetSourceSelection",22,None,None,None,None,None),
(13,23,"AdwComboRow","reset_source_selection",22,None,None,None,None,None),
(13,26,"AdwActionRow",None,22,None,None,None,1,None),
(13,27,"GtkBox",None,26,None,None,None,None,None),
(13,36,"GtkBox",None,27,None,None,None,None,None),
(13,37,"GtkButton","resetSourceMute",36,None,None,None,None,None),
(13,38,"GtkScale","resetVolumeSlider",36,None,None,None,1,None),
(13,37,"GtkButton","reset_source_mute",36,None,None,None,None,None),
(13,38,"GtkScale","reset_volume_slider",36,None,None,None,1,None),
(13,39,"GtkAdjustment",None,38,None,None,None,None,None),
(13,40,"GtkLabel","resetVolumePercentage",36,None,None,None,2,None),
(13,41,"GtkProgressBar","resetVolumeMeter",27,None,None,None,1,None),
(13,40,"GtkLabel","reset_volume_percentage",36,None,None,None,2,None),
(13,41,"GtkProgressBar","reset_volume_meter",27,None,None,None,1,None),
(13,42,"GtkSeparator",None,22,None,None,None,-1,None),
(14,3,"GtkBox","resetSettingBox",None,None,None,None,-1,None),
(15,1,"GtkListBoxRow","resetListBoxRow",None,None,None,None,None,None),
(16,6,"GtkPopover","resetPopup",None,None,None,None,-1,None),
(16,7,"GtkBox",None,6,None,None,None,None,None),
(16,10,"GtkBox",None,7,None,None,None,1,None),
(16,11,"GtkPasswordEntry","resetPopupEntry",10,None,None,None,None,None),
(16,12,"GtkButton","resetPopupButton",10,None,None,None,1,None),
(16,13,"GtkLabel","resetPopupLabel",7,None,None,None,None,None),
(16,11,"GtkPasswordEntry","reset_popup_entry",10,None,None,None,None,None),
(16,12,"GtkButton","reset_popup_button",10,None,None,None,1,None),
(16,13,"GtkLabel","reset_popup_label",7,None,None,None,None,None),
(17,5,"AdwActionRow","resetSavedWifiEntry",None,None,None,None,None,None),
(17,7,"GtkBox",None,5,None,None,None,None,None),
(17,11,"GtkLabel","resetSavedWifiLabel",7,None,None,None,None,None),
(17,12,"GtkButton","resetDeleteSavedWifiButton",7,None,None,None,2,None),
(17,14,"GtkButton","resetEditSavedWifiButton",7,None,None,None,1,None),
(17,11,"GtkLabel","reset_saved_wifi_label",7,None,None,None,None,None),
(17,12,"GtkButton","reset_delete_saved_wifi_button",7,None,None,None,2,None),
(17,14,"GtkButton","reset_edit_saved_wifi_button",7,None,None,None,1,None),
(18,13,"AdwPreferencesGroup","resetSinkEntry",None,None,None,None,None,None),
(18,14,"AdwActionRow","resetSinkName",13,None,None,None,None,None),
(18,15,"GtkCheckButton","resetSelectedSink",14,None,None,None,None,None),
(18,14,"AdwActionRow","reset_sink_name",13,None,None,None,None,None),
(18,15,"GtkCheckButton","reset_selected_sink",14,None,None,None,None,None),
(18,16,"AdwActionRow",None,13,None,None,None,1,None),
(18,17,"GtkBox",None,16,None,None,None,None,None),
(18,18,"GtkBox",None,17,None,None,None,None,None),
(18,19,"GtkButton","resetSinkMute",18,None,None,None,None,None),
(18,20,"GtkScale","resetVolumeSlider",18,None,None,None,1,None),
(18,19,"GtkButton","reset_sink_mute",18,None,None,None,None,None),
(18,20,"GtkScale","reset_volume_slider",18,None,None,None,1,None),
(18,21,"GtkAdjustment",None,20,None,None,None,None,None),
(18,22,"GtkLabel","resetVolumePercentage",18,None,None,None,2,None),
(18,23,"GtkProgressBar","resetVolumeMeter",17,None,None,None,1,None),
(18,22,"GtkLabel","reset_volume_percentage",18,None,None,None,2,None),
(18,23,"GtkProgressBar","reset_volume_meter",17,None,None,None,1,None),
(18,24,"GtkSeparator",None,13,None,None,None,2,None),
(19,13,"AdwPreferencesGroup","resetSourceEntry",None,None,None,None,None,None),
(19,14,"AdwActionRow","resetSourceName",13,None,None,None,None,None),
(19,15,"GtkCheckButton","resetSelectedSource",14,None,None,None,None,None),
(19,14,"AdwActionRow","reset_source_name",13,None,None,None,None,None),
(19,15,"GtkCheckButton","reset_selected_source",14,None,None,None,None,None),
(19,16,"AdwActionRow",None,13,None,None,None,1,None),
(19,17,"GtkBox",None,16,None,None,None,None,None),
(19,18,"GtkBox",None,17,None,None,None,None,None),
(19,19,"GtkButton","resetSourceMute",18,None,None,None,None,None),
(19,20,"GtkScale","resetVolumeSlider",18,None,None,None,1,None),
(19,19,"GtkButton","reset_source_mute",18,None,None,None,None,None),
(19,20,"GtkScale","reset_volume_slider",18,None,None,None,1,None),
(19,21,"GtkAdjustment",None,20,None,None,None,None,None),
(19,22,"GtkLabel","resetVolumePercentage",18,None,None,None,2,None),
(19,23,"GtkProgressBar","resetVolumeMeter",17,None,None,None,1,None),
(19,22,"GtkLabel","reset_volume_percentage",18,None,None,None,2,None),
(19,23,"GtkProgressBar","reset_volume_meter",17,None,None,None,1,None),
(19,24,"GtkSeparator",None,13,None,None,None,2,None),
(20,2,"AdwComboRow","resetCardEntry",None,None,None,None,None,None),
(20,2,"AdwComboRow","reset_card_entry",None,None,None,None,None,None),
(21,1,"AdwNavigationPage","resetWifiOptions",None,None,None,None,-1,None),
(21,52,"GtkBox",None,1,None,None,None,-1,None),
(21,53,"GtkNotebook",None,52,None,None,None,None,None),
(21,54,"GtkBox",None,53,None,None,None,None,None),
(21,55,"AdwPreferencesGroup",None,54,None,None,None,None,None),
(21,56,"AdwActionRow","resetWifiName",55,None,None,None,None,None),
(21,57,"AdwActionRow","resetWifiMac",55,None,None,None,1,None),
(21,58,"AdwActionRow","resetWifiLinkSpeed",55,None,None,None,2,None),
(21,59,"AdwActionRow","resetWifiIP4Addr",55,None,None,None,3,None),
(21,60,"AdwActionRow","resetWifiIP6Addr",55,None,None,None,4,None),
(21,61,"AdwActionRow","resetWifiGateway",55,None,None,None,5,None),
(21,62,"AdwActionRow","resetWifiDNS",55,None,None,None,6,None),
(21,63,"AdwActionRow","resetWifiLastUsed",55,None,None,None,7,None),
(21,64,"AdwSwitchRow","resetWifiAutoConnect",55,None,None,None,8,None),
(21,65,"AdwSwitchRow","resetWifiMetered",55,None,None,None,9,None),
(21,56,"AdwActionRow","reset_wifi_name",55,None,None,None,None,None),
(21,57,"AdwActionRow","reset_wifi_mac",55,None,None,None,1,None),
(21,58,"AdwActionRow","reset_wifi_link_speed",55,None,None,None,2,None),
(21,59,"AdwActionRow","reset_wifi_ip4_addr",55,None,None,None,3,None),
(21,60,"AdwActionRow","reset_wifi_ip6_addr",55,None,None,None,4,None),
(21,61,"AdwActionRow","reset_wifi_gateway",55,None,None,None,5,None),
(21,62,"AdwActionRow","reset_wifi_dns",55,None,None,None,6,None),
(21,63,"AdwActionRow","reset_wifi_last_used",55,None,None,None,7,None),
(21,64,"AdwSwitchRow","reset_wifi_auto_connect",55,None,None,None,8,None),
(21,65,"AdwSwitchRow","reset_wifi_metered",55,None,None,None,9,None),
(21,66,"GtkLabel",None,53,None,"tab",None,1,None),
(21,67,"GtkBox",None,53,None,None,None,2,None),
(21,68,"AdwPreferencesGroup",None,67,None,None,None,None,None),
(21,69,"AdwComboRow","resetIP4Method",68,None,None,None,None,None),
(21,69,"AdwComboRow","reset_ip4_method",68,None,None,None,None,None),
(21,70,"GtkStringList",None,69,None,None,None,None,None),
(21,71,"AdwEntryRow","resetIP4DNS",68,None,None,None,1,None),
(21,72,"AdwEntryRow","resetIP4Gateway",68,None,None,None,2,None),
(21,73,"AdwPreferencesGroup","resetIP4AddressGroup",67,None,None,None,1,None),
(21,74,"AdwPreferencesGroup","resetIP4RoutesGroup",67,None,None,None,2,None),
(21,71,"AdwEntryRow","reset_ip4_dns",68,None,None,None,1,None),
(21,72,"AdwEntryRow","reset_ip4_gateway",68,None,None,None,2,None),
(21,73,"AdwPreferencesGroup","reset_ip4_address_group",67,None,None,None,1,None),
(21,74,"AdwPreferencesGroup","reset_ip4_routes_group",67,None,None,None,2,None),
(21,75,"GtkBox",None,74,None,None,None,None,None),
(21,76,"GtkLabel",None,75,None,None,None,None,None),
(21,77,"GtkSwitch",None,75,None,None,None,1,None),
(21,78,"GtkLabel",None,53,None,"tab",None,3,None),
(21,79,"GtkBox",None,53,None,None,None,4,None),
(21,80,"AdwPreferencesGroup",None,79,None,None,None,None,None),
(21,81,"AdwComboRow","resetIP6Method",80,None,None,None,None,None),
(21,81,"AdwComboRow","reset_ip6_method",80,None,None,None,None,None),
(21,82,"GtkStringList",None,81,None,None,None,None,None),
(21,83,"AdwEntryRow","resetIP6DNS",80,None,None,None,1,None),
(21,84,"AdwEntryRow","resetIP6Gateway",80,None,None,None,2,None),
(21,85,"AdwPreferencesGroup","resetIP6AddressGroup",79,None,None,None,1,None),
(21,86,"AdwPreferencesGroup","resetIP6RoutesGroup",79,None,None,None,2,None),
(21,83,"AdwEntryRow","reset_ip6_dns",80,None,None,None,1,None),
(21,84,"AdwEntryRow","reset_ip6_gateway",80,None,None,None,2,None),
(21,85,"AdwPreferencesGroup","reset_ip6_address_group",79,None,None,None,1,None),
(21,86,"AdwPreferencesGroup","reset_ip6_routes_group",79,None,None,None,2,None),
(21,87,"GtkBox",None,86,None,None,None,None,None),
(21,88,"GtkLabel",None,87,None,None,None,None,None),
(21,89,"GtkSwitch",None,87,None,None,None,1,None),
(21,90,"GtkLabel",None,53,None,"tab",None,5,None),
(21,91,"GtkBox",None,53,None,None,None,6,None),
(21,92,"AdwPreferencesGroup",None,91,None,None,None,None,None),
(21,93,"AdwComboRow","resetWifiSecurityDropdown",92,None,None,None,None,None),
(21,96,"AdwPasswordEntryRow","resetWifiPassword",92,None,None,None,1,None),
(21,93,"AdwComboRow","reset_wifi_security_dropdown",92,None,None,None,None,None),
(21,96,"AdwPasswordEntryRow","reset_wifi_password",92,None,None,None,1,None),
(21,97,"GtkLabel",None,53,None,"tab",None,7,None),
(21,98,"GtkButton","wifiOptionsApplyButton",52,None,None,None,1,None),
(21,99,"GtkButton","resetIP4AddressAddButton",73,None,None,None,-1,None),
(21,100,"GtkButton","resetIP4RouteAddButton",75,None,None,None,2,None),
(21,101,"GtkButton","resetIP6AddressAddButton",85,None,None,None,-1,None),
(21,102,"GtkButton","resetIP6RouteAddButton",87,None,None,None,2,None),
(21,98,"GtkButton","wifi_options_apply_button",52,None,None,None,1,None),
(21,99,"GtkButton","reset_ip4_address_add_button",73,None,None,None,-1,None),
(21,100,"GtkButton","reset_ip4_route_add_button",75,None,None,None,2,None),
(21,101,"GtkButton","reset_ip6_address_add_button",85,None,None,None,-1,None),
(21,102,"GtkButton","reset_ip6_route_add_button",87,None,None,None,2,None),
(21,103,"GtkStringList",None,93,None,None,None,-1,None),
(22,1,"GtkBox","resetWifiAddressEntry",None,None,None,None,-1,None),
(22,2,"AdwExpanderRow","resetAddressRow",1,None,None,None,-1,None),
(22,5,"GtkButton","resetAddressRemove",1,None,None,None,-1,None),
(22,2,"AdwExpanderRow","reset_address_row",1,None,None,None,-1,None),
(22,5,"GtkButton","reset_address_remove",1,None,None,None,-1,None),
(22,6,"GtkBox",None,2,None,None,None,None,None),
(22,7,"AdwEntryRow","resetAddressAddress",6,None,None,None,None,None),
(22,8,"AdwEntryRow","resetAddressPrefix",6,None,None,None,1,None),
(22,7,"AdwEntryRow","reset_address_address",6,None,None,None,None,None),
(22,8,"AdwEntryRow","reset_address_prefix",6,None,None,None,1,None),
(23,1,"GtkBox","resetWifiRouteEntry",None,None,None,None,None,None),
(23,2,"AdwExpanderRow","resetRouteRow",1,None,None,None,None,None),
(23,5,"GtkButton","resetRouteRemove",1,None,None,None,1,None),
(23,2,"AdwExpanderRow","reset_route_row",1,None,None,None,None,None),
(23,5,"GtkButton","reset_route_remove",1,None,None,None,1,None),
(23,6,"GtkBox",None,2,None,None,None,1,None),
(23,7,"AdwEntryRow","resetRouteGateway",6,None,None,None,None,None),
(23,8,"AdwEntryRow","resetRouteMetric",6,None,None,None,1,None),
(23,7,"AdwEntryRow","reset_route_gateway",6,None,None,None,None,None),
(23,8,"AdwEntryRow","reset_route_metric",6,None,None,None,1,None),
(23,9,"GtkBox",None,2,None,None,None,None,None),
(23,10,"AdwEntryRow","resetRouteAddress",9,None,None,None,None,None),
(23,11,"AdwEntryRow","resetRoutePrefix",9,None,None,None,1,None),
(23,10,"AdwEntryRow","reset_route_address",9,None,None,None,None,None),
(23,11,"AdwEntryRow","reset_route_prefix",9,None,None,None,1,None),
(24,1,"AdwPreferencesGroup",None,None,None,None,None,-1,None),
(24,4,"GtkButton",None,1,None,None,None,-1,None),
(24,5,"GtkScrolledWindow",None,1,None,None,None,None,None),

View file

@ -19,7 +19,7 @@
</object>
</child>
<child>
<object class="GtkSwitch" id="resetWifiSwitch">
<object class="GtkSwitch" id="reset_wifi_switch">
<property name="active">True</property>
<property name="halign">end</property>
<property name="hexpand">True</property>
@ -30,7 +30,7 @@
</object>
</child>
<child>
<object class="AdwNavigationView" id="resetWifiNavigation">
<object class="AdwNavigationView" id="reset_wifi_navigation">
<child>
<object class="AdwNavigationPage">
<property name="tag">main</property>
@ -39,14 +39,14 @@
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="AdwPreferencesGroup" id="resetWifiDetails">
<object class="AdwPreferencesGroup" id="reset_wifi_details">
<child>
<object class="AdwComboRow" id="resetWiFiDevice">
<object class="AdwComboRow" id="reset_wifi_device">
<property name="title">WiFi Device</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetSavedNetworks">
<object class="AdwActionRow" id="reset_saved_networks">
<property name="title">Saved Networks</property>
<child>
<object class="GtkImage">
@ -61,7 +61,7 @@
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetWifiList">
<object class="AdwPreferencesGroup" id="reset_wifi_list">
<property name="margin-top">10</property>
<property name="title">Available networks</property>
</object>
@ -80,7 +80,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetAvailableNetworks">
<object class="AdwActionRow" id="reset_available_networks">
<property name="title">Available Networks</property>
<child>
<object class="GtkImage">
@ -95,7 +95,7 @@
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetStoredWifiList">
<object class="AdwPreferencesGroup" id="reset_stored_wifi_list">
<property name="title">Saved Networks</property>
</object>
</child>

View file

@ -7,19 +7,19 @@
<property name="margin-bottom">2</property>
<property name="margin-top">2</property>
<child>
<object class="AdwExpanderRow" id="resetAddressRow">
<object class="AdwExpanderRow" id="reset_address_row">
<property name="hexpand">True</property>
<property name="title">Add new Address</property>
<child>
<object class="GtkBox">
<child>
<object class="AdwEntryRow" id="resetAddressAddress">
<object class="AdwEntryRow" id="reset_address_address">
<property name="hexpand">True</property>
<property name="title">Address</property>
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetAddressPrefix">
<object class="AdwEntryRow" id="reset_address_prefix">
<property name="max-width-chars">5</property>
<property name="title">Prefix</property>
</object>
@ -29,7 +29,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetAddressRemove">
<object class="GtkButton" id="reset_address_remove">
<property name="height-request">55</property>
<property name="icon-name">edit-delete-symbolic</property>
<property name="valign">start</property>

View file

@ -11,12 +11,12 @@
<object class="GtkBox">
<property name="width-request">35</property>
<child>
<object class="GtkImage" id="resetWifiStrength">
<object class="GtkImage" id="reset_wifi_strength">
<property name="icon-name">network-wireless-signal-excellent-symbolic</property>
</object>
</child>
<child>
<object class="GtkImage" id="resetWifiEncrypted">
<object class="GtkImage" id="reset_wifi_encrypted">
<property name="halign">start</property>
<property name="icon-name">system-lock-screen-symbolic</property>
<property name="margin-bottom">6</property>
@ -27,7 +27,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetWifiLabel">
<object class="GtkLabel" id="reset_wifi_label">
<property name="ellipsize">end</property>
<property name="hexpand">True</property>
<property name="label">LoremIpsumInternet</property>
@ -38,7 +38,7 @@
</object>
</child>
<child>
<object class="GtkLabel" id="resetWifiConnected">
<object class="GtkLabel" id="reset_wifi_connected">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="justify">right</property>
@ -49,7 +49,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetWifiEditButton">
<object class="GtkButton" id="reset_wifi_edit_button">
<property name="halign">start</property>
<property name="has-frame">False</property>
<property name="icon-name">document-edit-symbolic</property>
@ -57,7 +57,7 @@
</object>
</child>
<child>
<object class="resetPopup" id="resetWifiPopup"/>
<object class="resetPopup" id="reset_wifi_popup"/>
</child>
</object>
</property>

View file

@ -18,60 +18,60 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="resetWifiName">
<object class="AdwActionRow" id="reset_wifi_name">
<property name="css-classes">property</property>
<property name="title">WiFi Name</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiMac">
<object class="AdwActionRow" id="reset_wifi_mac">
<property name="css-classes">property</property>
<property name="title">MAC-Address</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiLinkSpeed">
<object class="AdwActionRow" id="reset_wifi_link_speed">
<property name="css-classes">property</property>
<property name="title">Link Speed</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiIP4Addr">
<object class="AdwActionRow" id="reset_wifi_ip4_addr">
<property name="css-classes">property</property>
<property name="title">IPv4 Address</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiIP6Addr">
<object class="AdwActionRow" id="reset_wifi_ip6_addr">
<property name="css-classes">property</property>
<property name="title">IPv6 Address</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiGateway">
<object class="AdwActionRow" id="reset_wifi_gateway">
<property name="css-classes">property</property>
<property name="title">Gateway</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiDNS">
<object class="AdwActionRow" id="reset_wifi_dns">
<property name="css-classes">property</property>
<property name="title">DNS</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="resetWifiLastUsed">
<object class="AdwActionRow" id="reset_wifi_last_used">
<property name="css-classes">property</property>
<property name="title">Last Used</property>
</object>
</child>
<child>
<object class="AdwSwitchRow" id="resetWifiAutoConnect">
<object class="AdwSwitchRow" id="reset_wifi_auto_connect">
<property name="title">Connect automatically</property>
</object>
</child>
<child>
<object class="AdwSwitchRow" id="resetWifiMetered">
<object class="AdwSwitchRow" id="reset_wifi_metered">
<property name="title">Metered Connection</property>
</object>
</child>
@ -91,7 +91,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwComboRow" id="resetIP4Method">
<object class="AdwComboRow" id="reset_ip4_method">
<property name="model">
<object class="GtkStringList">
<items>
@ -107,21 +107,21 @@
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetIP4DNS">
<object class="AdwEntryRow" id="reset_ip4_dns">
<property name="title">DNS (separate IP by comma, empty for automatic)</property>
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetIP4Gateway">
<object class="AdwEntryRow" id="reset_ip4_gateway">
<property name="title">Gateway</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetIP4AddressGroup">
<object class="AdwPreferencesGroup" id="reset_ip4_address_group">
<property name="header-suffix">
<object class="GtkButton" id="resetIP4AddressAddButton">
<object class="GtkButton" id="reset_ip4_address_add_button">
<property name="icon-name">list-add-symbolic</property>
</object>
</property>
@ -130,7 +130,7 @@
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetIP4RoutesGroup">
<object class="AdwPreferencesGroup" id="reset_ip4_routes_group">
<property name="header-suffix">
<object class="GtkBox">
<child>
@ -145,7 +145,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetIP4RouteAddButton">
<object class="GtkButton" id="reset_ip4_route_add_button">
<property name="icon-name">list-add-symbolic</property>
<property name="margin-start">10</property>
</object>
@ -170,7 +170,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwComboRow" id="resetIP6Method">
<object class="AdwComboRow" id="reset_ip6_method">
<property name="model">
<object class="GtkStringList">
<items>
@ -187,21 +187,21 @@
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetIP6DNS">
<object class="AdwEntryRow" id="reset_ip6_dns">
<property name="title">DNS (separate IP by comma, empty for automatic)</property>
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetIP6Gateway">
<object class="AdwEntryRow" id="reset_ip6_gateway">
<property name="title">Gateway</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetIP6AddressGroup">
<object class="AdwPreferencesGroup" id="reset_ip6_address_group">
<property name="header-suffix">
<object class="GtkButton" id="resetIP6AddressAddButton">
<object class="GtkButton" id="reset_ip6_address_add_button">
<property name="icon-name">list-add-symbolic</property>
</object>
</property>
@ -210,7 +210,7 @@
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="resetIP6RoutesGroup">
<object class="AdwPreferencesGroup" id="reset_ip6_routes_group">
<property name="header-suffix">
<object class="GtkBox">
<child>
@ -225,7 +225,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetIP6RouteAddButton">
<object class="GtkButton" id="reset_ip6_route_add_button">
<property name="icon-name">list-add-symbolic</property>
<property name="margin-start">10</property>
</object>
@ -250,7 +250,7 @@
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwComboRow" id="resetWifiSecurityDropdown">
<object class="AdwComboRow" id="reset_wifi_security_dropdown">
<property name="model">
<object class="GtkStringList">
<items>
@ -263,7 +263,7 @@
</object>
</child>
<child>
<object class="AdwPasswordEntryRow" id="resetWifiPassword">
<object class="AdwPasswordEntryRow" id="reset_wifi_password">
<property name="title">Password</property>
</object>
</child>
@ -279,7 +279,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="wifiOptionsApplyButton">
<object class="GtkButton" id="wifi_options_apply_button">
<property name="halign">end</property>
<property name="label">Apply</property>
<property name="margin-top">10</property>

View file

@ -5,19 +5,19 @@
<requires lib="libadwaita" version="1.2"/>
<template class="resetWifiRouteEntry" parent="GtkBox">
<child>
<object class="AdwExpanderRow" id="resetRouteRow">
<object class="AdwExpanderRow" id="reset_route_row">
<property name="hexpand">True</property>
<property name="title">Add new Route</property>
<child>
<object class="GtkBox">
<child>
<object class="AdwEntryRow" id="resetRouteAddress">
<object class="AdwEntryRow" id="reset_route_address">
<property name="hexpand">True</property>
<property name="title">Address</property>
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetRoutePrefix">
<object class="AdwEntryRow" id="reset_route_prefix">
<property name="max-width-chars">5</property>
<property name="title">Prefix</property>
</object>
@ -27,13 +27,13 @@
<child>
<object class="GtkBox">
<child>
<object class="AdwEntryRow" id="resetRouteGateway">
<object class="AdwEntryRow" id="reset_route_gateway">
<property name="hexpand">True</property>
<property name="title">Gateway</property>
</object>
</child>
<child>
<object class="AdwEntryRow" id="resetRouteMetric">
<object class="AdwEntryRow" id="reset_route_metric">
<property name="max-width-chars">5</property>
<property name="title">Metric</property>
</object>
@ -43,7 +43,7 @@
</object>
</child>
<child>
<object class="GtkButton" id="resetRouteRemove">
<object class="GtkButton" id="reset_route_remove">
<property name="height-request">55</property>
<property name="icon-name">edit-delete-symbolic</property>
<property name="valign">start</property>