Mercurial > minori
comparison src/gui/widgets/poster.cc @ 378:5912dafc6e28
anime: add poster cache
:)
| author | Paper <paper@tflc.us> |
|---|---|
| date | Wed, 05 Nov 2025 12:50:35 -0500 |
| parents | ea3a74ed2ef9 |
| children |
comparison
equal
deleted
inserted
replaced
| 377:1b0b8e746d83 | 378:5912dafc6e28 |
|---|---|
| 16 #include <QThread> | 16 #include <QThread> |
| 17 #include <QUrl> | 17 #include <QUrl> |
| 18 | 18 |
| 19 #include <iostream> | 19 #include <iostream> |
| 20 | 20 |
| 21 GetPosterThread::GetPosterThread(QObject *parent) : QThread(parent) | |
| 22 { | |
| 23 } | |
| 24 | |
| 25 void GetPosterThread::SetId(int id) | |
| 26 { | |
| 27 id_ = id; | |
| 28 } | |
| 29 | |
| 30 void GetPosterThread::run() | |
| 31 { | |
| 32 /* this sucks cuz we can't really STOP the thread easily | |
| 33 * without making it fully finish */ | |
| 34 QImage img = Anime::db.GetAnimePoster(id_); | |
| 35 | |
| 36 emit Finished(img); | |
| 37 } | |
| 38 | |
| 21 Poster::Poster(QWidget *parent) : QFrame(parent) | 39 Poster::Poster(QWidget *parent) : QFrame(parent) |
| 22 { | 40 { |
| 23 QHBoxLayout *layout = new QHBoxLayout(this); | 41 QHBoxLayout *layout = new QHBoxLayout(this); |
| 24 layout->setContentsMargins(1, 1, 1, 1); | 42 layout->setContentsMargins(1, 1, 1, 1); |
| 25 | 43 |
| 29 setFrameShadow(QFrame::Plain); | 47 setFrameShadow(QFrame::Plain); |
| 30 | 48 |
| 31 label_.setAlignment(Qt::AlignCenter); | 49 label_.setAlignment(Qt::AlignCenter); |
| 32 layout->addWidget(&label_); | 50 layout->addWidget(&label_); |
| 33 | 51 |
| 34 get_thread_ = new HTTP::RequestThread(HTTP::Type::Get); | 52 get_thread_ = new GetPosterThread(nullptr); |
| 35 connect(get_thread_, &HTTP::RequestThread::ReceivedData, this, &Poster::ImageDownloadFinished); | 53 connect(get_thread_, &GetPosterThread::Finished, this, &Poster::ImageDownloadFinished); |
| 36 } | 54 } |
| 37 | 55 |
| 38 Poster::Poster(const Anime::Anime &anime, QWidget *parent) : Poster(parent) | 56 Poster::Poster(const Anime::Anime &anime, QWidget *parent) : Poster(parent) |
| 39 { | 57 { |
| 40 SetAnime(anime); | 58 SetAnime(anime); |
| 46 get_thread_->deleteLater(); | 64 get_thread_->deleteLater(); |
| 47 } | 65 } |
| 48 | 66 |
| 49 void Poster::DownloadPoster() | 67 void Poster::DownloadPoster() |
| 50 { | 68 { |
| 51 if (get_thread_->isRunning()) | 69 /* ;-; */ |
| 52 get_thread_->Stop(); | |
| 53 get_thread_->wait(); | 70 get_thread_->wait(); |
| 54 | 71 |
| 55 get_thread_->SetUrl(poster_url_); | 72 get_thread_->SetId(id_); |
| 56 get_thread_->start(); | 73 get_thread_->start(); |
| 57 } | 74 } |
| 58 | 75 |
| 59 void Poster::SetAnime(const Anime::Anime &anime) | 76 void Poster::SetAnime(const Anime::Anime &anime) |
| 60 { | 77 { |
| 61 label_.clear(); | 78 label_.clear(); |
| 62 | 79 |
| 63 poster_url_ = anime.GetPosterUrl(); | 80 id_ = anime.GetId(); |
| 64 if (isVisible()) | 81 |
| 82 if (isVisible()) { | |
| 65 DownloadPoster(); | 83 DownloadPoster(); |
| 66 else | 84 } else { |
| 67 need_refresh_ = true; | 85 need_refresh_ = true; |
| 86 } | |
| 68 | 87 |
| 69 std::optional<std::string> url = anime.GetServiceUrl(session.config.service); | 88 std::optional<std::string> url = anime.GetServiceUrl(session.config.service); |
| 70 if (url) | 89 if (url) |
| 71 service_url_ = Strings::ToQString(url.value()); | 90 service_url_ = Strings::ToQString(url.value()); |
| 72 | 91 |
| 96 setCursor(Qt::ArrowCursor); | 115 setCursor(Qt::ArrowCursor); |
| 97 label_.disconnect(); | 116 label_.disconnect(); |
| 98 } | 117 } |
| 99 } | 118 } |
| 100 | 119 |
| 101 void Poster::ImageDownloadFinished(const QByteArray &arr) | 120 void Poster::ImageDownloadFinished(const QImage &img) |
| 102 { | 121 { |
| 103 img_.loadFromData(arr); | 122 img_ = img; |
| 104 RenderToLabel(); | 123 RenderToLabel(); |
| 105 } | 124 } |
| 106 | 125 |
| 107 void Poster::RenderToLabel() | 126 void Poster::RenderToLabel() |
| 108 { | 127 { |
