Don't download images until they're displayed, show a message if an image couldn't be downloaded, show bigger fullsize images.

This commit is contained in:
David Sansome 2010-10-08 21:34:39 +00:00
parent 565ec47e42
commit fbb62a2f43
36 changed files with 175 additions and 32 deletions

View File

@ -1403,6 +1403,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "" msgstr ""
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1404,6 +1404,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "" msgstr ""
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1433,6 +1433,9 @@ msgstr "Previsualitza"
msgid "Previous track" msgid "Previous track"
msgstr "Pista anterior" msgstr "Pista anterior"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Progrés" msgstr "Progrés"

View File

@ -1408,6 +1408,9 @@ msgstr "Náhled"
msgid "Previous track" msgid "Previous track"
msgstr "Předchozí skladba" msgstr "Předchozí skladba"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Průběh" msgstr "Průběh"

View File

@ -1409,6 +1409,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "Forrige spor" msgstr "Forrige spor"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1434,6 +1434,9 @@ msgstr "Vorschau"
msgid "Previous track" msgid "Previous track"
msgstr "Vorheriges Stück" msgstr "Vorheriges Stück"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Fortschritt" msgstr "Fortschritt"

View File

@ -1437,6 +1437,9 @@ msgstr "Προεπισκόπηση"
msgid "Previous track" msgid "Previous track"
msgstr "Προηγούμενο κομμάτι" msgstr "Προηγούμενο κομμάτι"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Πρόοδος" msgstr "Πρόοδος"

View File

@ -1408,6 +1408,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "Previous track" msgstr "Previous track"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Progress" msgstr "Progress"

View File

@ -1405,6 +1405,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "Previous track" msgstr "Previous track"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1438,6 +1438,9 @@ msgstr "Vista previa"
msgid "Previous track" msgid "Previous track"
msgstr "Pista anterior" msgstr "Pista anterior"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Progreso" msgstr "Progreso"

View File

@ -1406,6 +1406,9 @@ msgstr "Esikatselu"
msgid "Previous track" msgid "Previous track"
msgstr "Edellinen kappale" msgstr "Edellinen kappale"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1442,6 +1442,9 @@ msgstr "Aperçu"
msgid "Previous track" msgid "Previous track"
msgstr "Piste précédente" msgstr "Piste précédente"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Progression" msgstr "Progression"

View File

@ -1410,6 +1410,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "" msgstr ""
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1431,6 +1431,9 @@ msgstr "Előnézet"
msgid "Previous track" msgid "Previous track"
msgstr "Előző szám" msgstr "Előző szám"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Folyamat" msgstr "Folyamat"

View File

@ -1442,6 +1442,9 @@ msgstr "Anteprima"
msgid "Previous track" msgid "Previous track"
msgstr "Traccia precedente" msgstr "Traccia precedente"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Avanzamento" msgstr "Avanzamento"

View File

@ -1405,6 +1405,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "" msgstr ""
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1404,6 +1404,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "" msgstr ""
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1407,6 +1407,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "Forrige spor" msgstr "Forrige spor"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1437,6 +1437,9 @@ msgstr "Voorbeeld"
msgid "Previous track" msgid "Previous track"
msgstr "Vorige track" msgstr "Vorige track"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Voortgang" msgstr "Voortgang"

View File

@ -1403,6 +1403,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "Pista precedenta" msgstr "Pista precedenta"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Progression" msgstr "Progression"

View File

@ -1433,6 +1433,9 @@ msgstr "Podgląd"
msgid "Previous track" msgid "Previous track"
msgstr "Poprzedni utwór" msgstr "Poprzedni utwór"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Postęp" msgstr "Postęp"

View File

@ -1434,6 +1434,9 @@ msgstr "Antevisão"
msgid "Previous track" msgid "Previous track"
msgstr "Faixa anterior" msgstr "Faixa anterior"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Evolução" msgstr "Evolução"

View File

@ -1422,6 +1422,9 @@ msgstr "Pré-visualização"
msgid "Previous track" msgid "Previous track"
msgstr "Faixa anterior" msgstr "Faixa anterior"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Andamento" msgstr "Andamento"

View File

