Mercurial > minori
comparison src/anime.cpp @ 2:23d0d9319a00
Update
Also converted everything to LF from CRLF
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sat, 12 Aug 2023 03:16:26 -0400 |
parents | 1ae666fdf9e2 |
children | 190ded9438c0 |
comparison
equal
deleted
inserted
replaced
1:1ae666fdf9e2 | 2:23d0d9319a00 |
---|---|
4 #include <cmath> | 4 #include <cmath> |
5 #include "window.h" | 5 #include "window.h" |
6 #include "anilist.h" | 6 #include "anilist.h" |
7 #include "config.h" | 7 #include "config.h" |
8 #include "anime.h" | 8 #include "anime.h" |
9 //#include "information.h" | 9 #include "date.h" |
10 #include "time_utils.h" | |
11 #include "information.h" | |
12 #include "ui_utils.h" | |
10 | 13 |
11 std::map<enum AnimeWatchingStatus, std::string> AnimeWatchingToStringMap = { | 14 std::map<enum AnimeWatchingStatus, std::string> AnimeWatchingToStringMap = { |
12 {CURRENT, "Watching"}, | 15 {CURRENT, "Watching"}, |
13 {PLANNING, "Planning"}, | 16 {PLANNING, "Planning"}, |
14 {COMPLETED, "Completed"}, | 17 {COMPLETED, "Completed"}, |
24 {CANCELLED, "Cancelled"}, | 27 {CANCELLED, "Cancelled"}, |
25 {HIATUS, "On hiatus"} | 28 {HIATUS, "On hiatus"} |
26 }; | 29 }; |
27 | 30 |
28 std::map<enum AnimeSeason, std::string> AnimeSeasonToStringMap = { | 31 std::map<enum AnimeSeason, std::string> AnimeSeasonToStringMap = { |
29 {WINTER, "Winter"}, | 32 {UNKNOWN, "Unknown"}, |
30 {SPRING, "Spring"}, | 33 {WINTER, "Winter"}, |
31 {SUMMER, "Summer"}, | 34 {SPRING, "Spring"}, |
32 {FALL, "Fall"} | 35 {SUMMER, "Summer"}, |
36 {FALL, "Fall"} | |
33 }; | 37 }; |
34 | 38 |
35 std::map<enum AnimeFormat, std::string> AnimeFormatToStringMap = { | 39 std::map<enum AnimeFormat, std::string> AnimeFormatToStringMap = { |
36 {TV, "TV"}, | 40 {TV, "TV"}, |
37 {TV_SHORT, "TV short"}, | 41 {TV_SHORT, "TV short"}, |
52 status = a.status; | 56 status = a.status; |
53 progress = a.progress; | 57 progress = a.progress; |
54 score = a.score; | 58 score = a.score; |
55 started = a.started; | 59 started = a.started; |
56 completed = a.completed; | 60 completed = a.completed; |
61 updated = a.updated; | |
57 notes = a.notes; | 62 notes = a.notes; |
58 id = a.id; | 63 id = a.id; |
59 title = a.title; | 64 title = a.title; |
60 episodes = a.episodes; | 65 episodes = a.episodes; |
61 airing = a.airing; | 66 airing = a.airing; |
128 return anime_id_to_anime.contains(id) ? anime_id_to_anime[id] : nullptr; | 133 return anime_id_to_anime.contains(id) ? anime_id_to_anime[id] : nullptr; |
129 } | 134 } |
130 | 135 |
131 bool AnimeList::AnimeInList(int id) { | 136 bool AnimeList::AnimeInList(int id) { |
132 return anime_id_to_anime.contains(id); | 137 return anime_id_to_anime.contains(id); |
138 } | |
139 | |
140 int AnimeList::GetAnimeIndex(Anime& anime) const { | |
141 for (int i = 0; i < Size(); i++) { | |
142 if (&anime_list.at(i) == &anime) { // lazy | |
143 return i; | |
144 } | |
145 } | |
146 return -1; | |
133 } | 147 } |
134 | 148 |
135 Anime& AnimeList::operator[](std::size_t index) { | 149 Anime& AnimeList::operator[](std::size_t index) { |
136 return anime_list.at(index); | 150 return anime_list.at(index); |
137 } | 151 } |
205 } | 219 } |
206 return QAbstractListModel::headerData(section, orientation, role); | 220 return QAbstractListModel::headerData(section, orientation, role); |
207 } | 221 } |
208 | 222 |
209 Anime* AnimeListWidgetModel::GetAnimeFromIndex(const QModelIndex& index) { | 223 Anime* AnimeListWidgetModel::GetAnimeFromIndex(const QModelIndex& index) { |
210 return (!index.isValid()) ? &(list[index.row()]) : nullptr; | 224 return (index.isValid()) ? &(list[index.row()]) : nullptr; |
211 } | 225 } |
212 | 226 |
213 QVariant AnimeListWidgetModel::data(const QModelIndex& index, int role) const { | 227 QVariant AnimeListWidgetModel::data(const QModelIndex& index, int role) const { |
214 if (!index.isValid()) | 228 if (!index.isValid()) |
215 return QVariant(); | 229 return QVariant(); |
216 if (role == Qt::DisplayRole) { | 230 if (role == Qt::DisplayRole) { |
217 switch (index.column()) { | 231 switch (index.column()) { |
218 case AL_TITLE: | 232 case AL_TITLE: |
219 return QString::fromWCharArray(list[index.row()].title.c_str()); | 233 return QString::fromWCharArray(list[index.row()].title.english.c_str()); |
220 case AL_PROGRESS: | 234 case AL_PROGRESS: |
221 return list[index.row()].progress; | 235 return list[index.row()].progress; |
222 case AL_SCORE: | 236 case AL_SCORE: |
223 return list[index.row()].score; | 237 return list[index.row()].score; |
224 case AL_TYPE: | 238 case AL_TYPE: |
225 return QString::fromStdString(AnimeFormatToStringMap[list[index.row()].type]); | 239 return QString::fromStdString(AnimeFormatToStringMap[list[index.row()].type]); |
226 case AL_SEASON: | 240 case AL_SEASON: |
227 return QString::fromStdString(AnimeSeasonToStringMap[list[index.row()].season]) + " " + QString::number((int)list[index.row()].air_date.year()); | 241 return QString::fromStdString(AnimeSeasonToStringMap[list[index.row()].season]) + " " + QString::number(list[index.row()].air_date.GetYear()); |
228 case AL_AVG_SCORE: | 242 case AL_AVG_SCORE: |
229 return list[index.row()].audience_score; | 243 return list[index.row()].audience_score; |
230 case AL_STARTED: | 244 case AL_STARTED: |
231 /* why c++20 chrono is stinky: the game */ | 245 return list[index.row()].started.GetAsQDate(); |
232 return QDate(int(list[index.row()].started.year()), static_cast<int>((unsigned int)list[index.row()].started.month()), static_cast<int>((unsigned int)list[index.row()].started.day())); | |
233 case AL_COMPLETED: | 246 case AL_COMPLETED: |
234 return QDate(int(list[index.row()].completed.year()), static_cast<int>((unsigned int)list[index.row()].completed.month()), static_cast<int>((unsigned int)list[index.row()].completed.day())); | 247 return list[index.row()].completed.GetAsQDate(); |
248 case AL_UPDATED: { | |
249 if (list[index.row()].updated == 0) | |
250 return QString("-"); | |
251 Time::Duration duration(Time::GetSystemTime() - list[index.row()].updated); | |
252 return QString::fromStdString(duration.AsRelativeString()); | |
253 } | |
235 case AL_NOTES: | 254 case AL_NOTES: |
236 return QString::fromWCharArray(list[index.row()].notes.c_str()); | 255 return QString::fromWCharArray(list[index.row()].notes.c_str()); |
237 default: | 256 default: |
238 return ""; | 257 return ""; |
239 } | 258 } |
248 case AL_AVG_SCORE: | 267 case AL_AVG_SCORE: |
249 return QVariant(Qt::AlignCenter | Qt::AlignVCenter); | 268 return QVariant(Qt::AlignCenter | Qt::AlignVCenter); |
250 case AL_SEASON: | 269 case AL_SEASON: |
251 case AL_STARTED: | 270 case AL_STARTED: |
252 case AL_COMPLETED: | 271 case AL_COMPLETED: |
272 case AL_UPDATED: | |
253 return QVariant(Qt::AlignRight | Qt::AlignVCenter); | 273 return QVariant(Qt::AlignRight | Qt::AlignVCenter); |
254 default: | 274 default: |
255 break; | 275 break; |
256 } | 276 } |
257 } | 277 } |
258 return QVariant(); | 278 return QVariant(); |
259 } | 279 } |
260 | 280 |
261 /* this should ALWAYS be called if the list is edited */ | 281 void AnimeListWidgetModel::UpdateAnime(Anime& anime) { |
262 void AnimeListWidgetModel::Update() { | 282 int i = list.GetAnimeIndex(anime); |
263 | 283 emit dataChanged(index(i), index(i)); |
264 } | 284 } |
265 | 285 |
266 /* Most of this stuff is const and/or should be edited in the Information dialog | 286 /* Most of this stuff is const and/or should be edited in the Information dialog |
267 | 287 |
268 bool AnimeListWidgetModel::setData(const QModelIndex &index, const QVariant &value, int role) { | 288 bool AnimeListWidgetModel::setData(const QModelIndex &index, const QVariant &value, int role) { |
372 const QModelIndex index = model->index(selected_items.first().row()); | 392 const QModelIndex index = model->index(selected_items.first().row()); |
373 Anime* anime = model->GetAnimeFromIndex(index); | 393 Anime* anime = model->GetAnimeFromIndex(index); |
374 if (!anime) | 394 if (!anime) |
375 return; | 395 return; |
376 | 396 |
377 /* todo: open information dialog... */ | 397 InformationDialog* dialog = new InformationDialog(*anime, model, this); |
398 | |
399 dialog->show(); | |
400 dialog->raise(); | |
401 dialog->activateWindow(); | |
378 } | 402 } |
379 | 403 |
380 AnimeListWidget::AnimeListWidget(QWidget* parent, AnimeList* alist) | 404 AnimeListWidget::AnimeListWidget(QWidget* parent, AnimeList* alist) |
381 : QTreeView(parent) { | 405 : QTreeView(parent) { |
382 model = new AnimeListWidgetModel(parent, alist); | 406 model = new AnimeListWidgetModel(parent, alist); |
383 this->setModel(model); | 407 setModel(model); |
408 setObjectName("listwidget"); | |
409 setStyleSheet("QTreeView#listwidget{border-top:0px;}"); | |
384 setUniformRowHeights(true); | 410 setUniformRowHeights(true); |
385 setAllColumnsShowFocus(false); | 411 setAllColumnsShowFocus(false); |
386 setSortingEnabled(true); | 412 setSortingEnabled(true); |
387 setSelectionMode(QAbstractItemView::ExtendedSelection); | 413 setSelectionMode(QAbstractItemView::ExtendedSelection); |
388 setItemsExpandable(false); | 414 setItemsExpandable(false); |
405 SetColumnDefaults(); | 431 SetColumnDefaults(); |
406 // } | 432 // } |
407 } | 433 } |
408 | 434 |
409 AnimeListPage::AnimeListPage(QWidget* parent) : QTabWidget (parent) { | 435 AnimeListPage::AnimeListPage(QWidget* parent) : QTabWidget (parent) { |
410 setDocumentMode(true); | 436 setDocumentMode(false); |
411 SyncAnimeList(); | 437 SyncAnimeList(); |
412 for (AnimeList& list : anime_lists) { | 438 for (AnimeList& list : anime_lists) { |
413 addTab(new AnimeListWidget(this, &list), QString::fromWCharArray(list.name.c_str())); | 439 addTab(new AnimeListWidget(this, &list), QString::fromWCharArray(list.name.c_str())); |
414 } | 440 } |
415 } | 441 } |