EditingInterface Class Reference

#include <editingInterface.h>

Inheritance diagram for EditingInterface:

[legend]
Collaboration diagram for EditingInterface:
[legend]
List of all members.

Detailed Description

Interface for editing photo.

Definition at line 53 of file editingInterface.h.

Public Slots

void handleSelectionChanged ()
void handleAspectRatioChanged ()
void setFocus ()

Signals

void photoModified ()

Public Member Functions

 EditingInterface (QWidget *parent=0, const char *name=0)
 Constructs layout.
 ~EditingInterface ()
void setPhoto (Subalbum *collection, Photo *photo)
 Sets the photo pointer and constructs scaled qimage's for painting.
PhotogetPhoto ()
 Returns a pointer to the currently selected photo.
bool currentPhotoRevertable ()
void revertCurrentPhoto ()
 reverts current photo and updates display

Protected Member Functions

void keyPressEvent (QKeyEvent *e)

Private Slots

void showPrevPhoto ()
 Show prev photo.
void showNextPhoto ()
 Show next photo.
void showFirstPhoto ()
 Show first photo.
void showLastPhoto ()
 Show last photo.
void rotateRight ()
 Rotate image right 90 degrees.
void rotateLeft ()
 Rotate image left 90 degrees.
void flipHorizontal ()
 Flip image horizontally.
void startCorrectTilt ()
 Enter correct image tilt mode.
void finishCorrectTilt (QPoint p1, QPoint p2)
 Finish correcting and image's tilt.
void flipVertical ()
 Flip image vertically.
void selectAspectRatio ()
 Aspect ratio selection changed.
void screenResolutionChanged ()
 Update recorded screen resolution and selection if necessary.
void rotateSelection ()
 Rotate current selection.
void crop ()
 Cropped image.
void enhanceContrast ()
 Enhance image contrast.
void colorBalance ()
 Improve color balance.
void removeRedeye ()
 Applies redeye removal.
void tuneLevels ()
 Opens levels editor for manual histogram and brightness/contrast adjustments.
void adjustGrain ()
 Opens image grain editor.
void selectEffect ()
 Effect seletion changed.
void applyEffect ()
 Apply selected effect.
void returnAction ()
 Exit editing interface.

Private Member Functions

void showNextPrevFirstLastPhoto (Photo *newPhoto)
 Utility method for show prev/next photos.
void rotateFlip (TRANSFORM_CODE rotationFlipType)
 Utility method for rotation + flip slots.
bool findSelection (QPoint &topLeft, QPoint &bottomRight)
 Finds the selected region of the image.
void selectAll (QPoint &topLeft, QPoint &bottomRight)
 Return coordinates that select entire image.
QImage * applyEffect (QString filename, ManipulationOptions *options=NULL)
 utlity function for apply effect and preview effect slots
void applyImageUpdate (QImage *editedImage, bool resetSelection)
 Applies update to image.

Private Attributes

ClickableLabelpreviousButton
 ------------ Buttons for changing the shown image
ClickableLabelnextButton
SelectionInterfaceselectionInterface
 This widget scales and displays the photo to fit the available screen space, and provides extensive support for selecting regions of the photo for editing/cropping.
QComboBox * aspectRatios
 Widget for selection aspect ratio to crop to.
QComboBox * orientations
int displayResolutionIndex
 Index for screen resolution, needed if this value pair changes during program executing.
QSize * aspectRatioValues
 array of common aspect ratios to crop to
double * maxDimensions
bool selectionRotated
 state variable indicating if the user wants to use a rotate aspect ratio
QToolButton * correctTiltButton
 The start tilt button is disabled while a line is being selected.
QToolButton * cropButton
 The crop buttons is disabled when no seletion is present.
ClickableLabelredEyeReductionButton
 The red eye reduction button is disabled when no selection is present.
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.
QLabeleffectPreview
 Label that shows preview of effect.
Subalbumcollection
 ========== Pointer to backend collection
Photophoto
 Pointer to backend photo.
QString effectPreviewImageFilename
 Path to scaled down version of image for fast generation of previews of effects.
LayoutWidgetlayout
 Pointer to the parent layout widget.
int displayWidth
 Dimension of photo in display coordinates.
int displayHeight
int imageWidth
 Dimension of photo in image coordinates.
int imageHeight


Constructor & Destructor Documentation

EditingInterface::EditingInterface ( QWidget parent = 0,
const char *  name = 0 
)

Constructs layout.

Definition at line 71 of file editingInterface.cpp.

References adjustGrain(), applyEffect(), applyEffectButton, aspectRatios, aspectRatioValues, BW_EFFECT, colorBalance(), correctTiltButton, crop(), cropButton, displayResolutionIndex, effectPreview, effectsList, EMBOSS_EFFECT, enhanceContrast(), finishCorrectTilt(), flipHorizontal(), flipVertical(), handleAspectRatioChanged(), handleSelectionChanged(), IMAGE_PATH, INVERT_EFFECT, layout, maxDimensions, MOSAIC_EFFECT, nextButton, NUM_MANIPULATIONS, PAINTING_EFFECT, photo, POINTILLISM_EFFECT, previousButton, redEyeReductionButton, removeRedeye(), rotateLeft(), rotateRight(), rotateSelection(), screenResolutionChanged(), selectAspectRatio(), selectEffect(), selectionInterface, SEPIA_EFFECT, ClickableLabel::setEnabled(), ClickableLabel::setPixmap(), showNextPhoto(), showPrevPhoto(), startCorrectTilt(), TIGHT_WIDGET_SPACING, tuneLevels(), and WIDGET_SPACING.

