From f977cac3fd7b0be411a528a669a064dd2d2d3f0f Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 23 Mar 2025 09:58:45 +0100 Subject: [PATCH] util: Add error toast helper --- src/album_page.rs | 20 ++------------ src/search_page.rs | 68 +++++++--------------------------------------- src/util.rs | 25 ++++++++++++++++- 3 files changed, 37 insertions(+), 76 deletions(-) diff --git a/src/album_page.rs b/src/album_page.rs index 7fb5712..3649f0d 100644 --- a/src/album_page.rs +++ b/src/album_page.rs @@ -1,16 +1,15 @@ use std::cell::OnceCell; use adw::subclass::prelude::*; -use gettextrs::gettext; use gtk::{ gio, - glib::{self, clone, Properties}, + glib::{self, Properties}, prelude::*, }; use crate::{ db::models::*, editor::album::AlbumEditor, library::Library, player::Player, - playlist_item::PlaylistItem, recording_tile::RecordingTile, util::error_dialog::ErrorDialog, + playlist_item::PlaylistItem, recording_tile::RecordingTile, util, }; mod imp { @@ -101,20 +100,7 @@ mod imp { .library() .delete_album(&obj.imp().album.get().unwrap().album_id) { - let toast = adw::Toast::builder() - .title(&gettext("Failed to delete album")) - .button_label("Details") - .build(); - - toast.connect_button_clicked(clone!( - #[weak] - obj, - move |_| { - ErrorDialog::present(&err, &obj); - } - )); - - obj.toast_overlay().add_toast(toast); + util::error_toast("Failed to delete album", err, &obj.toast_overlay()); } }) .build(); diff --git a/src/search_page.rs b/src/search_page.rs index 86b8cef..2fc3b80 100644 --- a/src/search_page.rs +++ b/src/search_page.rs @@ -5,7 +5,7 @@ use formatx::formatx; use gettextrs::gettext; use gtk::{ gio, - glib::{self, clone, Properties}, + glib::{self, Properties}, prelude::*, }; @@ -24,7 +24,7 @@ use crate::{ recording_tile::RecordingTile, search_tag::Tag, tag_tile::TagTile, - util::error_dialog::ErrorDialog, + util, }; mod imp { @@ -229,74 +229,26 @@ impl SearchPage { match highlight { Tag::Composer(person) | Tag::Performer(person) => { if let Err(err) = self.library().delete_person(&person.person_id) { - let toast = adw::Toast::builder() - .title(&gettext("Failed to delete person")) - .button_label("Details") - .build(); - - toast.connect_button_clicked(clone!( - #[weak(rename_to = obj)] - self, - move |_| { - ErrorDialog::present(&err, &obj); - } - )); - - self.toast_overlay().add_toast(toast); + util::error_toast("Failed to delete person", err, &self.toast_overlay()); } } Tag::Ensemble(ensemble) => { if let Err(err) = self.library().delete_ensemble(&ensemble.ensemble_id) { - let toast = adw::Toast::builder() - .title(&gettext("Failed to delete ensemble")) - .button_label("Details") - .build(); - - toast.connect_button_clicked(clone!( - #[weak(rename_to = obj)] - self, - move |_| { - ErrorDialog::present(&err, &obj); - } - )); - - self.toast_overlay().add_toast(toast); + util::error_toast("Failed to delete ensemble", err, &self.toast_overlay()); } } Tag::Instrument(instrument) => { if let Err(err) = self.library().delete_instrument(&instrument.instrument_id) { - let toast = adw::Toast::builder() - .title(&gettext("Failed to delete instrument")) - .button_label("Details") - .build(); - - toast.connect_button_clicked(clone!( - #[weak(rename_to = obj)] - self, - move |_| { - ErrorDialog::present(&err, &obj); - } - )); - - self.toast_overlay().add_toast(toast); + util::error_toast( + "Failed to delete instrument", + err, + &self.toast_overlay(), + ); } } Tag::Work(work) => { if let Err(err) = self.library().delete_work(&work.work_id) { - let toast = adw::Toast::builder() - .title(&gettext("Failed to delete work")) - .button_label("Details") - .build(); - - toast.connect_button_clicked(clone!( - #[weak(rename_to = obj)] - self, - move |_| { - ErrorDialog::present(&err, &obj); - } - )); - - self.toast_overlay().add_toast(toast); + util::error_toast("Failed to delete work", err, &self.toast_overlay()); } } } diff --git a/src/util.rs b/src/util.rs index a5330ef..6358704 100644 --- a/src/util.rs +++ b/src/util.rs @@ -2,9 +2,12 @@ pub mod activatable_row; pub mod drag_widget; pub mod error_dialog; -use gtk::glib; +use gettextrs::gettext; +use gtk::glib::{self, clone}; use lazy_static::lazy_static; +use error_dialog::ErrorDialog; + lazy_static! { /// The user's language code. pub static ref LANG: String = { @@ -20,3 +23,23 @@ lazy_static! { lang }; } + +/// Create and show an error toast. This will also log the error to the console. +pub fn error_toast(msgid: &str, err: anyhow::Error, toast_overlay: &adw::ToastOverlay) { + log::error!("{msgid}: {err:?}"); + + let toast = adw::Toast::builder() + .title(&gettext(msgid)) + .button_label("Details") + .build(); + + toast.connect_button_clicked(clone!( + #[weak] + toast_overlay, + move |_| { + ErrorDialog::present(&err, &toast_overlay); + } + )); + + toast_overlay.add_toast(toast); +}