This repository has been archived by the owner on Oct 4, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 43
/
ImagePreview.cpp
119 lines (100 loc) · 3.94 KB
/
ImagePreview.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
* Copyright (C) 2013-2014 Ofer Kashayov <[email protected]>
* This file is part of Phototonic Image Viewer.
*
* Phototonic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Phototonic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Phototonic. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ImagePreview.h"
#include "Settings.h"
#include "ThumbsViewer.h"
#include <QMovie>
ImagePreview::ImagePreview(QWidget *parent) : QWidget(parent)
{
imageLabel = new QLabel;
imageLabel->setScaledContents(true);
scrollArea = new QScrollArea;
scrollArea->setContentsMargins(0, 0, 0, 0);
scrollArea->setAlignment(Qt::AlignCenter);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->verticalScrollBar()->blockSignals(true);
scrollArea->horizontalScrollBar()->blockSignals(true);
scrollArea->setFrameStyle(0);
scrollArea->setWidget(imageLabel);
scrollArea->setWidgetResizable(true);
QHBoxLayout *mainLayout = new QHBoxLayout();
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
mainLayout->addWidget(scrollArea);
setBackgroundColor();
setLayout(mainLayout);
}
QPixmap& ImagePreview::loadImage(QString imageFileName) {
if (animation) {
delete animation;
}
QImageReader imageReader(imageFileName);
if (!imageReader.size().isValid()) {
previewPixmap = QIcon::fromTheme("image-missing",
QIcon(":/images/error_image.png")).pixmap(BAD_IMAGE_SIZE, BAD_IMAGE_SIZE);
} else if (Settings::enableAnimations && imageReader.supportsAnimation()){
animation = new QMovie(imageFileName);
animation->setParent(imageLabel);
animation->start();
imageLabel->setMovie(animation);
previewPixmap = animation->currentPixmap();
} else {
QSize resize = imageReader.size();
resize.scale(QSize(imageLabel->width(), imageLabel->height()), Qt::KeepAspectRatio);
QImage previewImage;
imageReader.read(&previewImage);
if (Settings::exifRotationEnabled) {
imageViewer->rotateByExifRotation(previewImage, imageFileName);
}
previewPixmap = QPixmap::fromImage(previewImage);
}
if (animation) {
imageLabel->setMovie(animation);
} else {
imageLabel->setPixmap(previewPixmap);
}
resizeImagePreview();
return previewPixmap;
}
void ImagePreview::clear() {
imageLabel->clear();
}
void ImagePreview::resizeImagePreview()
{
QSize previewSizePixmap = previewPixmap.size();
if (Settings::upscalePreview || previewSizePixmap.width() > scrollArea->width() || previewSizePixmap.height() > scrollArea->height()) {
previewSizePixmap.scale(scrollArea->width(), scrollArea->height(), Qt::KeepAspectRatio);
}
imageLabel->setFixedSize(previewSizePixmap);
imageLabel->adjustSize();
}
void ImagePreview::resizeEvent(QResizeEvent *event) {
QWidget::resizeEvent(event);
resizeImagePreview();
}
void ImagePreview::setBackgroundColor() {
QString bgColor = "background: rgb(%1, %2, %3); ";
bgColor = bgColor.arg(Settings::thumbsBackgroundColor.red())
.arg(Settings::thumbsBackgroundColor.green()).arg(Settings::thumbsBackgroundColor.blue());
QString ss = "QWidget { " + bgColor + " }";
scrollArea->setStyleSheet(ss);
}
void ImagePreview::setImageViewer(ImageViewer *imageViewer) {
this->imageViewer = imageViewer;
}