17 #include <qtoolbutton.h> 20 #include <qapplication.h> 23 #include <Q3GridLayout> 27 #include <q3hgroupbox.h> 28 #include <qpushbutton.h> 29 #include <qcombobox.h> 31 #include <QDesktopWidget> 34 #include "../clickableLabel.h" 40 #include "../statusWidget.h" 41 #include "../layoutWidget.h" 42 #include "../window.h" 43 #include "../titleWidget.h" 44 #include "../dialogs/questionDialog.h" 45 #include "../../config.h" 46 #include "../../backend/album.h" 47 #include "../../backend/subalbum.h" 48 #include "../../backend/photo.h" 49 #include "../../backend/tools/fileTools.h" 50 #include "../../backend/tools/imageTools.h" 52 #include "../../backend/enhancements/color.h" 53 #include "../../backend/enhancements/contrast.h" 54 #include "../../backend/enhancements/redEye.h" 55 #include "../../backend/enhancements/tilt.h" 57 #include "../../backend/manipulations/manipulationOptions.h" 58 #include "../../backend/manipulations/blackWhite.h" 59 #include "../../backend/manipulations/crop.h" 60 #include "../../backend/manipulations/emboss.h" 61 #include "../../backend/manipulations/invert.h" 62 #include "../../backend/manipulations/mosaic.h" 63 #include "../../backend/manipulations/painting.h" 64 #include "../../backend/manipulations/pointillism.h" 65 #include "../../backend/manipulations/sepia.h" 67 #include "../../configuration/configuration.h" 69 #define EFFECT_PREVIEW_WIDTH 107 70 #define EFFECT_PREVIEW_HEIGHT 80 80 QFont smallerFont = font();
81 smallerFont.setPointSize( smallerFont.pointSize() - 1 );
83 setFocusPolicy(Qt::StrongFocus);
99 Q3GridLayout* mainGrid =
new Q3GridLayout(
this, 3, 3, 0 );
100 mainGrid->addWidget( photoFrame, 0, 1 );
101 mainGrid->setRowStretch(0, 1);
102 mainGrid->addMultiCellWidget( controlsFrame, 1,1, 0,2 );
122 Q3GridLayout* selectionGrid =
new Q3GridLayout( photoFrame, 1, 5, 0 );
124 selectionGrid->addWidget(
previousButton, 0, 1, Qt::AlignCenter );
126 selectionGrid->setColStretch( 2, 1 );
127 selectionGrid->addWidget(
nextButton, 0, 3, Qt::AlignCenter );
132 Q3HGroupBox* frameControls =
new Q3HGroupBox( tr(
"Frame"), controlsFrame,
"frameControls" );
133 frameControls->setAlignment( Qt::AlignHCenter );
136 Q3HGroupBox* enhanceControls =
new Q3HGroupBox( tr(
"Enhance"), controlsFrame,
"enhanceControls" );
137 enhanceControls->setAlignment( Qt::AlignHCenter );
140 Q3HGroupBox* manipulateControls =
new Q3HGroupBox( tr(
"Manipulate"), controlsFrame,
"applyEffect" );
141 manipulateControls->setAlignment( Qt::AlignHCenter );
145 Q3GridLayout* controlsGrid =
new Q3GridLayout( controlsFrame, 1, 5, 0 );
146 controlsGrid->addWidget( frameControls, 0, 1 );
147 controlsGrid->addWidget( enhanceControls, 0, 2 );
148 controlsGrid->addWidget( manipulateControls, 0, 3 );
152 controlsGrid->setColStretch(0, 1);
154 controlsGrid->setColStretch(4, 1);
165 QToolButton* rotateRightButton =
new QToolButton( rotateFlipFrame,
"rotateRight" );
166 rotateRightButton->setIconSet( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/rotate90.png") );
167 rotateRightButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
168 connect( rotateRightButton, SIGNAL(clicked()), SLOT(
rotateRight()) );
169 QToolTip::add( rotateRightButton, tr(
"Rotate clockwise") );
171 QToolButton* rotateLeftButton =
new QToolButton( rotateFlipFrame,
"rotateLeft" );
172 rotateLeftButton->setIconSet( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/rotate270.png") );
173 rotateLeftButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
174 connect( rotateLeftButton, SIGNAL(clicked()), SLOT(
rotateLeft()) );
175 QToolTip::add( rotateLeftButton, tr(
"Rotate counterclockwise") );
177 QToolButton* flipHorizontalButton =
new QToolButton( rotateFlipFrame,
"flipHorizontal" );
178 flipHorizontalButton->setIconSet( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/flipHorizontally.png") );
179 flipHorizontalButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
180 connect( flipHorizontalButton, SIGNAL(clicked()), SLOT(
flipHorizontal()) );
181 QToolTip::add( flipHorizontalButton, tr(
"Flip horizontally") );
183 QToolButton* flipVerticalButton =
new QToolButton( rotateFlipFrame,
"flipVertical" );
184 flipVerticalButton->setIconSet( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/flipVertically.png") );
185 flipVerticalButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
186 connect( flipVerticalButton, SIGNAL(clicked()), SLOT(
flipVertical()) );
187 QToolTip::add( flipVerticalButton, tr(
"Flip vertically") );
201 Q3GridLayout* rotateFlipGrid =
new Q3GridLayout( rotateFlipFrame, 1, 5, 0 );
203 rotateFlipGrid->addWidget( rotateRightButton, 0, 0 );
204 rotateFlipGrid->addWidget( rotateLeftButton, 0, 1 );
205 rotateFlipGrid->addWidget( flipHorizontalButton, 0, 2 );
206 rotateFlipGrid->addWidget( flipVerticalButton, 0, 3 );
215 int curAspectRatio = 0;
254 QToolTip::add(
aspectRatios, tr(
"Select region for cropping using a particular aspect ratio") );
256 QLabel* aspectRatioLabel =
new QLabel( tr(
"Aspect Ratio"), frameControlsFrame );
257 aspectRatioLabel->setFont( smallerFont );
261 cropButton =
new QToolButton( frameControlsFrame );
263 cropIcon.setPixmap( QString(
IMAGE_PATH)+
"buttonIcons/crop.png",
267 cropIcon.setPixmap( QString(
IMAGE_PATH)+
"buttonIcons/crop_disabled.png",
272 QToolTip::add(
cropButton, tr(
"Crop photo to selected region") );
274 QLabel* cropLabel =
new QLabel( tr(
"Crop"), frameControlsFrame );
275 cropLabel->setFont( smallerFont );
280 Q3GridLayout* frameControlsGrid =
new Q3GridLayout( frameControlsFrame, 3, 2, 0 );
282 frameControlsGrid->addMultiCellWidget( rotateFlipFrame, 0,0, 0,1 );
283 frameControlsGrid->addWidget(
aspectRatios, 1, 0, Qt::AlignHCenter );
284 frameControlsGrid->addWidget(
cropButton, 1, 1, Qt::AlignHCenter );
285 frameControlsGrid->addWidget( aspectRatioLabel, 2, 0, Qt::AlignHCenter );
286 frameControlsGrid->addWidget( cropLabel, 2, 1, Qt::AlignHCenter );
294 int numLargeButtons = 3;
295 int curButtonIndex=0;
301 Q3Frame* autoEnhanceControlsFrame =
new Q3Frame( enhanceControlsFrame );
304 ClickableLabel* enhanceColorButton = largeButtons[curButtonIndex] =
306 largeButtons[curButtonIndex]->
setPixmap( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/improveColorBalance.png") );
307 connect( largeButtons[curButtonIndex], SIGNAL(clicked()), SLOT(
colorBalance()) );
308 QToolTip::add( largeButtons[curButtonIndex], tr(
"Enhance color balance") );
311 QLabel* enhanceColorLabel =
new QLabel( tr(
"Color"), autoEnhanceControlsFrame );
312 enhanceColorLabel->setFont( smallerFont );
315 ClickableLabel* enhanceContrastButton = largeButtons[curButtonIndex] =
317 largeButtons[curButtonIndex]->
setPixmap( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/enhanceContrast.png") );
318 connect( largeButtons[curButtonIndex], SIGNAL(clicked()), SLOT(
enhanceContrast()) );
319 QToolTip::add( largeButtons[curButtonIndex], tr(
"Enhance contrast") );
322 QLabel* enhanceContrastLabel =
new QLabel( tr(
"Contrast"), autoEnhanceControlsFrame );
323 enhanceContrastLabel->setFont( smallerFont );
329 largeButtons[curButtonIndex]->
setPixmap( QPixmap( QString(
IMAGE_PATH)+
"buttonIcons/redEyeReduction.png" ) );
330 connect( largeButtons[curButtonIndex], SIGNAL(clicked()), SLOT(
removeRedeye()) );
331 QToolTip::add( largeButtons[curButtonIndex], tr(
"Remove red-eye") );
334 QLabel* removeRedyEyeLabel =
new QLabel( tr(
"Red Eye"), autoEnhanceControlsFrame );
335 removeRedyEyeLabel->setFont( smallerFont );
338 Q3GridLayout* autoEnhanceControlsGrid =
new Q3GridLayout( autoEnhanceControlsFrame, 2, 3, 0 );
340 autoEnhanceControlsGrid->addWidget( enhanceColorButton, 0, 0, Qt::AlignHCenter );
341 autoEnhanceControlsGrid->addWidget( enhanceColorLabel, 1, 0, Qt::AlignHCenter );
343 autoEnhanceControlsGrid->addWidget( enhanceContrastButton, 0, 1, Qt::AlignHCenter );
344 autoEnhanceControlsGrid->addWidget( enhanceContrastLabel, 1, 1, Qt::AlignHCenter );
347 autoEnhanceControlsGrid->addWidget( removeRedyEyeLabel, 1, 2, Qt::AlignHCenter );
350 Q3Frame* manualEnhanceControlsFrame =
new Q3Frame( enhanceControlsFrame );
355 connect( tuneLevelsButton, SIGNAL(clicked()), SLOT(
tuneLevels()) );
356 QToolTip::add( tuneLevelsButton, tr(
"Fine tune brightness, contrast, and colors") );
358 QLabel* tuneLevelsLabel =
new QLabel( tr(
"Levels..."), manualEnhanceControlsFrame );
359 tuneLevelsLabel->setFont( smallerFont );
363 adjustGrainButton->
setPixmap( QPixmap(QString(
IMAGE_PATH)+
"buttonIcons/adjustGrain.png") );
364 connect( adjustGrainButton, SIGNAL(clicked()), SLOT(
adjustGrain()) );
365 QToolTip::add( adjustGrainButton, tr(
"Blur or sharpen image") );
367 QLabel* adjustGrainLabel =
new QLabel( tr(
"Grain..."), manualEnhanceControlsFrame );
368 adjustGrainLabel->setFont( smallerFont );
371 Q3GridLayout* manualEnhanceControlsGrid =
new Q3GridLayout( manualEnhanceControlsFrame, 2, 3, 0 );
373 manualEnhanceControlsGrid->addWidget( tuneLevelsButton, 0, 0, Qt::AlignHCenter );
374 manualEnhanceControlsGrid->addWidget( tuneLevelsLabel, 1, 0, Qt::AlignHCenter );
376 manualEnhanceControlsGrid->addWidget( adjustGrainButton, 0, 2, Qt::AlignHCenter );
377 manualEnhanceControlsGrid->addWidget( adjustGrainLabel, 1, 2, Qt::AlignHCenter );
381 Q3GridLayout* enhanceControlsGrid =
new Q3GridLayout( enhanceControlsFrame, 4, 2, 0 );
383 enhanceControlsGrid->addWidget( autoEnhanceControlsFrame, 0, 0, Qt::AlignHCenter );
384 enhanceControlsGrid->addWidget( manualEnhanceControlsFrame, 1, 0, Qt::AlignHCenter );
385 enhanceControlsGrid->setRowStretch( 0, 1 );
386 enhanceControlsGrid->setRowStretch( 3, 1 );
391 Q3Frame* manipulateControlsFrame =
new Q3Frame( manipulateControls,
"manipulateControlsFrame" );
394 effectsList =
new QComboBox( manipulateControlsFrame );
422 Q3GridLayout* manipulateControlsGrid =
new Q3GridLayout( manipulateControlsFrame, 2, 2, 0 );
424 manipulateControlsGrid->addWidget(
effectsList, 0, 0 );
426 manipulateControlsGrid->addMultiCellWidget(
effectPreview, 0,1, 1,1, Qt::AlignHCenter );
430 manipulateControlsGrid->setColSpacing(1, 85 );
459 "/effectPreviewImage.jpg";
478 if( prevPhoto != NULL &&
487 if( nextPhoto != NULL &&
496 if(firstPhoto !=
photo)
504 if(lastPhoto !=
photo)
511 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
512 qApp->processEvents();
548 qApp->restoreOverrideCursor();
549 qApp->processEvents();
575 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
576 qApp->processEvents();
582 QString editedImagePath = ((
Window*)qApp->mainWidget())->getTitle()->getAlbum()->getTmpDir() +
"/editedImage.jpg";
589 bool aspectRatioChanged = ( rotationFlipType ==
ROTATE_90 || rotationFlipType ==
ROTATE_270 );
599 if( aspectRatioChanged )
617 qApp->restoreOverrideCursor();
618 qApp->processEvents();
639 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
652 qApp->restoreOverrideCursor();
658 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
659 qApp->processEvents();
673 qApp->restoreOverrideCursor();
674 qApp->processEvents();
680 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
681 qApp->processEvents();
695 qApp->restoreOverrideCursor();
696 qApp->processEvents();
707 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
708 qApp->processEvents();
723 qApp->restoreOverrideCursor();
724 qApp->processEvents();
735 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
736 qApp->processEvents();
748 qApp->restoreOverrideCursor();
749 qApp->processEvents();
761 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
762 qApp->processEvents();
774 qApp->restoreOverrideCursor();
775 qApp->processEvents();
785 if( editedImage == NULL )
return;
802 if( optionsDialog.exec() )
807 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
808 qApp->processEvents();
810 qApp->restoreOverrideCursor();
822 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
823 qApp->processEvents();
828 delete options; options = NULL;
834 qApp->restoreOverrideCursor();
835 qApp->processEvents();
842 QImage* effectedImage = NULL;
855 return effectedImage;
862 if(editedImage == NULL)
879 QString editedImagePath = ((
Window*)qApp->mainWidget())->getTitle()->getAlbum()->getTmpDir() +
"/editedImage.jpg";
885 editedImage->save( editedImagePath,
"JPEG", 95 );
925 if(topLeft.x() >= bottomRight.x() ||
926 topLeft.y() >= bottomRight.y())
969 case Qt::Key_PageDown:
979 if(e->state() & Qt::ControlModifier)
983 if(e->state() & Qt::ControlModifier)
987 if(e->state() & Qt::ControlModifier)
989 if( e->state() & Qt::AltModifier )
1014 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
1021 int origWidth, origHeight;
1048 qApp->restoreOverrideCursor();
1066 QPoint curTopLeft, curBottomRight;
1070 QPoint selectionCenter = QPoint( ( curTopLeft.x() + curBottomRight.x() ) / 2,
1071 ( curTopLeft.y() + curBottomRight.y() ) / 2 );
1074 int newWidth = curBottomRight.y() - curTopLeft.y() + 1;
1075 int newHeight =curBottomRight.x() - curTopLeft.x() + 1;
1078 newWidth, newHeight );
1081 QPoint
topLeft = QPoint( selectionCenter.x() - newWidth/2,
1082 selectionCenter.y() - newHeight/2 );
1083 QPoint
bottomRight = QPoint( topLeft.x() + newWidth - 1,
1084 topLeft.y() + newHeight - 1 );
1089 bottomRight.setX( bottomRight.x() - topLeft.x() );
1095 bottomRight.setY( bottomRight.y() - topLeft.y() );
1101 topLeft.setX( topLeft.x() - ( bottomRight.x() -
imageWidth + 1 ) );
1107 topLeft.setY( topLeft.y() - ( bottomRight.y() -
imageHeight + 1 ) );
1132 { aspectRatio = QSize( aspectRatio.height(), aspectRatio.width() ); }
1136 { aspectRatio = QSize( aspectRatio.height(), aspectRatio.width() ); }
1139 int selectedWidth = 0;
1140 int selectedHeight = 0;
1146 selectedWidth = aspectRatio.width();
1147 selectedHeight = aspectRatio.height();
1150 selectedWidth, selectedHeight );
1157 selectedHeight = (int) (((
double) (
imageWidth * aspectRatio.height()) ) / aspectRatio.width() );
1160 selectedWidth, selectedHeight );
1165 QPoint curTopLeft, curBottomRight;
1170 curCenter.setX( (curTopLeft.x() + curBottomRight.x()) / 2 );
1171 curCenter.setY( (curTopLeft.y() + curBottomRight.y()) / 2 );
1175 if( curCenter.x() < 0 || curCenter.y() < 0 )
1183 QPoint newTopLeft, newBottomRight;
1185 newTopLeft.setX( curCenter.x() - selectedWidth/2 );
1186 newTopLeft.setY( curCenter.y() - selectedHeight/2 );
1189 if( newTopLeft.x() < 0 ) newTopLeft.setX( 0 );
1190 if( newTopLeft.y() < 0 ) newTopLeft.setY( 0 );
1193 newBottomRight.setX( newTopLeft.x() + selectedWidth - 1 );
1197 newTopLeft.setX( newBottomRight.x() - selectedWidth + 1 );
1200 newBottomRight.setY( newTopLeft.y() + selectedHeight - 1 );
1204 newTopLeft.setY( newBottomRight.y() - selectedHeight + 1 );
1223 if( p1.x() == -1 || p2.x() == -1 )
1231 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
1248 qApp->restoreOverrideCursor();
ClickableLabel * nextButton
void crop()
Cropped image.
void applyImageUpdate(QImage *editedImage, bool resetSelection)
Applies update to image.
QImage * correctImageTilt(QString filename, QPoint p1, QPoint p2, StatusWidget *status)
QString getImageFilename()
Gets the image filename.
void enhanceContrast()
Enhance image contrast.
Interface for adjusting image historgram using upper and lower bounds and bright and contrast control...
QString originalImageFilename()
orig filename
A photo consists of a full size image, a smaller slide show image, a very small thumbnail image...
int imageWidth
Dimension of photo in image coordinates.
ClickableLabel * previousButton
Buttons for changing the shown image
void revertPhoto()
revert photo to original form
void showPrevPhoto()
Show prev photo.
void adjustGrain()
Opens image grain editor.
void handleAspectRatioChanged()
QImage * mosaicEffect(QString filename, MosaicOptions *options)
Top level widget, encapsulates the title widget, the layout widget, and the toolbar widget...
StatusWidget * getStatus()
returns a pointer to the status widget
QToolButton * correctTiltButton
The start tilt button is disabled while a line is being selected.
Subalbum * collection
========== Pointer to backend collection
void removeRedeye()
Applies redeye removal.
#define TIGHT_WIDGET_SPACING
void handleSelectionChanged()
void setPixmap(const QPixmap &p)
bool findSelection(QPoint &topLeft, QPoint &bottomRight)
Finds the selected region of the image.
void flipVertical()
Flip image vertically.
void rotateLeft()
Rotate image left 90 degrees.
QImage * sepiaEffect(QString filename, ManipulationOptions *options)
QImage * enhanceImageContrast(QString filename, StatusWidget *status)
void enterDrawLineMode()
enter draw line mode - used for tilt correction
void startCorrectTilt()
Enter correct image tilt mode.
Photo * getNext()
Returns next photo pointer.
void tuneLevels()
Opens levels editor for manual histogram and brightness/contrast adjustments.
void colorBalance()
Improve color balance.
Interface for adjusting image grain by bluring and sharpening.
QImage * oilPaintingEffect(QString filename, ManipulationOptions *options)
bool currentPhotoRevertable()
void setPhoto(QString imageFilename, bool resetSelection=true)
Updates displayed photo.
void keyPressEvent(QKeyEvent *e)
void rotateRight()
Rotate image right 90 degrees.
void revertCurrentPhoto()
reverts current photo and updates display
Interface for choosing mosiac effect options.
bool setImage(QString imageName, QString slideshowName, QString thumbnailName)
Setup photo using preexisting full size, slideshow, and thumbnail images.
QString effectPreviewImageFilename
Path to scaled down version of image for fast generation of previews of effects.
A subalbum contains photos.
QComboBox * effectsList
List of effects that can be applied to photos.
QPushButton * applyEffectButton
The apply effect button is disabled when no effect has been chosen.
void showNextPhoto()
Show next photo.
void rotateFlip(TRANSFORM_CODE rotationFlipType)
Utility method for rotation + flip slots.
void applyEffect()
Apply selected effect.
void getSelection(QPoint &topLeft, QPoint &bottomRight)
Returns the current selected coordinates (actual slideshow image space, aka not including buffered wh...
void finishCorrectTilt(QPoint p1, QPoint p2)
Finish correcting and image's tilt.
void rotateSelection()
Rotate current selection.
QImage * removeRedeyeRegions(QString filename, QPoint topLeftExtreme, QPoint bottomRightExtreme, StatusWidget *statusWidget)
SelectionInterface * selectionInterface
This widget scales and displays the photo to fit the available screen space, and provides extensive s...
void setEnabled(bool val)
ClickableLabel * redEyeReductionButton
The red eye reduction button is disabled when no selection is present.
void getDisplaySize(int &width, int &height)
returns the current photo display size (in screen pixels)
void selectAspectRatio()
Aspect ratio selection changed.
void setSelection(QPoint topLeft, QPoint bottomRight, double cropMaxDimen=-1.0)
Sets the current selection cropMaxDimen specifies the idealized dimension in dominant direction in in...
Photo * getFirst()
Returns first photo in subalbum.
MosaicOptions * getOptions()
returns a populate options object
Display widget for photos. Used by the PhotoEditWidget.
QComboBox * aspectRatios
Widget for selection aspect ratio to crop to.
void flipHorizontal()
Flip image horizontally.
bool selectionRotated
state variable indicating if the user wants to use a rotate aspect ratio
Photo * photo
Pointer to backend photo.
QImage * embossEffect(QString filename, ManipulationOptions *options)
QImage * cropImage(QString filename, QPoint topLeft, QPoint bottomRight)
void setPhoto(Subalbum *collection, Photo *photo)
Sets the photo pointer and constructs scaled qimage's for painting.
QLabel * effectPreview
Label that shows preview of effect.
void selectNone()
selects none of the image
QToolButton * cropButton
The crop buttons is disabled when no seletion is present.
void screenResolutionChanged()
Update recorded screen resolution and selection if necessary.
int displayResolutionIndex
Index for screen resolution, needed if this value pair changes during program executing.
#define EFFECT_PREVIEW_WIDTH
void showNextPrevFirstLastPhoto(Photo *newPhoto)
Utility method for show prev/next photos.
QSize * aspectRatioValues
array of common aspect ratios to crop to
#define EFFECT_PREVIEW_HEIGHT
void setInvisible(bool val)
LayoutWidget * layout
Pointer to the parent layout widget.
QImage * pointillismEffect(QString filename, ManipulationOptions *)
void showFirstPhoto()
Show first photo.
QImage * blackWhiteEffect(QString filename, ManipulationOptions *options)
QImage * improveColorBalance(QString filename, StatusWidget *status)
Photo * getPhoto()
Returns a pointer to the currently selected photo.
EditingInterface(QWidget *parent=0, const char *name=0)
Constructs layout.
void selectAll(QPoint &topLeft, QPoint &bottomRight)
Return coordinates that select entire image.
Photo * getPrev()
Returns the previous photo pointer.
void returnAction()
Exit editing interface.
QImage * invertEffect(QString filename, ManipulationOptions *)
int displayWidth
Dimension of photo in display coordinates.
void showLastPhoto()
Show last photo.
void selectEffect()
Effect seletion changed.
Photo * getLast()
Returns last photo in subalbum.
bool revertPossible()
can photo be reverted to a differnt original form