From 03b19367406ec6f5a35226e66c25ef6556e65bf0 Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 21 Mar 2026 12:47:06 +0000 Subject: [PATCH 1/4] docs: fix image caching description in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4bae82..6d92bc9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ It follows the [river of news](http://scripting.com/2014/06/02/whatIsARiverOfNew - **River of news**: all unread articles in one flat list, auto-marked as read as you flip through them one by one - **Offline reading**: article content and images are cached locally so you can read without a connection -- **Image caching**: images are pre-fetched after each reload; skipped on metered connections unless enabled in preferences +- **Image caching**: images are pre-fetched after each reload; can be disabled in preferences and is always skipped on metered connections - **Offline sync**: read/unread state changes made offline are queued and pushed to the server next time you're online - **Persistent state**: the article list, selected article, and scroll position are restored when you reopen the app - **Dark mode**: follows the system color scheme automatically From a77fa3ae03293908b14837b06cee729596c2dea1 Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 21 Mar 2026 12:49:58 +0000 Subject: [PATCH 2/4] sidebar: bold title for unread articles --- src/article_row.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/article_row.rs b/src/article_row.rs index 578aae5..a5ff552 100644 --- a/src/article_row.rs +++ b/src/article_row.rs @@ -83,8 +83,10 @@ mod imp { let unread = obj.article().unread; if unread { title_label.remove_css_class("dim-label"); + title_label.set_attributes(Some(&bold_attrs())); } else { title_label.add_css_class("dim-label"); + title_label.set_attributes(None); } }); *self.unread_handler.borrow_mut() = Some((obj.clone(), id)); @@ -102,13 +104,21 @@ mod imp { fn update_read_style(&self, unread: bool) { if unread { self.title_label.remove_css_class("dim-label"); + self.title_label.set_attributes(Some(&bold_attrs())); } else { self.title_label.add_css_class("dim-label"); + self.title_label.set_attributes(None); } } } } +fn bold_attrs() -> gtk4::pango::AttrList { + let list = gtk4::pango::AttrList::new(); + list.insert(gtk4::pango::AttrInt::new_weight(gtk4::pango::Weight::Bold)); + list +} + fn relative_time(unix: i64) -> String { let now = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) From 3bcd6af23c6d15ffe68d9d029c136c2b0ffe7821 Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 21 Mar 2026 12:51:49 +0000 Subject: [PATCH 3/4] sidebar: use CSS class for bold unread title --- src/app.rs | 3 +++ src/article_row.rs | 14 ++++---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/app.rs b/src/app.rs index 9581eb5..6e287f0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -70,6 +70,9 @@ mod imp { } .sidebar-content row:selected { background-color: alpha(@window_fg_color, 0.22); + } + .unread-title { + font-weight: bold; }" ); gtk4::style_context_add_provider_for_display( diff --git a/src/article_row.rs b/src/article_row.rs index a5ff552..d8877ce 100644 --- a/src/article_row.rs +++ b/src/article_row.rs @@ -83,10 +83,10 @@ mod imp { let unread = obj.article().unread; if unread { title_label.remove_css_class("dim-label"); - title_label.set_attributes(Some(&bold_attrs())); + title_label.add_css_class("unread-title"); } else { title_label.add_css_class("dim-label"); - title_label.set_attributes(None); + title_label.remove_css_class("unread-title"); } }); *self.unread_handler.borrow_mut() = Some((obj.clone(), id)); @@ -104,21 +104,15 @@ mod imp { fn update_read_style(&self, unread: bool) { if unread { self.title_label.remove_css_class("dim-label"); - self.title_label.set_attributes(Some(&bold_attrs())); + self.title_label.add_css_class("unread-title"); } else { self.title_label.add_css_class("dim-label"); - self.title_label.set_attributes(None); + self.title_label.remove_css_class("unread-title"); } } } } -fn bold_attrs() -> gtk4::pango::AttrList { - let list = gtk4::pango::AttrList::new(); - list.insert(gtk4::pango::AttrInt::new_weight(gtk4::pango::Weight::Bold)); - list -} - fn relative_time(unix: i64) -> String { let now = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) From c19c2cbd1d7ff348ed401123a90174eb0d88d528 Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 21 Mar 2026 13:09:28 +0000 Subject: [PATCH 4/4] window: scale sidebar fonts with zoom level --- src/window.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/window.rs b/src/window.rs index e0991ed..91181c8 100644 --- a/src/window.rs +++ b/src/window.rs @@ -63,6 +63,7 @@ pub mod imp { pub current_article_id: RefCell>, pub mark_unread_guard: RefCell, pub pending_restore_id: RefCell>, + pub sidebar_zoom_css: std::cell::OnceCell, } #[glib::object_subclass] @@ -140,6 +141,16 @@ pub mod imp { let zoom = settings.double("zoom-level"); self.web_view.set_zoom_level(zoom); + // Set up sidebar font zoom CSS provider + let zoom_css = gtk4::CssProvider::new(); + gtk4::style_context_add_provider_for_display( + >k4::gdk::Display::default().unwrap(), + &zoom_css, + gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION, + ); + self.sidebar_zoom_css.set(zoom_css).ok(); + self.update_sidebar_zoom(zoom); + // Persist sidebar width while dragging (only when visible) let s2 = settings.clone(); let sidebar_weak = self.sidebar_toolbar.downgrade(); @@ -794,16 +805,26 @@ pub mod imp { // ── Zoom ────────────────────────────────────────────────────────────── + fn update_sidebar_zoom(&self, level: f64) { + if let Some(css) = self.sidebar_zoom_css.get() { + css.load_from_string(&format!( + ".sidebar-content label {{ font-size: {level}em; }}" + )); + } + } + fn zoom(&self, factor: f64) { let wv = &*self.web_view; let new_level = (wv.zoom_level() * factor).clamp(0.25, 5.0); wv.set_zoom_level(new_level); + self.update_sidebar_zoom(new_level); let settings = gio::Settings::new("net.jeena.FeedTheMonkey"); settings.set_double("zoom-level", new_level).ok(); } fn zoom_reset(&self) { self.web_view.set_zoom_level(1.0); + self.update_sidebar_zoom(1.0); let settings = gio::Settings::new("net.jeena.FeedTheMonkey"); settings.set_double("zoom-level", 1.0).ok(); }