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 {