From b995482e45b21d00d7c1e3c8e995ae721264cd51 Mon Sep 17 00:00:00 2001 From: yggverse Date: Tue, 4 Feb 2025 15:26:58 +0200 Subject: [PATCH] implement source view component as trait --- .../window/tab/item/page/content/text.rs | 8 +-- .../tab/item/page/content/text/source.rs | 59 ++++++++++--------- 2 files changed, 36 insertions(+), 31 deletions(-) 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 f0b45854..349b7a56 100644 --- a/src/app/browser/window/tab/item/page/content/text.rs +++ b/src/app/browser/window/tab/item/page/content/text.rs @@ -5,7 +5,7 @@ mod source; use super::{ItemAction, WindowAction}; use adw::ClampScrollable; use gemini::Gemini; -use gtk::{glib::Uri, prelude::Cast, ScrolledWindow, TextView}; +use gtk::{glib::Uri, ScrolledWindow, TextView}; use plain::Plain; use source::Source; use std::rc::Rc; @@ -64,10 +64,10 @@ impl Text { } pub fn source(data: &str) -> Self { - let source = Source::new(data); + let source = sourceview::View::source(data); Self { - scrolled_window: ScrolledWindow::builder().child(&source.text_view).build(), - text_view: source.text_view.upcast::(), + scrolled_window: ScrolledWindow::builder().child(&source).build(), + text_view: source.into_text_view(), meta: Meta { title: None }, } } diff --git a/src/app/browser/window/tab/item/page/content/text/source.rs b/src/app/browser/window/tab/item/page/content/text/source.rs index bb8e3235..f85522e7 100644 --- a/src/app/browser/window/tab/item/page/content/text/source.rs +++ b/src/app/browser/window/tab/item/page/content/text/source.rs @@ -1,32 +1,37 @@ -use sourceview::{Buffer, StyleScheme, View}; -const MARGIN: i32 = 8; +use gtk::TextView; +use sourceview::View; -pub struct Source { - pub text_view: View, +pub trait Source { + fn source(data: &str) -> Self; + fn into_text_view(self) -> TextView; } -impl Source { - pub fn new(data: &str) -> Self { - Self { - text_view: View::builder() - .bottom_margin(MARGIN) - .buffer( - &Buffer::builder() - .text(data) - .style_scheme(&StyleScheme::builder().build()) // adaptive - .highlight_syntax(true) - .build(), - ) - .cursor_visible(false) - .editable(false) - .left_margin(MARGIN) - .monospace(true) - .right_margin(MARGIN) - .show_line_marks(true) - .show_line_numbers(true) - .top_margin(MARGIN) - .vexpand(true) - .build(), - } +impl Source for View { + fn source(data: &str) -> Self { + use sourceview::{Buffer, StyleScheme}; + const MARGIN: i32 = 8; + View::builder() + .bottom_margin(MARGIN) + .buffer( + &Buffer::builder() + .text(data) + .style_scheme(&StyleScheme::builder().build()) // adaptive + .highlight_syntax(true) + .build(), + ) + .cursor_visible(false) + .editable(false) + .left_margin(MARGIN) + .monospace(true) + .right_margin(MARGIN) + .show_line_marks(true) + .show_line_numbers(true) + .top_margin(MARGIN) + .vexpand(true) + .build() + } + fn into_text_view(self) -> TextView { + use sourceview::prelude::Cast; + self.upcast::() } }