From 33943d37f1819b051b736fcb90d2078f8cb5043d Mon Sep 17 00:00:00 2001 From: yggverse Date: Wed, 5 Mar 2025 17:57:28 +0200 Subject: [PATCH] update gemtext error handler --- src/app/browser/window/tab/item.rs | 1 - src/app/browser/window/tab/item/client.rs | 1 - .../window/tab/item/client/driver/gemini.rs | 3 - src/app/browser/window/tab/item/page.rs | 10 --- .../browser/window/tab/item/page/content.rs | 27 ++++++- .../window/tab/item/page/content/text.rs | 80 ++++++++----------- .../tab/item/page/content/text/gemini.rs | 5 +- .../item/page/content/text/gemini/error.rs | 12 +-- .../browser/window/tab/item/page/notice.rs | 33 -------- 9 files changed, 64 insertions(+), 108 deletions(-) delete mode 100644 src/app/browser/window/tab/item/page/notice.rs diff --git a/src/app/browser/window/tab/item.rs b/src/app/browser/window/tab/item.rs index f4ca2a1a..24e46cc1 100644 --- a/src/app/browser/window/tab/item.rs +++ b/src/app/browser/window/tab/item.rs @@ -63,7 +63,6 @@ impl Item { )); target_child.append(&page.navigation.g_box); - target_child.append(&page.notice.banner); target_child.append(&page.content.g_box); target_child.append(&page.search.g_box); target_child.append(&page.input.clamp); diff --git a/src/app/browser/window/tab/item/client.rs b/src/app/browser/window/tab/item/client.rs index 415732ab..bb8da9d7 100644 --- a/src/app/browser/window/tab/item/client.rs +++ b/src/app/browser/window/tab/item/client.rs @@ -49,7 +49,6 @@ impl Client { // Reset widgets self.page.input.unset(); - self.page.notice.unset(); self.page.search.unset(); self.page.set_title("Loading.."); self.page.set_progress(0.1); diff --git a/src/app/browser/window/tab/item/client/driver/gemini.rs b/src/app/browser/window/tab/item/client/driver/gemini.rs index f8f51d23..15237450 100644 --- a/src/app/browser/window/tab/item/client/driver/gemini.rs +++ b/src/app/browser/window/tab/item/client/driver/gemini.rs @@ -260,9 +260,6 @@ fn handle( _ => panic!() // unexpected } }; - if let Some(notice) = widget.meta.notice { - page.notice(¬ice) - } page.search.set(Some(widget.text_view)); page.set_title(&match widget.meta.title { Some(title) => title.into(), // @TODO diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 211621b6..6e13b2e6 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -3,7 +3,6 @@ mod database; mod error; mod input; mod navigation; -mod notice; mod search; use super::{Action as ItemAction, BrowserAction, Profile, TabAction, WindowAction}; @@ -12,7 +11,6 @@ use content::Content; use error::Error; use input::Input; use navigation::Navigation; -use notice::Notice; use search::Search; use sqlite::Transaction; use std::rc::Rc; @@ -27,7 +25,6 @@ pub struct Page { pub content: Rc, pub input: Rc, pub navigation: Rc, - pub notice: Rc, pub search: Rc, // System /// Reference to [TabPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.TabPage.html) @@ -59,7 +56,6 @@ impl Page { (window_action, tab_action, item_action), )); let input = Rc::new(Input::new()); - let notice = Rc::new(Notice::new()); // Done Self { @@ -73,7 +69,6 @@ impl Page { content, input, navigation, - notice, search, } } @@ -104,11 +99,6 @@ impl Page { self.search.show() } - /// Toggle `Notice` widget - pub fn notice(&self, title: &str) { - self.notice.show(title) - } - /// Cleanup session for `Self` pub fn clean( &self, diff --git a/src/app/browser/window/tab/item/page/content.rs b/src/app/browser/window/tab/item/page/content.rs index 7e4067b2..44fd1517 100644 --- a/src/app/browser/window/tab/item/page/content.rs +++ b/src/app/browser/window/tab/item/page/content.rs @@ -118,9 +118,30 @@ impl Content { /// `text/gemini` pub fn to_text_gemini(&self, base: &Uri, data: &str) -> Text { self.clean(); - let text = Text::gemini((&self.window_action, &self.item_action), base, data); - self.g_box.append(&text.scrolled_window); - text + match Text::gemini((&self.window_action, &self.item_action), base, data) { + Ok(text) => { + self.g_box.append(&text.scrolled_window); + text + } + Err((message, text)) => { + self.g_box.append(&{ + let banner = adw::Banner::builder() + .title(message) + .revealed(true) + .button_label("Ok") + .build(); + banner.connect_button_clicked(|this| this.set_revealed(false)); + banner + }); + match text { + Some(text) => { + self.g_box.append(&text.scrolled_window); + text + } + None => todo!(), + } + } + } } /// `text/plain` diff --git a/src/app/browser/window/tab/item/page/content/text.rs b/src/app/browser/window/tab/item/page/content/text.rs index 66497897..a9ddb72f 100644 --- a/src/app/browser/window/tab/item/page/content/text.rs +++ b/src/app/browser/window/tab/item/page/content/text.rs @@ -12,7 +12,6 @@ use std::rc::Rc; pub struct Meta { pub title: Option, - pub notice: Option, } // @TODO move to separated mod pub struct Text { @@ -26,54 +25,36 @@ impl Text { actions: (&Rc, &Rc), base: &Uri, gemtext: &str, - ) -> Self { - // Init gemtext reader - let (gemini, notice) = match Gemini::build(actions, base, gemtext) { - Ok(gemini) => (gemini, None), - Err(e) => { - let notice = e.message(); - match e { - gemini::Error::Multiline(gemini) => (gemini, Some(notice)), - } - } - }; - - // Init container widget - let clamp_scrollable = ClampScrollable::builder() - .child(&gemini.text_view) - .css_classes(["view"]) - .maximum_size(800) - .build(); - - grab_focus_patch(&clamp_scrollable, &gemini.text_view); - - Self { - text_view: gemini.text_view, - meta: Meta { - title: gemini.title, - notice, + ) -> Result)> { + match Gemini::build(actions, base, gemtext) { + Ok(widget) => Ok(Self { + scrolled_window: reader(&widget.text_view), + text_view: widget.text_view, + meta: Meta { + title: widget.title, + }, + }), + Err(e) => match e { + gemini::Error::Markup(message, widget) => Err(( + message, + Some(Self { + scrolled_window: reader(&widget.text_view), + text_view: widget.text_view, + meta: Meta { + title: widget.title, + }, + }), + )), }, - scrolled_window: ScrolledWindow::builder().child(&clamp_scrollable).build(), } } pub fn plain(data: &str) -> Self { let text_view = TextView::plain(data); - let clamp_scrollable = ClampScrollable::builder() - .child(&text_view) - .css_classes(["view"]) - .maximum_size(800) // @TODO auto-expand - .build(); - - grab_focus_patch(&clamp_scrollable, &text_view); - Self { - scrolled_window: ScrolledWindow::builder().child(&clamp_scrollable).build(), + scrolled_window: reader(&text_view), text_view, - meta: Meta { - title: None, - notice: None, - }, + meta: Meta { title: None }, } } @@ -82,10 +63,7 @@ impl Text { Self { scrolled_window: ScrolledWindow::builder().child(&source).build(), text_view: source.into_text_view(), - meta: Meta { - title: None, - notice: None, - }, + meta: Meta { title: None }, } } } @@ -106,3 +84,15 @@ fn grab_focus_patch(clamp_scrollable: &ClampScrollable, text_view: &TextView) { clamp_scrollable.add_controller(controller); } + +fn reader(text_view: &TextView) -> ScrolledWindow { + let clamp_scrollable = ClampScrollable::builder() + .child(text_view) + .css_classes(["view"]) + .maximum_size(800) + .build(); + + grab_focus_patch(&clamp_scrollable, text_view); + + ScrolledWindow::builder().child(&clamp_scrollable).build() +} diff --git a/src/app/browser/window/tab/item/page/content/text/gemini.rs b/src/app/browser/window/tab/item/page/content/text/gemini.rs index 1309b108..852182d8 100644 --- a/src/app/browser/window/tab/item/page/content/text/gemini.rs +++ b/src/app/browser/window/tab/item/page/content/text/gemini.rs @@ -506,7 +506,10 @@ impl Gemini { if is_multiline_enabled { Ok(Self { text_view, title }) } else { - Err(Error::Multiline(Self { text_view, title })) + Err(Error::Markup( + "Invalid multiline markup! Gemtext format partially ignored.".to_string(), + Self { text_view, title }, + )) } } } diff --git a/src/app/browser/window/tab/item/page/content/text/gemini/error.rs b/src/app/browser/window/tab/item/page/content/text/gemini/error.rs index aa4cd8b0..57eef70a 100644 --- a/src/app/browser/window/tab/item/page/content/text/gemini/error.rs +++ b/src/app/browser/window/tab/item/page/content/text/gemini/error.rs @@ -1,13 +1,3 @@ pub enum Error { - Multiline(super::Gemini), -} - -impl Error { - pub fn message(&self) -> String { - match self { - Self::Multiline(_) => { - "Invalid multiline markup! Gemtext format partially ignored.".to_string() - } - } - } + Markup(String, super::Gemini), } diff --git a/src/app/browser/window/tab/item/page/notice.rs b/src/app/browser/window/tab/item/page/notice.rs deleted file mode 100644 index 303bc54c..00000000 --- a/src/app/browser/window/tab/item/page/notice.rs +++ /dev/null @@ -1,33 +0,0 @@ -use adw::Banner; - -pub struct Notice { - pub banner: Banner, -} - -impl Notice { - // Constructors - - /// Create new `Self` - pub fn new() -> Self { - let banner = Banner::builder().button_label("Ok").build(); - banner.connect_button_clicked(|this| this.set_revealed(false)); - Self { banner } - } - - // Actions - - pub fn show(&self, title: &str) { - self.banner.set_title(title); - self.banner.set_revealed(true); - } - - pub fn unset(&self) { - self.banner.set_revealed(false); - } -} - -impl Default for Notice { - fn default() -> Self { - Self::new() - } -}