mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-12 08:28:32 +02:00
feat: Add popups for password
This commit is contained in:
parent
5575acf00f
commit
7d0fc0b9e7
|
@ -1,17 +1,17 @@
|
|||
use adw::glib;
|
||||
use adw::glib::{IsA, Object};
|
||||
use gtk::Widget;
|
||||
use adw::glib::Object;
|
||||
use gtk::{gdk, Editable, Popover};
|
||||
|
||||
use super::popupImpl;
|
||||
|
||||
glib::wrapper! {
|
||||
pub struct Popup(ObjectSubclass<popupImpl::Popup>)
|
||||
@extends adw::Window, gtk::Widget,
|
||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||
@extends Popover, gtk::Widget,
|
||||
@implements Editable,gdk::Popup, gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||
}
|
||||
|
||||
impl Popup {
|
||||
pub fn new(child: &impl IsA<Widget>) -> Self {
|
||||
pub fn new() -> Self {
|
||||
let popup: Popup = Object::builder().build();
|
||||
// popup.set_child(child);
|
||||
popup
|
||||
|
|
|
@ -1,19 +1,35 @@
|
|||
use std::cell::RefCell;
|
||||
use std::sync::Arc;
|
||||
|
||||
use adw::subclass::prelude::{ActionRowImpl, PreferencesRowImpl};
|
||||
use adw::subclass::window::AdwWindowImpl;
|
||||
use gtk::gdk_pixbuf::subclass::prelude::{
|
||||
PixbufAnimationImpl, PixbufAnimationIterImpl, PixbufLoaderImpl,
|
||||
};
|
||||
use gtk::prelude::PopupExt;
|
||||
use gtk::subclass::prelude::*;
|
||||
use gtk::{glib, CompositeTemplate};
|
||||
use gtk::{
|
||||
gdk, glib, Button, CompositeTemplate, Entry, EntryBuffer, PasswordEntry, PasswordEntryBuffer, Popover,
|
||||
};
|
||||
|
||||
use super::popup;
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
#[derive(Default, CompositeTemplate)]
|
||||
#[template(resource = "/org/Xetibo/ReSet/resetPopup.ui")]
|
||||
pub struct Popup {}
|
||||
pub struct Popup {
|
||||
#[template_child]
|
||||
pub resetPopupEntry: TemplateChild<PasswordEntry>,
|
||||
#[template_child]
|
||||
pub resetPopupButton: TemplateChild<Button>,
|
||||
pub resetPopupText: Arc<RefCell<PasswordEntryBuffer>>,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
impl ObjectSubclass for Popup {
|
||||
const NAME: &'static str = "resetPopup";
|
||||
type Type = popup::Popup;
|
||||
type ParentType = adw::Window;
|
||||
type ParentType = Popover;
|
||||
|
||||
fn class_init(klass: &mut Self::Class) {
|
||||
klass.bind_template();
|
||||
|
@ -30,12 +46,12 @@ impl ObjectImpl for Popup {
|
|||
}
|
||||
}
|
||||
|
||||
impl BoxImpl for Popup {}
|
||||
|
||||
impl WidgetImpl for Popup {}
|
||||
|
||||
impl AdwWindowImpl for Popup {}
|
||||
|
||||
impl WindowImpl for Popup {}
|
||||
|
||||
impl PopoverImpl for Popup {}
|
||||
|
||||
impl ApplicationWindowImpl for Popup {}
|
||||
|
||||
impl EditableImpl for Popup {}
|
||||
|
|
|
@ -109,6 +109,7 @@ pub fn scanForWifi(wifiBox: Arc<WifiBox>) {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub async fn wat() -> Vec<AccessPoint> {
|
||||
let conn = Connection::new_session().unwrap();
|
||||
let proxy = conn.with_proxy(
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
use crate::components::base::popup::{self, Popup};
|
||||
use crate::components::wifi::wifiEntryImpl;
|
||||
use adw::glib;
|
||||
use adw::glib::{Object, PropertySet};
|
||||
use adw::prelude::{ButtonExt, EditableExt, EntryExt, PopoverExt};
|
||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||
use dbus::blocking::Connection;
|
||||
use dbus::Error;
|
||||
use glib::clone;
|
||||
use glib::{clone, Cast};
|
||||
use gtk::prelude::WidgetExt;
|
||||
use gtk::GestureClick;
|
||||
use gtk::{AlertDialog, Editable, GestureClick, PasswordEntry, PasswordEntryBuffer, Window};
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
use ReSet_Lib::network::network::{AccessPoint, WifiStrength};
|
||||
|
@ -75,6 +78,14 @@ impl WifiEntry {
|
|||
}
|
||||
|
||||
pub fn click_stored_network(entry: Arc<WifiEntry>) {
|
||||
let alert = AlertDialog::builder().build();
|
||||
let root = &entry.root().unwrap();
|
||||
let root = root.downcast_ref::<gtk::Window>();
|
||||
if root.is_none() {
|
||||
println!("ERROR BRO");
|
||||
return;
|
||||
}
|
||||
let root = root.unwrap();
|
||||
// TODO handle unknown access point -> should be done by having 2 different categories
|
||||
let entryImp = entry.imp();
|
||||
let conn = Connection::new_session().unwrap();
|
||||
|
@ -88,12 +99,14 @@ pub fn click_stored_network(entry: Arc<WifiEntry>) {
|
|||
let res: Result<(bool,), Error> =
|
||||
proxy.method_call("org.xetibo.ReSet", "DisconnectFromCurrentAccessPoint", ());
|
||||
if res.is_err() {
|
||||
// TODO handle error
|
||||
println!("no worky");
|
||||
alert.set_message("Error on connecting to dbus.");
|
||||
alert.show(Some(root));
|
||||
return;
|
||||
}
|
||||
let (res,) = res.unwrap();
|
||||
if res == false {
|
||||
alert.set_message("Could not disconnect from access point.");
|
||||
alert.show(Some(root));
|
||||
} else {
|
||||
entryImp.resetWifiConnected.get().set_from_icon_name(None);
|
||||
let mut access_point = entryImp.accessPoint.borrow_mut();
|
||||
|
@ -108,14 +121,14 @@ pub fn click_stored_network(entry: Arc<WifiEntry>) {
|
|||
(access_point,),
|
||||
);
|
||||
if res.is_err() {
|
||||
// TODO handle error
|
||||
println!("no worky");
|
||||
alert.set_message("Error on connecting to dbus.");
|
||||
alert.show(Some(root));
|
||||
} else {
|
||||
let (res,) = res.unwrap();
|
||||
if res == false {
|
||||
println!("no worky but it connected");
|
||||
alert.set_message("Could not connect to access point.");
|
||||
alert.show(Some(root));
|
||||
} else {
|
||||
println!("worky");
|
||||
entryImp
|
||||
.resetWifiConnected
|
||||
.get()
|
||||
|
@ -127,5 +140,62 @@ pub fn click_stored_network(entry: Arc<WifiEntry>) {
|
|||
}
|
||||
|
||||
pub fn click_new_network(entry: Arc<WifiEntry>) {
|
||||
println!("Not implemented yet :)");
|
||||
let connect_new_network =
|
||||
|entry: Arc<WifiEntry>, access_point: AccessPoint, password: String| -> bool {
|
||||
let alert = AlertDialog::builder().build();
|
||||
let root = &entry.root().unwrap();
|
||||
let root = root.downcast_ref::<gtk::Window>();
|
||||
if root.is_none() {
|
||||
println!("ERROR BRO");
|
||||
return false;
|
||||
}
|
||||
let root = root.unwrap();
|
||||
let conn = Connection::new_session().unwrap();
|
||||
let proxy = conn.with_proxy(
|
||||
"org.xetibo.ReSet",
|
||||
"/org/xetibo/ReSet",
|
||||
Duration::from_millis(10000),
|
||||
);
|
||||
// TODO crate spinner animation and block UI
|
||||
let res: Result<(bool,), Error> = proxy.method_call(
|
||||
"org.xetibo.ReSet",
|
||||
"ConnectToNewAccessPoint",
|
||||
(access_point, password),
|
||||
);
|
||||
if res.is_err() {
|
||||
alert.set_message("Could not connect to dbus.");
|
||||
alert.show(Some(root));
|
||||
return false;
|
||||
}
|
||||
if res.unwrap() == (false,) {
|
||||
alert.set_message("Could not connect to access point.");
|
||||
alert.show(Some(root));
|
||||
return false;
|
||||
}
|
||||
true
|
||||
};
|
||||
|
||||
let result = Arc::new(AtomicBool::new(false));
|
||||
let result_ref = result.clone();
|
||||
let entryImp = entry.imp();
|
||||
let popupImp = entryImp.resetWifiPopup.imp();
|
||||
popupImp
|
||||
.resetPopupEntry
|
||||
.connect_activate(clone!(@weak entry as origEntry, @weak entryImp => move |entry| {
|
||||
result_ref.store(
|
||||
connect_new_network(origEntry, entryImp.accessPoint.clone().take(), entry.text().to_string()),
|
||||
std::sync::atomic::Ordering::SeqCst,
|
||||
);
|
||||
entryImp.resetWifiPopup.popdown();
|
||||
}));
|
||||
popupImp
|
||||
.resetPopupButton
|
||||
.connect_clicked(clone!(@weak popupImp => move |_| {
|
||||
popupImp.resetPopupEntry.activate();
|
||||
}));
|
||||
entryImp.resetWifiPopup.popup();
|
||||
println!(
|
||||
"result is {}",
|
||||
result.load(std::sync::atomic::Ordering::SeqCst)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
use std::cell::RefCell;
|
||||
use ReSet_Lib::network::network::{WifiStrength, AccessPoint};
|
||||
use gtk::{Button, CompositeTemplate, glib, Image, Label, Gesture, GestureClick};
|
||||
use gtk::subclass::prelude::*;
|
||||
use crate::components::base::popup::Popup;
|
||||
use crate::components::wifi::wifiEntry;
|
||||
use gtk::subclass::prelude::*;
|
||||
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)]
|
||||
|
@ -20,6 +21,8 @@ pub struct WifiEntry {
|
|||
pub resetWifiConnected: TemplateChild<Image>,
|
||||
#[template_child]
|
||||
pub resetWifiStored: TemplateChild<Image>,
|
||||
#[template_child]
|
||||
pub resetWifiPopup: TemplateChild<Popup>,
|
||||
pub wifiName: RefCell<String>,
|
||||
pub wifiStrength: RefCell<WifiStrength>,
|
||||
pub accessPoint: RefCell<AccessPoint>,
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Cambalache 0.17.0 -->
|
||||
<interface>
|
||||
<requires lib="gtk" version="4.12"/>
|
||||
<requires lib="libadwaita" version="1.0"/>
|
||||
<template class="resetPasswordPopup" parent="AdwWindow">
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<child>
|
||||
<object class="GtkEntry" id="resetWifiPasswordEntry">
|
||||
<property name="activates-default">True</property>
|
||||
<property name="invisible-char-set">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="resetWifiPasswordButton">
|
||||
<property name="label">connect</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
31
src/resources/resetPopup.ui
Normal file
31
src/resources/resetPopup.ui
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Cambalache 0.17.0 -->
|
||||
<interface>
|
||||
<requires lib="gtk" version="4.12"/>
|
||||
<template class="resetPopup" parent="GtkPopover">
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<child>
|
||||
<object class="GtkPasswordEntry" id="resetPopupEntry">
|
||||
<property name="activates-default">True</property>
|
||||
<property name="margin-bottom">5</property>
|
||||
<property name="margin-end">5</property>
|
||||
<property name="margin-start">5</property>
|
||||
<property name="margin-top">5</property>
|
||||
<property name="placeholder-text">Wifi Password</property>
|
||||
<property name="show-peek-icon">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="resetPopupButton">
|
||||
<property name="label">connect</property>
|
||||
<property name="margin-bottom">5</property>
|
||||
<property name="margin-end">5</property>
|
||||
<property name="margin-start">5</property>
|
||||
<property name="margin-top">5</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
|
@ -14,7 +14,7 @@
|
|||
(13,1,None,"resetMicSourceEntry.ui",None,None,None,None,None,None,None),
|
||||
(14,1,None,"resetSettingBox.ui",None,None,None,None,None,None,None),
|
||||
(15,1,None,"resetListBoxRow.ui",None,None,None,None,None,None,None),
|
||||
(16,1,None,"resetPasswordPopup.ui",None,None,None,None,None,None,None)
|
||||
(16,6,None,"resetPopup.ui",None,None,None,None,None,None,None)
|
||||
</ui>
|
||||
<object>
|
||||
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," <child>\n <object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\">\n </object>\n </child>"),
|
||||
|
@ -83,6 +83,7 @@
|
|||
(5,7,"GtkButton","resetWifiButton",2,None,None,None,4,None),
|
||||
(5,8,"GtkImage","resetWifiConnected",2,None,None,None,3,None),
|
||||
(5,10,"GtkImage","resetWifiStored",2,None,None,None,2,None),
|
||||
(5,11,"resetPopup","resetWifiPopup",2,None,None,None,-1,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),
|
||||
|
@ -156,10 +157,10 @@
|
|||
(13,10,"GtkProgressBar","resetMicMeter",1,None,None,None,2,None),
|
||||
(14,1,"GtkBox","resetSetting",None,None,None,None,-1,None),
|
||||
(15,1,"GtkListBoxRow","resetListBoxRow",None,None,None,None,None,None),
|
||||
(16,1,"AdwWindow","resetPasswordPopup",None,None,None,None,-1,None),
|
||||
(16,2,"GtkBox",None,1,None,None,None,-1,None),
|
||||
(16,3,"GtkEntry","resetWifiPasswordEntry",2,None,None,None,-1,None),
|
||||
(16,4,"GtkButton","resetWifiPasswordButton",2,None,None,None,-1,None)
|
||||
(16,6,"GtkPopover","resetPopup",None,None,None,None,-1,None),
|
||||
(16,7,"GtkBox",None,6,None,None,None,None,None),
|
||||
(16,8,"GtkPasswordEntry","resetPopupEntry",7,None,None,None,None,None),
|
||||
(16,9,"GtkButton","resetPopupButton",7,None,None,None,1,None)
|
||||
</object>
|
||||
<object_property>
|
||||
(3,1,"GtkWindow","default-height","500",None,None,None,None,None,None,None,None,None),
|
||||
|
@ -477,9 +478,18 @@
|
|||
(14,1,"GtkWidget","width-request","500",None,None,None,None,None,None,None,None,None),
|
||||
(15,1,"GtkListBoxRow","selectable","False",None,None,None,None,None,None,None,None,None),
|
||||
(15,1,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
|
||||
(16,3,"GtkEntry","activates-default","True",None,None,None,None,None,None,None,None,None),
|
||||
(16,3,"GtkEntry","invisible-char-set","True",None,None,None,None,None,None,None,None,None),
|
||||
(16,4,"GtkButton","label","connect",None,None,None,None,None,None,None,None,None)
|
||||
(16,8,"GtkPasswordEntry","activates-default","True",None,None,None,None,None,None,None,None,None),
|
||||
(16,8,"GtkPasswordEntry","placeholder-text","Wifi Password",None,None,None,None,None,None,None,None,None),
|
||||
(16,8,"GtkPasswordEntry","show-peek-icon","True",None,None,None,None,None,None,None,None,None),
|
||||
(16,8,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,8,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,8,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,8,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,9,"GtkButton","label","connect",None,None,None,None,None,None,None,None,None),
|
||||
(16,9,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,9,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,9,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||
(16,9,"GtkWidget","margin-top","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),
|
||||
|
|
|
@ -4,6 +4,9 @@
|
|||
<requires lib="gtk" version="4.12"/>
|
||||
<template class="resetWifiEntry" parent="GtkBox">
|
||||
<property name="margin-start">5</property>
|
||||
<child>
|
||||
<object class="resetPopup" id="resetWifiPopup"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="width-request">35</property>
|
||||
|
|
|
@ -13,5 +13,6 @@
|
|||
<file compressed="true" preprocess="xml-stripblanks">resetAudioSourceEntry.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">resetMicrophone.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">resetMicSourceEntry.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
|
|
Loading…
Reference in a new issue