Move watched filtering logic to FilmGrid

This commit is contained in:
Reinout Meliesie 2026-01-26 14:22:51 +01:00
commit 23e8f1e949
Signed by: zedfrigg
GPG key ID: 3AFCC06481308BC6
2 changed files with 29 additions and 16 deletions

View file

@ -98,13 +98,31 @@ impl Component for FilmGrid {
} }
}); });
} }
FilmGridInput::ApplyWatchedFilter(watched_filter) => { FilmGridInput::ApplyWatchedFilter(watched_filter) => match watched_filter {
self Some(WatchedFilter::OnlyWatched) => {
.items for (index, item) in self.items.iter().enumerate() {
.broadcast(FilmGridItemInput::ApplyWatchedFilter(watched_filter)); if item.film().watched {
self.items.send(index, FilmGridItemInput::SetVisible(true));
} else {
self.items.send(index, FilmGridItemInput::SetVisible(false));
} }
} }
} }
Some(WatchedFilter::OnlyUnwatched) => {
for (index, item) in self.items.iter().enumerate() {
if item.film().watched {
self.items.send(index, FilmGridItemInput::SetVisible(false));
} else {
self.items.send(index, FilmGridItemInput::SetVisible(true));
}
}
}
None => {
self.items.broadcast(FilmGridItemInput::SetVisible(true));
}
},
}
}
fn update_cmd( fn update_cmd(
&mut self, &mut self,

View file

@ -10,7 +10,6 @@ use relm4::{Component, ComponentController, Controller, FactorySender, RelmWidge
use crate::persist::data_manager::{DataManager, DataManagerError}; use crate::persist::data_manager::{DataManager, DataManagerError};
use crate::ui::components::media_details::{FilmDetails, FilmDetailsOutput}; use crate::ui::components::media_details::{FilmDetails, FilmDetailsOutput};
use crate::ui::filtering::WatchedFilter;
use crate::ui::widget_extensions::{AttrListExt, CondDialogExt, CondLabelExt}; use crate::ui::widget_extensions::{AttrListExt, CondDialogExt, CondLabelExt};
use crate::views::overview::FilmOverview; use crate::views::overview::FilmOverview;
@ -20,7 +19,7 @@ pub struct FilmGridItem {
film: FilmOverview, film: FilmOverview,
poster: Option<Texture>, poster: Option<Texture>,
details: Option<Controller<FilmDetails>>, details: Option<Controller<FilmDetails>>,
watched_filter: Option<WatchedFilter>, visible: bool,
} }
impl FilmGridItem { impl FilmGridItem {
@ -41,7 +40,7 @@ pub enum FilmGridItemInput {
ItemClicked, ItemClicked,
DetailsClosed, DetailsClosed,
WatchedStatusChanged(bool), WatchedStatusChanged(bool),
ApplyWatchedFilter(Option<WatchedFilter>), SetVisible(bool),
} }
#[factory(pub)] #[factory(pub)]
@ -57,11 +56,7 @@ impl FactoryComponent for FilmGridItem {
root = FlowBoxChild { root = FlowBoxChild {
set_focusable: false, set_focusable: false,
#[watch] #[watch]
set_visible: match self.watched_filter { set_visible: self.visible,
Some(WatchedFilter::OnlyWatched) => self.film.watched,
Some(WatchedFilter::OnlyUnwatched) => !self.film.watched,
None => true,
},
Button { Button {
connect_clicked => FilmGridItemInput::ItemClicked, connect_clicked => FilmGridItemInput::ItemClicked,
@ -169,7 +164,7 @@ impl FactoryComponent for FilmGridItem {
film, film,
poster: None, poster: None,
details: None, details: None,
watched_filter: None, visible: true,
} }
} }
@ -195,8 +190,8 @@ impl FactoryComponent for FilmGridItem {
FilmGridItemInput::WatchedStatusChanged(watched) => { FilmGridItemInput::WatchedStatusChanged(watched) => {
self.film.watched = watched; self.film.watched = watched;
} }
FilmGridItemInput::ApplyWatchedFilter(watched_filter) => { FilmGridItemInput::SetVisible(visible) => {
self.watched_filter = watched_filter; self.visible = visible;
} }
} }
} }