Skip to content
This repository has been archived by the owner on Feb 12, 2023. It is now read-only.

Commit

Permalink
fix(file transfer widget): QPushButton allows image to overflow
Browse files Browse the repository at this point in the history
Introduced in 857dfbc

Regression was due to fact that QPushButton allows icon to overflow.
This patch does:
1. Scale and crop icon to fit into button.
2. Avoid upscaling small images.
3. Refactor FileTransferWidget::showPreview() to load image from file
   only once.

Closes #3042
  • Loading branch information
Talkless committed Apr 17, 2016
1 parent 8fa40d5 commit 32d588a
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 8 deletions.
45 changes: 37 additions & 8 deletions src/chatlog/content/filetransferwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -502,22 +502,24 @@ void FileTransferWidget::showPreview(const QString &filename)

if (previewExtensions.contains(QFileInfo(filename).suffix()))
{
const int size = qMax(ui->previewButton->width(), ui->previewButton->height());
// Subtract to make border visible
const int size = qMax(ui->previewButton->width(), ui->previewButton->height()) - 4;

QPixmap pmap = QPixmap(filename).scaled(QSize(size, size),
Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
ui->previewButton->setIcon(QIcon(pmap));
ui->previewButton->setIconSize(pmap.size());
const QImage image = QImage(filename);
const QPixmap iconPixmap = scaleCropIntoSquare(QPixmap::fromImage(image), size);

ui->previewButton->setIcon(QIcon(iconPixmap));
ui->previewButton->setIconSize(iconPixmap.size());
ui->previewButton->show();
// Show mouseover preview, but make sure it's not larger than 50% of the screen width/height
QRect desktopSize = QApplication::desktop()->screenGeometry();
QImage image = QImage(filename).scaled(0.5 * desktopSize.width(),
const QRect desktopSize = QApplication::desktop()->screenGeometry();
const QImage previewImage = image.scaled(0.5 * desktopSize.width(),
0.5 * desktopSize.height(),
Qt::KeepAspectRatio, Qt::SmoothTransformation);
QByteArray imageData;
QBuffer buffer(&imageData);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG");
previewImage.save(&buffer, "PNG");
buffer.close();
ui->previewButton->setToolTip("<img src=data:image/png;base64," + imageData.toBase64() + "/>");
}
Expand All @@ -537,3 +539,30 @@ void FileTransferWidget::onPreviewButtonClicked()
{
handleButton(ui->previewButton);
}

QPixmap FileTransferWidget::scaleCropIntoSquare(const QPixmap &source, const int targetSize)
{
QPixmap result;

// Make sure smaller-than-icon images (at least one dimension is smaller) will not be upscaled
if (source.width() < targetSize || source.height() < targetSize)
{
result = source;
}
else
{
result = source.scaled(targetSize, targetSize,
Qt::KeepAspectRatioByExpanding,
Qt::SmoothTransformation);
}

// Then, image has to be cropped (if needed) so it will not overflow rectangle
// Only one dimension will be bigger after Qt::KeepAspectRatioByExpanding
if (result.width() > targetSize)
return result.copy((result.width() - targetSize) / 2, 0, targetSize, targetSize);
else if (result.height() > targetSize)
return result.copy(0, (result.height() - targetSize) / 2, targetSize, targetSize);

// Picture was rectangle in the first place, no cropping
return result;
}
3 changes: 3 additions & 0 deletions src/chatlog/content/filetransferwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ private slots:
void onBottomButtonClicked();
void onPreviewButtonClicked();

private:
static QPixmap scaleCropIntoSquare(const QPixmap &source, int targetSize);

private:
Ui::FileTransferWidget *ui;
ToxFile fileInfo;
Expand Down
3 changes: 3 additions & 0 deletions src/chatlog/content/filetransferwidget.ui
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="styleSheet">
<string notr="true">QPushButton{ border: 2px solid white }</string>
</property>
<property name="icon">
<iconset resource="../../../res.qrc">
<normaloff>:/ui/fileTransferInstance/no.svg</normaloff>:/ui/fileTransferInstance/no.svg</iconset>
Expand Down

0 comments on commit 32d588a

Please sign in to comment.