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,11 +98,29 @@ impl Component for FilmGrid {
}
});
}
FilmGridInput::ApplyWatchedFilter(watched_filter) => {
self
.items
.broadcast(FilmGridItemInput::ApplyWatchedFilter(watched_filter));
}
FilmGridInput::ApplyWatchedFilter(watched_filter) => match watched_filter {
Some(WatchedFilter::OnlyWatched) => {
for (index, item) in self.items.iter().enumerate() {
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));
}
},
}
}

View file

@ -10,7 +10,6 @@ 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;
@ -20,7 +19,7 @@ pub struct FilmGridItem {
film: FilmOverview,
poster: Option<Texture>,
details: Option<Controller<FilmDetails>>,
watched_filter: Option<WatchedFilter>,
visible: bool,
}
impl FilmGridItem {
@ -41,7 +40,7 @@ pub enum FilmGridItemInput {
ItemClicked,
DetailsClosed,
WatchedStatusChanged(bool),
ApplyWatchedFilter(Option<WatchedFilter>),
SetVisible(bool),
}
#[factory(pub)]
@ -57,11 +56,7 @@ impl FactoryComponent for FilmGridItem {
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,
},
set_visible: self.visible,
Button {
connect_clicked => FilmGridItemInput::ItemClicked,
@ -169,7 +164,7 @@ impl FactoryComponent for FilmGridItem {
film,
poster: None,
details: None,
watched_filter: None,
visible: true,
}
}
@ -195,8 +190,8 @@ impl FactoryComponent for FilmGridItem {
FilmGridItemInput::WatchedStatusChanged(watched) => {
self.film.watched = watched;
}
FilmGridItemInput::ApplyWatchedFilter(watched_filter) => {
self.watched_filter = watched_filter;
FilmGridItemInput::SetVisible(visible) => {
self.visible = visible;
}
}
}