diff --git a/src/translations/ar.po b/src/translations/ar.po index 906d6c293..bd121ce9f 100644 --- a/src/translations/ar.po +++ b/src/translations/ar.po @@ -1403,6 +1403,9 @@ msgstr "" msgid "Previous track" msgstr "" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/bg.po b/src/translations/bg.po index aedbde0a6..ceb19806f 100644 --- a/src/translations/bg.po +++ b/src/translations/bg.po @@ -1404,6 +1404,9 @@ msgstr "" msgid "Previous track" msgstr "" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/ca.po b/src/translations/ca.po index ac6ddb400..faa14d479 100644 --- a/src/translations/ca.po +++ b/src/translations/ca.po @@ -1433,6 +1433,9 @@ msgstr "Previsualitza" msgid "Previous track" msgstr "Pista anterior" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Progrés" diff --git a/src/translations/cs.po b/src/translations/cs.po index 71f9605b9..9a2d78016 100644 --- a/src/translations/cs.po +++ b/src/translations/cs.po @@ -1408,6 +1408,9 @@ msgstr "Náhled" msgid "Previous track" msgstr "Předchozí skladba" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Průběh" diff --git a/src/translations/da.po b/src/translations/da.po index 1f9e997d1..e88e8aa8d 100644 --- a/src/translations/da.po +++ b/src/translations/da.po @@ -1409,6 +1409,9 @@ msgstr "" msgid "Previous track" msgstr "Forrige spor" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/de.po b/src/translations/de.po index 952149f03..1c4cff36f 100644 --- a/src/translations/de.po +++ b/src/translations/de.po @@ -1434,6 +1434,9 @@ msgstr "Vorschau" msgid "Previous track" msgstr "Vorheriges Stück" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Fortschritt" diff --git a/src/translations/el.po b/src/translations/el.po index d7e263688..ae9df7d42 100644 --- a/src/translations/el.po +++ b/src/translations/el.po @@ -1437,6 +1437,9 @@ msgstr "Προεπισκόπηση" msgid "Previous track" msgstr "Προηγούμενο κομμάτι" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Πρόοδος" diff --git a/src/translations/en_CA.po b/src/translations/en_CA.po index 854a25e2a..89134af5b 100644 --- a/src/translations/en_CA.po +++ b/src/translations/en_CA.po @@ -1408,6 +1408,9 @@ msgstr "" msgid "Previous track" msgstr "Previous track" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Progress" diff --git a/src/translations/en_GB.po b/src/translations/en_GB.po index dccaa9315..ed266e6fe 100644 --- a/src/translations/en_GB.po +++ b/src/translations/en_GB.po @@ -1405,6 +1405,9 @@ msgstr "" msgid "Previous track" msgstr "Previous track" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/es.po b/src/translations/es.po index 4cab720b3..8e1308f92 100644 --- a/src/translations/es.po +++ b/src/translations/es.po @@ -1438,6 +1438,9 @@ msgstr "Vista previa" msgid "Previous track" msgstr "Pista anterior" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Progreso" diff --git a/src/translations/fi.po b/src/translations/fi.po index 02a0efaa2..cc5602db2 100644 --- a/src/translations/fi.po +++ b/src/translations/fi.po @@ -1406,6 +1406,9 @@ msgstr "Esikatselu" msgid "Previous track" msgstr "Edellinen kappale" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/fr.po b/src/translations/fr.po index 92c029974..4c5a61abe 100644 --- a/src/translations/fr.po +++ b/src/translations/fr.po @@ -1442,6 +1442,9 @@ msgstr "Aperçu" msgid "Previous track" msgstr "Piste précédente" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Progression" diff --git a/src/translations/gl.po b/src/translations/gl.po index d551c11d1..64f3a4c5f 100644 --- a/src/translations/gl.po +++ b/src/translations/gl.po @@ -1410,6 +1410,9 @@ msgstr "" msgid "Previous track" msgstr "" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/hu.po b/src/translations/hu.po index 2bc4bbcd5..0a6c5241d 100644 --- a/src/translations/hu.po +++ b/src/translations/hu.po @@ -1431,6 +1431,9 @@ msgstr "Előnézet" msgid "Previous track" msgstr "Előző szám" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Folyamat" diff --git a/src/translations/it.po b/src/translations/it.po index e6edd293d..222cef8b9 100644 --- a/src/translations/it.po +++ b/src/translations/it.po @@ -1442,6 +1442,9 @@ msgstr "Anteprima" msgid "Previous track" msgstr "Traccia precedente" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Avanzamento" diff --git a/src/translations/kk.po b/src/translations/kk.po index 88fa7aece..fe2d72b1d 100644 --- a/src/translations/kk.po +++ b/src/translations/kk.po @@ -1405,6 +1405,9 @@ msgstr "" msgid "Previous track" msgstr "" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/lt.po b/src/translations/lt.po index 41a9d2fbb..de88bbdf2 100644 --- a/src/translations/lt.po +++ b/src/translations/lt.po @@ -1404,6 +1404,9 @@ msgstr "" msgid "Previous track" msgstr "" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/nb.po b/src/translations/nb.po index 1e15b8436..8af0f6f50 100644 --- a/src/translations/nb.po +++ b/src/translations/nb.po @@ -1407,6 +1407,9 @@ msgstr "" msgid "Previous track" msgstr "Forrige spor" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/nl.po b/src/translations/nl.po index 44c51eebb..b5228d30d 100644 --- a/src/translations/nl.po +++ b/src/translations/nl.po @@ -1437,6 +1437,9 @@ msgstr "Voorbeeld" msgid "Previous track" msgstr "Vorige track" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Voortgang" diff --git a/src/translations/oc.po b/src/translations/oc.po index 5d8f0e31c..6a05f9421 100644 --- a/src/translations/oc.po +++ b/src/translations/oc.po @@ -1403,6 +1403,9 @@ msgstr "" msgid "Previous track" msgstr "Pista precedenta" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Progression" diff --git a/src/translations/pl.po b/src/translations/pl.po index 657f859fc..abed9ce78 100644 --- a/src/translations/pl.po +++ b/src/translations/pl.po @@ -1433,6 +1433,9 @@ msgstr "Podgląd" msgid "Previous track" msgstr "Poprzedni utwór" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Postęp" diff --git a/src/translations/pt.po b/src/translations/pt.po index bb80c7a84..3e70392ab 100644 --- a/src/translations/pt.po +++ b/src/translations/pt.po @@ -1434,6 +1434,9 @@ msgstr "Antevisão" msgid "Previous track" msgstr "Faixa anterior" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Evolução" diff --git a/src/translations/pt_BR.po b/src/translations/pt_BR.po index 11676ac37..e6aa10489 100644 --- a/src/translations/pt_BR.po +++ b/src/translations/pt_BR.po @@ -1422,6 +1422,9 @@ msgstr "Pré-visualização" msgid "Previous track" msgstr "Faixa anterior" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Andamento" diff --git a/src/translations/ro.po b/src/translations/ro.po index b2fed7dc9..e7a5654ad 100644 --- a/src/translations/ro.po +++ b/src/translations/ro.po @@ -1404,6 +1404,9 @@ msgstr "" msgid "Previous track" msgstr "Piesa precedentă" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/ru.po b/src/translations/ru.po index 57117afda..f025d8519 100644 --- a/src/translations/ru.po +++ b/src/translations/ru.po @@ -1426,6 +1426,9 @@ msgstr "Предпросмотр" msgid "Previous track" msgstr "Предыдущая композиция" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Ход выполнения" diff --git a/src/translations/sk.po b/src/translations/sk.po index b2864ef91..ae01a555b 100644 --- a/src/translations/sk.po +++ b/src/translations/sk.po @@ -1427,6 +1427,9 @@ msgstr "Náhľad" msgid "Previous track" msgstr "Predchádzajúca skladba" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Priebeh" diff --git a/src/translations/sl.po b/src/translations/sl.po index c11f76cb9..a1ed4fcc0 100644 --- a/src/translations/sl.po +++ b/src/translations/sl.po @@ -1427,6 +1427,9 @@ msgstr "Predogled" msgid "Previous track" msgstr "Predhodna skladba" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Potek" diff --git a/src/translations/sr.po b/src/translations/sr.po index 2eea65722..c5733027a 100644 --- a/src/translations/sr.po +++ b/src/translations/sr.po @@ -1409,6 +1409,9 @@ msgstr "Преглед" msgid "Previous track" msgstr "Претходна нумера" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Напредак" diff --git a/src/translations/sv.po b/src/translations/sv.po index 2dc483e0b..be0b3aed8 100644 --- a/src/translations/sv.po +++ b/src/translations/sv.po @@ -1413,6 +1413,9 @@ msgstr "Förhandsvisning" msgid "Previous track" msgstr "Föregående spår" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Förlopp" diff --git a/src/translations/tr.po b/src/translations/tr.po index 66e19efba..3ccde7b7c 100644 --- a/src/translations/tr.po +++ b/src/translations/tr.po @@ -1430,6 +1430,9 @@ msgstr "Önizleme" msgid "Previous track" msgstr "Önceki parça" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "İlerleme" diff --git a/src/translations/translations.pot b/src/translations/translations.pot index 70f3b9ff1..ac7e6e03e 100644 --- a/src/translations/translations.pot +++ b/src/translations/translations.pot @@ -1394,6 +1394,9 @@ msgstr "" msgid "Previous track" msgstr "" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/uk.po b/src/translations/uk.po index b8d62c1a4..c50c64535 100644 --- a/src/translations/uk.po +++ b/src/translations/uk.po @@ -1427,6 +1427,9 @@ msgstr "Перегляд" msgid "Previous track" msgstr "Попередня доріжка" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "Поступ" diff --git a/src/translations/zh_CN.po b/src/translations/zh_CN.po index 10b6f73d8..b757a1707 100644 --- a/src/translations/zh_CN.po +++ b/src/translations/zh_CN.po @@ -1403,6 +1403,9 @@ msgstr "" msgid "Previous track" msgstr "上一音轨" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "" diff --git a/src/translations/zh_TW.po b/src/translations/zh_TW.po index f3f30f5da..1ad1f5e04 100644 --- a/src/translations/zh_TW.po +++ b/src/translations/zh_TW.po @@ -1409,6 +1409,9 @@ msgstr "試聽" msgid "Previous track" msgstr "上一首歌曲" +msgid "Problem loading image" +msgstr "" + msgid "Progress" msgstr "進展" diff --git a/src/widgets/prettyimageview.cpp b/src/widgets/prettyimageview.cpp index 361db41e0..fda920c5a 100644 --- a/src/widgets/prettyimageview.cpp +++ b/src/widgets/prettyimageview.cpp @@ -19,6 +19,7 @@ #include "ui/iconloader.h" #include +#include #include #include #include @@ -74,7 +75,8 @@ QRect PrettyImageView::right() const { QRect PrettyImageView::middle() const { return QRect(kEdgeWidth + kEdgePadding, kBorderHeight, - width() - (kEdgeWidth + kEdgePadding) * 2, kImageHeight - kBorderHeight); + width() - (kEdgeWidth + kEdgePadding) * 2, + kImageHeight - kBorderHeight); } void PrettyImageView::Clear() { @@ -85,15 +87,22 @@ void PrettyImageView::Clear() { } void PrettyImageView::AddImage(const QUrl& url) { - const int index = images_.count(); + images_ << Image(url); +} + +void PrettyImageView::LazyLoadImage(int index) { + if (index < 0 || index >= images_.count()) + return; + Image* image = &images_[index]; + if (image->state_ != Image::WaitingForLazyLoad) + return; + const int id = next_image_request_id_ ++; - // Add the image to the list - images_ << Image(url); - // Start fetching the image - network_->Get(url, this, "ImageFetched", id); + network_->Get(image->url_, this, "ImageFetched", id); image_requests_[id] = index; + image->state_ = Image::Loading; } void PrettyImageView::ImageFetched(quint64 id, QNetworkReply* reply) { @@ -105,10 +114,12 @@ void PrettyImageView::ImageFetched(quint64 id, QNetworkReply* reply) { Image& data = images_[image_requests_.take(id)]; QImage image = QImage::fromData(reply->readAll()); - if (image.isNull()) - return; - - data.SetImage(image); + if (image.isNull()) { + data.state_ = Image::Failed; + } else { + data.SetImage(image); + data.state_ = Image::Loaded; + } update(); } @@ -116,9 +127,6 @@ void PrettyImageView::paintEvent(QPaintEvent*) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); - p.setBrush(palette().color(QPalette::Highlight)); - p.setPen(QPen(palette().color(QPalette::Text), 0.5)); - const int next_index = current_index_ + 1; const int prev_index = current_index_ - 1; const int image_width = width() - kEdgeWidth * 2; @@ -133,6 +141,11 @@ void PrettyImageView::paintEvent(QPaintEvent*) { const QRect prev_rect(-image_width + kEdgeWidth, kBorderHeight, image_width, kImageHeight - kBorderHeight); + // Start the images loading if they're not already + LazyLoadImage(current_index_); + LazyLoadImage(next_index); + LazyLoadImage(prev_index); + // Draw the images DrawImage(&p, current_rect, Qt::AlignHCenter, 1.0, current_index_); DrawImage(&p, next_rect, Qt::AlignLeft, next_opacity, next_index); @@ -145,7 +158,7 @@ void PrettyImageView::DrawImage(QPainter* p, const QRect& rect, Qt::Alignment al return; const Image& image = images_[image_index]; - QSize image_size = image.image_.isNull() ? QSize(100, 160) : image.image_.size(); + QSize image_size = image.image_.isNull() ? QSize(160, 100) : image.image_.size(); // Scale the image rect to fit in the rectangle image_size.scale(rect.size(), Qt::KeepAspectRatio); @@ -161,7 +174,7 @@ void PrettyImageView::DrawImage(QPainter* p, const QRect& rect, Qt::Alignment al // Draw the main image p->setOpacity(opacity); - DrawThumbnail(p, draw_rect, image); + DrawThumbnail(p, draw_rect, align, image); // Draw the reflection // Figure out where to draw it @@ -183,7 +196,7 @@ void PrettyImageView::DrawImage(QPainter* p, const QRect& rect, Qt::Alignment al reflection.rect().bottomRight()); // Draw the reflection into the buffer - DrawThumbnail(&reflection_painter, reflection.rect(), image); + DrawThumbnail(&reflection_painter, reflection.rect(), align, image); // Make it fade out towards the bottom QLinearGradient fade_gradient(fade_rect.topLeft(), fade_rect.bottomLeft()); @@ -199,14 +212,23 @@ void PrettyImageView::DrawImage(QPainter* p, const QRect& rect, Qt::Alignment al p->drawImage(reflection_rect, reflection); } -void PrettyImageView::DrawThumbnail(QPainter* p, const QRect& rect, const Image& image) { - if (image.image_.isNull()) { - // Draw an empty box if there's no image to show +void PrettyImageView::DrawThumbnail(QPainter* p, const QRect& rect, + Qt::Alignment align, const Image& image) { + switch (image.state_) { + case Image::WaitingForLazyLoad: + case Image::Loading: p->setPen(palette().color(QPalette::Disabled, QPalette::Text)); - p->drawText(rect, Qt::AlignHCenter | Qt::AlignBottom, tr("Loading...")); - } else { - // Draw the image + p->drawText(rect, align | Qt::AlignBottom, tr("Loading...")); + break; + + case Image::Failed: + p->setPen(palette().color(QPalette::Disabled, QPalette::Text)); + p->drawText(rect, align | Qt::AlignBottom, tr("Problem loading image")); + break; + + case Image::Loaded: p->drawPixmap(rect, image.thumbnail_); + break; } } @@ -280,15 +302,23 @@ void PrettyImageView::ShowFullsize() { const QImage& image = images_[current_index_].image_; + // Work out how large to make the window, based on the size of the screen + QRect desktop_rect(QApplication::desktop()->availableGeometry(this)); + QSize window_size(qMin(desktop_rect.width() - 20, image.width() + 2), + qMin(desktop_rect.height() - 20, image.height() + 2)); + + // Create the window QScrollArea* window = new QScrollArea; - - QLabel* label = new QLabel(window); - label->setPixmap(QPixmap::fromImage(image)); - window->setWidget(label); - window->setAttribute(Qt::WA_DeleteOnClose, true); window->setWindowTitle(tr("Clementine image viewer")); - window->resize(qMin(800, image.width() + 2), qMin(500, image.height() + 2)); + window->resize(window_size); + + // Create the label that displays the image + QLabel* label = new QLabel(window); + label->setPixmap(QPixmap::fromImage(image)); + + // Show the label in the window + window->setWidget(label); window->show(); } diff --git a/src/widgets/prettyimageview.h b/src/widgets/prettyimageview.h index 52c5fd741..017d35008 100644 --- a/src/widgets/prettyimageview.h +++ b/src/widgets/prettyimageview.h @@ -61,11 +61,18 @@ private slots: private: struct Image { - Image(const QUrl& url) : loading_(false), url_(url) {} + Image(const QUrl& url) : state_(WaitingForLazyLoad), url_(url) {} void SetImage(const QImage& image); - bool loading_; + enum State { + WaitingForLazyLoad, + Loading, + Failed, + Loaded, + }; + + State state_; QUrl url_; QImage image_; QPixmap thumbnail_; @@ -77,8 +84,12 @@ private: void SetTimeLineActive(QTimeLine* timeline, bool active); - void DrawImage(QPainter* p, const QRect& rect, Qt::Alignment align, qreal opacity, int image_index); - void DrawThumbnail(QPainter* p, const QRect& rect, const Image& image); + void DrawImage(QPainter* p, const QRect& rect, Qt::Alignment align, + qreal opacity, int image_index); + void DrawThumbnail(QPainter* p, const QRect& rect, Qt::Alignment align, + const Image& image); + + void LazyLoadImage(int index); private slots: void ImageFetched(quint64 id, QNetworkReply* reply);