From 9e20da3bd5a8dbe26872fd8678745695138f7936 Mon Sep 17 00:00:00 2001 From: tranfelix <tranfelix99@gmail.com> Date: Mon, 16 Oct 2023 15:53:39 +0200 Subject: [PATCH] add searchable sidebar add example flowbox with wifi children --- src/main.rs | 11 +- src/resources/resetMainWindow.ui | 200 +++----------------------- src/resources/resetUI.cmb | 66 ++++++--- src/resources/resetWiFi.ui | 62 ++++---- src/resources/resetWifiEntry.ui | 35 +++++ src/resources/resources.gresource.xml | 3 +- src/wifi/mod.rs | 33 +++++ src/wifi/wifiBox.rs | 43 ++++++ src/wifi/wifiEntry.rs | 39 +++++ src/window/imp.rs | 34 ++++- src/window/mod.rs | 48 ++++++- 11 files changed, 323 insertions(+), 251 deletions(-) create mode 100644 src/resources/resetWifiEntry.ui create mode 100644 src/wifi/mod.rs create mode 100644 src/wifi/wifiBox.rs create mode 100644 src/wifi/wifiEntry.rs diff --git a/src/main.rs b/src/main.rs index 5968362..532bb95 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ mod window; +mod wifi; use gtk::prelude::*; use gtk::{Application, gio}; @@ -10,20 +11,16 @@ fn main() { gio::resources_register_include!("src.templates.gresource") .expect("Failed to register resources."); - // Create a new application let app = Application::builder() .application_id(APP_ID) .build(); - // Connect to "activate" signal of `app` - app.connect_activate(build_ui); - - // Run the application + app.connect_activate(buildUI); app.run(); } -fn build_ui(app: &Application) { - // Create new window and present it +#[allow(non_snake_case)] +fn buildUI(app: &Application) { let window = Window::new(app); window.present(); } \ No newline at end of file diff --git a/src/resources/resetMainWindow.ui b/src/resources/resetMainWindow.ui index 3eb7445..477ed13 100644 --- a/src/resources/resetMainWindow.ui +++ b/src/resources/resetMainWindow.ui @@ -1,7 +1,7 @@ <?xml version='1.0' encoding='UTF-8'?> <!-- Created with Cambalache 0.17.0 --> <interface> - <requires lib="gtk" version="4.12"/> + <requires lib="gtk" version="4.8"/> <requires lib="libadwaita" version="1.4"/> <template class="resetUI" parent="AdwApplicationWindow"> <child> @@ -15,197 +15,28 @@ <property name="title">ReSet</property> </object> </property> + <child> + <object class="GtkLabel" id="test"/> + </child> </object> </child> <child> <object class="AdwNavigationSplitView"> <property name="content"> <object class="AdwNavigationPage"> - <property name="child"> - <object class="GtkFlowBox" id="resetMainWindow"> - <child> - <object class="GtkBox" id="resetWifi_2"> - <property name="orientation">vertical</property> - <child> - <object class="AdwClampScrollable"> - <property name="orientation">vertical</property> - <child> - <object class="GtkBox"> - <property name="orientation">vertical</property> - <child> - <object class="GtkLabel"> - <property name="halign">start</property> - <property name="justify">right</property> - <property name="label">Available networks</property> - </object> - </child> - <child> - <object class="GtkListBox" id="resetWifiList"> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength_2"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel_2"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton_2"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength_3"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel_3"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton_3"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength_4"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel_4"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton_4"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength_5"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel_5"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton_5"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength_6"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel_6"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton_6"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkButton"> - <property name="halign">start</property> - <property name="label">Advanced</property> - <property name="valign">start</property> - </object> - </child> - </object> - </child> - </object> - </property> <property name="margin-bottom">20</property> <property name="margin-end">20</property> <property name="margin-start">20</property> <property name="margin-top">20</property> + <child> + <object class="GtkFlowBox" id="resetMain"> + <property name="column-spacing">25</property> + <property name="homogeneous">True</property> + <property name="row-spacing">25</property> + <property name="selection-mode">none</property> + <property name="valign">start</property> + </object> + </child> </object> </property> <property name="sidebar"> @@ -218,14 +49,14 @@ <property name="orientation">vertical</property> <property name="width-request">150</property> <child> - <object class="GtkSearchEntry"> + <object class="GtkSearchEntry" id="resetSearchEntry"> <property name="margin-end">5</property> <property name="margin-start">5</property> <property name="placeholder-text">Search</property> </object> </child> <child> - <object class="GtkListBox"> + <object class="GtkListBox" id="resetSidebarList"> <property name="css-name">resetList</property> <property name="width-request">150</property> <child> @@ -393,6 +224,7 @@ </property> </object> </property> + <property name="vexpand">True</property> </object> </child> </object> diff --git a/src/resources/resetUI.cmb b/src/resources/resetUI.cmb index 073cbce..de233f9 100644 --- a/src/resources/resetUI.cmb +++ b/src/resources/resetUI.cmb @@ -2,11 +2,12 @@ <!DOCTYPE cambalache-project SYSTEM "cambalache-project.dtd"> <cambalache-project version="0.13.1" target_tk="gtk-4.0"> <ui> - (3,None,None,"resetMainWindow",None,None,None,None,None,None,None), - (4,None,None,"resetWiFi",None,None,None,None,None,None,None) + (3,1,None,"resetMainWindow",None,None,None,None,None,None,None), + (4,7,None,"resetWiFi",None,None,None,None,None,None,None), + (5,1,None,"resetWifiEntry",None,None,None,None,None,None,None) </ui> <object> - (3,1,"AdwApplicationWindow",None,None,None,None,None,-1,None), + (3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1,None), (3,2,"GtkBox",None,1,None,None,None,-1,None), (3,3,"AdwHeaderBar",None,2,None,None,None,None,None), (3,5,"AdwWindowTitle",None,3,None,None,None,-1,None), @@ -15,8 +16,8 @@ (3,8,"AdwNavigationPage",None,6,None,None,None,-1,None), (3,73,"GtkViewport",None,7,None,None,None,-1,None), (3,74,"GtkBox",None,73,None,None,None,None,None), - (3,75,"GtkSearchEntry",None,74,None,None,None,None,None), - (3,76,"GtkListBox",None,74,None,None,None,1,None), + (3,75,"GtkSearchEntry","resetSearchEntry",74,None,None,None,None,None), + (3,76,"GtkListBox","resetSidebarList",74,None,None,None,1,None), (3,79,"GtkListBoxRow","resetWifi",76,None,None,None,1,None), (3,81,"GtkListBoxRow","resetBluetooth",76,None,None,None,2,None), (3,83,"GtkListBoxRow","resetVPN",76,None,None,None,3,None), @@ -45,19 +46,26 @@ (3,111,"GtkBox",None,85,None,None,None,None,None), (3,112,"GtkImage",None,111,None,None,None,None,None), (3,113,"GtkLabel",None,111,None,None,None,1,None), - (3,114,"GtkFlowBox","resetMainWindow",8,None,None,None,-1,None), - (4,1,"GtkListBoxRow","resetWifiEntry",None,None,None,None,None,None), - (4,2,"GtkBox",None,1,None,None,None,None,None), - (4,3,"GtkImage","resetWifiStrength",2,None,None,None,None,None), - (4,4,"GtkLabel","resetWifiLabel",2,None,None,None,1,None), - (4,5,"GtkButton","resetWifiButton",2,None,None,None,2,None), + (3,115,"GtkLabel","test",3,None,None,None,-1,None), + (3,116,"GtkFlowBox","resetMain",8,None,None,None,-1,None), (4,7,"GtkBox","resetWifi",None,None,None,None,None,None), (4,8,"AdwClampScrollable",None,7,None,None,None,None,None), (4,9,"GtkBox",None,8,None,None,None,None,None), (4,10,"GtkLabel",None,9,None,None,None,None,None), (4,11,"GtkListBox","resetWifiList",9,None,None,None,1,None), (4,42,"GtkButton",None,7,None,None,None,1,None), - (4,43,"AdwToast",None,None,None,None,None,-1,None) + (4,44,"resetWifiEntry",None,11,None,None,None,1,None), + (4,45,"resetWifiEntry",None,11,None,None,None,1,None), + (4,46,"resetWifiEntry",None,11,None,None,None,2,None), + (4,47,"resetWifiEntry",None,11,None,None,None,3,None), + (4,48,"resetWifiEntry",None,11,None,None,None,4,None), + (4,49,"resetWifiEntry",None,11,None,None,None,5,None), + (4,50,"resetWifiEntry",None,11,None,None,None,6,None), + (5,1,"GtkListBoxRow","resetWifiEntry",None,None,None,None,None,None), + (5,2,"GtkBox",None,1,None,None,None,None,None), + (5,3,"GtkImage","resetWifiStrength",2,None,None,None,None,None), + (5,4,"GtkLabel","resetWifiLabel",2,None,None,None,1,None), + (5,5,"GtkButton","resetWifiButton",2,None,None,None,2,None) </object> <object_property> (3,2,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None), @@ -66,8 +74,8 @@ (3,5,"AdwWindowTitle","title","ReSet",None,None,None,None,None,None,None,None,None), (3,6,"AdwNavigationSplitView","content",None,None,None,None,None,8,None,None,None,None), (3,6,"AdwNavigationSplitView","sidebar",None,None,None,None,None,7,None,None,None,None), + (3,6,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None), (3,7,"AdwNavigationPage","child",None,None,None,None,None,73,None,None,None,None), - (3,8,"AdwNavigationPage","child",None,None,None,None,None,114,None,None,None,None), (3,8,"GtkWidget","margin-bottom","20",None,None,None,None,None,None,None,None,None), (3,8,"GtkWidget","margin-end","20",None,None,None,None,None,None,None,None,None), (3,8,"GtkWidget","margin-start","20",None,None,None,None,None,None,None,None,None), @@ -122,23 +130,37 @@ (3,112,"GtkImage","icon-name","audio-headset-symbolic",None,None,None,None,None,None,None,None,None), (3,112,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None), (3,113,"GtkLabel","label","Audio",None,None,None,None,None,None,None,None,None), - (4,3,"GtkImage","icon-name","network-wireless-symbolic",None,None,None,None,None,None,None,None,None), - (4,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None), - (4,4,"GtkLabel","label","LoremIpsumInternet",None,None,None,None,None,None,None,None,None), - (4,4,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None), - (4,4,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None), - (4,5,"GtkButton","icon-name","emblem-system-symbolic",None,None,None,None,None,None,None,None,None), - (4,5,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None), - (4,5,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), + (3,116,"GtkFlowBox","column-spacing","25",None,None,None,None,None,None,None,None,None), + (3,116,"GtkFlowBox","homogeneous","True",None,None,None,None,None,None,None,None,None), + (3,116,"GtkFlowBox","row-spacing","25",None,None,None,None,None,None,None,None,None), + (3,116,"GtkFlowBox","selection-mode","none",None,None,None,None,None,None,None,None,None), + (3,116,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), (4,7,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None), + (4,7,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None), + (4,7,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), + (4,8,"AdwClampScrollable","maximum-size","0",None,None,None,None,None,None,None,None,None), (4,8,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None), (4,9,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None), + (4,9,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), (4,10,"GtkLabel","justify","right",None,None,None,None,None,None,None,None,None), (4,10,"GtkLabel","label","Available networks",None,None,None,None,None,None,None,None,None), (4,10,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None), + (4,11,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), (4,42,"GtkButton","label","Advanced",None,None,None,None,None,None,None,None,None), (4,42,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None), - (4,42,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None) + (4,42,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), + (5,3,"GtkImage","icon-name","network-wireless-symbolic",None,None,None,None,None,None,None,None,None), + (5,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None), + (5,4,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None), + (5,4,"GtkLabel","label","LoremIpsumInternet",None,None,None,None,None,None,None,None,None), + (5,4,"GtkLabel","single-line-mode","True",None,None,None,None,None,None,None,None,None), + (5,4,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None), + (5,4,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None), + (5,4,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None), + (5,4,"GtkWidget","width-request","200",None,None,None,None,None,None,None,None,None), + (5,5,"GtkButton","icon-name","emblem-system-symbolic",None,None,None,None,None,None,None,None,None), + (5,5,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None), + (5,5,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None) </object_property> <object_data> (3,76,"GtkWidget",2,2,None,1,None,None,None,None), diff --git a/src/resources/resetWiFi.ui b/src/resources/resetWiFi.ui index 3112867..39d0336 100644 --- a/src/resources/resetWiFi.ui +++ b/src/resources/resetWiFi.ui @@ -1,40 +1,20 @@ <?xml version='1.0' encoding='UTF-8'?> <!-- Created with Cambalache 0.17.0 --> <interface> - <object class="GtkListBoxRow" id="resetWifiEntry"> - <child> - <object class="GtkBox"> - <child> - <object class="GtkImage" id="resetWifiStrength"> - <property name="icon-name">network-wireless-symbolic</property> - <property name="margin-end">15</property> - </object> - </child> - <child> - <object class="GtkLabel" id="resetWifiLabel"> - <property name="hexpand">True</property> - <property name="label">LoremIpsumInternet</property> - <property name="xalign">0.0</property> - </object> - </child> - <child> - <object class="GtkButton" id="resetWifiButton"> - <property name="halign">start</property> - <property name="icon-name">emblem-system-symbolic</property> - <property name="valign">center</property> - </object> - </child> - </object> - </child> - </object> - <object class="GtkBox" id="resetWifi"> + <requires lib="gtk" version="4.12"/> + <requires lib="libadwaita" version="1.4"/> + <template class="resetWifi" parent="GtkBox"> + <property name="halign">start</property> <property name="orientation">vertical</property> + <property name="valign">start</property> <child> <object class="AdwClampScrollable"> + <property name="maximum-size">0</property> <property name="orientation">vertical</property> <child> <object class="GtkBox"> <property name="orientation">vertical</property> + <property name="valign">start</property> <child> <object class="GtkLabel"> <property name="halign">start</property> @@ -43,7 +23,30 @@ </object> </child> <child> - <object class="GtkListBox" id="resetWifiList"/> + <object class="GtkListBox" id="resetWifiList"> + <property name="valign">start</property> + <child> + <object class="resetWifiEntry"/> + </child> + <child> + <object class="resetWifiEntry"/> + </child> + <child> + <object class="resetWifiEntry"/> + </child> + <child> + <object class="resetWifiEntry"/> + </child> + <child> + <object class="resetWifiEntry"/> + </child> + <child> + <object class="resetWifiEntry"/> + </child> + <child> + <object class="resetWifiEntry"/> + </child> + </object> </child> </object> </child> @@ -56,6 +59,5 @@ <property name="valign">start</property> </object> </child> - </object> - <object class="AdwToast"/> + </template> </interface> diff --git a/src/resources/resetWifiEntry.ui b/src/resources/resetWifiEntry.ui new file mode 100644 index 0000000..1f1c503 --- /dev/null +++ b/src/resources/resetWifiEntry.ui @@ -0,0 +1,35 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Created with Cambalache 0.17.0 --> +<interface> + <requires lib="gtk" version="4.12"/> + <template class="resetWifiEntry" parent="GtkListBoxRow"> + <child> + <object class="GtkBox"> + <child> + <object class="GtkImage" id="resetWifiStrength"> + <property name="icon-name">network-wireless-symbolic</property> + <property name="margin-end">15</property> + </object> + </child> + <child> + <object class="GtkLabel" id="resetWifiLabel"> + <property name="ellipsize">end</property> + <property name="hexpand">True</property> + <property name="label">LoremIpsumInternet</property> + <property name="margin-end">10</property> + <property name="single-line-mode">True</property> + <property name="width-request">200</property> + <property name="xalign">0.0</property> + </object> + </child> + <child> + <object class="GtkButton" id="resetWifiButton"> + <property name="halign">start</property> + <property name="icon-name">emblem-system-symbolic</property> + <property name="valign">center</property> + </object> + </child> + </object> + </child> + </template> +</interface> diff --git a/src/resources/resources.gresource.xml b/src/resources/resources.gresource.xml index 26a1a8f..36eb403 100644 --- a/src/resources/resources.gresource.xml +++ b/src/resources/resources.gresource.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/org/xetibo/reset/"> + <file compressed="true" preprocess="xml-stripblanks">resetWifiEntry.ui</file> + <file compressed="true" preprocess="xml-stripblanks">resetWiFi.ui</file> <file compressed="true" preprocess="xml-stripblanks">resetMainWindow.ui</file> -<!-- <file compressed="true" preprocess="xml-stripblanks">resetWiFi.ui</file>--> </gresource> </gresources> diff --git a/src/wifi/mod.rs b/src/wifi/mod.rs new file mode 100644 index 0000000..794b6ab --- /dev/null +++ b/src/wifi/mod.rs @@ -0,0 +1,33 @@ +#![allow(non_snake_case)] + +mod wifiBox; +mod wifiEntry; + +use adw::glib::Object; +use gtk::{glib}; +use gtk::prelude::WidgetExt; +use gtk::subclass::prelude::*; + +glib::wrapper! { + pub struct WifiBox(ObjectSubclass<wifiBox::WifiBox>) + @extends gtk::Box, gtk::Widget, + @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; +} + +glib::wrapper! { + pub struct WifiEntry(ObjectSubclass<wifiEntry::WifiEntry>) + @extends gtk::Widget, + @implements gtk::Accessible, gtk::Buildable, gtk::Actionable, gtk::ConstraintTarget; +} + +impl WifiBox { + pub fn new() -> Self { + Object::builder().build() + } +} + +impl WifiEntry { + fn onClick(&self) { + self.imp().resetWifiButton.set_tooltip_text(Option::from("asd")); + } +} \ No newline at end of file diff --git a/src/wifi/wifiBox.rs b/src/wifi/wifiBox.rs new file mode 100644 index 0000000..416bd51 --- /dev/null +++ b/src/wifi/wifiBox.rs @@ -0,0 +1,43 @@ +use gtk::{CompositeTemplate, glib, ListBox}; +use gtk::prelude::*; +use gtk::subclass::prelude::*; +use crate::wifi::WifiEntry; + + +#[allow(non_snake_case)] +#[derive(Default, CompositeTemplate)] +#[template(resource = "/org/xetibo/reset/resetWiFi.ui")] +pub struct WifiBox { + #[template_child] + pub resetWifiList: TemplateChild<ListBox>, +} + +#[glib::object_subclass] +impl ObjectSubclass for WifiBox { + const NAME: &'static str = "resetWifi"; + type Type = super::WifiBox; + type ParentType = gtk::Box; + + fn class_init(klass: &mut Self::Class) { + WifiEntry::ensure_type(); + klass.bind_template(); + } + + fn instance_init(obj: &glib::subclass::InitializingObject<Self>) { + obj.init_template(); + } +} + +impl ObjectImpl for WifiBox { + fn constructed(&self) { + self.parent_constructed(); + } +} + +impl BoxImpl for WifiBox {} + +impl WidgetImpl for WifiBox {} + +impl WindowImpl for WifiBox {} + +impl ApplicationWindowImpl for WifiBox {} diff --git a/src/wifi/wifiEntry.rs b/src/wifi/wifiEntry.rs new file mode 100644 index 0000000..8bf60cd --- /dev/null +++ b/src/wifi/wifiEntry.rs @@ -0,0 +1,39 @@ +use gtk::{Button, CompositeTemplate, glib}; +use gtk::subclass::prelude::*; + +#[allow(non_snake_case)] +#[derive(Default, CompositeTemplate)] +#[template(resource = "/org/xetibo/reset/resetWifiEntry.ui")] +pub struct WifiEntry { + #[template_child] + pub resetWifiButton: TemplateChild<Button>, +} + +#[glib::object_subclass] +impl ObjectSubclass for WifiEntry { + const NAME: &'static str = "resetWifiEntry"; + type Type = super::WifiEntry; + type ParentType = gtk::ListBoxRow; + + fn class_init(klass: &mut Self::Class) { + klass.bind_template(); + } + + fn instance_init(obj: &glib::subclass::InitializingObject<Self>) { + obj.init_template(); + } +} + +impl ObjectImpl for WifiEntry { + fn constructed(&self) { + self.parent_constructed(); + } +} + +impl ListBoxRowImpl for WifiEntry {} + +impl WidgetImpl for WifiEntry {} + +impl WindowImpl for WifiEntry {} + +impl ApplicationWindowImpl for WifiEntry {} diff --git a/src/window/imp.rs b/src/window/imp.rs index b0168bd..301d527 100644 --- a/src/window/imp.rs +++ b/src/window/imp.rs @@ -1,12 +1,22 @@ +use adw::glib::StaticTypeExt; use adw::subclass::prelude::AdwApplicationWindowImpl; use glib::subclass::InitializingObject; use gtk::subclass::prelude::*; -use gtk::{glib, CompositeTemplate}; +use gtk::{glib, CompositeTemplate, SearchEntry, Label, ListBox, FlowBox}; +use crate::wifi::WifiBox; +#[allow(non_snake_case)] #[derive(CompositeTemplate, Default)] #[template(resource = "/org/xetibo/reset/resetMainWindow.ui")] pub struct Window { - // todo i guess + #[template_child] + pub resetSearchEntry: TemplateChild<SearchEntry>, + #[template_child] + pub resetSidebarList: TemplateChild<ListBox>, + #[template_child] + pub resetMain: TemplateChild<FlowBox>, + #[template_child] + pub test: TemplateChild<Label>, } #[glib::object_subclass] @@ -16,6 +26,7 @@ impl ObjectSubclass for Window { type ParentType = adw::ApplicationWindow; fn class_init(klass: &mut Self::Class) { + WifiBox::ensure_type(); klass.bind_template(); } @@ -24,7 +35,24 @@ impl ObjectSubclass for Window { } } -impl ObjectImpl for Window {} +impl ObjectImpl for Window { + fn constructed(&self) { + self.parent_constructed(); + + let object = self.obj(); + object.setupCallback(); + + let wifibox = WifiBox::new(); + let wifibox2 = WifiBox::new(); + let wifibox3 = WifiBox::new(); + let wifibox4 = WifiBox::new(); + + self.resetMain.insert(&wifibox, -1); + self.resetMain.insert(&wifibox2, -1); + self.resetMain.insert(&wifibox3, -1); + self.resetMain.insert(&wifibox4, -1); + } +} impl WidgetImpl for Window {} diff --git a/src/window/mod.rs b/src/window/mod.rs index 5809612..721ac5d 100644 --- a/src/window/mod.rs +++ b/src/window/mod.rs @@ -1,7 +1,10 @@ mod imp; +use adw::glib::clone; +use adw::subclass::prelude::ObjectSubclassIsExt; use glib::Object; use gtk::{gio, glib, Application}; +use gtk::prelude::*; glib::wrapper! { pub struct Window(ObjectSubclass<imp::Window>) @@ -10,11 +13,48 @@ glib::wrapper! { gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager; } +#[allow(non_snake_case)] impl Window { pub fn new(app: &Application) -> Self { - // Create new window - Object::builder() - .property("application", app) - .build() + Object::builder().property("application", app).build() + } + + fn setupCallback(&self) { + self.imp() + .resetSearchEntry + .connect_search_changed(clone!(@ weak self as window => move |_| { + window.setText(); + window.filterList(); + })); + } + + fn setText(&self) { + let buffer = self.imp() + .resetSearchEntry + .text() + .to_string(); + self.imp() + .test + .set_text(&buffer); + } + + fn filterList(&self) { + let text = self.imp() + .resetSearchEntry + .text() + .to_string(); + self.imp().resetSidebarList.set_filter_func(move |x| { + if text == "" { + return true; + } + if let Some(child) = x.child() { + let result = child.downcast::<gtk::Box>().unwrap(); + let label = result.last_child().unwrap().downcast::<gtk::Label>().unwrap(); + if label.text().to_lowercase().contains(&text.to_lowercase()) { + return true; + } + } + return false; + }); } } \ No newline at end of file