@ -1404,6 +1404,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "Piesa precedentă" msgstr "Piesa precedentă"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1426,6 +1426,9 @@ msgstr "Предпросмотр"
msgid "Previous track" msgid "Previous track"
msgstr "Предыдущая композиция" msgstr "Предыдущая композиция"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Ход выполнения" msgstr "Ход выполнения"

View File

@ -1427,6 +1427,9 @@ msgstr "Náhľad"
msgid "Previous track" msgid "Previous track"
msgstr "Predchádzajúca skladba" msgstr "Predchádzajúca skladba"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Priebeh" msgstr "Priebeh"

View File

@ -1427,6 +1427,9 @@ msgstr "Predogled"
msgid "Previous track" msgid "Previous track"
msgstr "Predhodna skladba" msgstr "Predhodna skladba"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Potek" msgstr "Potek"

View File

@ -1409,6 +1409,9 @@ msgstr "Преглед"
msgid "Previous track" msgid "Previous track"
msgstr "Претходна нумера" msgstr "Претходна нумера"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Напредак" msgstr "Напредак"

View File

@ -1413,6 +1413,9 @@ msgstr "Förhandsvisning"
msgid "Previous track" msgid "Previous track"
msgstr "Föregående spår" msgstr "Föregående spår"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Förlopp" msgstr "Förlopp"

View File

@ -1430,6 +1430,9 @@ msgstr "Önizleme"
msgid "Previous track" msgid "Previous track"
msgstr "Önceki parça" msgstr "Önceki parça"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "İlerleme" msgstr "İlerleme"

View File

@ -1394,6 +1394,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "" msgstr ""
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1427,6 +1427,9 @@ msgstr "Перегляд"
msgid "Previous track" msgid "Previous track"
msgstr "Попередня доріжка" msgstr "Попередня доріжка"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "Поступ" msgstr "Поступ"

View File

@ -1403,6 +1403,9 @@ msgstr ""
msgid "Previous track" msgid "Previous track"
msgstr "上一音轨" msgstr "上一音轨"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""

View File

@ -1409,6 +1409,9 @@ msgstr "試聽"
msgid "Previous track" msgid "Previous track"
msgstr "上一首歌曲" msgstr "上一首歌曲"
msgid "Problem loading image"
msgstr ""
msgid "Progress" msgid "Progress"
msgstr "進展" msgstr "進展"

View File

