diff --git a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/drop.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/drop.rs index 14b7133c..14f1021c 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/drop.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/drop.rs @@ -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"]); diff --git a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/exit.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/exit.rs index a5d12c53..897d3eee 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/exit.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/exit.rs @@ -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"]); diff --git a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/file.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/file.rs index 3e7b9815..1f0dbdc8 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/file.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/file.rs @@ -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) + } + }); } }); } diff --git a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/save.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/save.rs index c0bdeda7..f6da5e50 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/save.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/identity/common/form/save.rs @@ -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) + } + }); +} diff --git a/src/app/browser/window/tab/item/page/navigation/request/search/form/drop.rs b/src/app/browser/window/tab/item/page/navigation/request/search/form/drop.rs index ab178eb2..b3195efa 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/search/form/drop.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/search/form/drop.rs @@ -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"]);