33
32
#include <klocale.h>
36
#include <lib/hudwidget.h>
35
#include <lib/documentview/rasterimageview.h>
37
36
#include "gwenviewconfig.h"
38
#include "imageview.h"
39
37
#include "paintutils.h"
40
38
#include "redeyereductionimageoperation.h"
41
#include "ui_redeyereductionhud.h"
42
#include "widgetfloater.h"
48
struct RedEyeReductionHud : public QWidget, public Ui_RedEyeReductionHud {
49
RedEyeReductionHud() {
51
setCursor(Qt::ArrowCursor);
56
struct RedEyeReductionToolPrivate {
57
RedEyeReductionTool* mRedEyeReductionTool;
58
RedEyeReductionTool::Status mStatus;
61
RedEyeReductionHud* mHud;
62
HudWidget* mHudWidget;
63
WidgetFloater* mFloater;
66
void showNotSetHudWidget() {
69
QLabel* label = new QLabel(i18n("Click on the red eye you want to fix."));
72
createHudWidgetForWidget(label);
76
void showAdjustingHudWidget() {
77
mHud = new RedEyeReductionHud();
79
mHud->diameterSpinBox->setValue(mDiameter);
80
QObject::connect(mHud->applyButton, SIGNAL(clicked()),
81
mRedEyeReductionTool, SLOT(slotApplyClicked()));
82
QObject::connect(mHud->diameterSpinBox, SIGNAL(valueChanged(int)),
83
mRedEyeReductionTool, SLOT(setDiameter(int)));
85
createHudWidgetForWidget(mHud);
89
void createHudWidgetForWidget(QWidget* widget) {
90
mHudWidget->deleteLater();
91
mHudWidget = new HudWidget();
92
mHudWidget->init(widget, HudWidget::OptionCloseButton);
93
mHudWidget->adjustSize();
94
QObject::connect(mHudWidget, SIGNAL(closed()),
95
mRedEyeReductionTool, SIGNAL(done()) );
96
mFloater->setChildWidget(mHudWidget);
105
QRectF rectF() const {
106
if (mStatus == RedEyeReductionTool::NotSet) {
109
return QRectF(mCenter.x() - mDiameter / 2, mCenter.y() - mDiameter / 2, mDiameter, mDiameter);
114
RedEyeReductionTool::RedEyeReductionTool(ImageView* view)
115
: AbstractImageViewTool(view)
116
, d(new RedEyeReductionToolPrivate) {
117
d->mRedEyeReductionTool = this;
118
d->mDiameter = GwenviewConfig::redEyeReductionDiameter();
123
d->mFloater = new WidgetFloater(imageView());
124
d->mFloater->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
125
d->mFloater->setVerticalMargin(
126
KDialog::marginHint()
127
+ imageView()->style()->pixelMetric(QStyle::PM_ScrollBarExtent)
129
d->showNotSetHudWidget();
131
view->document()->startLoadingFullImage();
135
RedEyeReductionTool::~RedEyeReductionTool() {
136
GwenviewConfig::setRedEyeReductionDiameter(d->mDiameter);
141
void RedEyeReductionTool::paint(QPainter* painter) {
142
if (d->mStatus == NotSet) {
145
QRectF docRectF = d->rectF();
146
imageView()->document()->waitUntilLoaded();
148
QRect docRect = PaintUtils::containingRect(docRectF);
149
QImage img = imageView()->document()->image().copy(docRect);
151
docRectF.left() - docRect.left(),
152
docRectF.top() - docRect.top(),
156
RedEyeReductionImageOperation::apply(&img, imgRectF);
158
const QRectF viewRectF = imageView()->mapToViewportF(docRectF);
159
painter->drawImage(viewRectF, img, imgRectF);
163
void RedEyeReductionTool::mousePressEvent(QMouseEvent* event) {
164
if (d->mStatus == NotSet) {
165
d->showAdjustingHudWidget();
166
d->mStatus = Adjusting;
168
d->mCenter = imageView()->mapToImageF(event->pos());
169
imageView()->viewport()->update();
173
void RedEyeReductionTool::mouseMoveEvent(QMouseEvent* event) {
174
if (event->buttons() == Qt::NoButton) {
177
d->mCenter = imageView()->mapToImageF(event->pos());
178
imageView()->viewport()->update();
182
void RedEyeReductionTool::toolActivated() {
183
imageView()->viewport()->setCursor(Qt::CrossCursor);
187
void RedEyeReductionTool::toolDeactivated() {
188
d->mHudWidget->deleteLater();
192
void RedEyeReductionTool::slotApplyClicked() {
193
QRectF docRectF = d->rectF();
194
if (!docRectF.isValid()) {
195
kWarning() << "invalid rect";
198
RedEyeReductionImageOperation* op = new RedEyeReductionImageOperation(docRectF);
199
emit imageOperationRequested(op);
202
d->showNotSetHudWidget();
206
void RedEyeReductionTool::setDiameter(int value) {
207
d->mDiameter = value;
208
imageView()->viewport()->update();
39
#include "ui_redeyereductionwidget.h"
44
struct RedEyeReductionWidget : public QWidget, public Ui_RedEyeReductionWidget
46
RedEyeReductionWidget()
53
dialogButtonBox->button(QDialogButtonBox::Ok)->hide();
54
stackedWidget->setCurrentWidget(notSetPage);
59
dialogButtonBox->button(QDialogButtonBox::Ok)->show();
60
stackedWidget->setCurrentWidget(mainPage);
64
struct RedEyeReductionToolPrivate
66
RedEyeReductionTool* q;
67
RedEyeReductionTool::Status mStatus;
70
RedEyeReductionWidget* mToolWidget;
72
void setupToolWidget()
74
mToolWidget = new RedEyeReductionWidget;
75
mToolWidget->showNotSetPage();
76
QObject::connect(mToolWidget->diameterSpinBox, SIGNAL(valueChanged(int)),
77
q, SLOT(setDiameter(int)));
78
QObject::connect(mToolWidget->dialogButtonBox, SIGNAL(accepted()),
79
q, SLOT(slotApplyClicked()));
80
QObject::connect(mToolWidget->dialogButtonBox, SIGNAL(rejected()),
84
QRectF rectF() const {
85
if (mStatus == RedEyeReductionTool::NotSet) {
88
return QRectF(mCenter.x() - mDiameter / 2, mCenter.y() - mDiameter / 2, mDiameter, mDiameter);
92
RedEyeReductionTool::RedEyeReductionTool(RasterImageView* view)
93
: AbstractRasterImageViewTool(view)
94
, d(new RedEyeReductionToolPrivate)
97
d->mDiameter = GwenviewConfig::redEyeReductionDiameter();
101
view->document()->startLoadingFullImage();
104
RedEyeReductionTool::~RedEyeReductionTool()
106
GwenviewConfig::setRedEyeReductionDiameter(d->mDiameter);
107
delete d->mToolWidget;
111
void RedEyeReductionTool::paint(QPainter* painter)
113
if (d->mStatus == NotSet) {
116
QRectF docRectF = d->rectF();
117
imageView()->document()->waitUntilLoaded();
119
QRect docRect = PaintUtils::containingRect(docRectF);
120
QImage img = imageView()->document()->image().copy(docRect);
122
docRectF.left() - docRect.left(),
123
docRectF.top() - docRect.top(),
127
RedEyeReductionImageOperation::apply(&img, imgRectF);
129
const QRectF viewRectF = imageView()->mapToView(docRectF);
130
painter->drawImage(viewRectF, img, imgRectF);
133
void RedEyeReductionTool::mousePressEvent(QGraphicsSceneMouseEvent* event)
136
if (d->mStatus == NotSet) {
137
d->mToolWidget->diameterSpinBox->setValue(d->mDiameter);
138
d->mToolWidget->showMainPage();
139
d->mStatus = Adjusting;
141
d->mCenter = imageView()->mapToImage(event->pos());
142
imageView()->update();
145
void RedEyeReductionTool::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
148
if (event->buttons() == Qt::NoButton) {
151
d->mCenter = imageView()->mapToImage(event->pos());
152
imageView()->update();
155
void RedEyeReductionTool::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
157
// Just prevent the event from reaching the image view
161
void RedEyeReductionTool::toolActivated()
163
imageView()->setCursor(Qt::CrossCursor);
166
void RedEyeReductionTool::slotApplyClicked()
168
QRectF docRectF = d->rectF();
169
if (!docRectF.isValid()) {
170
kWarning() << "invalid rect";
173
RedEyeReductionImageOperation* op = new RedEyeReductionImageOperation(docRectF);
174
emit imageOperationRequested(op);
177
d->mToolWidget->showNotSetPage();
180
void RedEyeReductionTool::setDiameter(int value)
182
d->mDiameter = value;
183
imageView()->update();
186
QWidget* RedEyeReductionTool::widget() const
188
return d->mToolWidget;