From 00ffb7faf9333e2e73955dda782d89d62123a642 Mon Sep 17 00:00:00 2001 From: takotori Date: Mon, 27 Nov 2023 11:31:28 +0100 Subject: [PATCH] extract signallistitemfactory to utils --- src/components/base/cardEntry.rs | 22 +++++++--------------- src/components/input/outputStreamEntry.rs | 2 ++ src/components/input/sourceBox.rs | 18 ++++-------------- src/components/mod.rs | 1 + src/components/output/inputStreamEntry.rs | 2 ++ src/components/output/sinkBox.rs | 19 ++++--------------- src/components/utils.rs | 17 +++++++++++++++++ src/components/wifi/wifiOptions.rs | 7 +++++-- 8 files changed, 42 insertions(+), 46 deletions(-) create mode 100644 src/components/utils.rs diff --git a/src/components/base/cardEntry.rs b/src/components/base/cardEntry.rs index 6f0ce9d..804acac 100644 --- a/src/components/base/cardEntry.rs +++ b/src/components/base/cardEntry.rs @@ -5,12 +5,15 @@ use adw::glib::Object; use adw::prelude::{ComboRowExt, PreferencesRowExt}; use dbus::blocking::Connection; use dbus::Error; -use glib::{Cast, clone, ObjectExt}; +use glib::{Cast, clone}; use glib::subclass::types::ObjectSubclassIsExt; -use gtk::{Align, gio, SignalListItemFactory, StringList, StringObject}; -use gtk::prelude::{GObjectPropertyExpressionExt, ListItemExt, WidgetExt}; +use gtk::{gio, StringList, StringObject}; use ReSet_Lib::audio::audio::Card; +use components::utils::createDropdownLabelFactory; + +use crate::components; + use super::cardEntryImpl; glib::wrapper! { @@ -55,18 +58,7 @@ impl CardEntry { let (device_index, profile_name) = map.get(&selected).unwrap(); set_card_profile_of_device(*device_index, profile_name.clone()); })); - - let factory = &SignalListItemFactory::new(); - factory.connect_setup(|_, item| { - let item = item.downcast_ref::().unwrap(); - let label = gtk::Label::new(None); - label.set_halign(Align::Start); - item.property_expression("item") - .chain_property::("string") - .bind(&label, "label", gtk::Widget::NONE); - item.set_child(Some(&label)); - }); - entry.set_factory(Some(factory)); + entry.set_factory(Some(&createDropdownLabelFactory())); } entry } diff --git a/src/components/input/outputStreamEntry.rs b/src/components/input/outputStreamEntry.rs index e0e6fdb..0be5e46 100644 --- a/src/components/input/outputStreamEntry.rs +++ b/src/components/input/outputStreamEntry.rs @@ -10,6 +10,7 @@ use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, Cast, Propagation}; use gtk::{gio, StringObject}; use ReSet_Lib::audio::audio::OutputStream; +use crate::components::utils::createDropdownLabelFactory; use super::outputStreamEntryImpl; use super::sourceBox::SourceBox; @@ -32,6 +33,7 @@ impl OutputStreamEntry { 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())); let volume = stream.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; diff --git a/src/components/input/sourceBox.rs b/src/components/input/sourceBox.rs index e51d3c6..7f522a7 100644 --- a/src/components/input/sourceBox.rs +++ b/src/components/input/sourceBox.rs @@ -10,8 +10,8 @@ use dbus::blocking::Connection; use dbus::message::SignalArgs; use glib::{Cast, clone, Propagation, Variant}; use glib::subclass::prelude::ObjectSubclassIsExt; -use gtk::{Align, gio, SignalListItemFactory, StringObject}; -use gtk::prelude::{ActionableExt, GObjectPropertyExpressionExt, ListItemExt, WidgetExt}; +use gtk::{gio, StringObject}; +use gtk::prelude::{ActionableExt}; use ReSet_Lib::audio::audio::{Card, OutputStream, Source}; use crate::components::base::cardEntry::CardEntry; @@ -22,6 +22,7 @@ use crate::components::base::utils::{ }; use crate::components::input::sourceBoxImpl; use crate::components::input::sourceEntry::set_source_volume; +use crate::components::utils::createDropdownLabelFactory; use super::outputStreamEntry::OutputStreamEntry; use super::sourceEntry::{set_default_source, SourceEntry, toggle_source_mute}; @@ -63,18 +64,7 @@ impl SourceBox { selfImp.resetInputCardsBackButton.set_activatable(true); selfImp.resetInputCardsBackButton.set_action_name(Some("navigation.pop")); - let factory = &SignalListItemFactory::new(); - factory.connect_setup(|_, item| { - let item = item.downcast_ref::().unwrap(); - let label = gtk::Label::new(None); - label.set_halign(Align::Start); - item.property_expression("item") - .chain_property::("string") - .bind(&label, "label", gtk::Widget::NONE); - item.set_child(Some(&label)); - }); - - selfImp.resetSourceDropdown.set_factory(Some(factory)); + selfImp.resetSourceDropdown.set_factory(Some(&createDropdownLabelFactory())); } } diff --git a/src/components/mod.rs b/src/components/mod.rs index 400fa61..a581f71 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -4,4 +4,5 @@ mod input; pub mod output; pub mod wifi; pub mod window; +pub mod utils; diff --git a/src/components/output/inputStreamEntry.rs b/src/components/output/inputStreamEntry.rs index 0c48d99..fdffa19 100644 --- a/src/components/output/inputStreamEntry.rs +++ b/src/components/output/inputStreamEntry.rs @@ -10,6 +10,7 @@ use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, Cast, Propagation}; use gtk::{gio, StringObject}; use ReSet_Lib::audio::audio::InputStream; +use crate::components::utils::createDropdownLabelFactory; use super::inputStreamEntryImpl; use super::sinkBox::SinkBox; @@ -37,6 +38,7 @@ impl InputStreamEntry { } let name = stream.application_name.clone() + ": " + stream.name.as_str(); imp.resetSinkSelection.set_title(name.as_str()); + imp.resetSinkSelection.set_factory(Some(&createDropdownLabelFactory())); let volume = stream.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; diff --git a/src/components/output/sinkBox.rs b/src/components/output/sinkBox.rs index 849f0a0..f12024e 100644 --- a/src/components/output/sinkBox.rs +++ b/src/components/output/sinkBox.rs @@ -11,9 +11,8 @@ use dbus::blocking::Connection; use dbus::message::SignalArgs; use glib::{Cast, clone, Propagation, Variant}; use glib::subclass::prelude::ObjectSubclassIsExt; -use gtk::{Align, gio, SignalListItemFactory, StringObject}; -use gtk::prelude::*; -use gtk::prelude::{ActionableExt, GObjectPropertyExpressionExt, ListItemExt}; +use gtk::{gio, StringObject}; +use gtk::prelude::ActionableExt; use ReSet_Lib::audio::audio::{Card, InputStream, Sink}; use crate::components::base::cardEntry::CardEntry; @@ -22,6 +21,7 @@ use crate::components::base::utils::{ InputStreamAdded, InputStreamChanged, InputStreamRemoved, SinkAdded, SinkChanged, SinkRemoved, }; use crate::components::output::sinkEntry::set_sink_volume; +use crate::components::utils::createDropdownLabelFactory; use super::inputStreamEntry::InputStreamEntry; use super::sinkBoxImpl; @@ -71,18 +71,7 @@ impl SinkBox { selfImp.resetInputCardsBackButton.set_activatable(true); selfImp.resetInputCardsBackButton.set_action_name(Some("navigation.pop")); - let factory = &SignalListItemFactory::new(); - factory.connect_setup(|_, item| { - let item = item.downcast_ref::().unwrap(); - let label = gtk::Label::new(None); - label.set_halign(Align::Start); - item.property_expression("item") - .chain_property::("string") - .bind(&label, "label", gtk::Widget::NONE); - item.set_child(Some(&label)); - }); - - selfImp.resetSinkDropdown.set_factory(Some(factory)); + selfImp.resetSinkDropdown.set_factory(Some(&createDropdownLabelFactory())); } } diff --git a/src/components/utils.rs b/src/components/utils.rs new file mode 100644 index 0000000..84383fe --- /dev/null +++ b/src/components/utils.rs @@ -0,0 +1,17 @@ +use glib::Cast; +use gtk::{Align, SignalListItemFactory, StringObject}; +use gtk::prelude::{GObjectPropertyExpressionExt, ListItemExt, WidgetExt}; + +pub fn createDropdownLabelFactory() -> SignalListItemFactory { + let factory = SignalListItemFactory::new(); + factory.connect_setup(|_, item| { + let item = item.downcast_ref::().unwrap(); + let label = gtk::Label::new(None); + label.set_halign(Align::Start); + item.property_expression("item") + .chain_property::("string") + .bind(&label, "label", gtk::Widget::NONE); + item.set_child(Some(&label)); + }); + factory +} \ No newline at end of file diff --git a/src/components/wifi/wifiOptions.rs b/src/components/wifi/wifiOptions.rs index a1f66eb..1d2a507 100644 --- a/src/components/wifi/wifiOptions.rs +++ b/src/components/wifi/wifiOptions.rs @@ -5,7 +5,7 @@ use adw::glib::Object; use adw::prelude::{ActionRowExt, ComboRowExt, PreferencesGroupExt}; use adw::subclass::prelude::ObjectSubclassIsExt; use dbus::arg::PropMap; -use glib::{clone, ObjectExt, PropertySet}; +use glib::{clone, PropertySet}; use gtk::prelude::{EditableExt, WidgetExt}; use regex::Regex; use ReSet_Lib::network::connection::{Connection, Enum, TypeSettings}; @@ -183,12 +183,15 @@ fn setupCallbacks(wifiOptions: &Arc) { wifiOptionsIP4.setIP4Visibility(selected); })); - // TODO not finished let dnsRegex = Regex::new(r"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$").unwrap(); 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.as_str().is_empty() { + imp.resetIP4DNS.remove_css_class("error"); + return; + } for dnsEntry in dnsInput.as_str().split(',').collect::>() { if dnsRegex.is_match(dnsEntry) { imp.resetIP4DNS.remove_css_class("error");