00072                                  : QWidget(parent,name)
00073 {
00074   //create a smaller font for drawing various labels and items
00075   QFont smallerFont = font();
00076   smallerFont.setPointSize( smallerFont.pointSize() - 1 );  
00077 
00078   setFocusPolicy(QWidget::StrongFocus);
00079 
00080   //set photo pointer to null by default
00081   photo = NULL;
00082 
00083   //store layout pointer
00084   layout = (LayoutWidget*)parent;
00085 
00086   //----------  
00087   //Construct photo frame that houses photo being edited and prev and next buttons
00088   QFrame* photoFrame = new QFrame(this, "photoFrame" );
00089   
00090   //Construct the frame that houses all the controls
00091   QFrame* controlsFrame = new QFrame(this, "controlsFrame");
00092 
00093   //Place photo fram and control widgets in a top level grid
00094   QGridLayout* mainGrid = new QGridLayout( this, 3, 3, 0 );
00095   mainGrid->addWidget( photoFrame, 0, 1 );
00096   mainGrid->setRowStretch(0, 1);
00097   mainGrid->addMultiCellWidget( controlsFrame, 1,1, 0,2 );
00098   mainGrid->setRowSpacing( 2, WIDGET_SPACING );
00099   //----------  
00100   //Previous photo button
00101   previousButton = new ClickableLabel( photoFrame, "previousButton" );
00102   previousButton->setPixmap( QPixmap(QString(IMAGE_PATH)+"buttonIcons/previous.png") ); 
00103   connect( previousButton, SIGNAL(clicked()), SLOT(showPrevPhoto()) );    
00104 
00105   //Create widget for displaying and selecting regions of the current photo
00106   selectionInterface = new SelectionInterface( photoFrame, "selectionInterface" );
00107   connect( selectionInterface, SIGNAL( selectionChanged() ), this, SLOT( handleSelectionChanged() ) );
00108   connect( selectionInterface, SIGNAL( aspectRatioChanged() ), this, SLOT( handleAspectRatioChanged() ) );
00109   connect( selectionInterface, SIGNAL( ctrlClick() ), this, SLOT( rotateSelection() ) );
00110   
00111   //Next photo button
00112   nextButton = new ClickableLabel( photoFrame, "nextButton" );
00113   nextButton->setPixmap( QPixmap(QString(IMAGE_PATH)+"buttonIcons/next.png") ); 
00114   connect( nextButton, SIGNAL(clicked()), SLOT(showNextPhoto()) );    
00115 
00116   //Place above widgets in grid, allow seletion interface to take up extra room
00117   QGridLayout* selectionGrid = new QGridLayout( photoFrame, 1, 5, 0 );
00118   selectionGrid->setColSpacing( 0, WIDGET_SPACING );
00119   selectionGrid->addWidget( previousButton,     0, 1, Qt::AlignCenter );
00120   selectionGrid->addWidget( selectionInterface, 0, 2 );
00121   selectionGrid->setColStretch( 2, 1 );
00122   selectionGrid->addWidget( nextButton,         0, 3, Qt::AlignCenter );
00123   selectionGrid->setColSpacing( 4, WIDGET_SPACING );
00124   selectionGrid->setSpacing( WIDGET_SPACING );
00125   //-----------
00126   //construct the frames each set of controls is placed in
00127   QHGroupBox* frameControls   = new QHGroupBox( tr("Frame"),   controlsFrame, "frameControls"   );
00128   frameControls->setAlignment( Qt::AlignHCenter );
00129   frameControls->setInsideMargin( WIDGET_SPACING );
00130 
00131   QHGroupBox* enhanceControls = new QHGroupBox( tr("Enhance"), controlsFrame, "enhanceControls" );
00132   enhanceControls->setAlignment( Qt::AlignHCenter ); 
00133   enhanceControls->setInsideMargin( WIDGET_SPACING );
00134   
00135   QHGroupBox* manipulateControls = new QHGroupBox( tr("Manipulate"), controlsFrame, "applyEffect" );
00136   manipulateControls->setAlignment( Qt::AlignHCenter );
00137   manipulateControls->setInsideMargin( WIDGET_SPACING );
00138       
00139   //layout groups of controls
00140   QGridLayout* controlsGrid = new QGridLayout( controlsFrame, 1, 5, 0 );
00141   controlsGrid->addWidget( frameControls,      0, 1 );  
00142   controlsGrid->addWidget( enhanceControls,    0, 2 );  
00143   controlsGrid->addWidget( manipulateControls, 0, 3 );  
00144   
00145   controlsGrid->setSpacing( WIDGET_SPACING );    
00146   controlsGrid->setColSpacing(0, WIDGET_SPACING );
00147   controlsGrid->setColStretch(0, 1);
00148   controlsGrid->setColSpacing(4, WIDGET_SPACING );
00149   controlsGrid->setColStretch(4, 1);
00150   
00151   //----------   
00152   //Frame Controls
00153   //----------    
00154   QFrame* frameControlsFrame = new QFrame( frameControls );
00155  
00156   //-----
00157   //rotate and flip buttons
00158   QFrame* rotateFlipFrame = new QFrame( frameControlsFrame );
00159   
00160   QToolButton* rotateRightButton = new QToolButton( rotateFlipFrame, "rotateRight" );
00161   rotateRightButton->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/rotate90.png") );
00162   rotateRightButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00163   connect( rotateRightButton, SIGNAL(clicked()), SLOT(rotateRight()) );
00164   QToolTip::add( rotateRightButton, tr("Rotate clockwise") );  
00165   
00166   QToolButton* rotateLeftButton = new QToolButton( rotateFlipFrame, "rotateLeft" );
00167   rotateLeftButton->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/rotate270.png") ); 
00168   rotateLeftButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00169   connect( rotateLeftButton, SIGNAL(clicked()), SLOT(rotateLeft()) );
00170   QToolTip::add( rotateLeftButton, tr("Rotate counterclockwise") );  
00171 
00172   QToolButton* flipHorizontalButton = new QToolButton( rotateFlipFrame, "flipHorizontal" );
00173   flipHorizontalButton->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/flipHorizontally.png") );
00174   flipHorizontalButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00175   connect( flipHorizontalButton, SIGNAL(clicked()), SLOT(flipHorizontal()) );
00176   QToolTip::add( flipHorizontalButton, tr("Flip horizontally") );  
00177   
00178   QToolButton* flipVerticalButton = new QToolButton( rotateFlipFrame, "flipVertical" );
00179   flipVerticalButton->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/flipVertically.png") ); 
00180   flipVerticalButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00181   connect( flipVerticalButton, SIGNAL(clicked()), SLOT(flipVertical()) );  
00182   QToolTip::add( flipVerticalButton, tr("Flip vertically") );  
00183   
00184   correctTiltButton = new QToolButton( rotateFlipFrame, "correctTilt" );
00185   correctTiltButton->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/correctTilt.png") ); 
00186   correctTiltButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00187   
00188   connect( correctTiltButton, SIGNAL(clicked()), SLOT(startCorrectTilt()) );
00189 
00190   connect( selectionInterface, SIGNAL(lineSelected(QPoint, QPoint)),
00191            this, SLOT(finishCorrectTilt( QPoint, QPoint)) );
00192 
00193   QToolTip::add( correctTiltButton, tr("Correct tilt") );  
00194 
00195   //Place buttons in grid
00196   QGridLayout* rotateFlipGrid = new QGridLayout( rotateFlipFrame, 1, 5, 0 );
00197   rotateFlipGrid->setSpacing(TIGHT_WIDGET_SPACING);  
00198   rotateFlipGrid->addWidget( rotateRightButton,    0, 0 );
00199   rotateFlipGrid->addWidget( rotateLeftButton,     0, 1 );
00200   rotateFlipGrid->addWidget( flipHorizontalButton, 0, 2 );
00201   rotateFlipGrid->addWidget( flipVerticalButton,   0, 3 );
00202   rotateFlipGrid->addWidget( correctTiltButton,    0, 4 );
00203   //-----
00204   //aspect ratio selection and crop controls
00205   aspectRatios = new QComboBox( frameControlsFrame );
00206   aspectRatios->setFont( smallerFont );
00207   connect( aspectRatios, SIGNAL(activated(int)), this, SLOT(selectAspectRatio()) );  
00208   aspectRatioValues = new QSize[8];
00209   maxDimensions = new double[8];
00210   int curAspectRatio = 0;
00211   //--
00212   aspectRatios->insertItem( tr("Custom") );
00213   maxDimensions[curAspectRatio] = -1.0;
00214   aspectRatioValues[curAspectRatio++] = QSize( -1, -1 );
00215   //--  
00216   aspectRatios->insertItem( tr("Photo (3.5 x 5)") );
00217   maxDimensions[curAspectRatio] = 5.0;
00218   aspectRatioValues[curAspectRatio++] = QSize( 10, 7 );
00219   //--  
00220   aspectRatios->insertItem( tr("Photo (4 x 6)") );
00221   maxDimensions[curAspectRatio] = 6.0;
00222   aspectRatioValues[curAspectRatio++] = QSize( 6, 4 );
00223   //--  
00224   aspectRatios->insertItem( tr("Photo (5 x 7)") );
00225   maxDimensions[curAspectRatio] = 7.0;
00226   aspectRatioValues[curAspectRatio++] = QSize( 7, 5 );
00227   //--  
00228   aspectRatios->insertItem( tr("Photo (8 x 10)") );
00229   maxDimensions[curAspectRatio] = 10.0;
00230   aspectRatioValues[curAspectRatio++] = QSize( 10, 8 );
00231   //--  
00232   aspectRatios->insertItem( tr("Postcard") );
00233   maxDimensions[curAspectRatio] = 6.0;
00234   aspectRatioValues[curAspectRatio++] = QSize( 6, 4 );
00235   //--  
00236   aspectRatios->insertItem( tr("Wallet") );
00237   maxDimensions[curAspectRatio] = 3.0;
00238   aspectRatioValues[curAspectRatio++] = QSize( 3, 2 );
00239   //--  
00240   aspectRatios->insertItem( tr("Desktop") );
00241   displayResolutionIndex = curAspectRatio;
00242   maxDimensions[curAspectRatio] = -1.0;
00243   aspectRatioValues[curAspectRatio++] = qApp->desktop()->screenGeometry().size();
00244   //--  
00245   //connect signal emitted when screen resolution changes 
00246   //so as to update this stored value (and selction if necessary)
00247   connect( qApp->desktop(), SIGNAL( resized(int)), this, SLOT(screenResolutionChanged()) );
00248 
00249   QToolTip::add( aspectRatios, tr("Select region for cropping using a particular aspect ratio") );  
00250 
00251   QLabel* aspectRatioLabel = new QLabel( tr("Aspect Ratio"), frameControlsFrame );
00252   aspectRatioLabel->setFont( smallerFont );
00253   //--
00254 
00255   //Crop button
00256   cropButton = new QToolButton( frameControlsFrame );
00257   QIconSet cropIcon;
00258   cropIcon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/crop.png",
00259                       QIconSet::Automatic,
00260                       QIconSet::Normal );
00261                        
00262   cropIcon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/crop_disabled.png",
00263                       QIconSet::Automatic,
00264                       QIconSet::Disabled );
00265   cropButton->setIconSet( cropIcon );
00266   connect( cropButton, SIGNAL(clicked()), SLOT(crop()) );
00267   QToolTip::add( cropButton, tr("Crop photo to selected region") );  
00268 
00269   QLabel* cropLabel = new QLabel( tr("Crop"), frameControlsFrame );
00270   cropLabel->setFont( smallerFont );  
00271   
00272   //--  
00273 
00274   //Place frame controls in a grid
00275   QGridLayout* frameControlsGrid = new QGridLayout( frameControlsFrame, 3, 2, 0 );
00276   frameControlsGrid->setSpacing(TIGHT_WIDGET_SPACING);  
00277   frameControlsGrid->addMultiCellWidget( rotateFlipFrame, 0,0,  0,1 );
00278   frameControlsGrid->addWidget( aspectRatios,     1, 0, Qt::AlignHCenter );  
00279   frameControlsGrid->addWidget( cropButton,       1, 1, Qt::AlignHCenter );  
00280   frameControlsGrid->addWidget( aspectRatioLabel, 2, 0, Qt::AlignHCenter );  
00281   frameControlsGrid->addWidget( cropLabel,        2, 1, Qt::AlignHCenter );    
00282 
00283   //----------  
00284   //Enhance Controls
00285   //----------    
00286   QFrame* enhanceControlsFrame = new QFrame( enhanceControls );  
00287   
00288   //setup params for large buttons  
00289   int numLargeButtons = 3;
00290   int curButtonIndex=0;
00291   ClickableLabel** largeButtons = new ClickableLabel*[numLargeButtons];
00292   
00293 
00294   //--------------------
00295   //Frame for semi-automatic enhance controls
00296   QFrame* autoEnhanceControlsFrame = new QFrame( enhanceControlsFrame );  
00297 
00298   //Enhance Color
00299   ClickableLabel* enhanceColorButton = largeButtons[curButtonIndex] = 
00300     new ClickableLabel( autoEnhanceControlsFrame );
00301   largeButtons[curButtonIndex]->setPixmap( QPixmap(QString(IMAGE_PATH)+"buttonIcons/improveColorBalance.png") );
00302   connect( largeButtons[curButtonIndex], SIGNAL(clicked()), SLOT(colorBalance()) );
00303   QToolTip::add( largeButtons[curButtonIndex], tr("Enhance color balance") );  
00304   curButtonIndex++;
00305 
00306   QLabel* enhanceColorLabel = new QLabel( tr("Color"), autoEnhanceControlsFrame );
00307   enhanceColorLabel->setFont( smallerFont );  
00308   
00309   //Enhance Contrast
00310   ClickableLabel* enhanceContrastButton = largeButtons[curButtonIndex] = 
00311     new ClickableLabel( autoEnhanceControlsFrame );
00312   largeButtons[curButtonIndex]->setPixmap( QPixmap(QString(IMAGE_PATH)+"buttonIcons/enhanceContrast.png") );
00313   connect( largeButtons[curButtonIndex], SIGNAL(clicked()), SLOT(enhanceContrast()) );
00314   QToolTip::add( largeButtons[curButtonIndex], tr("Enhance contrast") );  
00315   curButtonIndex++;
00316   
00317   QLabel* enhanceContrastLabel = new QLabel( tr("Contrast"), autoEnhanceControlsFrame );
00318   enhanceContrastLabel->setFont( smallerFont );  
00319 
00320   //Remove Red-Eye  
00321   redEyeReductionButton = largeButtons[curButtonIndex] = new ClickableLabel( autoEnhanceControlsFrame );
00322   redEyeReductionButton->setEnabled( false );
00323   
00324   largeButtons[curButtonIndex]->setPixmap( QPixmap( QString(IMAGE_PATH)+"buttonIcons/redEyeReduction.png" ) );
00325   connect( largeButtons[curButtonIndex], SIGNAL(clicked()), SLOT(removeRedeye()) );
00326   QToolTip::add( largeButtons[curButtonIndex], tr("Remove red-eye") );  
00327   curButtonIndex++;
00328 
00329   QLabel* removeRedyEyeLabel = new QLabel( tr("Red Eye"), autoEnhanceControlsFrame );
00330   removeRedyEyeLabel->setFont( smallerFont );  
00331 
00332   //Place semi-automatic enhance controls in grid
00333   QGridLayout* autoEnhanceControlsGrid = new QGridLayout( autoEnhanceControlsFrame, 2, 3, 0 );
00334   autoEnhanceControlsGrid->setSpacing(TIGHT_WIDGET_SPACING);  
00335   autoEnhanceControlsGrid->addWidget( enhanceColorButton,    0, 0, Qt::AlignHCenter );
00336   autoEnhanceControlsGrid->addWidget( enhanceColorLabel,     1, 0, Qt::AlignHCenter );  
00337 
00338   autoEnhanceControlsGrid->addWidget( enhanceContrastButton, 0, 1, Qt::AlignHCenter );
00339   autoEnhanceControlsGrid->addWidget( enhanceContrastLabel,  1, 1, Qt::AlignHCenter );  
00340 
00341   autoEnhanceControlsGrid->addWidget( redEyeReductionButton, 0, 2, Qt::AlignHCenter );
00342   autoEnhanceControlsGrid->addWidget( removeRedyEyeLabel,    1, 2, Qt::AlignHCenter );  
00343   //--------------------
00344   //Frame for more labor intensive enhance controls
00345   QFrame* manualEnhanceControlsFrame = new QFrame( enhanceControlsFrame );  
00346   
00347   //Tune Levels Button
00348   ClickableLabel* tuneLevelsButton = new ClickableLabel( manualEnhanceControlsFrame );
00349   tuneLevelsButton->setPixmap( QPixmap(QString(IMAGE_PATH)+"buttonIcons/tuneLevels.png") );
00350   connect( tuneLevelsButton, SIGNAL(clicked()), SLOT(tuneLevels()) );
00351   QToolTip::add( tuneLevelsButton, tr("Fine tune brightness, contrast, and colors") );  
00352   
00353   QLabel* tuneLevelsLabel = new QLabel( tr("Levels..."), manualEnhanceControlsFrame );
00354   tuneLevelsLabel->setFont( smallerFont );  
00355 
00356   //Adjust Grain Button
00357   ClickableLabel* adjustGrainButton = new ClickableLabel( manualEnhanceControlsFrame );
00358   adjustGrainButton->setPixmap( QPixmap(QString(IMAGE_PATH)+"buttonIcons/adjustGrain.png") );
00359   connect( adjustGrainButton, SIGNAL(clicked()), SLOT(adjustGrain()) );
00360   QToolTip::add( adjustGrainButton, tr("Blur or sharpen image") );  
00361 
00362   QLabel* adjustGrainLabel = new QLabel( tr("Grain..."), manualEnhanceControlsFrame );
00363   adjustGrainLabel->setFont( smallerFont );  
00364 
00365   //Place manual enhance controls in grid
00366   QGridLayout* manualEnhanceControlsGrid = new QGridLayout( manualEnhanceControlsFrame, 2, 3, 0 );
00367   manualEnhanceControlsGrid->setSpacing(TIGHT_WIDGET_SPACING);  
00368   manualEnhanceControlsGrid->addWidget( tuneLevelsButton,    0, 0, Qt::AlignHCenter );
00369   manualEnhanceControlsGrid->addWidget( tuneLevelsLabel,     1, 0, Qt::AlignHCenter );
00370   manualEnhanceControlsGrid->setColSpacing( 1, WIDGET_SPACING );
00371   manualEnhanceControlsGrid->addWidget( adjustGrainButton, 0, 2, Qt::AlignHCenter );
00372   manualEnhanceControlsGrid->addWidget( adjustGrainLabel,  1, 2, Qt::AlignHCenter );
00373   //--------------------
00374 
00375   //Place enhance controls in a grid
00376   QGridLayout* enhanceControlsGrid = new QGridLayout( enhanceControlsFrame, 4, 2, 0 );
00377   enhanceControlsGrid->setSpacing(WIDGET_SPACING);  
00378   enhanceControlsGrid->addWidget( autoEnhanceControlsFrame,   0, 0, Qt::AlignHCenter );
00379   enhanceControlsGrid->addWidget( manualEnhanceControlsFrame, 1, 0, Qt::AlignHCenter );
00380   enhanceControlsGrid->setRowStretch( 0, 1 );
00381   enhanceControlsGrid->setRowStretch( 3, 1 );
00382   
00383   //----------  
00384   //Effects Controls
00385   //----------  
00386   QFrame* manipulateControlsFrame = new QFrame( manipulateControls, "manipulateControlsFrame" );
00387   //--  
00388   //Effects
00389   effectsList = new QComboBox( manipulateControlsFrame );
00390   effectsList->setFont( smallerFont );  
00391   connect( effectsList, SIGNAL(activated(int)), this, SLOT(selectEffect()) );
00392 
00393   int i;
00394   for(i=0; i<NUM_MANIPULATIONS; i++)
00395   {
00396     switch(i)
00397     {
00398       case BW_EFFECT:          effectsList->insertItem( tr("B + W") );       break;
00399       case SEPIA_EFFECT:       effectsList->insertItem( tr("Sepia") );       break;
00400       case INVERT_EFFECT:      effectsList->insertItem( tr("Invert") );      break;
00401       case EMBOSS_EFFECT:      effectsList->insertItem( tr("Emboss") );      break;
00402       case MOSAIC_EFFECT:      effectsList->insertItem( tr("Mosaic") );       break;
00403       case PAINTING_EFFECT:    effectsList->insertItem( tr("Painting") );    break;
00404       case POINTILLISM_EFFECT: effectsList->insertItem( tr("Pointillism") ); break;
00405     }
00406   }
00407 
00408   //Apply effect button
00409   applyEffectButton = new QPushButton( tr("Apply"), manipulateControlsFrame );
00410   applyEffectButton->setFont( smallerFont );  
00411   connect( applyEffectButton, SIGNAL(clicked()), SLOT(applyEffect()) );   
00412   
00413   //preview of seleted effect
00414   effectPreview = new QLabel( manipulateControlsFrame );
00415  
00416   //Place effects controls in a grid
00417   QGridLayout* manipulateControlsGrid = new QGridLayout( manipulateControlsFrame, 2, 2, 0 );
00418   manipulateControlsGrid->setSpacing(TIGHT_WIDGET_SPACING);  
00419   manipulateControlsGrid->addWidget( effectsList, 0, 0 );
00420   manipulateControlsGrid->addWidget( applyEffectButton, 1, 0, Qt::AlignHCenter );  
00421   manipulateControlsGrid->addMultiCellWidget( effectPreview, 0,1, 1,1, Qt::AlignHCenter );  
00422 
00423   //make sure preview image always requires EFFECT_PREVIEW_WIDTH width so contorls don't
00424   //move around when rotating photos
00425   manipulateControlsGrid->setColSpacing(1, 85 );
00426 }

