implement button state restore after timeout

This commit is contained in:
yggverse 2025-01-30 17:11:21 +02:00
parent 9945002efa
commit 1c400fdd23
5 changed files with 81 additions and 22 deletions

View file

@ -5,6 +5,7 @@ use adw::{
AlertDialog, ResponseAppearance,
};
use gtk::{
glib::timeout_add_seconds_local_once,
prelude::{ButtonExt, WidgetExt},
Button,
};
@ -83,6 +84,14 @@ impl Drop {
button.set_css_classes(&["error"]);
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) => {
button.set_css_classes(&["error"]);

View file

@ -4,7 +4,7 @@ use super::{
};
use crate::Profile;
use gtk::{
glib::Uri,
glib::{timeout_add_seconds_local_once, Uri},
prelude::{ButtonExt, WidgetExt},
Button,
};
@ -107,6 +107,14 @@ impl Exit for Button {
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) => {
button.set_css_classes(&["error"]);

View file

@ -1,7 +1,7 @@
use super::WidgetAction;
use gtk::{
gio::{Cancellable, ListStore, TlsCertificate},
glib::{gformat, GString},
glib::{gformat, timeout_add_seconds_local_once, GString},
prelude::{ButtonExt, FileExt, TlsCertificateExt, WidgetExt},
Button, FileDialog, FileFilter, Window,
};
@ -89,7 +89,18 @@ impl File {
}
}
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)
}
});
}
});
}

View file

@ -5,7 +5,7 @@ use super::list::{item::Value, List};
use crate::profile::Profile;
use gtk::{
gio::{Cancellable, FileCreateFlags, ListStore},
glib::Priority,
glib::{timeout_add_seconds_local_once, Priority},
prelude::{ButtonExt, FileExt, OutputStreamExtManual, WidgetExt},
Button, FileDialog, FileFilter, Window,
};
@ -14,6 +14,7 @@ use std::{path::MAIN_SEPARATOR, rc::Rc};
const LABEL: &str = "Export";
const TOOLTIP_TEXT: &str = "Export selected identity to file";
const MARGIN: i32 = 8;
const TIMEOUT_RENEW: u32 = 1; // seconds
pub struct Save {
pub button: Button,
@ -88,33 +89,40 @@ impl Save {
Cancellable::NONE, // @TODO
{
let button = button.clone();
move |result| match result {
Ok(_) => {
button.set_css_classes(&[
"success",
]);
button.set_label(&format!(
"Saved to {}",
file.parse_name()
))
}
Err((_, e)) => {
button.set_css_classes(&[
"error",
]);
button.set_label(&e.to_string())
move |result| {
match result {
Ok(_) => {
button.set_css_classes(&[
"success",
]);
button.set_label(&format!(
"Saved to {}",
file.parse_name()
))
}
Err((_, e)) => {
button.set_css_classes(&[
"error",
]);
button.set_label(
&e.to_string(),
)
}
}
renew_button(&button, TIMEOUT_RENEW)
}
},
),
Err(e) => {
button.set_css_classes(&["error"]);
button.set_label(&e.to_string())
button.set_label(&e.to_string());
renew_button(&button, TIMEOUT_RENEW)
}
},
Err(e) => {
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
@ -123,7 +131,8 @@ impl Save {
}
Err(e) => {
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)
}
}
/// 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)
}
});
}

View file

@ -5,6 +5,7 @@ use adw::{
AlertDialog, ResponseAppearance,
};
use gtk::{
glib::timeout_add_seconds_local_once,
prelude::{ButtonExt, WidgetExt},
Button,
};
@ -83,6 +84,14 @@ impl Drop for Button {
button.set_css_classes(&["error"]);
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) => {
button.set_css_classes(&["error"]);