From 311d78bcc86d1a5e409bbeac804ca538a357cc1c Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Mon, 26 Jan 2026 13:01:43 +0100 Subject: [PATCH] Implement watched filtering on FilmGridItem level --- src/ui/components/media_grid/film_grid.rs | 8 ++++++-- .../components/media_grid_item/film_grid_item.rs | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/ui/components/media_grid/film_grid.rs b/src/ui/components/media_grid/film_grid.rs index c9b8c3a..dfc2b71 100644 --- a/src/ui/components/media_grid/film_grid.rs +++ b/src/ui/components/media_grid/film_grid.rs @@ -4,7 +4,7 @@ use relm4::factory::FactoryVecDeque; use relm4::{Component, ComponentParts, ComponentSender, component}; use crate::persist::data_manager::{DataManager, DataManagerError}; -use crate::ui::components::media_grid_item::FilmGridItem; +use crate::ui::components::media_grid_item::{FilmGridItem, FilmGridItemInput}; use crate::ui::factory_sorting::sort_factory_vec; use crate::ui::filtering::WatchedFilter; use crate::ui::sorting::{ @@ -98,7 +98,11 @@ impl Component for FilmGrid { } }); } - FilmGridInput::ApplyWatchedFilter(_watched_filter) => {} + FilmGridInput::ApplyWatchedFilter(watched_filter) => { + self + .items + .broadcast(FilmGridItemInput::ApplyWatchedFilter(watched_filter)); + } } } diff --git a/src/ui/components/media_grid_item/film_grid_item.rs b/src/ui/components/media_grid_item/film_grid_item.rs index 2e844be..21df41a 100644 --- a/src/ui/components/media_grid_item/film_grid_item.rs +++ b/src/ui/components/media_grid_item/film_grid_item.rs @@ -10,6 +10,7 @@ use relm4::{Component, ComponentController, Controller, FactorySender, RelmWidge use crate::persist::data_manager::{DataManager, DataManagerError}; use crate::ui::components::media_details::{FilmDetails, FilmDetailsOutput}; +use crate::ui::filtering::WatchedFilter; use crate::ui::widget_extensions::{AttrListExt, CondDialogExt, CondLabelExt}; use crate::views::overview::FilmOverview; @@ -19,6 +20,7 @@ pub struct FilmGridItem { film: FilmOverview, poster: Option, details: Option>, + watched_filter: Option, } impl FilmGridItem { @@ -34,11 +36,12 @@ pub enum FilmGridItemCmdOutput { PosterFailed(DataManagerError), } -#[derive(Debug)] +#[derive(Clone, Copy, Debug)] pub enum FilmGridItemInput { ItemClicked, DetailsClosed, WatchedStatusChanged(bool), + ApplyWatchedFilter(Option), } #[factory(pub)] @@ -53,6 +56,13 @@ impl FactoryComponent for FilmGridItem { #[root] root = FlowBoxChild { set_focusable: false, + #[watch] + set_visible: match self.watched_filter { + Some(WatchedFilter::OnlyWatched) => self.film.watched, + Some(WatchedFilter::OnlyUnwatched) => !self.film.watched, + None => true, + }, + Button { connect_clicked => FilmGridItemInput::ItemClicked, set_css_classes: &["flat", "media-grid-item"], @@ -159,6 +169,7 @@ impl FactoryComponent for FilmGridItem { film, poster: None, details: None, + watched_filter: None, } } @@ -184,6 +195,9 @@ impl FactoryComponent for FilmGridItem { FilmGridItemInput::WatchedStatusChanged(watched) => { self.film.watched = watched; } + FilmGridItemInput::ApplyWatchedFilter(watched_filter) => { + self.watched_filter = watched_filter; + } } }