EditingInterface::~EditingInterface (  ) 

Definition at line 428 of file editingInterface.cpp.

00428 { }


Member Function Documentation

void EditingInterface::adjustGrain (  )  [private, slot]

Opens image grain editor.

Definition at line 748 of file editingInterface.cpp.

References applyImageUpdate(), Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, photo, and StatusWidget::releaseInput().

Referenced by EditingInterface().

00749 {
00750   //load photo in grain editor
00751   //if changes took place update image
00752   GrainEditor editor( photo->getImageFilename(), this);
00753   if( editor.exec() ) 
00754   { 
00755     //set busy cursor
00756     qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00757     qApp->processEvents();
00758     
00759     //disable user input
00760     layout->getWindow()->getStatus()->grabInput();
00761 
00762     //update image    
00763     applyImageUpdate( editor.getModifiedImage(), false ); 
00764     
00765     //enable user input
00766     layout->getWindow()->getStatus()->releaseInput();
00767 
00768     //remove busy cursor
00769     qApp->restoreOverrideCursor();
00770     qApp->processEvents();
00771   }
00772 }

QImage * EditingInterface::applyEffect ( QString  filename,
ManipulationOptions options = NULL 
) [private]

utlity function for apply effect and preview effect slots

Definition at line 834 of file editingInterface.cpp.