@ -19,6 +19,7 @@
#include "ui/iconloader.h" #include "ui/iconloader.h"
#include <QApplication> #include <QApplication>
#include <QDesktopWidget>
#include <QFileDialog> #include <QFileDialog>
#include <QLabel> #include <QLabel>
#include <QMenu> #include <QMenu>
@ -74,7 +75,8 @@ QRect PrettyImageView::right() const {
QRect PrettyImageView::middle() const { QRect PrettyImageView::middle() const {
return QRect(kEdgeWidth + kEdgePadding, kBorderHeight, return QRect(kEdgeWidth + kEdgePadding, kBorderHeight,
width() - (kEdgeWidth + kEdgePadding) * 2, kImageHeight - kBorderHeight); width() - (kEdgeWidth + kEdgePadding) * 2,
kImageHeight - kBorderHeight);
} }
void PrettyImageView::Clear() { void PrettyImageView::Clear() {
@ -85,15 +87,22 @@ void PrettyImageView::Clear() {
} }
void PrettyImageView::AddImage(const QUrl& url) { 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_ ++; const int id = next_image_request_id_ ++;
// Add the image to the list
images_ << Image(url);
// Start fetching the image // Start fetching the image
network_->Get(url, this, "ImageFetched", id); network_->Get(image->url_, this, "ImageFetched", id);
image_requests_[id] = index; image_requests_[id] = index;
image->state_ = Image::Loading;
} }
void PrettyImageView::ImageFetched(quint64 id, QNetworkReply* reply) { 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)]; Image& data = images_[image_requests_.take(id)];
QImage image = QImage::fromData(reply->readAll()); QImage image = QImage::fromData(reply->readAll());
if (image.isNull()) if (image.isNull()) {
return; data.state_ = Image::Failed;
} else {
data.SetImage(image); data.SetImage(image);
data.state_ = Image::Loaded;
}
update(); update();
} }
@ -116,9 +127,6 @@ void PrettyImageView::paintEvent(QPaintEvent*) {
QPainter p(this); QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true); 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 next_index = current_index_ + 1;
const int prev_index = current_index_ - 1; const int prev_index = current_index_ - 1;
const int image_width = width() - kEdgeWidth * 2; const int image_width = width() - kEdgeWidth * 2;
@ -133,6 +141,11 @@ void PrettyImageView::paintEvent(QPaintEvent*) {
const QRect prev_rect(-image_width + kEdgeWidth, kBorderHeight, const QRect prev_rect(-image_width + kEdgeWidth, kBorderHeight,
image_width, kImageHeight - 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 // Draw the images
DrawImage(&p, current_rect, Qt::AlignHCenter, 1.0, current_index_); DrawImage(&p, current_rect, Qt::AlignHCenter, 1.0, current_index_);
DrawImage(&p, next_rect, Qt::AlignLeft, next_opacity, next_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; return;
const Image& image = images_[image_index]; 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 // Scale the image rect to fit in the rectangle
image_size.scale(rect.size(), Qt::KeepAspectRatio); 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 // Draw the main image
p->setOpacity(opacity); p->setOpacity(opacity);
DrawThumbnail(p, draw_rect, image); DrawThumbnail(p, draw_rect, align, image);
// Draw the reflection // Draw the reflection
// Figure out where to draw it // Figure out where to draw it
@ -183,7 +196,7 @@ void PrettyImageView::DrawImage(QPainter* p, const QRect& rect, Qt::Alignment al
reflection.rect().bottomRight()); reflection.rect().bottomRight());
// Draw the reflection into the buffer // 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 // Make it fade out towards the bottom
QLinearGradient fade_gradient(fade_rect.topLeft(), fade_rect.bottomLeft()); 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); p->drawImage(reflection_rect, reflection);
} }
void PrettyImageView::DrawThumbnail(QPainter* p, const QRect& rect, const Image& image) { void PrettyImageView::DrawThumbnail(QPainter* p, const QRect& rect,
if (image.image_.isNull()) { Qt::Alignment align, const Image& image) {
// Draw an empty box if there's no image to show switch (image.state_) {
case Image::WaitingForLazyLoad:
case Image::Loading:
p->setPen(palette().color(QPalette::Disabled, QPalette::Text)); p->setPen(palette().color(QPalette::Disabled, QPalette::Text));
p->drawText(rect, Qt::AlignHCenter | Qt::AlignBottom, tr("Loading...")); p->drawText(rect, align | Qt::AlignBottom, tr("Loading..."));
} else { break;
// Draw the image
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_); p->drawPixmap(rect, image.thumbnail_);
break;
} }
} }
@ -280,15 +302,23 @@ void PrettyImageView::ShowFullsize() {
const QImage& image = images_[current_index_].image_; 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; QScrollArea* window = new QScrollArea;
QLabel* label = new QLabel(window);
label->setPixmap(QPixmap::fromImage(image));
window->setWidget(label);
window->setAttribute(Qt::WA_DeleteOnClose, true); window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowTitle(tr("Clementine image viewer")); 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(); window->show();
} }

View File

@ -61,11 +61,18 @@ private slots:
private: private:
struct Image { struct Image {
Image(const QUrl& url) : loading_(false), url_(url) {} Image(const QUrl& url) : state_(WaitingForLazyLoad), url_(url) {}
void SetImage(const QImage& image); void SetImage(const QImage& image);
bool loading_; enum State {
WaitingForLazyLoad,
Loading,
Failed,
Loaded,
};
State state_;
QUrl url_; QUrl url_;
QImage image_; QImage image_;
QPixmap thumbnail_; QPixmap thumbnail_;
@ -77,8 +84,12 @@ private:
void SetTimeLineActive(QTimeLine* timeline, bool active); void SetTimeLineActive(QTimeLine* timeline, bool active);
void DrawImage(QPainter* p, const QRect& rect, Qt::Alignment align, qreal opacity, int image_index); void DrawImage(QPainter* p, const QRect& rect, Qt::Alignment align,
void DrawThumbnail(QPainter* p, const QRect& rect, const Image& image); qreal opacity, int image_index);
void DrawThumbnail(QPainter* p, const QRect& rect, Qt::Alignment align,
const Image& image);
void LazyLoadImage(int index);
private slots: private slots:
void ImageFetched(quint64 id, QNetworkReply* reply); void ImageFetched(quint64 id, QNetworkReply* reply);