Mercurial > minori
comparison src/gui/widgets/anime_info.cc @ 320:1b5c04268d6a
services/kitsu: ACTUALLY finish GetAnimeList
there are some things the API just... doesn't provide. therefore
we have to request the genres separately any time a new anime info
box is opened...
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Wed, 12 Jun 2024 19:49:19 -0400 |
parents | b1f625b0227c |
children | 5d3c9b31aa6e |
comparison
equal
deleted
inserted
replaced
319:d928ec7b6a0d | 320:1b5c04268d6a |
---|---|
1 #include "gui/widgets/anime_info.h" | 1 #include "gui/widgets/anime_info.h" |
2 #include "core/anime.h" | 2 #include "core/anime.h" |
3 #include "core/anime_db.h" | |
3 #include "core/strings.h" | 4 #include "core/strings.h" |
4 #include "gui/translate/anime.h" | 5 #include "gui/translate/anime.h" |
5 #include "gui/widgets/text.h" | 6 #include "gui/widgets/text.h" |
7 #include "services/services.h" | |
6 #include <QHBoxLayout> | 8 #include <QHBoxLayout> |
7 #include <QTextStream> | 9 #include <QTextStream> |
10 | |
11 AnimeInfoWidgetGetMetadataThread::AnimeInfoWidgetGetMetadataThread(QObject* parent) : QThread(parent) {} | |
12 | |
13 void AnimeInfoWidgetGetMetadataThread::AddToQueue(int id) { | |
14 const std::lock_guard<std::mutex> guard(queue_mutex_); | |
15 queue_.push(id); | |
16 } | |
17 | |
18 /* processes the queue... */ | |
19 void AnimeInfoWidgetGetMetadataThread::run() { | |
20 queue_mutex_.lock(); | |
21 while (!queue_.empty() && !isInterruptionRequested()) { | |
22 int id = queue_.front(); | |
23 | |
24 queue_mutex_.unlock(); | |
25 | |
26 if (Services::RetrieveAnimeMetadata(id)) | |
27 emit NeedRefresh(id); | |
28 | |
29 queue_mutex_.lock(); | |
30 | |
31 queue_.pop(); | |
32 } | |
33 queue_mutex_.unlock(); | |
34 } | |
35 | |
36 /* all widgets share this thread */ | |
37 static AnimeInfoWidgetGetMetadataThread get_metadata_thread; | |
8 | 38 |
9 AnimeInfoWidget::AnimeInfoWidget(QWidget* parent) | 39 AnimeInfoWidget::AnimeInfoWidget(QWidget* parent) |
10 : QWidget(parent) | 40 : QWidget(parent) |
11 , _title(tr("Alternative titles"), "") | 41 , _title(tr("Alternative titles"), "") |
12 , _details(tr("Details"), tr("Type:\nEpisodes:\nStatus:\nSeason:\nGenres:\nScore:"), "") | 42 , _details(tr("Details"), tr("Type:\nEpisodes:\nStatus:\nSeason:\nGenres:\nProducers:\nScore:"), "") |
13 , _synopsis(tr("Synopsis"), "") { | 43 , _synopsis(tr("Synopsis"), "") { |
14 QVBoxLayout* layout = new QVBoxLayout(this); | 44 QVBoxLayout* layout = new QVBoxLayout(this); |
15 | 45 |
16 layout->addWidget(&_title); | 46 layout->addWidget(&_title); |
17 layout->addWidget(&_details); | 47 layout->addWidget(&_details); |
18 layout->addWidget(&_synopsis); | 48 layout->addWidget(&_synopsis); |
49 | |
50 /* ... */ | |
51 connect(&get_metadata_thread, &AnimeInfoWidgetGetMetadataThread::NeedRefresh, this, [this](int id) { | |
52 setUpdatesEnabled(false); | |
53 | |
54 if (id == id_) | |
55 RefreshGenres(Anime::db.items[id]); | |
56 | |
57 setUpdatesEnabled(true); | |
58 }); | |
19 } | 59 } |
20 | 60 |
21 AnimeInfoWidget::AnimeInfoWidget(const Anime::Anime& anime, QWidget* parent) : AnimeInfoWidget(parent) { | 61 AnimeInfoWidget::AnimeInfoWidget(const Anime::Anime& anime, QWidget* parent) : AnimeInfoWidget(parent) { |
22 SetAnime(anime); | 62 SetAnime(anime); |
23 } | 63 } |
24 | 64 |
25 void AnimeInfoWidget::SetAnime(const Anime::Anime& anime) { | 65 void AnimeInfoWidget::SetAnime(const Anime::Anime& anime) { |
66 setUpdatesEnabled(false); | |
67 | |
68 id_ = anime.GetId(); | |
69 | |
70 get_metadata_thread.AddToQueue(id_); | |
71 if (!get_metadata_thread.isRunning()) | |
72 get_metadata_thread.start(); | |
73 | |
26 /* alt titles */ | 74 /* alt titles */ |
27 _title.GetLine()->SetText(Strings::ToQString(Strings::Implode(anime.GetTitleSynonyms(), ", "))); | 75 _title.GetLine()->SetText(Strings::ToQString(Strings::Implode(anime.GetTitleSynonyms(), ", "))); |
28 | 76 |
77 RefreshGenres(anime); | |
78 | |
79 _synopsis.GetParagraph()->SetText(Strings::ToQString(anime.GetSynopsis())); | |
80 | |
81 setUpdatesEnabled(true); | |
82 | |
83 updateGeometry(); | |
84 } | |
85 | |
86 void AnimeInfoWidget::RefreshGenres(const Anime::Anime& anime) { | |
29 /* details */ | 87 /* details */ |
30 QString details_data; | 88 QString details_data; |
31 QTextStream details_data_s(&details_data); | 89 QTextStream details_data_s(&details_data); |
32 | 90 |
33 /* we have to convert ALL of these strings to | 91 /* we have to convert ALL of these strings to |
34 * QString because QTextStream sucks and assumes | 92 * QString because QTextStream sucks and assumes |
35 * Latin1 (on Windows?) */ | 93 * Latin-1 (on Windows?) */ |
36 const auto genres = anime.GetGenres(); | 94 const auto genres = anime.GetGenres(); |
95 const auto producers = anime.GetProducers(); | |
96 | |
37 details_data_s << Strings::ToQString(Translate::ToLocalString(anime.GetFormat())) << "\n" | 97 details_data_s << Strings::ToQString(Translate::ToLocalString(anime.GetFormat())) << "\n" |
38 << anime.GetEpisodes() << "\n" | 98 << anime.GetEpisodes() << "\n" |
39 << Strings::ToQString(Translate::ToLocalString(anime.GetAiringStatus())) << "\n" | 99 << Strings::ToQString(Translate::ToLocalString(anime.GetAiringStatus())) << "\n" |
40 << Strings::ToQString(Translate::ToLocalString(anime.GetSeason())) << " " | 100 << Strings::ToQString(Translate::ToLocalString(anime.GetSeason())) << " " |
41 << anime.GetAirDate().GetYear().value_or(2000) << "\n" | 101 << anime.GetAirDate().GetYear().value_or(2000) << "\n" |
42 << Strings::ToQString((genres.size() > 1) ? Strings::Implode(genres, ", ") : "-") << "\n" | 102 << Strings::ToQString((genres.size() > 1) ? Strings::Implode(genres, ", ") : "-") << "\n" |
103 << Strings::ToQString((producers.size() > 1) ? Strings::Implode(producers, ", ") : "-") << "\n" | |
43 << anime.GetAudienceScore() << "%"; | 104 << anime.GetAudienceScore() << "%"; |
105 | |
44 _details.GetData()->setText(details_data); | 106 _details.GetData()->setText(details_data); |
45 | |
46 _synopsis.GetParagraph()->SetText(Strings::ToQString(anime.GetSynopsis())); | |
47 | |
48 updateGeometry(); | |
49 } | 107 } |