mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-02 17:45:28 +00:00
implement button state restore after timeout
This commit is contained in:
parent
9945002efa
commit
1c400fdd23
5 changed files with 81 additions and 22 deletions
|
|
@ -5,6 +5,7 @@ use adw::{
|
||||||
AlertDialog, ResponseAppearance,
|
AlertDialog, ResponseAppearance,
|
||||||
};
|
};
|
||||||
use gtk::{
|
use gtk::{
|
||||||
|
glib::timeout_add_seconds_local_once,
|
||||||
prelude::{ButtonExt, WidgetExt},
|
prelude::{ButtonExt, WidgetExt},
|
||||||
Button,
|
Button,
|
||||||
};
|
};
|
||||||
|
|
@ -83,6 +84,14 @@ impl Drop {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
button.set_label("List item not found")
|
button.set_label("List item not found")
|
||||||
}
|
}
|
||||||
|
timeout_add_seconds_local_once(1, {
|
||||||
|
let button = button.clone();
|
||||||
|
move || {
|
||||||
|
button.remove_css_class("error");
|
||||||
|
button.remove_css_class("success");
|
||||||
|
button.set_label(LABEL)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use super::{
|
||||||
};
|
};
|
||||||
use crate::Profile;
|
use crate::Profile;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
glib::Uri,
|
glib::{timeout_add_seconds_local_once, Uri},
|
||||||
prelude::{ButtonExt, WidgetExt},
|
prelude::{ButtonExt, WidgetExt},
|
||||||
Button,
|
Button,
|
||||||
};
|
};
|
||||||
|
|
@ -107,6 +107,14 @@ impl Exit for Button {
|
||||||
button.set_label(&e.to_string())
|
button.set_label(&e.to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
timeout_add_seconds_local_once(1, {
|
||||||
|
let button = button.clone();
|
||||||
|
move || {
|
||||||
|
button.remove_css_class("error");
|
||||||
|
button.remove_css_class("success");
|
||||||
|
button.set_label(LABEL)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use super::WidgetAction;
|
use super::WidgetAction;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
gio::{Cancellable, ListStore, TlsCertificate},
|
gio::{Cancellable, ListStore, TlsCertificate},
|
||||||
glib::{gformat, GString},
|
glib::{gformat, timeout_add_seconds_local_once, GString},
|
||||||
prelude::{ButtonExt, FileExt, TlsCertificateExt, WidgetExt},
|
prelude::{ButtonExt, FileExt, TlsCertificateExt, WidgetExt},
|
||||||
Button, FileDialog, FileFilter, Window,
|
Button, FileDialog, FileFilter, Window,
|
||||||
};
|
};
|
||||||
|
|
@ -89,7 +89,18 @@ impl File {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
button.set_sensitive(true); // unlock
|
button.set_sensitive(true); // unlock
|
||||||
widget_action.update.activate()
|
widget_action.update.activate();
|
||||||
|
|
||||||
|
// Renew button with timeout
|
||||||
|
timeout_add_seconds_local_once(1, {
|
||||||
|
let button = button.clone();
|
||||||
|
move || {
|
||||||
|
button.remove_css_class("error");
|
||||||
|
button.remove_css_class("success");
|
||||||
|
button.remove_css_class("warning");
|
||||||
|
button.set_label(LABEL)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use super::list::{item::Value, List};
|
||||||
use crate::profile::Profile;
|
use crate::profile::Profile;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
gio::{Cancellable, FileCreateFlags, ListStore},
|
gio::{Cancellable, FileCreateFlags, ListStore},
|
||||||
glib::Priority,
|
glib::{timeout_add_seconds_local_once, Priority},
|
||||||
prelude::{ButtonExt, FileExt, OutputStreamExtManual, WidgetExt},
|
prelude::{ButtonExt, FileExt, OutputStreamExtManual, WidgetExt},
|
||||||
Button, FileDialog, FileFilter, Window,
|
Button, FileDialog, FileFilter, Window,
|
||||||
};
|
};
|
||||||
|
|
@ -14,6 +14,7 @@ use std::{path::MAIN_SEPARATOR, rc::Rc};
|
||||||
const LABEL: &str = "Export";
|
const LABEL: &str = "Export";
|
||||||
const TOOLTIP_TEXT: &str = "Export selected identity to file";
|
const TOOLTIP_TEXT: &str = "Export selected identity to file";
|
||||||
const MARGIN: i32 = 8;
|
const MARGIN: i32 = 8;
|
||||||
|
const TIMEOUT_RENEW: u32 = 1; // seconds
|
||||||
|
|
||||||
pub struct Save {
|
pub struct Save {
|
||||||
pub button: Button,
|
pub button: Button,
|
||||||
|
|
@ -88,7 +89,8 @@ impl Save {
|
||||||
Cancellable::NONE, // @TODO
|
Cancellable::NONE, // @TODO
|
||||||
{
|
{
|
||||||
let button = button.clone();
|
let button = button.clone();
|
||||||
move |result| match result {
|
move |result| {
|
||||||
|
match result {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
button.set_css_classes(&[
|
button.set_css_classes(&[
|
||||||
"success",
|
"success",
|
||||||
|
|
@ -102,19 +104,25 @@ impl Save {
|
||||||
button.set_css_classes(&[
|
button.set_css_classes(&[
|
||||||
"error",
|
"error",
|
||||||
]);
|
]);
|
||||||
button.set_label(&e.to_string())
|
button.set_label(
|
||||||
|
&e.to_string(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
renew_button(&button, TIMEOUT_RENEW)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
button.set_label(&e.to_string())
|
button.set_label(&e.to_string());
|
||||||
|
renew_button(&button, TIMEOUT_RENEW)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
button.set_css_classes(&["warning"]);
|
button.set_css_classes(&["warning"]);
|
||||||
button.set_label(e.message())
|
button.set_label(e.message());
|
||||||
|
renew_button(&button, TIMEOUT_RENEW)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
button.set_sensitive(true); // unlock
|
button.set_sensitive(true); // unlock
|
||||||
|
|
@ -123,7 +131,8 @@ impl Save {
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
button.set_label(&e.to_string())
|
button.set_label(&e.to_string());
|
||||||
|
renew_button(&button, TIMEOUT_RENEW)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -142,3 +151,16 @@ impl Save {
|
||||||
self.button.set_visible(is_visible)
|
self.button.set_visible(is_visible)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return default button state after timeout
|
||||||
|
fn renew_button(button: &Button, timeout: u32) {
|
||||||
|
timeout_add_seconds_local_once(timeout, {
|
||||||
|
let button = button.clone();
|
||||||
|
move || {
|
||||||
|
button.remove_css_class("error");
|
||||||
|
button.remove_css_class("success");
|
||||||
|
button.remove_css_class("warning");
|
||||||
|
button.set_label(LABEL)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ use adw::{
|
||||||
AlertDialog, ResponseAppearance,
|
AlertDialog, ResponseAppearance,
|
||||||
};
|
};
|
||||||
use gtk::{
|
use gtk::{
|
||||||
|
glib::timeout_add_seconds_local_once,
|
||||||
prelude::{ButtonExt, WidgetExt},
|
prelude::{ButtonExt, WidgetExt},
|
||||||
Button,
|
Button,
|
||||||
};
|
};
|
||||||
|
|
@ -83,6 +84,14 @@ impl Drop for Button {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
button.set_label("List item not found")
|
button.set_label("List item not found")
|
||||||
}
|
}
|
||||||
|
timeout_add_seconds_local_once(1, {
|
||||||
|
let button = button.clone();
|
||||||
|
move || {
|
||||||
|
button.remove_css_class("error");
|
||||||
|
button.remove_css_class("success");
|
||||||
|
button.set_label(LABEL)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
button.set_css_classes(&["error"]);
|
button.set_css_classes(&["error"]);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue