comparison src/gui/widgets/poster.cc @ 370:ea3a74ed2ef9

*: hm, last commit wasn't quite finished?
author Paper <paper@tflc.us>
date Fri, 25 Jul 2025 10:22:04 -0400
parents 6b0768158dcd
children
comparison
equal deleted inserted replaced
369:47c9f8502269 370:ea3a74ed2ef9
16 #include <QThread> 16 #include <QThread>
17 #include <QUrl> 17 #include <QUrl>
18 18
19 #include <iostream> 19 #include <iostream>
20 20
21 Poster::Poster(QWidget* parent) : QFrame(parent) { 21 Poster::Poster(QWidget *parent) : QFrame(parent)
22 QHBoxLayout* layout = new QHBoxLayout(this); 22 {
23 QHBoxLayout *layout = new QHBoxLayout(this);
23 layout->setContentsMargins(1, 1, 1, 1); 24 layout->setContentsMargins(1, 1, 1, 1);
24 25
25 setCursor(Qt::PointingHandCursor); 26 setCursor(Qt::PointingHandCursor);
26 setFixedSize(150, 225); // FIXME need to kill this 27 setFixedSize(150, 225); // FIXME need to kill this
27 setFrameShape(QFrame::Box); 28 setFrameShape(QFrame::Box);
32 33
33 get_thread_ = new HTTP::RequestThread(HTTP::Type::Get); 34 get_thread_ = new HTTP::RequestThread(HTTP::Type::Get);
34 connect(get_thread_, &HTTP::RequestThread::ReceivedData, this, &Poster::ImageDownloadFinished); 35 connect(get_thread_, &HTTP::RequestThread::ReceivedData, this, &Poster::ImageDownloadFinished);
35 } 36 }
36 37
37 Poster::Poster(const Anime::Anime& anime, QWidget* parent) : Poster(parent) { 38 Poster::Poster(const Anime::Anime &anime, QWidget *parent) : Poster(parent)
39 {
38 SetAnime(anime); 40 SetAnime(anime);
39 } 41 }
40 42
41 Poster::~Poster() { 43 Poster::~Poster()
44 {
42 /* schedule deletion of the thread */ 45 /* schedule deletion of the thread */
43 get_thread_->deleteLater(); 46 get_thread_->deleteLater();
44 } 47 }
45 48
46 void Poster::DownloadPoster() { 49 void Poster::DownloadPoster()
50 {
47 if (get_thread_->isRunning()) 51 if (get_thread_->isRunning())
48 get_thread_->Stop(); 52 get_thread_->Stop();
49 get_thread_->wait(); 53 get_thread_->wait();
50 54
51 get_thread_->SetUrl(poster_url_); 55 get_thread_->SetUrl(poster_url_);
52 get_thread_->start(); 56 get_thread_->start();
53 } 57 }
54 58
55 void Poster::SetAnime(const Anime::Anime& anime) { 59 void Poster::SetAnime(const Anime::Anime &anime)
60 {
56 label_.clear(); 61 label_.clear();
57 62
58 poster_url_ = anime.GetPosterUrl(); 63 poster_url_ = anime.GetPosterUrl();
59 if (isVisible()) 64 if (isVisible())
60 DownloadPoster(); 65 DownloadPoster();
69 label_.disconnect(); 74 label_.disconnect();
70 connect(&label_, &ClickableLabel::clicked, this, [this] { QDesktopServices::openUrl(service_url_); }); 75 connect(&label_, &ClickableLabel::clicked, this, [this] { QDesktopServices::openUrl(service_url_); });
71 } 76 }
72 } 77 }
73 78
74 void Poster::showEvent(QShowEvent* event) { 79 void Poster::showEvent(QShowEvent *event)
80 {
75 if (need_refresh_) { 81 if (need_refresh_) {
76 DownloadPoster(); 82 DownloadPoster();
77 need_refresh_ = false; 83 need_refresh_ = false;
78 } 84 }
79 } 85 }
80 86
81 void Poster::SetClickable(bool enabled) { 87 void Poster::SetClickable(bool enabled)
88 {
82 clickable_ = enabled; 89 clickable_ = enabled;
83 90
84 if (clickable_ && !service_url_.isEmpty()) { 91 if (clickable_ && !service_url_.isEmpty()) {
85 setCursor(Qt::PointingHandCursor); 92 setCursor(Qt::PointingHandCursor);
86 label_.disconnect(); 93 label_.disconnect();
89 setCursor(Qt::ArrowCursor); 96 setCursor(Qt::ArrowCursor);
90 label_.disconnect(); 97 label_.disconnect();
91 } 98 }
92 } 99 }
93 100
94 void Poster::ImageDownloadFinished(const QByteArray& arr) { 101 void Poster::ImageDownloadFinished(const QByteArray &arr)
102 {
95 img_.loadFromData(arr); 103 img_.loadFromData(arr);
96 RenderToLabel(); 104 RenderToLabel();
97 } 105 }
98 106
99 void Poster::RenderToLabel() { 107 void Poster::RenderToLabel()
108 {
100 const QPixmap pixmap = QPixmap::fromImage(img_); 109 const QPixmap pixmap = QPixmap::fromImage(img_);
101 if (pixmap.isNull()) 110 if (pixmap.isNull())
102 return; 111 return;
103 label_.setPixmap(pixmap.scaled(label_.size(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); 112 label_.setPixmap(pixmap.scaled(label_.size(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation));
104 } 113 }
105 114
106 bool Poster::hasHeightForWidth(void) const { 115 bool Poster::hasHeightForWidth(void) const
116 {
107 return true; 117 return true;
108 } 118 }
109 119
110 int Poster::heightForWidth(int w) const { 120 int Poster::heightForWidth(int w) const
121 {
111 return static_cast<int>(static_cast<double>(w) * 225 / 150); 122 return static_cast<int>(static_cast<double>(w) * 225 / 150);
112 } 123 }
113 124
114 void Poster::resizeEvent(QResizeEvent*) { 125 void Poster::resizeEvent(QResizeEvent *)
126 {
115 RenderToLabel(); 127 RenderToLabel();
116 } 128 }
117 129
118 QSize Poster::minimumSizeHint() const { 130 QSize Poster::minimumSizeHint() const
131 {
119 return QSize(120, heightForWidth(120)); 132 return QSize(120, heightForWidth(120));
120 } 133 }
121 134
122 QSize Poster::sizeHint() const { 135 QSize Poster::sizeHint() const
136 {
123 return QSize(150, heightForWidth(150)); 137 return QSize(150, heightForWidth(150));
124 } 138 }