mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 16:45:27 +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,
|
||||
};
|
||||
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"]);
|
||||
|
|
|
|||
|
|
@ -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"]);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue