62
63
struct ImageOpsContextManagerItem::Private {
63
ImageOpsContextManagerItem* that;
64
MainWindow* mMainWindow;
67
KAction* mRotateLeftAction;
68
KAction* mRotateRightAction;
69
KAction* mMirrorAction;
71
KAction* mResizeAction;
73
KAction* mRedEyeReductionAction;
74
QList<KAction*> mActionList;
77
KActionCollection* actionCollection = mMainWindow->actionCollection();
78
KActionCategory* edit=new KActionCategory(i18nc("@title actions category - means actions changing image","Edit"), actionCollection);
79
mRotateLeftAction = edit->addAction("rotate_left",that, SLOT(rotateLeft()));
80
mRotateLeftAction->setText(i18n("Rotate Left"));
81
mRotateLeftAction->setIcon(KIcon("object-rotate-left"));
82
mRotateLeftAction->setShortcut(Qt::CTRL + Qt::Key_L);
84
mRotateRightAction = edit->addAction("rotate_right",that, SLOT(rotateRight()));
85
mRotateRightAction->setText(i18n("Rotate Right"));
86
mRotateRightAction->setIcon(KIcon("object-rotate-right"));
87
mRotateRightAction->setShortcut(Qt::CTRL + Qt::Key_R);
89
mMirrorAction = edit->addAction("mirror",that, SLOT(mirror()));
90
mMirrorAction->setText(i18n("Mirror"));
91
mMirrorAction->setIcon(KIcon("object-flip-horizontal"));
93
mFlipAction = edit->addAction("flip",that, SLOT(flip()));
94
mFlipAction->setText(i18n("Flip"));
95
mFlipAction->setIcon(KIcon("object-flip-vertical"));
97
mResizeAction = edit->addAction("resize",that, SLOT(resizeImage()) );
98
mResizeAction->setText(i18n("Resize"));
99
mResizeAction->setIcon(KIcon("transform-scale"));
100
mResizeAction->setShortcut(Qt::SHIFT + Qt::Key_R);
102
mCropAction = edit->addAction("crop",that, SLOT(crop()));
103
mCropAction->setText(i18n("Crop"));
104
mCropAction->setIcon(KIcon("transform-crop-and-resize"));
105
mCropAction->setShortcut(Qt::SHIFT + Qt::Key_C);
107
mRedEyeReductionAction = edit->addAction("red_eye_reduction",that, SLOT(startRedEyeReduction()) );
108
mRedEyeReductionAction->setText(i18n("Red Eye Reduction"));
109
//mRedEyeReductionAction->setIcon(KIcon("transform-crop-and-resize"));
113
<< mRotateRightAction
118
<< mRedEyeReductionAction
123
bool ensureEditable() {
124
KUrl url = that->contextManager()->currentUrl();
125
return GvCore::ensureDocumentIsEditable(url);
64
ImageOpsContextManagerItem* q;
65
MainWindow* mMainWindow;
68
KAction* mRotateLeftAction;
69
KAction* mRotateRightAction;
70
KAction* mMirrorAction;
72
KAction* mResizeAction;
74
KAction* mRedEyeReductionAction;
75
QList<KAction*> mActionList;
79
KActionCollection* actionCollection = mMainWindow->actionCollection();
80
KActionCategory* edit = new KActionCategory(i18nc("@title actions category - means actions changing image", "Edit"), actionCollection);
81
mRotateLeftAction = edit->addAction("rotate_left", q, SLOT(rotateLeft()));
82
mRotateLeftAction->setText(i18n("Rotate Left"));
83
mRotateLeftAction->setIcon(KIcon("object-rotate-left"));
84
mRotateLeftAction->setShortcut(Qt::CTRL + Qt::Key_L);
86
mRotateRightAction = edit->addAction("rotate_right", q, SLOT(rotateRight()));
87
mRotateRightAction->setText(i18n("Rotate Right"));
88
mRotateRightAction->setIcon(KIcon("object-rotate-right"));
89
mRotateRightAction->setShortcut(Qt::CTRL + Qt::Key_R);
91
mMirrorAction = edit->addAction("mirror", q, SLOT(mirror()));
92
mMirrorAction->setText(i18n("Mirror"));
93
mMirrorAction->setIcon(KIcon("object-flip-horizontal"));
95
mFlipAction = edit->addAction("flip", q, SLOT(flip()));
96
mFlipAction->setText(i18n("Flip"));
97
mFlipAction->setIcon(KIcon("object-flip-vertical"));
99
mResizeAction = edit->addAction("resize", q, SLOT(resizeImage()));
100
mResizeAction->setText(i18n("Resize"));
101
mResizeAction->setIcon(KIcon("transform-scale"));
102
mResizeAction->setShortcut(Qt::SHIFT + Qt::Key_R);
104
mCropAction = edit->addAction("crop", q, SLOT(crop()));
105
mCropAction->setText(i18n("Crop"));
106
mCropAction->setIcon(KIcon("transform-crop-and-resize"));
107
mCropAction->setShortcut(Qt::SHIFT + Qt::Key_C);
109
mRedEyeReductionAction = edit->addAction("red_eye_reduction", q, SLOT(startRedEyeReduction()));
110
mRedEyeReductionAction->setText(i18n("Red Eye Reduction"));
111
//mRedEyeReductionAction->setIcon(KIcon("transform-crop-and-resize"));
115
<< mRotateRightAction
120
<< mRedEyeReductionAction
124
bool ensureEditable()
126
KUrl url = q->contextManager()->currentUrl();
127
return GvCore::ensureDocumentIsEditable(url);
130
131
ImageOpsContextManagerItem::ImageOpsContextManagerItem(ContextManager* manager, MainWindow* mainWindow)
131
132
: AbstractContextManagerItem(manager)
134
d->mMainWindow = mainWindow;
135
d->mGroup = new SideBarGroup(i18n("Image Operations"));
136
setWidget(d->mGroup);
137
EventWatcher::install(d->mGroup, QEvent::Show, this, SLOT(updateSideBarContent()));
140
connect(contextManager(), SIGNAL(selectionChanged()),
141
SLOT(updateActions()) );
142
connect(mainWindow, SIGNAL(viewModeChanged()),
143
SLOT(updateActions()) );
144
connect(mainWindow->documentPanel(), SIGNAL(completed()),
145
SLOT(updateActions()) );
149
ImageOpsContextManagerItem::~ImageOpsContextManagerItem() {
154
void ImageOpsContextManagerItem::updateSideBarContent() {
155
if (!d->mGroup->isVisible()) {
160
Q_FOREACH(KAction* action, d->mActionList) {
161
if (action->isEnabled()) {
162
d->mGroup->addAction(action);
168
void ImageOpsContextManagerItem::updateActions() {
169
bool canModify = d->mMainWindow->currentDocumentIsRasterImage();
170
bool documentPanelIsVisible = d->mMainWindow->documentPanel()->isVisible();
171
if (!documentPanelIsVisible) {
172
// Since we only support image operations on one image for now,
173
// disable actions if several images are selected and the document
174
// view is not visible.
175
if (contextManager()->selectedFileItemList().count() != 1) {
180
d->mRotateLeftAction->setEnabled(canModify);
181
d->mRotateRightAction->setEnabled(canModify);
182
d->mMirrorAction->setEnabled(canModify);
183
d->mFlipAction->setEnabled(canModify);
184
d->mResizeAction->setEnabled(canModify);
185
d->mCropAction->setEnabled(canModify && documentPanelIsVisible);
186
d->mRedEyeReductionAction->setEnabled(canModify && documentPanelIsVisible);
188
updateSideBarContent();
192
void ImageOpsContextManagerItem::rotateLeft() {
193
TransformImageOperation* op = new TransformImageOperation(ROT_270);
194
applyImageOperation(op);
198
void ImageOpsContextManagerItem::rotateRight() {
199
TransformImageOperation* op = new TransformImageOperation(ROT_90);
200
applyImageOperation(op);
204
void ImageOpsContextManagerItem::mirror() {
205
TransformImageOperation* op = new TransformImageOperation(HFLIP);
206
applyImageOperation(op);
210
void ImageOpsContextManagerItem::flip() {
211
TransformImageOperation* op = new TransformImageOperation(VFLIP);
212
applyImageOperation(op);
216
void ImageOpsContextManagerItem::resizeImage() {
217
if (!d->ensureEditable()) {
220
Document::Ptr doc = DocumentFactory::instance()->load(contextManager()->currentUrl());
221
doc->startLoadingFullImage();
136
d->mMainWindow = mainWindow;
137
d->mGroup = new SideBarGroup(i18n("Image Operations"));
138
setWidget(d->mGroup);
139
EventWatcher::install(d->mGroup, QEvent::Show, this, SLOT(updateSideBarContent()));
142
connect(contextManager(), SIGNAL(selectionChanged()),
143
SLOT(updateActions()));
144
connect(mainWindow, SIGNAL(viewModeChanged()),
145
SLOT(updateActions()));
146
connect(mainWindow->documentPanel(), SIGNAL(completed()),
147
SLOT(updateActions()));
150
ImageOpsContextManagerItem::~ImageOpsContextManagerItem()
155
void ImageOpsContextManagerItem::updateSideBarContent()
157
if (!d->mGroup->isVisible()) {
162
Q_FOREACH(KAction * action, d->mActionList) {
163
if (action->isEnabled()) {
164
d->mGroup->addAction(action);
169
void ImageOpsContextManagerItem::updateActions()
171
bool canModify = d->mMainWindow->currentDocumentIsRasterImage();
172
bool documentPanelIsVisible = d->mMainWindow->documentPanel()->isVisible();
173
if (!documentPanelIsVisible) {
174
// Since we only support image operations on one image for now,
175
// disable actions if several images are selected and the document
176
// view is not visible.
177
if (contextManager()->selectedFileItemList().count() != 1) {
182
d->mRotateLeftAction->setEnabled(canModify);
183
d->mRotateRightAction->setEnabled(canModify);
184
d->mMirrorAction->setEnabled(canModify);
185
d->mFlipAction->setEnabled(canModify);
186
d->mResizeAction->setEnabled(canModify);
187
d->mCropAction->setEnabled(canModify && documentPanelIsVisible);
188
d->mRedEyeReductionAction->setEnabled(canModify && documentPanelIsVisible);
190
updateSideBarContent();
193
void ImageOpsContextManagerItem::rotateLeft()
195
TransformImageOperation* op = new TransformImageOperation(ROT_270);
196
applyImageOperation(op);
199
void ImageOpsContextManagerItem::rotateRight()
201
TransformImageOperation* op = new TransformImageOperation(ROT_90);
202
applyImageOperation(op);
205
void ImageOpsContextManagerItem::mirror()
207
TransformImageOperation* op = new TransformImageOperation(HFLIP);
208
applyImageOperation(op);
211
void ImageOpsContextManagerItem::flip()
213
TransformImageOperation* op = new TransformImageOperation(VFLIP);
214
applyImageOperation(op);
217
void ImageOpsContextManagerItem::resizeImage()
219
if (!d->ensureEditable()) {
222
Document::Ptr doc = DocumentFactory::instance()->load(contextManager()->currentUrl());
223
doc->startLoadingFullImage();
222
224
ResizeImageDialog dialog(d->mMainWindow);
223
225
dialog.setOriginalSize(doc->size());
224
226
if (!dialog.exec()) {
227
ResizeImageOperation* op = new ResizeImageOperation(dialog.size());
228
applyImageOperation(op);
232
void ImageOpsContextManagerItem::crop() {
233
if (!d->ensureEditable()) {
236
ImageView* imageView = d->mMainWindow->documentPanel()->imageView();
238
kError() << "No ImageView available!";
241
CropTool* tool = new CropTool(imageView);
242
connect(tool, SIGNAL(imageOperationRequested(AbstractImageOperation*)),
243
SLOT(applyImageOperation(AbstractImageOperation*)) );
244
connect(tool, SIGNAL(done()),
245
SLOT(restoreDefaultImageViewTool()) );
247
d->mMainWindow->setDistractionFreeMode(true);
248
imageView->setCurrentTool(tool);
252
void ImageOpsContextManagerItem::startRedEyeReduction() {
253
if (!d->ensureEditable()) {
256
ImageView* imageView = d->mMainWindow->documentPanel()->imageView();
258
kError() << "No ImageView available!";
261
RedEyeReductionTool* tool = new RedEyeReductionTool(imageView);
262
connect(tool, SIGNAL(imageOperationRequested(AbstractImageOperation*)),
263
SLOT(applyImageOperation(AbstractImageOperation*)) );
264
connect(tool, SIGNAL(done()),
265
SLOT(restoreDefaultImageViewTool()) );
267
d->mMainWindow->setDistractionFreeMode(true);
268
imageView->setCurrentTool(tool);
272
void ImageOpsContextManagerItem::applyImageOperation(AbstractImageOperation* op) {
273
// For now, we only support operations on one image
274
KUrl url = contextManager()->currentUrl();
276
Document::Ptr doc = DocumentFactory::instance()->load(url);
277
op->applyToDocument(doc);
281
void ImageOpsContextManagerItem::restoreDefaultImageViewTool() {
282
ImageView* imageView = d->mMainWindow->documentPanel()->imageView();
284
kError() << "No ImageView available!";
288
AbstractImageViewTool* tool = imageView->currentTool();
289
imageView->setCurrentTool(0);
291
d->mMainWindow->setDistractionFreeMode(false);
229
ResizeImageOperation* op = new ResizeImageOperation(dialog.size());
230
applyImageOperation(op);
233
void ImageOpsContextManagerItem::crop()
235
if (!d->ensureEditable()) {
238
RasterImageView* imageView = d->mMainWindow->documentPanel()->imageView();
240
kError() << "No ImageView available!";
243
CropTool* tool = new CropTool(imageView);
244
connect(tool, SIGNAL(imageOperationRequested(AbstractImageOperation*)),
245
SLOT(applyImageOperation(AbstractImageOperation*)));
246
connect(tool, SIGNAL(done()),
247
SLOT(restoreDefaultImageViewTool()));
249
d->mMainWindow->setDistractionFreeMode(true);
250
imageView->setCurrentTool(tool);
253
void ImageOpsContextManagerItem::startRedEyeReduction()
255
if (!d->ensureEditable()) {
258
RasterImageView* view = d->mMainWindow->documentPanel()->imageView();
260
kError() << "No RasterImageView available!";
263
RedEyeReductionTool* tool = new RedEyeReductionTool(view);
264
connect(tool, SIGNAL(imageOperationRequested(AbstractImageOperation*)),
265
SLOT(applyImageOperation(AbstractImageOperation*)));
266
connect(tool, SIGNAL(done()),
267
SLOT(restoreDefaultImageViewTool()));
269
d->mMainWindow->setDistractionFreeMode(true);
270
view->setCurrentTool(tool);
273
void ImageOpsContextManagerItem::applyImageOperation(AbstractImageOperation* op)
275
// For now, we only support operations on one image
276
KUrl url = contextManager()->currentUrl();
278
Document::Ptr doc = DocumentFactory::instance()->load(url);
279
op->applyToDocument(doc);
282
void ImageOpsContextManagerItem::restoreDefaultImageViewTool()
284
RasterImageView* imageView = d->mMainWindow->documentPanel()->imageView();
286
kError() << "No RasterImageView available!";
290
AbstractRasterImageViewTool* tool = imageView->currentTool();
291
imageView->setCurrentTool(0);
293
d->mMainWindow->setDistractionFreeMode(false);