@ -1,14 +1,16 @@
use adw ::{ prelude ::* , subclass ::prelude ::* } ;
use gettextrs ::gettext ;
use gtk ::{ self , glib , CompositeTemplate } ;
use gtk ::glib ;
use crate ::toast ;
use crate ::{ toast , APP_ID } ;
/// The possible error subpages.
#[ derive(Debug, Clone, Copy, strum::AsRefStr) ]
#[ strum(serialize_all = " kebab-case " ) ]
pub enum ErrorSubpage {
/// The page to present when there was an error with the secret API.
Secret ,
/// The page to present when there was an error when initializing a session.
Session ,
}
@ -17,19 +19,19 @@ mod imp {
use super ::* ;
#[ derive(Debug, Default, CompositeTemplate) ]
#[ derive(Debug, Default, gtk:: CompositeTemplate) ]
#[ template(resource = " /org/gnome/Fractal/ui/error_page.ui " ) ]
pub struct ErrorPage {
#[ template_child ]
pub stack : TemplateChild < gtk ::Stack > ,
stack : TemplateChild < gtk ::Stack > ,
#[ template_child ]
pub secret_error_page : TemplateChild < adw ::StatusPage > ,
secret_error_page : TemplateChild < adw ::StatusPage > ,
#[ template_child ]
pub linux_secret_instructions : TemplateChild < adw ::Clamp > ,
linux_secret_instructions : TemplateChild < adw ::Clamp > ,
#[ template_child ]
pub secret_service_override_command : TemplateChild < gtk ::Label > ,
secret_service_override_command : TemplateChild < gtk ::Label > ,
#[ template_child ]
pub session_error_page : TemplateChild < adw ::StatusPage > ,
session_error_page : TemplateChild < adw ::StatusPage > ,
}
#[ glib::object_subclass ]
@ -40,7 +42,7 @@ mod imp {
fn class_init ( klass : & mut Self ::Class ) {
Self ::bind_template ( klass ) ;
Self ::Type ::bind_template_callbacks ( klass ) ;
Self ::bind_template_callbacks ( klass ) ;
klass . set_accessible_role ( gtk ::AccessibleRole ::Group ) ;
}
@ -53,6 +55,45 @@ mod imp {
impl ObjectImpl for ErrorPage { }
impl WidgetImpl for ErrorPage { }
impl BinImpl for ErrorPage { }
#[ gtk::template_callbacks ]
impl ErrorPage {
/// Display the given secret error.
pub ( super ) fn display_secret_error ( & self , message : & str ) {
#[ cfg(not(target_os = " linux " )) ]
self . linux_secret_instructions . set_visible ( false ) ;
#[ cfg(target_os = " linux " ) ]
{
self . linux_secret_instructions . set_visible ( true ) ;
self . secret_service_override_command . set_markup ( & format! (
"<tt>flatpak --user override --talk-name=org.freedesktop.secrets {APP_ID}</tt>" ,
) ) ;
}
self . secret_error_page . set_description ( Some ( message ) ) ;
self . stack
. set_visible_child_name ( ErrorSubpage ::Secret . as_ref ( ) ) ;
}
/// Display the given session error.
pub ( super ) fn display_session_error ( & self , message : & str ) {
self . session_error_page . set_description ( Some ( message ) ) ;
self . stack
. set_visible_child_name ( ErrorSubpage ::Session . as_ref ( ) ) ;
}
/// Copy the secret service override command to the clipboard.
#[ template_callback ]
fn copy_secret_service_override_command ( & self ) {
let obj = self . obj ( ) ;
let command = self . secret_service_override_command . label ( ) ;
obj . clipboard ( )
. set_text ( command . trim_start_matches ( "<tt>" ) . trim_end_matches ( "</tt>" ) ) ;
toast ! ( obj , gettext ( "Command copied to clipboard" ) ) ;
}
}
}
glib ::wrapper ! {
@ -61,48 +102,18 @@ glib::wrapper! {
@ extends gtk ::Widget , adw ::Bin , @ implements gtk ::Accessible ;
}
#[ gtk::template_callbacks ]
impl ErrorPage {
pub fn new ( ) -> Self {
glib ::Object ::new ( )
}
/// Display the given secret error.
pub fn display_secret_error ( & self , message : & str ) {
let imp = self . imp ( ) ;
#[ cfg(not(target_os = " linux " )) ]
imp . linux_secret_instructions . set_visible ( false ) ;
#[ cfg(target_os = " linux " ) ]
{
imp . linux_secret_instructions . set_visible ( true ) ;
imp . secret_service_override_command . set_markup ( & format! (
"<tt>flatpak --user override --talk-name=org.freedesktop.secrets {}</tt>" ,
crate ::config ::APP_ID
) ) ;
}
imp . secret_error_page . set_description ( Some ( message ) ) ;
imp . stack
. set_visible_child_name ( ErrorSubpage ::Secret . as_ref ( ) ) ;
}
/// Copy the secret service override command to the clipboard.
#[ template_callback ]
fn copy_secret_service_override_command ( & self ) {
let command = self . imp ( ) . secret_service_override_command . label ( ) ;
self . clipboard ( )
. set_text ( command . trim_start_matches ( "<tt>" ) . trim_end_matches ( "</tt>" ) ) ;
toast ! ( self , gettext ( "Command copied to clipboard" ) ) ;
pub ( crate ) fn display_secret_error ( & self , message : & str ) {
self . imp ( ) . display_secret_error ( message ) ;
}
/// Display the given session error.
pub fn display_session_error ( & self , message : & str ) {
let imp = self . imp ( ) ;
imp . session_error_page . set_description ( Some ( message ) ) ;
imp . stack
. set_visible_child_name ( ErrorSubpage ::Session . as_ref ( ) ) ;
pub ( crate ) fn display_session_error ( & self , message : & str ) {
self . imp ( ) . display_session_error ( message ) ;
}
}