References blackWhiteEffect(), BW_EFFECT, effectsList, EMBOSS_EFFECT, embossEffect(), INVERT_EFFECT, invertEffect(), MOSAIC_EFFECT, mosaicEffect(), oilPaintingEffect(), PAINTING_EFFECT, POINTILLISM_EFFECT, pointillismEffect(), SEPIA_EFFECT, and sepiaEffect().

00835 {
00836   //apply effect
00837   QImage* effectedImage = NULL;
00838   switch( effectsList->currentItem() )
00839   {
00840     case BW_EFFECT:          effectedImage = blackWhiteEffect(  filename, options ); break;
00841     case SEPIA_EFFECT:       effectedImage = sepiaEffect(       filename, options ); break;
00842     case INVERT_EFFECT:      effectedImage = invertEffect(      filename, options ); break;
00843     case EMBOSS_EFFECT:      effectedImage = embossEffect(      filename, options ); break;
00844     case PAINTING_EFFECT:    effectedImage = oilPaintingEffect( filename, options ); break;
00845     case POINTILLISM_EFFECT: effectedImage = pointillismEffect( filename, options ); break;
00846     case MOSAIC_EFFECT:      effectedImage = mosaicEffect(      filename, (MosaicOptions*) options ); break;
00847   }
00848 
00849   //return effected image
00850   return effectedImage;
00851 }

void EditingInterface::applyEffect (  )  [private, slot]

Apply selected effect.

Definition at line 788 of file editingInterface.cpp.

References applyEffectButton, applyImageUpdate(), editedImage, effectsList, Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, MOSAIC_EFFECT, photo, StatusWidget::releaseInput(), StatusWidget::setStatus(), and StatusWidget::showProgressBar().

Referenced by EditingInterface(), and selectEffect().

00789 {  
00790   //--------------------------------
00791   //Get any manipulation options if needed
00792   ManipulationOptions* options = NULL;
00793   if( effectsList->currentItem() == MOSAIC_EFFECT )   
00794   {
00795     MosaicOptionsDialog optionsDialog(this);
00796     //user accepted so get selected options
00797     if( optionsDialog.exec() ) 
00798     { 
00799       //constructing the tiles list can unfortunately be quite slow so show a preparing tiles message
00800       //and busy icon while getting the options chosen
00801       layout->getWindow()->getStatus()->showProgressBar( QString(tr("Preparing Tiles")), 100 );
00802       qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00803       qApp->processEvents();       
00804       options = optionsDialog.getOptions(); 
00805       qApp->restoreOverrideCursor();
00806     }
00807     //user hit cancel so bail
00808     else 
00809     { return; }
00810   }
00811   else
00812   { options = new ManipulationOptions( layout->getWindow()->getStatus() ); }
00813   //--------------------------------
00814   //Disable user input
00815   layout->getWindow()->getStatus()->grabInput();
00816   applyEffectButton->setEnabled(false);
00817   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00818   qApp->processEvents();
00819   //--------------------------------
00820   //Apply effect
00821   QImage* editedImage = applyEffect( photo->getImageFilename(), options );
00822   applyImageUpdate( editedImage, false );
00823   delete options; options = NULL;
00824   //--------------------------------
00825   //Remove status bar if present and reenable user input
00826   layout->getWindow()->getStatus()->setStatus( "" );
00827   layout->getWindow()->getStatus()->releaseInput();
00828   applyEffectButton->setEnabled(true);
00829   qApp->restoreOverrideCursor();
00830   qApp->processEvents();
00831   //--------------------------------
00832 } 

void EditingInterface::applyImageUpdate ( QImage *  editedImage,
bool  resetSelection 
) [private]

Applies update to image.

Definition at line 853 of file editingInterface.cpp.

References displayHeight, displayWidth, EFFECT_PREVIEW_HEIGHT, EFFECT_PREVIEW_WIDTH, effectPreviewImageFilename, SelectionInterface::getDisplaySize(), Photo::getImageFilename(), getImageSize(), imageHeight, imageWidth, photo, photoModified(), scaleImage(), selectEffect(), selectionInterface, selectionRotated, SelectionInterface::selectNone(), Photo::setImage(), and SelectionInterface::setPhoto().

Referenced by adjustGrain(), applyEffect(), colorBalance(), crop(), enhanceContrast(), finishCorrectTilt(), removeRedeye(), and tuneLevels().

00854 {  
00855   //skip apply step if pointer is null. this usually means
00856   //no modifications were made (for example: no red eyes were detected)
00857   if(editedImage == NULL) 
00858   { 
00859     //sometimes the user instructs the program to modify an image in a way
00860     //where no real changes are actually necessary. case in point, red eye reduction
00861     //on a region where there is no red stuff at all! in order to be consistant, if
00862     //the user is expecting the selection to be reset then always reset it! this
00863     //normally occurs below when resetting the photo but we'll do it here 
00864     //since resetting the photo will not take place
00865     if(resetSelection) 
00866     { 
00867       selectionInterface->selectNone(); 
00868     }
00869     
00870     return; 
00871   }
00872   
00873   //construct edited image path
00874   QString editedImagePath = ((Window*)qApp->mainWidget())->getTitle()->getAlbum()->getTmpDir() + "/editedImage.jpg";
00875 
00876   //save edited image to temporary location
00877   //TODO: EXIF information is lost at this point, Qt does not support
00878   //storing exif information, but perhaps a 2nd pass can be made on the file
00879   //where exif info is added using libjpeg functions?
00880   editedImage->save( editedImagePath, "JPEG", 95 );
00881   delete editedImage;
00882   editedImage = NULL;
00883     
00884   //apply changes to photo
00885   photo->setImage( editedImagePath );
00886   
00887   //Reload photo view
00888   selectionInterface->setPhoto( editedImagePath, resetSelection );  
00889 
00890   //If we're resetting the selection (due to cropping), reset the 
00891   //selection rotated bit as well
00892   if( resetSelection ) { selectionRotated = false; }
00893   
00894   //update image dimension variables
00895   getImageSize( photo->getImageFilename(), imageWidth, imageHeight );  
00896 
00897   //get display size photo dimensions
00898   selectionInterface->getDisplaySize( displayWidth, displayHeight );
00899 
00900   //update effect preview
00901   scaleImage( photo->getImageFilename(), effectPreviewImageFilename, EFFECT_PREVIEW_WIDTH, EFFECT_PREVIEW_HEIGHT );
00902   selectEffect();
00903   
00904   //emit modified signal
00905   emit photoModified();
00906 }

void EditingInterface::colorBalance (  )  [private, slot]

Improve color balance.

Definition at line 672 of file editingInterface.cpp.

References applyImageUpdate(), Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), improveColorBalance(), layout, photo, and StatusWidget::releaseInput().

Referenced by EditingInterface().

00673 {
00674   //set busy cursor
00675   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00676   qApp->processEvents();
00677 
00678   //disable user input
00679   layout->getWindow()->getStatus()->grabInput();
00680 
00681   //improve color balance
00682   applyImageUpdate( improveColorBalance( photo->getImageFilename(),
00683                                          layout->getWindow()->getStatus() ),
00684                     false );
00685 
00686   //enable user input
00687   layout->getWindow()->getStatus()->releaseInput();
00688 
00689   //remove busy cursor
00690   qApp->restoreOverrideCursor();
00691   qApp->processEvents();
00692 }

void EditingInterface::crop (  )  [private, slot]

Cropped image.

Definition at line 626 of file editingInterface.cpp.

References applyImageUpdate(), bottomRight, cropImage(), findSelection(), Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, photo, StatusWidget::releaseInput(), and topLeft.

Referenced by EditingInterface().

00627 {
00628   //find selection, if empty bail!
00629   QPoint topLeft, bottomRight;
00630   if (!findSelection(topLeft, bottomRight) )
00631     return;
00632 
00633   //set busy cursor
00634   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00635 
00636   //disable user input
00637   layout->getWindow()->getStatus()->grabInput();
00638 
00639   //crop image
00640   applyImageUpdate( cropImage( photo->getImageFilename(), topLeft, bottomRight ),
00641                     true );
00642 
00643   //enable user input
00644   layout->getWindow()->getStatus()->releaseInput();
00645 
00646   //remove busy cursor
00647   qApp->restoreOverrideCursor();
00648 }

bool EditingInterface::currentPhotoRevertable (  ) 

Definition at line 995 of file editingInterface.cpp.

References photo, and Photo::revertPossible().

Referenced by LayoutWidget::photoStateChangedEvent(), and revertCurrentPhoto().

00996 {
00997   if(photo == NULL) 
00998     return false;
00999   else
01000     return photo->revertPossible();
01001 }

