26 #include <QApplication>
27 #include <QDesktopWidget>
32 QPixmap pixmapFromFile(
const QString& filename)
34 static const QStringList previewExtensions = {
"png",
"jpeg",
"jpg",
"gif",
"svg",
35 "PNG",
"JPEG",
"JPG",
"GIF",
"SVG"};
37 if (!previewExtensions.contains(QFileInfo(filename).suffix())) {
41 QFile imageFile(filename);
42 if (!imageFile.open(QIODevice::ReadOnly)) {
46 const QByteArray imageFileData = imageFile.readAll();
47 QImage image = QImage::fromData(imageFileData);
51 return QPixmap::fromImage(image);
54 QPixmap scaleCropIntoSquare(
const QPixmap& source,
const int targetSize)
60 if (source.width() < targetSize || source.height() < targetSize) {
63 result = source.scaled(targetSize, targetSize, Qt::KeepAspectRatioByExpanding,
64 Qt::SmoothTransformation);
69 if (result.width() > targetSize) {
70 return result.copy((result.width() - targetSize) / 2, 0, targetSize, targetSize);
71 }
else if (result.height() > targetSize) {
72 return result.copy(0, (result.height() - targetSize) / 2, targetSize, targetSize);
79 QString getToolTipDisplayingImage(
const QPixmap& image)
83 const QRect desktopSize = QApplication::desktop()->geometry();
84 const int maxPreviewWidth{desktopSize.width() / 2};
85 const int maxPreviewHeight{desktopSize.height() / 2};
86 const QPixmap previewImage = [&image, maxPreviewWidth, maxPreviewHeight]() {
87 if (image.width() > maxPreviewWidth || image.height() > maxPreviewHeight) {
88 return image.scaled(maxPreviewWidth, maxPreviewHeight, Qt::KeepAspectRatio,
89 Qt::SmoothTransformation);
96 QBuffer buffer(&imageData);
97 buffer.open(QIODevice::WriteOnly);
98 previewImage.save(&buffer,
"PNG");
101 return "<img src=data:image/png;base64," + imageData.toBase64() +
"/>";
110 auto desiredSize = qMin(width(), height());
111 desiredSize = qMax(desiredSize, 4) - 4;
113 auto croppedImage = scaleCropIntoSquare(image, desiredSize);
114 setIcon(QIcon(croppedImage));
115 setIconSize(croppedImage.size());
116 setToolTip(getToolTipDisplayingImage(image));