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