void EditingInterface::enhanceContrast (  )  [private, slot]

Enhance image contrast.

Definition at line 650 of file editingInterface.cpp.

References applyImageUpdate(), enhanceImageContrast(), Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, photo, and StatusWidget::releaseInput().

Referenced by EditingInterface().

00651 {
00652   //set busy cursor
00653   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00654   qApp->processEvents();
00655 
00656   //disable user input
00657   layout->getWindow()->getStatus()->grabInput();
00658 
00659   //enhance image
00660   applyImageUpdate( enhanceImageContrast( photo->getImageFilename(),
00661                                           layout->getWindow()->getStatus() ),
00662                     false );
00663 
00664   //enable user input
00665   layout->getWindow()->getStatus()->releaseInput();
00666 
00667   //remove busy cursor
00668   qApp->restoreOverrideCursor();
00669   qApp->processEvents();
00670 }

bool EditingInterface::findSelection ( QPoint &  topLeft,
QPoint &  bottomRight 
) [private]

Finds the selected region of the image.

Definition at line 914 of file editingInterface.cpp.

References SelectionInterface::getSelection(), and selectionInterface.

Referenced by crop(), handleSelectionChanged(), and removeRedeye().

00915 {
00916   //get raw selection in display coordinates
00917   selectionInterface->getSelection(topLeft, bottomRight);
00918 
00919   //if range is empty then retrun false
00920   if(topLeft.x() >= bottomRight.x() ||
00921      topLeft.y() >= bottomRight.y())
00922     return false;
00923   
00924   //return success
00925   return true;
00926 }

void EditingInterface::finishCorrectTilt ( QPoint  p1,
QPoint  p2 
) [private, slot]

Finish correcting and image's tilt.

Definition at line 1215 of file editingInterface.cpp.

References applyImageUpdate(), correctImageTilt(), correctTiltButton, Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, photo, and StatusWidget::releaseInput().

Referenced by EditingInterface().

01216 {
01217   //if either point is invalid ignore action
01218   if( p1.x() == -1 || p2.x() == -1 )
01219   {
01220     //reenable tilt button
01221     correctTiltButton->setEnabled( true );
01222     return;
01223   }
01224   
01225   //set busy cursor
01226   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
01227   
01228   //disable user input
01229   layout->getWindow()->getStatus()->grabInput();
01230   
01231   //rotate image by determining correct angle from two points
01232   QImage* rotatedImage = correctImageTilt( photo->getImageFilename(), p1, p2,
01233                                            layout->getWindow()->getStatus() );
01234   applyImageUpdate( rotatedImage, true );
01235   
01236   //reenable tilt button
01237   correctTiltButton->setEnabled( true );
01238 
01239   //enable user input
01240   layout->getWindow()->getStatus()->releaseInput();
01241 
01242   //remove busy cursor
01243   qApp->restoreOverrideCursor();
01244 }

void EditingInterface::flipHorizontal (  )  [private, slot]

Flip image horizontally.

Definition at line 557 of file editingInterface.cpp.

References FLIP_H, and rotateFlip().

Referenced by EditingInterface(), and keyPressEvent().

00558 {
00559   rotateFlip( FLIP_H );
00560 }

void EditingInterface::flipVertical (  )  [private, slot]

Flip image vertically.

Definition at line 562 of file editingInterface.cpp.

References FLIP_V, and rotateFlip().

Referenced by EditingInterface(), and keyPressEvent().

00563 {
00564   rotateFlip( FLIP_V );
00565 }

Photo * EditingInterface::getPhoto (  ) 

Returns a pointer to the currently selected photo.

Definition at line 430 of file editingInterface.cpp.

References photo.

Referenced by LayoutWidget::tabChanged().

00430 { return photo; }

void EditingInterface::handleAspectRatioChanged (  )  [slot]

Definition at line 938 of file editingInterface.cpp.

References aspectRatios.

Referenced by EditingInterface().

00939 {
00940   //change aspect ratio combo box to custom
00941   aspectRatios->setCurrentItem(0);  
00942 }

void EditingInterface::handleSelectionChanged (  )  [slot]

Definition at line 928 of file editingInterface.cpp.

References bottomRight, cropButton, findSelection(), redEyeReductionButton, ClickableLabel::setEnabled(), and topLeft.

Referenced by EditingInterface().

00929 {
00930   //crop button is enabled only when a portion of the image is selected
00931   QPoint topLeft, bottomRight;
00932   bool selectionPresent = findSelection(topLeft,bottomRight);     
00933 
00934   cropButton->setEnabled( selectionPresent );
00935   redEyeReductionButton->setEnabled( selectionPresent );  
00936 }

void EditingInterface::keyPressEvent ( QKeyEvent *  e  )  [protected]

Definition at line 952 of file editingInterface.cpp.

References flipHorizontal(), flipVertical(), returnAction(), rotateLeft(), rotateRight(), showFirstPhoto(), showLastPhoto(), showNextPhoto(), and showPrevPhoto().

00953 {
00954   //next handle additional keys
00955   switch( e->key() )
00956   {
00957     //apply changes and exit
00958     case Qt::Key_Escape:
00959       returnAction();
00960       break;
00961     case Qt::Key_Prior:
00962       showPrevPhoto();
00963       break;
00964     case Qt::Key_Next:
00965       showNextPhoto();
00966       break;
00967     case Qt::Key_Home:
00968       showFirstPhoto();
00969       break;
00970     case Qt::Key_End:
00971       showLastPhoto();
00972       break;
00973     case Qt::Key_R:
00974       if(e->state() & Qt::ControlButton)
00975         rotateRight();
00976       break;
00977     case Qt::Key_L:
00978       if(e->state() & Qt::ControlButton)
00979         rotateLeft();
00980       break;
00981     case Qt::Key_F:
00982       if(e->state() & Qt::ControlButton)
00983       {
00984         if( e->state() & Qt::AltButton )
00985           flipVertical();
00986         else
00987           flipHorizontal();
00988       }
00989       break;
00990     default:
00991       e->ignore();
00992   }
00993 }

void EditingInterface::photoModified (  )  [signal]

Referenced by applyImageUpdate(), revertCurrentPhoto(), rotateFlip(), and showNextPrevFirstLastPhoto().

void EditingInterface::removeRedeye (  )  [private, slot]

Applies redeye removal.

Definition at line 694 of file editingInterface.cpp.

References applyImageUpdate(), bottomRight, findSelection(), Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, photo, StatusWidget::releaseInput(), removeRedeyeRegions(), and topLeft.

Referenced by EditingInterface().

00695 {
00696   //find selection, if empty bail!
00697   QPoint topLeft, bottomRight;
00698   if (!findSelection(topLeft, bottomRight) )
00699     return;
00700 
00701   //set busy cursor
00702   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00703   qApp->processEvents();
00704   
00705   //disable user input
00706   layout->getWindow()->getStatus()->grabInput();
00707 
00708   //remove redeye image
00709   applyImageUpdate( removeRedeyeRegions( photo->getImageFilename(), 
00710                                          topLeft, bottomRight,
00711                                          layout->getWindow()->getStatus() ),
00712                     true );
00713 
00714   //enable user input
00715   layout->getWindow()->getStatus()->releaseInput();
00716 
00717   //remove busy cursor
00718   qApp->restoreOverrideCursor();
00719   qApp->processEvents();
00720 }

void EditingInterface::returnAction (  )  [private, slot]

Exit editing interface.

Definition at line 908 of file editingInterface.cpp.

References layout, and LayoutWidget::organize().

Referenced by keyPressEvent().

00909 {
00910   //exit edit mode
00911   layout->organize();
00912 }

void EditingInterface::revertCurrentPhoto (  ) 

reverts current photo and updates display

Revert photo

Definition at line 1003 of file editingInterface.cpp.

References currentPhotoRevertable(), displayHeight, displayWidth, EFFECT_PREVIEW_HEIGHT, EFFECT_PREVIEW_WIDTH, effectPreviewImageFilename, SelectionInterface::getDisplaySize(), Photo::getImageFilename(), getImageSize(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), imageHeight, imageWidth, layout, Photo::originalImageFilename(), photo, photoModified(), StatusWidget::releaseInput(), Photo::revertPhoto(), scaleImage(), selectEffect(), selectionInterface, and SelectionInterface::setPhoto().

Referenced by LayoutWidget::revertPhotos().

01004 {
01005   //if current photo not revertable immediately bail
01006   if( ! currentPhotoRevertable() ) return;
01007   
01008   //set busy cursor
01009   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
01010   
01011   //disable user input
01012   layout->getWindow()->getStatus()->grabInput();
01013 
01014   //get current and reverted image sizes and compare to see if size has changed.
01015   //if so reset selected region
01016   int origWidth, origHeight;
01017   getImageSize( photo->originalImageFilename(), origWidth, origHeight );  
01018   bool resetSelection = (origWidth != imageWidth) || (origHeight != imageHeight);
01019   
01021   photo->revertPhoto();
01022 
01023   //Reload photo view
01024   selectionInterface->setPhoto( photo->getImageFilename(), resetSelection );  
01025   
01026   //update image dimension variables
01027   getImageSize( photo->getImageFilename(), imageWidth, imageHeight );  
01028   
01029   //get display size photo dimensions
01030   selectionInterface->getDisplaySize( displayWidth, displayHeight );
01031   
01032   //update effect preview
01033   scaleImage( photo->getImageFilename(), effectPreviewImageFilename, EFFECT_PREVIEW_WIDTH, EFFECT_PREVIEW_HEIGHT );
01034   selectEffect();  
01035   
01036   //emit modified signal
01037   emit photoModified();
01038 
01039   //enable user input
01040   layout->getWindow()->getStatus()->releaseInput();
01041 
01042   //remove busy cursor
01043   qApp->restoreOverrideCursor();
01044 }

