]> Some of my projects - localmylist.git/commitdiff
Add option to hide watched episodes.
authorAPTX <marek321@gmail.com>
Sun, 13 Jul 2014 15:32:12 +0000 (17:32 +0200)
committerAPTX <marek321@gmail.com>
Sun, 13 Jul 2014 15:32:12 +0000 (17:32 +0200)
If all episodes of an anime are watched
and myListHideEmptyAnime is true the anime
is hidden as well.

localmylist-management/mylistfiltermodel.cpp
localmylist-management/mylistfiltermodel.h
localmylist/share/schema/default_config.sql

index 108e3cfae530177e101199143fb5197cc0bec031..7c8d3a9d124d456d0faba2597f2ca66b16687a3d 100644 (file)
@@ -8,7 +8,7 @@
 #include <QDebug>
 
 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<LocalMyList::MyListModel *>(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<const LocalMyList::MyListAnimeNode *>(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<const LocalMyList::MyListEpisodeNode *>(node)->internalData();
+                       if (episodeData.watchedDate.isValid())
+                               return false;
+               }
+       }
+
+       return true;
 }
index 5b8df70d1d88f43934d5cc45ca3f147a052e3e65..c5f9ffb1e39815e08e85276057d179bf0c496b57 100644 (file)
@@ -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
index 6ad9cdb8f8a5f96825706e587972cb464324d813..dc118ac1ba1892aefd43b4f8ee870282ae8962df 100644 (file)
@@ -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);