1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2004 Antonio Larrosa <larrosa@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "kpixmapregionselectordialog.h"
9
10#include <QDialogButtonBox>
11#include <QGuiApplication>
12#include <QImage>
13#include <QLabel>
14#include <QScreen>
15#include <QVBoxLayout>
16
17#include <kpixmapregionselectorwidget.h>
18
19class KPixmapRegionSelectorDialogPrivate
20{
21public:
22 KPixmapRegionSelectorDialogPrivate(KPixmapRegionSelectorDialog *parent)
23 : q(parent)
24 {
25 }
26
27 KPixmapRegionSelectorWidget *pixmapSelectorWidget = nullptr;
28 KPixmapRegionSelectorDialog *const q;
29
30 void init()
31 {
32 //When the image is rotated we need to enforce the maximum width&height into the
33 //KPixmapRegionSelectorWidget; in order to avoid the dialog to get out of the screen
34 q->connect(sender: pixmapSelectorWidget, signal: &KPixmapRegionSelectorWidget::pixmapRotated, context: q, slot: [this]() {
35 adjustPixmapSize();
36 });
37 }
38
39 void adjustPixmapSize()
40 {
41 if (pixmapSelectorWidget) {
42 // Set maximum size for picture
43 QScreen *screen = pixmapSelectorWidget->screen();
44 if (screen) {
45 const QRect screenGeometry = screen->availableGeometry();
46 pixmapSelectorWidget->setMaximumWidgetSize(width: (int)(screenGeometry.width() * 4.0 / 5), height: (int)(screenGeometry.height() * 4.0 / 5));
47 }
48 }
49 }
50};
51
52KPixmapRegionSelectorDialog::KPixmapRegionSelectorDialog(QWidget *parent)
53 : QDialog(parent)
54 , d(new KPixmapRegionSelectorDialogPrivate(this))
55{
56 setWindowTitle(tr(s: "Select Region of Image", c: "@title:window"));
57
58 QVBoxLayout *boxLayout = new QVBoxLayout(this);
59
60 QLabel *label = new QLabel(tr(s: "Please click and drag on the image to select the region of interest:", c: "@label:chooser"), this);
61 d->pixmapSelectorWidget = new KPixmapRegionSelectorWidget(this);
62
63 QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
64 buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
65 connect(sender: buttonBox, signal: &QDialogButtonBox::accepted, context: this, slot: &QDialog::accept);
66 connect(sender: buttonBox, signal: &QDialogButtonBox::rejected, context: this, slot: &QDialog::reject);
67
68 boxLayout->addWidget(label);
69 boxLayout->addWidget(d->pixmapSelectorWidget);
70 boxLayout->addWidget(buttonBox);
71
72 d->init();
73}
74
75KPixmapRegionSelectorDialog::~KPixmapRegionSelectorDialog() = default;
76
77KPixmapRegionSelectorWidget *KPixmapRegionSelectorDialog::pixmapRegionSelectorWidget() const
78{
79 return d->pixmapSelectorWidget;
80}
81
82void KPixmapRegionSelectorDialog::adjustRegionSelectorWidgetSizeToFitScreen()
83{
84 d->adjustPixmapSize();
85}
86
87QRect KPixmapRegionSelectorDialog::getSelectedRegion(const QPixmap &pixmap, QWidget *parent)
88{
89 KPixmapRegionSelectorDialog dialog(parent);
90
91 dialog.pixmapRegionSelectorWidget()->setPixmap(pixmap);
92 dialog.adjustRegionSelectorWidgetSizeToFitScreen();
93
94 int result = dialog.exec();
95
96 QRect rect;
97
98 if (result == QDialog::Accepted) {
99 rect = dialog.pixmapRegionSelectorWidget()->unzoomedSelectedRegion();
100 }
101
102 return rect;
103}
104
105QRect KPixmapRegionSelectorDialog::getSelectedRegion(const QPixmap &pixmap, int aspectRatioWidth, int aspectRatioHeight, QWidget *parent)
106{
107 KPixmapRegionSelectorDialog dialog(parent);
108
109 dialog.pixmapRegionSelectorWidget()->setPixmap(pixmap);
110 dialog.pixmapRegionSelectorWidget()->setSelectionAspectRatio(width: aspectRatioWidth, height: aspectRatioHeight);
111 dialog.adjustRegionSelectorWidgetSizeToFitScreen();
112
113 int result = dialog.exec();
114
115 QRect rect;
116
117 if (result == QDialog::Accepted) {
118 rect = dialog.pixmapRegionSelectorWidget()->unzoomedSelectedRegion();
119 }
120
121 return rect;
122}
123
124QImage KPixmapRegionSelectorDialog::getSelectedImage(const QPixmap &pixmap, QWidget *parent)
125{
126 KPixmapRegionSelectorDialog dialog(parent);
127
128 dialog.pixmapRegionSelectorWidget()->setPixmap(pixmap);
129 dialog.adjustRegionSelectorWidgetSizeToFitScreen();
130
131 int result = dialog.exec();
132
133 QImage image;
134
135 if (result == QDialog::Accepted) {
136 image = dialog.pixmapRegionSelectorWidget()->selectedImage();
137 }
138
139 return image;
140}
141
142QImage KPixmapRegionSelectorDialog::getSelectedImage(const QPixmap &pixmap, int aspectRatioWidth, int aspectRatioHeight, QWidget *parent)
143{
144 KPixmapRegionSelectorDialog dialog(parent);
145
146 dialog.pixmapRegionSelectorWidget()->setPixmap(pixmap);
147 dialog.pixmapRegionSelectorWidget()->setSelectionAspectRatio(width: aspectRatioWidth, height: aspectRatioHeight);
148 dialog.adjustRegionSelectorWidgetSizeToFitScreen();
149
150 int result = dialog.exec();
151
152 QImage image;
153
154 if (result == QDialog::Accepted) {
155 image = dialog.pixmapRegionSelectorWidget()->selectedImage();
156 }
157
158 return image;
159}
160
161#include "moc_kpixmapregionselectordialog.cpp"
162

source code of kwidgetsaddons/src/kpixmapregionselectordialog.cpp