void EditingInterface::rotateFlip ( TRANSFORM_CODE  rotationFlipType  )  [private]

Utility method for rotation + flip slots.

Definition at line 567 of file editingInterface.cpp.

References displayHeight, displayWidth, EFFECT_PREVIEW_HEIGHT, EFFECT_PREVIEW_WIDTH, effectPreviewImageFilename, SelectionInterface::getDisplaySize(), Photo::getImageFilename(), getImageSize(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), imageHeight, imageWidth, layout, photo, photoModified(), StatusWidget::releaseInput(), ROTATE_270, ROTATE_90, scaleImage(), selectAspectRatio(), selectEffect(), selectionInterface, selectionRotated, Photo::setImage(), SelectionInterface::setPhoto(), and transformImage().

Referenced by flipHorizontal(), flipVertical(), rotateLeft(), and rotateRight().

00568 {
00569   //set busy pointer
00570   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00571   qApp->processEvents();
00572   
00573   //disable user input
00574   layout->getWindow()->getStatus()->grabInput();
00575   
00576   //rotate image, bail if rotation fails
00577   QString editedImagePath = ((Window*)qApp->mainWidget())->getTitle()->getAlbum()->getTmpDir() + "/editedImage.jpg";
00578   transformImage( photo->getImageFilename(), editedImagePath, rotationFlipType );
00579 
00580   //apply changes to photo
00581   photo->setImage( editedImagePath );
00582   
00583   //Reload photo view
00584   bool aspectRatioChanged = ( rotationFlipType == ROTATE_90 || rotationFlipType == ROTATE_270 );  
00585   selectionInterface->setPhoto( editedImagePath, aspectRatioChanged );  
00586   
00587   //update image dimension variables
00588   getImageSize( photo->getImageFilename(), imageWidth, imageHeight );  
00589   
00590   //get display size photo dimensions
00591   selectionInterface->getDisplaySize( displayWidth, displayHeight );
00592   
00593   //reapply selected aspect ratio selection if aspect ratio changed
00594   if( aspectRatioChanged )
00595   {
00596     //reset selectionRotated bool to false
00597     selectionRotated = false;
00598     selectAspectRatio();      
00599   }
00600   
00601   //update effect preview
00602   scaleImage( photo->getImageFilename(), effectPreviewImageFilename, EFFECT_PREVIEW_WIDTH, EFFECT_PREVIEW_HEIGHT );
00603   selectEffect();
00604   
00605   //emit modified signal
00606   emit photoModified();
00607   
00608   //enable user input
00609   layout->getWindow()->getStatus()->releaseInput();
00610 
00611   //remove busy cursor
00612   qApp->restoreOverrideCursor();
00613   qApp->processEvents();
00614 }

void EditingInterface::rotateLeft (  )  [private, slot]

Rotate image left 90 degrees.

Definition at line 552 of file editingInterface.cpp.

References ROTATE_270, and rotateFlip().

Referenced by EditingInterface(), and keyPressEvent().

00553 {
00554   rotateFlip( ROTATE_270 );
00555 }

void EditingInterface::rotateRight (  )  [private, slot]

Rotate image right 90 degrees.

Definition at line 547 of file editingInterface.cpp.

References ROTATE_90, and rotateFlip().

Referenced by EditingInterface(), and keyPressEvent().

00548 {
00549   rotateFlip( ROTATE_90 );
00550 }

void EditingInterface::rotateSelection (  )  [private, slot]

Rotate current selection.

Definition at line 1052 of file editingInterface.cpp.

References aspectRatios, bottomRight, calcScaledImageDimensions(), SelectionInterface::getSelection(), imageHeight, imageWidth, selectAspectRatio(), selectionInterface, selectionRotated, SelectionInterface::setSelection(), and topLeft.

Referenced by EditingInterface().

01053 {
01054   //invert rotate bool
01055   selectionRotated = !selectionRotated;
01056   
01057   //rotate custom selection in place, scale/shift if necessary to keep on image
01058   if(aspectRatios->currentItem() == 0)
01059   {
01060     //get cur selection
01061     QPoint curTopLeft, curBottomRight;
01062     selectionInterface->getSelection(curTopLeft, curBottomRight); 
01063 
01064     //find center
01065     QPoint selectionCenter = QPoint( ( curTopLeft.x() + curBottomRight.x() ) / 2,
01066                                      ( curTopLeft.y() + curBottomRight.y() ) / 2 );    
01067 
01068     //scale rotated width/height to fit image
01069     int newWidth = curBottomRight.y() - curTopLeft.y() + 1;
01070     int newHeight =curBottomRight.x() - curTopLeft.x() + 1;
01071     calcScaledImageDimensions( newWidth, newHeight,
01072                                imageWidth, imageHeight,
01073                                newWidth, newHeight );
01074 
01075     //center new selection over old selection
01076     QPoint topLeft = QPoint( selectionCenter.x() - newWidth/2,
01077                              selectionCenter.y() - newHeight/2 );
01078     QPoint bottomRight = QPoint( topLeft.x() + newWidth - 1,
01079                                  topLeft.y() + newHeight - 1 );
01080 
01081     //shift selection area to not go outside image boundary
01082     if(topLeft.x() < 0)
01083     {
01084       bottomRight.setX( bottomRight.x() - topLeft.x() );
01085       topLeft.setX( 0 );
01086     }
01087 
01088     if(topLeft.y() < 0)
01089     {
01090       bottomRight.setY( bottomRight.y() - topLeft.y() );
01091       topLeft.setY( 0 );
01092     }
01093     
01094     if(bottomRight.x() >= imageWidth )
01095     {
01096       topLeft.setX( topLeft.x() - ( bottomRight.x() - imageWidth + 1 ) );
01097       bottomRight.setX( imageWidth - 1 );
01098     }
01099 
01100     if(bottomRight.y() >= imageHeight )
01101     {
01102       topLeft.setY( topLeft.y() - ( bottomRight.y() - imageHeight + 1 ) );
01103       bottomRight.setY( imageHeight - 1 );
01104     }
01105     
01106     //select new region
01107     selectionInterface->setSelection(topLeft, bottomRight);    
01108   }
01109   //else call selectAspectRatio passing true that we're
01110   //using the rotated version of the current aspect ratio
01111   else
01112   { 
01113     selectAspectRatio(); 
01114   }
01115 }

void EditingInterface::screenResolutionChanged (  )  [private, slot]

Update recorded screen resolution and selection if necessary.

Definition at line 616 of file editingInterface.cpp.

References aspectRatios, aspectRatioValues, displayResolutionIndex, and selectAspectRatio().

Referenced by EditingInterface().

00617 {
00618   //reset display resolution
00619   aspectRatioValues[displayResolutionIndex] = qApp->desktop()->screenGeometry().size();
00620 
00621   //if user is currently constraining the current selection then reset to fit new display resolution
00622   if(aspectRatios->currentItem() == displayResolutionIndex )
00623   { selectAspectRatio(); }
00624 }

void EditingInterface::selectAll ( QPoint &  topLeft,
QPoint &  bottomRight 
) [private]

Return coordinates that select entire image.

Definition at line 944 of file editingInterface.cpp.

References imageHeight, and imageWidth.

00945 {
00946   topLeft.setX(0); 
00947   topLeft.setY(0);
00948   bottomRight.setX(imageWidth - 1); 
00949   bottomRight.setY(imageHeight - 1);     
00950 }

void EditingInterface::selectAspectRatio (  )  [private, slot]

Aspect ratio selection changed.

Definition at line 1117 of file editingInterface.cpp.

References aspectRatios, aspectRatioValues, calcScaledImageDimensions(), displayResolutionIndex, SelectionInterface::getSelection(), imageHeight, imageWidth, maxDimensions, selectionInterface, selectionRotated, and SelectionInterface::setSelection().

Referenced by EditingInterface(), rotateFlip(), rotateSelection(), screenResolutionChanged(), and showNextPrevFirstLastPhoto().

