mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-08 22:52:01 +02:00
Implement wifi options route
This commit is contained in:
parent
1578fc3dac
commit
2e034f848e
|
@ -32,7 +32,7 @@ impl WifiAddressEntry {
|
|||
|
||||
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.resetAddressRow.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
|
||||
}
|
||||
entryImp.protocol.set(protocol);
|
||||
entry.setupCallbacks(conn);
|
||||
|
@ -43,7 +43,7 @@ impl WifiAddressEntry {
|
|||
let selfImp = self.imp();
|
||||
|
||||
let conn = connection.clone();
|
||||
selfImp.resetAddressAddress.connect_changed(clone!(@weak selfImp, @weak self as what => move |entry| {
|
||||
selfImp.resetAddressAddress.connect_changed(clone!(@weak selfImp => move |entry| {
|
||||
let addressInput = entry.text();
|
||||
let mut conn = conn.borrow_mut();
|
||||
|
||||
|
@ -57,14 +57,14 @@ impl WifiAddressEntry {
|
|||
IpProtocol::IPv6 => Ipv6Addr::from_str(addressInput.as_str()).map(|a| IpAddr::V6(a)),
|
||||
};
|
||||
match result {
|
||||
Ok(ip_addr) => {
|
||||
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(ip_addr.to_string(), selfImp.prefix.get().1 as u32));
|
||||
*selfImp.address.borrow_mut() = (true, ip_addr.to_string());
|
||||
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");
|
||||
|
@ -98,7 +98,7 @@ impl WifiAddressEntry {
|
|||
|
||||
let prefix = prefix.unwrap();
|
||||
match selfImp.protocol.get() {
|
||||
IpProtocol::IPv4 if prefix < 32 => {
|
||||
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()) {
|
||||
|
@ -108,7 +108,7 @@ impl WifiAddressEntry {
|
|||
}
|
||||
}
|
||||
}
|
||||
IpProtocol::IPv6 if prefix < 128 => {
|
||||
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()) {
|
||||
|
|
|
@ -6,11 +6,10 @@ use adw::glib;
|
|||
use adw::glib::Object;
|
||||
use adw::prelude::{ActionRowExt, ComboRowExt, PreferencesGroupExt};
|
||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||
use dbus::arg::PropMap;
|
||||
use glib::{clone, closure_local, ObjectExt, PropertySet};
|
||||
use glib::{clone, PropertySet};
|
||||
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
|
||||
use gtk::Widget;
|
||||
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;
|
||||
|
@ -96,34 +95,33 @@ impl WifiOptions {
|
|||
}
|
||||
// IPv4
|
||||
for i in 0..ip4AddressLength {
|
||||
let address = &WifiAddressEntry::new(Some(i), selfImp.connection.clone(), IpProtocol::IPv4);
|
||||
let address = &WifiAddressEntry::new(Some(i), selfImp.connection.clone(), IPv4);
|
||||
selfImp.resetIP4AddressGroup.add(address);
|
||||
}
|
||||
let address = &WifiAddressEntry::new(None, selfImp.connection.clone(), IpProtocol::IPv4);
|
||||
let address = &WifiAddressEntry::new(None, selfImp.connection.clone(), IPv4);
|
||||
selfImp.resetIP4AddressGroup.add(address);
|
||||
|
||||
if ip4RouteLength == 0 {
|
||||
selfImp.resetIP4RoutesGroup.add(&WifiRouteEntry::new(None, selfImp.connection.clone(), IpProtocol::IPv4))
|
||||
} else {
|
||||
for address in 0..ip4RouteLength {
|
||||
selfImp.resetIP4RoutesGroup.add(&WifiRouteEntry::new(Some(address), selfImp.connection.clone(), IpProtocol::IPv4))
|
||||
}
|
||||
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 address in 0..ip6AddressLength {
|
||||
let address = &WifiAddressEntry::new(Some(address), selfImp.connection.clone(), IpProtocol::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(), IpProtocol::IPv6);
|
||||
let address = &WifiAddressEntry::new(None, selfImp.connection.clone(), IPv6);
|
||||
selfImp.resetIP6AddressGroup.add(address);
|
||||
|
||||
if ip6RouteLength == 0 {
|
||||
selfImp.resetIP6RoutesGroup.add(&WifiRouteEntry::new(None, selfImp.connection.clone(), IpProtocol::IPv6))
|
||||
} else {
|
||||
for address in 0..ip6RouteLength {
|
||||
selfImp.resetIP6RoutesGroup.add(&WifiRouteEntry::new(Some(address), selfImp.connection.clone(), IpProtocol::IPv6))
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -182,6 +180,7 @@ fn setupCallbacks(wifiOptions: &Arc<WifiOptions>) {
|
|||
}));
|
||||
imp.wifiOptionsApplyButton.connect_clicked(clone!(@weak imp => move |_| {
|
||||
let prop = imp.connection.borrow().convert_to_propmap();
|
||||
// todo send to daemon somehow
|
||||
}));
|
||||
// IPv4
|
||||
let wifiOptionsIP4 = wifiOptions.clone();
|
||||
|
@ -255,6 +254,11 @@ fn setupCallbacks(wifiOptions: &Arc<WifiOptions>) {
|
|||
}
|
||||
}
|
||||
}));
|
||||
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();
|
||||
|
|
|
@ -45,6 +45,8 @@ pub struct WifiOptions {
|
|||
pub resetIP4AddressAddButton: TemplateChild<Button>,
|
||||
#[template_child]
|
||||
pub resetIP4RoutesGroup: TemplateChild<PreferencesGroup>,
|
||||
#[template_child]
|
||||
pub resetIP4RouteAddButton: TemplateChild<Button>,
|
||||
// IPv6
|
||||
#[template_child]
|
||||
pub resetIP6Method: TemplateChild<ComboRow>,
|
||||
|
@ -55,7 +57,11 @@ pub struct WifiOptions {
|
|||
#[template_child]
|
||||
pub resetIP6AddressGroup: TemplateChild<PreferencesGroup>,
|
||||
#[template_child]
|
||||
pub resetIP6AddressAddButton: TemplateChild<Button>,
|
||||
#[template_child]
|
||||
pub resetIP6RoutesGroup: TemplateChild<PreferencesGroup>,
|
||||
#[template_child]
|
||||
pub resetIP6RouteAddButton: TemplateChild<Button>,
|
||||
// Security
|
||||
// Misc
|
||||
#[template_child]
|
||||
|
|
|
@ -1,11 +1,19 @@
|
|||
use std::cell::RefCell;
|
||||
use std::cell::{Ref, RefCell};
|
||||
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
||||
use std::rc::Rc;
|
||||
use std::str::FromStr;
|
||||
use adw::glib;
|
||||
use adw::glib::Object;
|
||||
use ReSet_Lib::network::connection::{Connection};
|
||||
use adw::prelude::{ExpanderRowExt, PreferencesRowExt};
|
||||
use glib::clone;
|
||||
use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||
use gtk::prelude::{EditableExt, WidgetExt};
|
||||
use ReSet_Lib::network::connection::{Address, Connection};
|
||||
use crate::components::wifi::utils::IpProtocol;
|
||||
use crate::components::wifi::utils::IpProtocol::IPv4;
|
||||
|
||||
use crate::components::wifi::wifiRouteEntryImpl;
|
||||
use crate::components::wifi::wifiRouteEntryImpl::WifiRouteEntryImpl;
|
||||
|
||||
glib::wrapper! {
|
||||
pub struct WifiRouteEntry(ObjectSubclass<wifiRouteEntryImpl::WifiRouteEntryImpl>)
|
||||
|
@ -14,24 +22,206 @@ glib::wrapper! {
|
|||
}
|
||||
|
||||
impl WifiRouteEntry {
|
||||
pub fn new(address: Option<usize>, rc: Rc<RefCell<Connection>>, protocol: IpProtocol) -> Self {
|
||||
pub fn new(address: Option<usize>, conn : Rc<RefCell<Connection>>, protocol: IpProtocol) -> Self {
|
||||
let entry: WifiRouteEntry = Object::builder().build();
|
||||
// if let Some(address) = address {
|
||||
// let entryImp = entry.imp();
|
||||
// let map = address.to_map();
|
||||
//
|
||||
// let addr = getValueFromKey(&map, "address");
|
||||
// let prefix = getValueFromKey(&map, "prefix-length");
|
||||
// let gateway = getValueFromKey(&map, "gateway");
|
||||
// let metric = getValueFromKey(&map, "metric");
|
||||
//
|
||||
// entryImp.resetRouteAddress.set_text(&addr);
|
||||
// entryImp.resetRouteNetmask.set_text(&prefix);
|
||||
// entryImp.resetRouteGateway.set_text(&gateway);
|
||||
// entryImp.resetRouteMetric.set_text(&metric);
|
||||
// entryImp.resetRouteRow.set_title(&format!("{}, {}, {}, {}", addr, prefix, gateway, metric));
|
||||
// }
|
||||
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(|a| IpAddr::V4(a)),
|
||||
IpProtocol::IPv6 => Ipv6Addr::from_str(addressInput.as_str()).map(|a| IpAddr::V6(a)),
|
||||
};
|
||||
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);
|
||||
return;
|
||||
};
|
||||
|
||||
if prefixInput.is_empty() || !prefix.is_ok() {
|
||||
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(|a| IpAddr::V4(a)),
|
||||
IpProtocol::IPv6 => Ipv6Addr::from_str(gatewayInput.as_str()).map(|a| IpAddr::V6(a)),
|
||||
};
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
use std::cell::{Cell, RefCell};
|
||||
use crate::components::wifi::wifiRouteEntry;
|
||||
use adw::{EntryRow, ExpanderRow};
|
||||
use gtk::subclass::prelude::*;
|
||||
use gtk::{glib, Button, CompositeTemplate};
|
||||
use crate::components::wifi::utils::IpProtocol;
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
#[derive(Default, CompositeTemplate)]
|
||||
|
@ -12,13 +14,18 @@ pub struct WifiRouteEntryImpl {
|
|||
#[template_child]
|
||||
pub resetRouteAddress: TemplateChild<EntryRow>,
|
||||
#[template_child]
|
||||
pub resetRouteNetmask: TemplateChild<EntryRow>,
|
||||
pub resetRoutePrefix: TemplateChild<EntryRow>,
|
||||
#[template_child]
|
||||
pub resetRouteGateway: TemplateChild<EntryRow>,
|
||||
#[template_child]
|
||||
pub resetRouteMetric: TemplateChild<EntryRow>,
|
||||
#[template_child]
|
||||
pub resetRouteRemove: TemplateChild<Button>,
|
||||
pub address: RefCell<(bool, String)>,
|
||||
pub prefix: Cell<(bool, u32)>,
|
||||
pub gateway: RefCell<Option<String>>,
|
||||
pub metric: Cell<Option<u32>>,
|
||||
pub protocol: Cell<IpProtocol>,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<child>
|
||||
<object class="GtkButton" id="resetBluetoothButton">
|
||||
<property name="has-frame">False</property>
|
||||
<property name="icon-name">user-trash-symbolic</property>
|
||||
<property name="icon-name">emblem-system-symbolic</property>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
|
|
|
@ -165,9 +165,9 @@
|
|||
(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,6,"GtkBox",None,2,None,None,None,1,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,2,None),
|
||||
(11,8,"GtkLabel","resetBluetoothAddress",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),
|
||||
|
@ -301,19 +301,24 @@
|
|||
(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),
|
||||
(22,1,"GtkBox","resetWifiAddressEntry",None,None,None,None,-1,None),
|
||||
(22,2,"AdwExpanderRow","resetAddressRow",1,None,None,None,-1,None),
|
||||
(22,3,"AdwEntryRow","resetAddressAddress",2,None,None,None,-1,None),
|
||||
(22,4,"AdwEntryRow","resetAddressPrefix",2,None,None,None,1,None),
|
||||
(22,5,"GtkButton","resetAddressRemove",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),
|
||||
(23,1,"GtkBox","resetWifiRouteEntry",None,None,None,None,None,None),
|
||||
(23,2,"AdwExpanderRow","resetRouteRow",1,None,None,None,None,None),
|
||||
(23,3,"AdwEntryRow","resetRouteAddress",2,None,None,None,None,None),
|
||||
(23,4,"AdwEntryRow","resetRouteNetmask",2,None,None,None,1,None),
|
||||
(23,5,"GtkButton","resetRouteRemove",1,None,None,None,1,None),
|
||||
(23,6,"GtkBox",None,2,None,None,None,2,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,8,"AdwEntryRow","resetRouteMetric",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)
|
||||
</object>
|
||||
<object_property>
|
||||
(3,1,"GtkWidget","height-request","200",None,None,None,None,None,None,None,None,None),
|
||||
|
@ -599,7 +604,7 @@
|
|||
(11,3,"GtkImage","icon-name","input-mouse-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(11,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None),
|
||||
(11,5,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
|
||||
(11,5,"GtkButton","icon-name","user-trash-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(11,5,"GtkButton","icon-name","emblem-system-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(11,6,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||
(11,7,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None),
|
||||
(11,7,"GtkLabel","label","LoremIpsum Wireless Mouse",None,None,None,None,None,None,None,None,None),
|
||||
|
@ -840,6 +845,7 @@
|
|||
(21,81,"AdwPreferencesRow","title","IPv6 Method",None,None,None,None,None,None,None,None,None),
|
||||
(21,83,"AdwPreferencesRow","title","DNS (separate IP by comma, empty for automatic)",None,None,None,None,None,None,None,None,None),
|
||||
(21,84,"AdwPreferencesRow","title","Gateway",None,None,None,None,None,None,None,None,None),
|
||||
(21,85,"AdwPreferencesGroup","header-suffix",None,None,None,None,None,101,None,None,None,None),
|
||||
(21,85,"AdwPreferencesGroup","title","Addresses",None,None,None,None,None,None,None,None,None),
|
||||
(21,85,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,86,"AdwPreferencesGroup","header-suffix",None,None,None,None,None,87,None,None,None,None),
|
||||
|
@ -859,26 +865,35 @@
|
|||
(21,98,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||
(21,98,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,99,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,100,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,100,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,101,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,102,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,102,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
|
||||
(22,1,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
|
||||
(22,1,"GtkWidget","margin-top","2",None,None,None,None,None,None,None,None,None),
|
||||
(22,2,"AdwPreferencesRow","title","Add new Address",None,None,None,None,None,None,None,None,None),
|
||||
(22,2,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||
(22,3,"AdwPreferencesRow","title","Address",None,None,None,None,None,None,None,None,None),
|
||||
(22,4,"AdwPreferencesRow","title","Prefix",None,None,None,None,None,None,None,None,None),
|
||||
(22,5,"GtkButton","icon-name","edit-delete-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(22,5,"GtkWidget","height-request","55",None,None,None,None,None,None,None,None,None),
|
||||
(22,5,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||
(22,7,"AdwPreferencesRow","title","Address",None,None,None,None,None,None,None,None,None),
|
||||
(22,7,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||
(22,8,"AdwPreferencesRow","title","Prefix",None,None,None,None,None,None,None,None,None),
|
||||
(22,8,"GtkEditable","max-width-chars","5",None,None,None,None,None,None,None,None,None),
|
||||
(23,2,"AdwPreferencesRow","title","Add new Route",None,None,None,None,None,None,None,None,None),
|
||||
(23,2,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||
(23,3,"AdwPreferencesRow","title","Address",None,None,None,None,None,None,None,None,None),
|
||||
(23,4,"AdwPreferencesRow","title","Netmask",None,None,None,None,None,None,None,None,None),
|
||||
(23,5,"GtkButton","icon-name","edit-delete-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(23,5,"GtkWidget","height-request","55",None,None,None,None,None,None,None,None,None),
|
||||
(23,5,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||
(23,7,"AdwPreferencesRow","title","Gateway",None,None,None,None,None,None,None,None,None),
|
||||
(23,7,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||
(23,8,"AdwPreferencesRow","title","Metric",None,None,None,None,None,None,None,None,None),
|
||||
(23,8,"GtkEditable","max-width-chars","5",None,None,None,None,None,None,None,None,None)
|
||||
(23,8,"GtkEditable","max-width-chars","5",None,None,None,None,None,None,None,None,None),
|
||||
(23,10,"AdwPreferencesRow","title","Address",None,None,None,None,None,None,None,None,None),
|
||||
(23,10,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||
(23,11,"AdwPreferencesRow","title","Prefix",None,None,None,None,None,None,None,None,None),
|
||||
(23,11,"GtkEditable","max-width-chars","5",None,None,None,None,None,None,None,None,None)
|
||||
</object_property>
|
||||
<object_data>
|
||||
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),
|
||||
|
|
|
@ -11,13 +11,19 @@
|
|||
<property name="hexpand">True</property>
|
||||
<property name="title">Add new Address</property>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetAddressAddress">
|
||||
<property name="title">Address</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetAddressPrefix">
|
||||
<property name="title">Prefix</property>
|
||||
<object class="GtkBox">
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetAddressAddress">
|
||||
<property name="hexpand">True</property>
|
||||
<property name="title">Address</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetAddressPrefix">
|
||||
<property name="max-width-chars">5</property>
|
||||
<property name="title">Prefix</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
|
|
@ -142,6 +142,12 @@
|
|||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="resetIP4RouteAddButton">
|
||||
<property name="icon-name">list-add-symbolic</property>
|
||||
<property name="margin-start">10</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</property>
|
||||
<property name="margin-top">10</property>
|
||||
|
@ -191,6 +197,11 @@
|
|||
</child>
|
||||
<child>
|
||||
<object class="AdwPreferencesGroup" id="resetIP6AddressGroup">
|
||||
<property name="header-suffix">
|
||||
<object class="GtkButton" id="resetIP6AddressAddButton">
|
||||
<property name="icon-name">list-add-symbolic</property>
|
||||
</object>
|
||||
</property>
|
||||
<property name="margin-top">10</property>
|
||||
<property name="title">Addresses</property>
|
||||
</object>
|
||||
|
@ -210,6 +221,12 @@
|
|||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="resetIP6RouteAddButton">
|
||||
<property name="icon-name">list-add-symbolic</property>
|
||||
<property name="margin-start">10</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</property>
|
||||
<property name="margin-top">10</property>
|
||||
|
|
|
@ -9,13 +9,19 @@
|
|||
<property name="hexpand">True</property>
|
||||
<property name="title">Add new Route</property>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetRouteAddress">
|
||||
<property name="title">Address</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetRouteNetmask">
|
||||
<property name="title">Netmask</property>
|
||||
<object class="GtkBox">
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetRouteAddress">
|
||||
<property name="hexpand">True</property>
|
||||
<property name="title">Address</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="resetRoutePrefix">
|
||||
<property name="max-width-chars">5</property>
|
||||
<property name="title">Prefix</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
|
|
Loading…
Reference in a new issue