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, 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"]);

View file

@ -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"]);

View file

@ -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)
}
});
} }
}); });
} }

View file

@ -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,33 +89,40 @@ impl Save {
Cancellable::NONE, // @TODO Cancellable::NONE, // @TODO
{ {
let button = button.clone(); let button = button.clone();
move |result| match result { move |result| {
Ok(_) => { match result {
button.set_css_classes(&[ Ok(_) => {
"success", button.set_css_classes(&[
]); "success",
button.set_label(&format!( ]);
"Saved to {}", button.set_label(&format!(
file.parse_name() "Saved to {}",
)) file.parse_name()
} ))
Err((_, e)) => { }
button.set_css_classes(&[ Err((_, e)) => {
"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(&["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)
}
});
}

View file

@ -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"]);