01118 {
01119   //if user selected "custom" don't modify current selection
01120   if( aspectRatios->currentItem() == 0 ) return;
01121   
01122   //get default aspect ratio
01123   QSize aspectRatio = aspectRatioValues[ aspectRatios->currentItem() ];  
01124 
01125   //automatically rotate default if current photo is taller than wide
01126   if( imageHeight > imageWidth )
01127   { aspectRatio = QSize( aspectRatio.height(), aspectRatio.width() ); }
01128   
01129   //exchange aspect ratio dimensions if we're in rotated selection mode
01130   if( selectionRotated )
01131   { aspectRatio = QSize( aspectRatio.height(), aspectRatio.width() ); }
01132     
01133   //determine selected width and height;
01134   int selectedWidth = 0; 
01135   int selectedHeight = 0;
01136   
01137   //display resolution, match exactly or scale down
01138   if(aspectRatios->currentItem() == displayResolutionIndex)
01139   {    
01140     //select region less than or equal to display resolution while maintaining aspect ratio
01141     selectedWidth = aspectRatio.width();
01142     selectedHeight = aspectRatio.height();
01143     calcScaledImageDimensions( selectedWidth, selectedHeight,
01144                                imageWidth, imageHeight,
01145                                selectedWidth, selectedHeight );
01146   }
01147   //else use aspect ratio directly as a ratio
01148   else
01149   {  
01150     //select region using same aspect ratio
01151     selectedWidth = imageWidth;
01152     selectedHeight = (int) (((double) (imageWidth * aspectRatio.height()) ) / aspectRatio.width() );
01153     calcScaledImageDimensions( selectedWidth, selectedHeight,
01154                                imageWidth, imageHeight,
01155                                selectedWidth, selectedHeight );
01156     
01157   }
01158   
01159   //get current selection boundary
01160   QPoint curTopLeft, curBottomRight;
01161   selectionInterface->getSelection( curTopLeft, curBottomRight );
01162   
01163   //get current selection center
01164   QPoint curCenter;
01165   curCenter.setX( (curTopLeft.x() + curBottomRight.x()) / 2 );
01166   curCenter.setY( (curTopLeft.y() + curBottomRight.y()) / 2 );
01167 
01168   //if center is off image (no previous selection) then
01169   //fix center to center of image
01170   if( curCenter.x() < 0 || curCenter.y() < 0 )
01171   {
01172     curCenter.setX( imageWidth/2 );
01173     curCenter.setY( imageHeight/2 );
01174   }
01175   
01176   //attempt to center new selection overold selection, only
01177   //offset if necessary
01178   QPoint newTopLeft, newBottomRight;
01179 
01180   newTopLeft.setX( curCenter.x() - selectedWidth/2 );
01181   newTopLeft.setY( curCenter.y() - selectedHeight/2 );
01182 
01183   //push right/down if necessary
01184   if( newTopLeft.x() < 0 ) newTopLeft.setX( 0 );
01185   if( newTopLeft.y() < 0 ) newTopLeft.setY( 0 );
01186   
01187   //push left/up if necessary
01188   newBottomRight.setX( newTopLeft.x() + selectedWidth - 1 );
01189   if( newBottomRight.x() >= imageWidth )
01190   {
01191     newBottomRight.setX( imageWidth-1 );
01192     newTopLeft.setX( newBottomRight.x() - selectedWidth + 1 );
01193   }
01194   
01195   newBottomRight.setY( newTopLeft.y() + selectedHeight - 1 );
01196   if( newBottomRight.y() >= imageHeight )
01197   {
01198     newBottomRight.setY( imageHeight-1 );
01199     newTopLeft.setY( newBottomRight.y() - selectedHeight + 1 );
01200   }
01201 
01202   //select region
01203   selectionInterface->setSelection(newTopLeft, newBottomRight,
01204                                    maxDimensions[aspectRatios->currentItem()] );    
01205 } 

void EditingInterface::selectEffect (  )  [private, slot]

Effect seletion changed.

Definition at line 774 of file editingInterface.cpp.

References applyEffect(), editedImage, effectPreview, and effectPreviewImageFilename.

Referenced by applyImageUpdate(), EditingInterface(), revertCurrentPhoto(), rotateFlip(), setPhoto(), and showNextPrevFirstLastPhoto().

00775 {  
00776   //apply effect on preview image
00777   QImage* editedImage = applyEffect( effectPreviewImageFilename );
00778   
00779   //bail if generated preview image failed
00780   if( editedImage == NULL ) return;
00781   
00782   //refresh displayed preview image
00783   effectPreview->setPixmap( QPixmap(*editedImage) );
00784   delete editedImage;
00785   editedImage = NULL;  
00786 }

void EditingInterface::setFocus (  )  [slot]

Definition at line 1046 of file editingInterface.cpp.

References selectionInterface.

Referenced by LayoutWidget::tabChanged().

01047 {
01048   //always pass off focus even to selection interface so it can get key strokes
01049   selectionInterface->setFocus();
01050 }

void EditingInterface::setPhoto ( Subalbum collection,
Photo photo 
)

Sets the photo pointer and constructs scaled qimage's for painting.

Definition at line 432 of file editingInterface.cpp.

References aspectRatios, collection, cropButton, displayHeight, displayWidth, EFFECT_PREVIEW_HEIGHT, EFFECT_PREVIEW_WIDTH, effectPreviewImageFilename, effectsList, SelectionInterface::getDisplaySize(), Photo::getImageFilename(), getImageSize(), Photo::getNext(), Photo::getPrev(), imageHeight, imageWidth, nextButton, photo, previousButton, redEyeReductionButton, scaleImage(), selectEffect(), selectionInterface, selectionRotated, ClickableLabel::setEnabled(), ClickableLabel::setInvisible(), and SelectionInterface::setPhoto().

Referenced by LayoutWidget::tabChanged().

00433 {
00434   //store photo and collection object handles
00435   this->collection = collection;
00436   this->photo = photo;
00437 
00438   //update visibility of prev and next buttons
00439   previousButton->setInvisible( photo->getPrev() == NULL );
00440   nextButton->setInvisible( photo->getNext() == NULL );
00441   
00442   //reset combo menu's back to first entries
00443   aspectRatios->setCurrentItem(0);
00444   effectsList->setCurrentItem(0);
00445 
00446   //reset selectionRotated bool to false
00447   selectionRotated = false;
00448   
00449   //update view of photo
00450   selectionInterface->setPhoto( photo->getImageFilename() );  
00451  
00452   //created effect preview image  
00453   effectPreviewImageFilename = ((Window*)qApp->mainWidget())->getTitle()->getAlbum()->getTmpDir() + 
00454                                "/effectPreviewImage.jpg";
00455   scaleImage( photo->getImageFilename(), effectPreviewImageFilename, EFFECT_PREVIEW_WIDTH, EFFECT_PREVIEW_HEIGHT );
00456   selectEffect();
00457   
00458   //get full size photo dimensions
00459   getImageSize( photo->getImageFilename(), imageWidth, imageHeight );
00460   
00461   //get display size photo dimensions
00462   selectionInterface->getDisplaySize( displayWidth, displayHeight );
00463 
00464   //disable the crop and reset buttons
00465   cropButton->setEnabled( false );
00466   redEyeReductionButton->setEnabled( false );  
00467 }

void EditingInterface::showFirstPhoto (  )  [private, slot]

Show first photo.

Definition at line 487 of file editingInterface.cpp.

References collection, Subalbum::getFirst(), photo, and showNextPrevFirstLastPhoto().

Referenced by keyPressEvent().

00488 { 
00489   Photo* firstPhoto = collection->getFirst();
00490 
00491   if(firstPhoto != photo)
00492   { showNextPrevFirstLastPhoto( firstPhoto ); }
00493 }

void EditingInterface::showLastPhoto (  )  [private, slot]

Show last photo.

Definition at line 495 of file editingInterface.cpp.

References collection, Subalbum::getLast(), photo, and showNextPrevFirstLastPhoto().

Referenced by keyPressEvent().

00496 { 
00497   Photo* lastPhoto = collection->getLast();
00498   
00499   if(lastPhoto != photo)
00500   { showNextPrevFirstLastPhoto( lastPhoto ); }
00501 }

void EditingInterface::showNextPhoto (  )  [private, slot]

Show next photo.

Definition at line 478 of file editingInterface.cpp.

References Photo::getNext(), photo, and showNextPrevFirstLastPhoto().

Referenced by EditingInterface(), and keyPressEvent().

00479 { 
00480   Photo* nextPhoto = photo->getNext();
00481 
00482   if( nextPhoto != NULL &&
00483       nextPhoto != photo )
00484   { showNextPrevFirstLastPhoto( nextPhoto ); }
00485 }  

void EditingInterface::showNextPrevFirstLastPhoto ( Photo newPhoto  )  [private]

Utility method for show prev/next photos.

Definition at line 503 of file editingInterface.cpp.

References aspectRatios, displayHeight, displayWidth, EFFECT_PREVIEW_HEIGHT, EFFECT_PREVIEW_WIDTH, effectPreviewImageFilename, SelectionInterface::getDisplaySize(), Photo::getImageFilename(), getImageSize(), Photo::getNext(), Photo::getPrev(), imageHeight, imageWidth, nextButton, photo, photoModified(), previousButton, scaleImage(), selectAspectRatio(), selectEffect(), selectionInterface, selectionRotated, ClickableLabel::setInvisible(), SelectionInterface::setPhoto(), and SelectionInterface::setSelection().

Referenced by showFirstPhoto(), showLastPhoto(), showNextPhoto(), and showPrevPhoto().

00504 {  
00505   //set busy pointer
00506   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00507   qApp->processEvents();
00508 
00509   //reset photo object handle
00510   photo = newPhoto;
00511 
00512   //reset selectionRotated bool to false
00513   selectionRotated = false;
00514   
00515   //update visibility of prev and next buttons
00516   previousButton->setInvisible( photo->getPrev() == NULL );
00517   nextButton->setInvisible( photo->getNext() == NULL );
00518     
00519   //update view of photo
00520   selectionInterface->setPhoto( photo->getImageFilename() );  
00521 
00522   //created effect preview image  
00523   effectPreviewImageFilename = ((Window*)qApp->mainWidget())->getTitle()->getAlbum()->getTmpDir() +     "/effectPreviewImage.jpg";
00524   scaleImage( photo->getImageFilename(), effectPreviewImageFilename, EFFECT_PREVIEW_WIDTH, EFFECT_PREVIEW_HEIGHT );
00525   selectEffect();
00526 
00527   //get full size photo dimensions
00528   getImageSize( photo->getImageFilename(), imageWidth, imageHeight );
00529 
00530   //get display size photo dimensions
00531   selectionInterface->getDisplaySize( displayWidth, displayHeight );
00532 
00533   //auto select region if custom not selected, else select nothing
00534   if(aspectRatios->currentItem() != 0)
00535   { selectAspectRatio(); }
00536   else  
00537   { selectionInterface->setSelection( QPoint(-1,-1), QPoint(-1, -1) ); }
00538   
00539   //emit signal that photo state possibly has changed
00540   emit photoModified();
00541   
00542   //remove busy cursor
00543   qApp->restoreOverrideCursor();
00544   qApp->processEvents();
00545 }

