From 810bddc2612a30244c9505608b24a4764c2aa564 Mon Sep 17 00:00:00 2001 From: Fabio Lenherr / DashieTM Date: Sat, 28 Oct 2023 15:16:39 +0200 Subject: [PATCH 1/2] feat: Add adwaita init --- src/main.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6b4b4f7..1ce6fae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,10 @@ -mod window; mod audio; -mod wifi; mod bluetooth; +mod wifi; +mod window; use gtk::prelude::*; -use gtk::{Application, gio}; +use gtk::{gio, Application}; use window::Window; const APP_ID: &str = "org.Xetibo.ReSet"; @@ -13,9 +13,11 @@ fn main() { gio::resources_register_include!("src.templates.gresource") .expect("Failed to register resources."); - let app = Application::builder() - .application_id(APP_ID) - .build(); + let app = Application::builder().application_id(APP_ID).build(); + + app.connect_startup(move |_| { + adw::init().unwrap(); + }); app.connect_activate(buildUI); app.run(); @@ -25,4 +27,5 @@ fn main() { fn buildUI(app: &Application) { let window = Window::new(app); window.present(); -} \ No newline at end of file +} + From 159bcef5704b80932a79474ed233750d5b47236f Mon Sep 17 00:00:00 2001 From: Fabio Lenherr / DashieTM Date: Sat, 28 Oct 2023 15:27:58 +0200 Subject: [PATCH 2/2] feat: Add close Button --- src/window/mod.rs | 189 +++++++++++++++++++++++++++++-------------- src/window/window.rs | 10 +-- 2 files changed, 133 insertions(+), 66 deletions(-) diff --git a/src/window/mod.rs b/src/window/mod.rs index c857400..f67745b 100644 --- a/src/window/mod.rs +++ b/src/window/mod.rs @@ -1,18 +1,21 @@ #![allow(non_snake_case)] -use adw::BreakpointCondition; use adw::glib::clone; use adw::subclass::prelude::ObjectSubclassIsExt; +use adw::BreakpointCondition; use glib::Object; -use gtk::{Application, FlowBox, gio, glib}; use gtk::prelude::*; +use gtk::{gio, glib, Application, FlowBox}; -use crate::window::handleSidebarClick::{HANDLE_AUDIO_CLICK, HANDLE_BLUETOOTH_CLICK, HANDLE_CONNECTIVITY_CLICK, HANDLE_MICROPHONE_CLICK, HANDLE_VOLUME_CLICK, HANDLE_VPN_CLICK, HANDLE_WIFI_CLICK}; +use crate::window::handleSidebarClick::{ + HANDLE_AUDIO_CLICK, HANDLE_BLUETOOTH_CLICK, HANDLE_CONNECTIVITY_CLICK, HANDLE_MICROPHONE_CLICK, + HANDLE_VOLUME_CLICK, HANDLE_VPN_CLICK, HANDLE_WIFI_CLICK, +}; use crate::window::sidebarEntry::{Categories, SidebarAction}; -mod window; -mod sidebarEntry; mod handleSidebarClick; +mod sidebarEntry; +mod window; glib::wrapper! { pub struct Window(ObjectSubclass) @@ -36,30 +39,48 @@ impl Window { fn setupCallback(&self) { let selfImp = self.imp(); - selfImp.resetSearchEntry.connect_search_changed(clone!(@ weak self as window => move |_| { + selfImp + .resetSearchEntry + .connect_search_changed(clone!(@ weak self as window => move |_| { window.filterList(); })); - selfImp.resetSideBarToggle.connect_clicked(clone!(@ weak self as window => move |_| { + selfImp + .resetSideBarToggle + .connect_clicked(clone!(@ weak self as window => move |_| { window.toggleSidebar(); })); - selfImp.resetSidebarList.connect_row_activated(clone!(@ weak selfImp as flowbox => move |x, y| { - let result = y.downcast_ref::().unwrap(); - let clickEvent = result.imp().onClickEvent.borrow().onClickEvent; - (clickEvent)(flowbox.resetMain.get()); - })); + selfImp.resetSidebarList.connect_row_activated( + clone!(@ weak selfImp as flowbox => move |_, y| { + let result = y.downcast_ref::().unwrap(); + let clickEvent = result.imp().onClickEvent.borrow().onClickEvent; + (clickEvent)(flowbox.resetMain.get()); + }), + ); + + selfImp + .resetClose + .connect_clicked(clone!(@ weak self as window => move |_| { + window.close(); + })); } fn handleDynamicSidebar(&self) { let selfImp = self.imp(); - selfImp.resetSidebarBreakpoint.set_condition(BreakpointCondition::parse("max-width: 500sp").as_ref().ok()); - selfImp.resetSidebarBreakpoint.add_setter(&Object::from(selfImp.resetOverlaySplitView.get()), - "collapsed", - &true.to_value()); - selfImp.resetSidebarBreakpoint.add_setter(&Object::from(selfImp.resetSideBarToggle.get()), - "visible", - &true.to_value()); + selfImp + .resetSidebarBreakpoint + .set_condition(BreakpointCondition::parse("max-width: 500sp").as_ref().ok()); + selfImp.resetSidebarBreakpoint.add_setter( + &Object::from(selfImp.resetOverlaySplitView.get()), + "collapsed", + &true.to_value(), + ); + selfImp.resetSidebarBreakpoint.add_setter( + &Object::from(selfImp.resetSideBarToggle.get()), + "visible", + &true.to_value(), + ); } fn filterList(&self) { @@ -72,13 +93,25 @@ impl Window { } continue; } - if mainEntry.imp().name.borrow().to_lowercase().contains(&text.to_lowercase()) { + if mainEntry + .imp() + .name + .borrow() + .to_lowercase() + .contains(&text.to_lowercase()) + { mainEntry.set_visible(true); } else { mainEntry.set_visible(false); } for subEntry in subEntries { - if subEntry.imp().name.borrow().to_lowercase().contains(&text.to_lowercase()) { + if subEntry + .imp() + .name + .borrow() + .to_lowercase() + .contains(&text.to_lowercase()) + { subEntry.set_visible(true); mainEntry.set_visible(true); } else { @@ -100,45 +133,68 @@ impl Window { let selfImp = self.imp(); let mut sidebarEntries = selfImp.sidebarEntries.borrow_mut(); - let connectivityList = vec![SidebarEntry::new("WiFi", - "network-wireless-symbolic", - Categories::Connectivity, - true, - HANDLE_WIFI_CLICK), - SidebarEntry::new("Bluetooth", - "bluetooth-symbolic", - Categories::Connectivity, - true, - HANDLE_BLUETOOTH_CLICK), - SidebarEntry::new("VPN", - "network-vpn-symbolic", - Categories::Connectivity, - true, - HANDLE_VPN_CLICK)]; + let connectivityList = vec![ + SidebarEntry::new( + "WiFi", + "network-wireless-symbolic", + Categories::Connectivity, + true, + HANDLE_WIFI_CLICK, + ), + SidebarEntry::new( + "Bluetooth", + "bluetooth-symbolic", + Categories::Connectivity, + true, + HANDLE_BLUETOOTH_CLICK, + ), + SidebarEntry::new( + "VPN", + "network-vpn-symbolic", + Categories::Connectivity, + true, + HANDLE_VPN_CLICK, + ), + ]; - sidebarEntries.push((SidebarEntry::new("Connectivity", - "network-wired-symbolic", - Categories::Connectivity, - false, - HANDLE_CONNECTIVITY_CLICK), connectivityList)); + sidebarEntries.push(( + SidebarEntry::new( + "Connectivity", + "network-wired-symbolic", + Categories::Connectivity, + false, + HANDLE_CONNECTIVITY_CLICK, + ), + connectivityList, + )); - let audioList = vec![SidebarEntry::new("Volume", - "audio-volume-high-symbolic", - Categories::Audio, - true, - HANDLE_VOLUME_CLICK), - SidebarEntry::new("Microphone", - "audio-input-microphone-symbolic", - Categories::Audio, - true, - HANDLE_MICROPHONE_CLICK)]; - - sidebarEntries.push((SidebarEntry::new("Audio", - "audio-headset-symbolic", - Categories::Audio, - false, - HANDLE_AUDIO_CLICK), audioList)); + let audioList = vec![ + SidebarEntry::new( + "Volume", + "audio-volume-high-symbolic", + Categories::Audio, + true, + HANDLE_VOLUME_CLICK, + ), + SidebarEntry::new( + "Microphone", + "audio-input-microphone-symbolic", + Categories::Audio, + true, + HANDLE_MICROPHONE_CLICK, + ), + ]; + sidebarEntries.push(( + SidebarEntry::new( + "Audio", + "audio-headset-symbolic", + Categories::Audio, + false, + HANDLE_AUDIO_CLICK, + ), + audioList, + )); for (mainEntry, subEntries) in sidebarEntries.iter() { selfImp.resetSidebarList.append(mainEntry); @@ -150,18 +206,28 @@ impl Window { } impl SidebarEntry { - pub fn new(entryName: &str, iconName: &str, category: Categories, isSubcategory: bool, clickEvent: fn(FlowBox)) -> Self { + pub fn new( + entryName: &str, + iconName: &str, + category: Categories, + isSubcategory: bool, + clickEvent: fn(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 + .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 }; + *action = SidebarAction { + onClickEvent: clickEvent, + }; } Self::setMargin(&entry); entry @@ -173,4 +239,5 @@ impl SidebarEntry { option.set_margin_start(30); } } -} \ No newline at end of file +} + diff --git a/src/window/window.rs b/src/window/window.rs index 38050ed..0460773 100644 --- a/src/window/window.rs +++ b/src/window/window.rs @@ -1,10 +1,10 @@ -use std::cell::RefCell; -use adw::{Breakpoint, OverlaySplitView}; use adw::glib::StaticTypeExt; use adw::subclass::prelude::AdwApplicationWindowImpl; +use adw::{Breakpoint, OverlaySplitView}; use glib::subclass::InitializingObject; -use gtk::{Button, CompositeTemplate, FlowBox, glib, ListBox, SearchEntry, Box}; use gtk::subclass::prelude::*; +use gtk::{glib, Box, Button, CompositeTemplate, FlowBox, ListBox, SearchEntry}; +use std::cell::RefCell; use crate::wifi::WifiBox; use crate::window::SidebarEntry; @@ -27,6 +27,8 @@ pub struct Window { pub resetSideBarToggle: TemplateChild