Mercurial > minori
view include/gui/pages/anime_list.h @ 327:b5d6c27c308f
anime: refactor Anime::SeriesSeason to Season class
ToLocalString has also been altered to take in both season
and year because lots of locales actually treat formatting
seasons differently! most notably is Russian which adds a
suffix at the end to notate seasons(??)
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Thu, 13 Jun 2024 01:49:18 -0400 |
parents | 1b5c04268d6a |
children |
line wrap: on
line source
#ifndef MINORI_GUI_PAGES_ANIME_LIST_H_ #define MINORI_GUI_PAGES_ANIME_LIST_H_ #include "core/anime.h" #include <QAbstractListModel> #include <QSortFilterProxyModel> #include <QStyledItemDelegate> #include <QWidget> #include <QThread> #include <vector> #include <queue> class QTreeView; class QTabBar; class AnimeListPage; class AnimeListPageUpdateEntryThread final : public QThread { Q_OBJECT public: AnimeListPageUpdateEntryThread(QObject* parent = nullptr); void AddToQueue(int id); signals: void NeedRefresh(); protected: void run() override; private: std::mutex queue_mutex_; std::queue<int> queue_; }; class AnimeListPageSortFilter final : public QSortFilterProxyModel { Q_OBJECT public: AnimeListPageSortFilter(QObject* parent = nullptr); protected: bool lessThan(const QModelIndex& l, const QModelIndex& r) const override; }; class AnimeListPageModel final : public QAbstractListModel { Q_OBJECT public: enum columns { AL_TITLE, AL_PROGRESS, AL_EPISODES, AL_SCORE, AL_AVG_SCORE, AL_TYPE, AL_SEASON, AL_STARTED, AL_COMPLETED, AL_UPDATED, AL_NOTES, NB_COLUMNS }; AnimeListPageModel(QObject* parent, Anime::ListStatus _status); ~AnimeListPageModel() override = default; int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QVariant headerData(const int section, const Qt::Orientation orientation, const int role) const override; void RefreshList(); Anime::Anime* GetAnimeFromIndex(QModelIndex index); private: Anime::ListStatus status; std::vector<Anime::Anime> list; }; class AnimeListPage final : public QWidget { Q_OBJECT public: AnimeListPage(QWidget* parent = nullptr); public slots: void Refresh(); protected: void paintEvent(QPaintEvent*) override; void InitStyle(QStyleOptionTabWidgetFrame* option) const; void InitBasicStyle(QStyleOptionTabWidgetFrame* option) const; void SetupLayout(); void showEvent(QShowEvent*) override; void resizeEvent(QResizeEvent* e) override; void RefreshList(); void RefreshTabs(); void UpdateAnime(int id); void RemoveAnime(int id); private slots: void DisplayColumnHeaderMenu(); void DisplayListMenu(); void ItemDoubleClicked(); void SetColumnDefaults(); int VisibleColumnsCount() const; private: QTabBar* tab_bar; QTreeView* tree_view; QRect panelRect; AnimeListPageUpdateEntryThread update_entry_thread_; std::array<AnimeListPageSortFilter*, 5> sort_models; }; #endif // MINORI_GUI_PAGES_ANIME_LIST_H_