Browse Source

Merge pull request #3142

Vincas Dargis (1):
      fix(file transfer widget): QPushButton allows image to overflow
pull/3149/head
sudden6 10 years ago
parent
commit
b883d07b0d
No known key found for this signature in database
GPG Key ID: 279509B499E032B9
  1. 45
      src/chatlog/content/filetransferwidget.cpp
  2. 3
      src/chatlog/content/filetransferwidget.h
  3. 3
      src/chatlog/content/filetransferwidget.ui

45
src/chatlog/content/filetransferwidget.cpp

@ -502,22 +502,24 @@ void FileTransferWidget::showPreview(const QString &filename) @@ -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() + "/>");
}
@ -537,3 +539,30 @@ void FileTransferWidget::onPreviewButtonClicked() @@ -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
src/chatlog/content/filetransferwidget.h

@ -72,6 +72,9 @@ private slots: @@ -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;

3
src/chatlog/content/filetransferwidget.ui

@ -292,6 +292,9 @@ @@ -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>

Loading…
Cancel
Save