void EditingInterface::showPrevPhoto (  )  [private, slot]

Show prev photo.

Definition at line 469 of file editingInterface.cpp.

References Photo::getPrev(), photo, and showNextPrevFirstLastPhoto().

Referenced by EditingInterface(), and keyPressEvent().

00470 { 
00471   Photo* prevPhoto = photo->getPrev();
00472 
00473   if( prevPhoto != NULL && 
00474       prevPhoto != photo )
00475   { showNextPrevFirstLastPhoto( prevPhoto ); }
00476 }

void EditingInterface::startCorrectTilt (  )  [private, slot]

Enter correct image tilt mode.

Definition at line 1207 of file editingInterface.cpp.

References correctTiltButton, SelectionInterface::enterDrawLineMode(), and selectionInterface.

Referenced by EditingInterface().

01208 {
01209   //instruct user to select a horizontal or vertical line in the image by
01210   //beginning draw line mode in the selection interface
01211   correctTiltButton->setEnabled( false );
01212   selectionInterface->enterDrawLineMode();
01213 }

void EditingInterface::tuneLevels (  )  [private, slot]

Opens levels editor for manual histogram and brightness/contrast adjustments.

Definition at line 722 of file editingInterface.cpp.

References applyImageUpdate(), Photo::getImageFilename(), Window::getStatus(), LayoutWidget::getWindow(), StatusWidget::grabInput(), layout, photo, and StatusWidget::releaseInput().

Referenced by EditingInterface().

00723 {
00724   //load photo in histogram editor
00725   //if changes took place update image
00726   HistogramEditor editor( photo->getImageFilename(), this);
00727   if( editor.exec() ) 
00728   { 
00729     //set busy cursor
00730     qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00731     qApp->processEvents();
00732 
00733     //disable user input
00734     layout->getWindow()->getStatus()->grabInput();
00735 
00736     //update image    
00737     applyImageUpdate( editor.getModifiedImage(), false ); 
00738 
00739     //enable user input
00740     layout->getWindow()->getStatus()->releaseInput();
00741 
00742     //remove busy cursor
00743     qApp->restoreOverrideCursor();
00744     qApp->processEvents();
00745   }
00746 }


Member Data Documentation

QPushButton* EditingInterface::applyEffectButton [private]

The apply effect button is disabled when no effect has been chosen.

Definition at line 208 of file editingInterface.h.

Referenced by applyEffect(), and EditingInterface().

QComboBox* EditingInterface::aspectRatios [private]

Widget for selection aspect ratio to crop to.

Definition at line 180 of file editingInterface.h.

Referenced by EditingInterface(), handleAspectRatioChanged(), rotateSelection(), screenResolutionChanged(), selectAspectRatio(), setPhoto(), and showNextPrevFirstLastPhoto().

QSize* EditingInterface::aspectRatioValues [private]

array of common aspect ratios to crop to

Definition at line 189 of file editingInterface.h.

Referenced by EditingInterface(), screenResolutionChanged(), and selectAspectRatio().

Subalbum* EditingInterface::collection [private]

========== Pointer to backend collection

Definition at line 214 of file editingInterface.h.

Referenced by setPhoto(), showFirstPhoto(), and showLastPhoto().

QToolButton* EditingInterface::correctTiltButton [private]

The start tilt button is disabled while a line is being selected.

Definition at line 196 of file editingInterface.h.

Referenced by EditingInterface(), finishCorrectTilt(), and startCorrectTilt().

QToolButton* EditingInterface::cropButton [private]

The crop buttons is disabled when no seletion is present.

Definition at line 199 of file editingInterface.h.

Referenced by EditingInterface(), handleSelectionChanged(), and setPhoto().

int EditingInterface::displayHeight [private]

Definition at line 226 of file editingInterface.h.

Referenced by applyImageUpdate(), revertCurrentPhoto(), rotateFlip(), setPhoto(), and showNextPrevFirstLastPhoto().

int EditingInterface::displayResolutionIndex [private]

Index for screen resolution, needed if this value pair changes during program executing.

Definition at line 186 of file editingInterface.h.

Referenced by EditingInterface(), screenResolutionChanged(), and selectAspectRatio().

int EditingInterface::displayWidth [private]

Dimension of photo in display coordinates.

Definition at line 226 of file editingInterface.h.

Referenced by applyImageUpdate(), revertCurrentPhoto(), rotateFlip(), setPhoto(), and showNextPrevFirstLastPhoto().

QLabel* EditingInterface::effectPreview [private]

Label that shows preview of effect.

Definition at line 211 of file editingInterface.h.

Referenced by EditingInterface(), and selectEffect().

QString EditingInterface::effectPreviewImageFilename [private]

Path to scaled down version of image for fast generation of previews of effects.

Definition at line 220 of file editingInterface.h.

Referenced by applyImageUpdate(), revertCurrentPhoto(), rotateFlip(), selectEffect(), setPhoto(), and showNextPrevFirstLastPhoto().

QComboBox* EditingInterface::effectsList [private]

List of effects that can be applied to photos.

Definition at line 205 of file editingInterface.h.

Referenced by applyEffect(), EditingInterface(), and setPhoto().

int EditingInterface::imageHeight [private]

Definition at line 229 of file editingInterface.h.

Referenced by applyImageUpdate(), revertCurrentPhoto(), rotateFlip(), rotateSelection(), selectAll(), selectAspectRatio(), setPhoto(), and showNextPrevFirstLastPhoto().

int EditingInterface::imageWidth [private]

Dimension of photo in image coordinates.

Definition at line 229 of file editingInterface.h.

Referenced by applyImageUpdate(), revertCurrentPhoto(), rotateFlip(), rotateSelection(), selectAll(), selectAspectRatio(), setPhoto(), and showNextPrevFirstLastPhoto().

LayoutWidget* EditingInterface::layout [private]

Pointer to the parent layout widget.

Definition at line 223 of file editingInterface.h.

Referenced by adjustGrain(), applyEffect(), colorBalance(), crop(), EditingInterface(), enhanceContrast(), finishCorrectTilt(), removeRedeye(), returnAction(), revertCurrentPhoto(), rotateFlip(), and tuneLevels().

double* EditingInterface::maxDimensions [private]

Definition at line 190 of file editingInterface.h.

Referenced by EditingInterface(), and selectAspectRatio().

ClickableLabel * EditingInterface::nextButton [private]

Definition at line 173 of file editingInterface.h.

Referenced by EditingInterface(), setPhoto(), and showNextPrevFirstLastPhoto().

QComboBox* EditingInterface::orientations [private]

Definition at line 183 of file editingInterface.h.

Photo* EditingInterface::photo [private]

Pointer to backend photo.

Definition at line 217 of file editingInterface.h.

Referenced by adjustGrain(), applyEffect(), applyImageUpdate(), colorBalance(), crop(), currentPhotoRevertable(), EditingInterface(), enhanceContrast(), finishCorrectTilt(), getPhoto(), removeRedeye(), revertCurrentPhoto(), rotateFlip(), setPhoto(), showFirstPhoto(), showLastPhoto(), showNextPhoto(), showNextPrevFirstLastPhoto(), showPrevPhoto(), and tuneLevels().

ClickableLabel* EditingInterface::previousButton [private]

------------ Buttons for changing the shown image

Definition at line 173 of file editingInterface.h.

Referenced by EditingInterface(), setPhoto(), and showNextPrevFirstLastPhoto().

ClickableLabel* EditingInterface::redEyeReductionButton [private]

The red eye reduction button is disabled when no selection is present.

Definition at line 202 of file editingInterface.h.

Referenced by EditingInterface(), handleSelectionChanged(), and setPhoto().

SelectionInterface* EditingInterface::selectionInterface [private]

This widget scales and displays the photo to fit the available screen space, and provides extensive support for selecting regions of the photo for editing/cropping.

Definition at line 177 of file editingInterface.h.

Referenced by applyImageUpdate(), EditingInterface(), findSelection(), revertCurrentPhoto(), rotateFlip(), rotateSelection(), selectAspectRatio(), setFocus(), setPhoto(), showNextPrevFirstLastPhoto(), and startCorrectTilt().

bool EditingInterface::selectionRotated [private]

state variable indicating if the user wants to use a rotate aspect ratio

Definition at line 193 of file editingInterface.h.

Referenced by applyImageUpdate(), rotateFlip(), rotateSelection(), selectAspectRatio(), setPhoto(), and showNextPrevFirstLastPhoto().


The documentation for this class was generated from the following files:
Generated on Wed Nov 8 16:37:18 2006 for AlbumShaper by  doxygen 1.4.7