Mercurial > minori
diff src/include/anime.h @ 1:1ae666fdf9e2
*: initial commit
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Tue, 08 Aug 2023 19:49:15 -0400 |
parents | |
children | 23d0d9319a00 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/include/anime.h Tue Aug 08 19:49:15 2023 -0400 @@ -0,0 +1,168 @@ +#ifndef __anime_h +#define __anime_h +#include <vector> +#include <chrono> +#include <map> +#include "window.h" + +enum AnimeWatchingStatus { + CURRENT, + PLANNING, + COMPLETED, + DROPPED, + PAUSED, + REPEATING +}; + +enum AnimeAiringStatus { + FINISHED, + RELEASING, + NOT_YET_RELEASED, + CANCELLED, + HIATUS +}; + +enum AnimeFormat { + TV, + TV_SHORT, + MOVIE, + SPECIAL, + OVA, + ONA, + MUSIC, + MANGA, + NOVEL, + ONE_SHOT +}; + +enum AnimeSeason { + WINTER, + SPRING, + SUMMER, + FALL +}; + +class Anime { + public: + Anime(); + Anime(const Anime& a); + /* List-specific data */ + enum AnimeWatchingStatus status; + int progress; + int score; + std::chrono::year_month_day started; + std::chrono::year_month_day completed; + std::wstring notes; + + /* Useful information */ + int id; + std::wstring title; + int episodes; + enum AnimeAiringStatus airing; + std::chrono::year_month_day air_date; + std::vector<std::string> genres; + std::vector<std::string> producers; + enum AnimeFormat type; + enum AnimeSeason season; + int audience_score; + std::wstring synopsis; + int duration; +}; + +/* This is a simple wrapper on a vector that provides + methods to make it easier to search the list. */ +class AnimeList { + public: + AnimeList(); + AnimeList(const AnimeList& l); + ~AnimeList(); + void Add(Anime& anime); + void Insert(size_t pos, Anime& anime); + void Delete(size_t index); + void Clear(); + std::vector<Anime>::iterator begin() noexcept; + std::vector<Anime>::iterator end() noexcept; + std::vector<Anime>::const_iterator cbegin() noexcept; + std::vector<Anime>::const_iterator cend() noexcept; + size_t Size() const; + Anime* AnimeById(int id); + bool AnimeInList(int id); + Anime& operator[](size_t index); + const Anime& operator[](size_t index) const; + std::wstring name; + + private: + std::vector<Anime> anime_list; + std::map<int, Anime*> anime_id_to_anime; +}; + +class AnimeListWidgetModel : public QAbstractListModel { + Q_OBJECT + public: + enum columns { + AL_TITLE, + AL_PROGRESS, + AL_SCORE, + AL_AVG_SCORE, + AL_TYPE, + AL_SEASON, + AL_STARTED, + AL_COMPLETED, + AL_UPDATED, + AL_NOTES, + + NB_COLUMNS + }; + + AnimeListWidgetModel(QWidget* parent, AnimeList* alist); + ~AnimeListWidgetModel() override = default; + //QVariant headerData(const int section, const Qt::Orientation orientation, const int role) const; + int rowCount(const QModelIndex& parent = QModelIndex()) const; + int columnCount(const QModelIndex& parent = QModelIndex()) const; + QVariant data(const QModelIndex& index, int role) const; + QVariant headerData(const int section, const Qt::Orientation orientation, const int role) const; + Anime* GetAnimeFromIndex(const QModelIndex& index); + void Update(); + + private: + //void AddAnime(AnimeList& list); + AnimeList& list; +}; + +class AnimeListWidget : public QTreeView { + Q_OBJECT + public: + AnimeListWidget(QWidget* parent, AnimeList* alist); + + private slots: + void DisplayColumnHeaderMenu(); + void DisplayListMenu(); + void ItemDoubleClicked(); + void SetColumnDefaults(); + int VisibleColumnsCount() const; + + private: + AnimeListWidgetModel* model = nullptr; +}; + +class AnimeListPage : public QTabWidget { + public: + AnimeListPage(QWidget* parent = nullptr); + void SyncAnimeList(); + void FreeAnimeList(); + int GetTotalAnimeAmount(); + int GetTotalEpisodeAmount(); + int GetTotalWatchedAmount(); + int GetTotalPlannedAmount(); + double GetAverageScore(); + double GetScoreDeviation(); + + private: + std::vector<AnimeList> anime_lists; +}; + +extern std::map<enum AnimeSeason, std::string> AnimeSeasonToStringMap; +extern std::map<enum AnimeFormat, std::string> AnimeFormatToStringMap; +extern std::map<enum AnimeWatchingStatus, std::string> AnimeWatchingToStringMap; +extern std::map<enum AnimeAiringStatus, std::string> AnimeAiringToStringMap; +#endif // __anime_h \ No newline at end of file