From: APTX Date: Sun, 13 Jul 2014 15:32:12 +0000 (+0200) Subject: Add option to hide watched episodes. X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=798abbbfa167d27007cb2b91a752e9f4ad35cfc0;p=localmylist.git Add option to hide watched episodes. If all episodes of an anime are watched and myListHideEmptyAnime is true the anime is hidden as well. --- diff --git a/localmylist-management/mylistfiltermodel.cpp b/localmylist-management/mylistfiltermodel.cpp index 108e3cf..7c8d3a9 100644 --- a/localmylist-management/mylistfiltermodel.cpp +++ b/localmylist-management/mylistfiltermodel.cpp @@ -8,7 +8,7 @@ #include MyListFilterModel::MyListFilterModel(QObject *parent) : - QSortFilterProxyModel(parent), m_hideEmptyAnime(false) + QSortFilterProxyModel(parent), m_hideEmptyAnime(false), m_hideWatchedEpisodes(false) { setFilterCaseSensitivity(Qt::CaseInsensitive); @@ -20,6 +20,11 @@ bool MyListFilterModel::hideEmptyAnime() const return m_hideEmptyAnime; } +bool MyListFilterModel::hideWatchedEpisodes() const +{ + return m_hideWatchedEpisodes; +} + LocalMyList::MyListModel *MyListFilterModel::myListModel() const { return qobject_cast(sourceModel()); @@ -49,19 +54,64 @@ void MyListFilterModel::setHideEmptyAnime(bool hide) emit hideEmptyAnimeChanged(hide); } +void MyListFilterModel::setHideWatchedEpisodes(bool hideWatchedEpisodes) +{ + if (m_hideWatchedEpisodes == hideWatchedEpisodes) + return; + + m_hideWatchedEpisodes = hideWatchedEpisodes; + + if (LocalMyList::instance()->settings()->get("myListHideWatchedEpisodes", hideWatchedEpisodes) != hideWatchedEpisodes) + { + LocalMyList::instance()->settings()->set("myListHideWatchedEpisodes", hideWatchedEpisodes); + LocalMyList::instance()->settings()->commit(); + } + invalidateFilter(); + + emit hideWatchedEpisodesChanged(hideWatchedEpisodes); +} + void MyListFilterModel::configChanged() { setHideEmptyAnime(LocalMyList::instance()->settings()->get("myListHideEmptyAnime", false)); + setHideWatchedEpisodes(LocalMyList::instance()->settings()->get("myListHideWatchedEpisodes", false)); } bool MyListFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { - if (source_parent.isValid()) - return true; - const QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); - if (m_hideEmptyAnime && !sourceModel()->rowCount(idx) && !sourceModel()->canFetchMore(idx)) - return false; - return sourceModel()->data(idx).toString().contains(filterRegExp()); + if (!source_parent.isValid()) + { + if (m_hideEmptyAnime) + { + if (!sourceModel()->rowCount(idx) && !sourceModel()->canFetchMore(idx)) + return false; + + if (m_hideWatchedEpisodes) + { + const LocalMyList::MyListNode *node = myListModel()->node(idx); + if (node->type() == LocalMyList::MyListNode::AnimeNode) + { + const LocalMyList::AnimeData &animeData = static_cast(node)->internalData(); + if (animeData.watchedEpisodes == animeData.episodesInMyList) + return false; + } + } + } + + return sourceModel()->data(idx).toString().contains(filterRegExp()); + } + else if (m_hideWatchedEpisodes) + { + const LocalMyList::MyListNode *node = myListModel()->node(idx); + if (node->type() == LocalMyList::MyListNode::EpisodeNode) + { + const LocalMyList::EpisodeData &episodeData = static_cast(node)->internalData(); + if (episodeData.watchedDate.isValid()) + return false; + } + } + + return true; } diff --git a/localmylist-management/mylistfiltermodel.h b/localmylist-management/mylistfiltermodel.h index 5b8df70..c5f9ffb 100644 --- a/localmylist-management/mylistfiltermodel.h +++ b/localmylist-management/mylistfiltermodel.h @@ -12,28 +12,33 @@ class MyListFilterModel : public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(bool hideEmptyAnime READ hideEmptyAnime WRITE setHideEmptyAnime NOTIFY hideEmptyAnimeChanged) + Q_PROPERTY(bool hideWatchedEpisodes READ hideWatchedEpisodes WRITE setHideWatchedEpisodes NOTIFY hideWatchedEpisodesChanged) public: explicit MyListFilterModel(QObject *parent = 0); bool hideEmptyAnime() const; + bool hideWatchedEpisodes() const; public slots: LocalMyList::MyListModel *myListModel() const; LocalMyList::MyListNode *node(const QModelIndex &idx) const; void setHideEmptyAnime(bool hide); + void setHideWatchedEpisodes(bool hideWatchedEpisodes); void configChanged(); signals: - void hideEmptyAnimeChanged(bool arg); + void hideEmptyAnimeChanged(bool hideEmptyAnime); + void hideWatchedEpisodesChanged(bool hideWatchedEpisodes); protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; private: bool m_hideEmptyAnime; + bool m_hideWatchedEpisodes; }; #endif // MYLISTFILTERMODEL_H diff --git a/localmylist/share/schema/default_config.sql b/localmylist/share/schema/default_config.sql index 6ad9cdb..dc118ac 100644 --- a/localmylist/share/schema/default_config.sql +++ b/localmylist/share/schema/default_config.sql @@ -30,6 +30,7 @@ INSERT INTO config VALUES ('fileFilters', '*.mkv *.mp4 *.ogg *.ogm *.wmv *.avi * INSERT INTO config VALUES ('anidbTitleUrl', 'http://anidb.net/api/anime-titles.dat.gz', true); INSERT INTO config VALUES ('myListHideEmptyAnime', '0', true); +INSERT INTO config VALUES ('myListHideWatchedEpisodes', '0', true); -- Episode types INSERT INTO episode_type VALUES ('', 'Normal', 0);