00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qlayout.h>
00013 #include <qlabel.h>
00014 #include <qcombobox.h>
00015 #include <qpushbutton.h>
00016 #include <qframe.h>
00017 #include <qslider.h>
00018 #include <qtooltip.h>
00019 #include <qsizegrip.h>
00020
00021
00022 #include "grainEditor.h"
00023 #include "panningPreviewInterface.h"
00024 #include "selectionPlacementInterface.h"
00025 #include "../blurSharpenSlider.h"
00026 #include "../clickableLabel.h"
00027 #include "../../config.h"
00028 #include "../../backend/manipulations/blur.h"
00029 #include "../../backend/manipulations/sharpen.h"
00030 #include "../../backend/manipulations/edgeDetect.h"
00031 #include "../../backend/tools/imageTools.h"
00032
00033 #define SLIDER_RADIUS 50
00034
00035
00036 GrainEditor::GrainEditor( QString fileName, QWidget *parent, const char* name ) : QDialog(parent,name,true)
00037 {
00038
00039 this->fileName = fileName;
00040
00041
00042 getImageSize( fileName, origImageSize );
00043
00044
00045
00046 scaleImage( fileName, edgesImage, 512, 384 );
00047 EdgeDetect detector( &edgesImage );
00048 clusterMap = detector.getClusterMap();
00049 numRegions = detector.getNumClusters();
00050
00051 QFrame* visibleFrame = new QFrame( this, "visible widgets" );
00052
00053
00054 previewInterface = new PanningPreviewInterface( fileName,
00055 visibleFrame, "previewInterface" );
00056 previewSelection = new QComboBox( visibleFrame, "previewSelction" );
00057 previewSelection->insertItem( tr("Split View") );
00058 previewSelection->insertItem( tr("Original Image") );
00059 previewSelection->insertItem( tr("Adjusted Image") );
00060 connect( previewSelection, SIGNAL(activated(int)), this, SLOT(selectPreviewImageType(int)) );
00061
00062
00063 QFrame* controlsFrame = new QFrame( visibleFrame, "controlsFrame" );
00064
00065 QLabel* selectionLabel = new QLabel( tr("Region Shown in Detail:"),
00066 controlsFrame, "selectionLabel" );
00067
00068 selectionPlacementInterface = new SelectionPlacementInterface( fileName,
00069 controlsFrame,
00070 "selectionPlacementInterface" );
00071
00072 connect( previewInterface, SIGNAL( selectionChanged() ),
00073 this, SLOT( previewResized() ) );
00074 connect( selectionPlacementInterface, SIGNAL(placementChanged(QRect)),
00075 previewInterface, SLOT(setSelection(QRect)) );
00076
00077 boundariesSlider = new BlurSharpenSlider( Qt::Vertical, controlsFrame );
00078 boundariesSlider->setMinValue( -SLIDER_RADIUS );
00079 boundariesSlider->setMaxValue( SLIDER_RADIUS );
00080 connect( boundariesSlider, SIGNAL(valueChanged(int)),
00081 this, SLOT(generateAdjustedPreviewImage()) );
00082
00083 boundariesIcon = new ClickableLabel( controlsFrame, "boundariesIcon" );
00084 connect( boundariesIcon, SIGNAL(clicked()), SLOT(resetBoundaries()) );
00085
00086
00087
00088
00089 boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/blurSharpen.png") );
00090 QToolTip::add( boundariesSlider, tr("Blur/Sharpen Image") );
00091 QToolTip::add( boundariesIcon, tr("Reset") );
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 QGridLayout* controlsGrid = new QGridLayout( controlsFrame, 6, 4, 0 );
00108 controlsGrid->setRowStretch( 0, 1 );
00109
00110 controlsGrid->addMultiCellWidget( selectionLabel, 1,1, 0,3 );
00111 controlsGrid->addMultiCellWidget( selectionPlacementInterface, 2,2, 0,3 );
00112
00113 controlsGrid->addWidget( boundariesSlider, 3, 1 );
00114 controlsGrid->addWidget( boundariesIcon, 4, 1 );
00115
00116
00117
00118
00119
00120 controlsGrid->setRowSpacing( 3, 2*SLIDER_RADIUS + 5) ;
00121
00122 controlsGrid->setRowStretch( 5, 1 );
00123 controlsGrid->setSpacing( WIDGET_SPACING );
00124
00125 controlsGrid->setColStretch( 0, 1 );
00126 controlsGrid->setColStretch( 3, 1 );
00127
00128
00129 buttonsFrame = new QFrame( visibleFrame, "dialogButtons" );
00130
00131 QPushButton* applyButton = new QPushButton( tr("Apply"), buttonsFrame );
00132 applyButton->setDefault(true);
00133 applyButton->setFocus();
00134 connect( applyButton, SIGNAL(clicked()), SLOT(applyAction()) );
00135
00136 QPushButton* cancelButton = new QPushButton( tr("Cancel"), buttonsFrame );
00137 connect( cancelButton, SIGNAL(clicked()), SLOT(reject()) );
00138
00139 QPushButton* resetButton = new QPushButton( tr("Reset"), buttonsFrame );
00140 connect( resetButton, SIGNAL(clicked()), SLOT(resetAction()) );
00141
00142 QGridLayout* buttonsGrid = new QGridLayout( buttonsFrame, 1, 5, 0 );
00143 buttonsGrid->setColStretch( 0, 1 );
00144 buttonsGrid->addWidget( applyButton, 0, 1 );
00145 buttonsGrid->addWidget( cancelButton, 0, 2 );
00146 buttonsGrid->addWidget( resetButton, 0, 3 );
00147 buttonsGrid->setColStretch( 4, 1 );
00148 buttonsGrid->setSpacing( WIDGET_SPACING );
00149
00150
00151 QGridLayout* mainGrid = new QGridLayout( visibleFrame, 3, 2, 0 );
00152
00153 mainGrid->addWidget( previewInterface, 0,0 );
00154 mainGrid->addWidget( previewSelection, 1,0, Qt::AlignHCenter );
00155
00156 mainGrid->addMultiCellWidget( controlsFrame, 0,1, 1,1 );
00157
00158 mainGrid->addMultiCellWidget( buttonsFrame, 2,2, 0,1 );
00159
00160 mainGrid->setRowStretch( 0, 1 );
00161 mainGrid->setColStretch( 0, 1 );
00162
00163 mainGrid->setSpacing( WIDGET_SPACING );
00164 mainGrid->setMargin( WIDGET_SPACING );
00165
00166
00167 QGridLayout* invisibleGrid = new QGridLayout( this, 2, 1, 0 );
00168 invisibleGrid->addWidget( visibleFrame, 0, 0 );
00169 invisibleGrid->setRowStretch( 0, 1 );
00170
00171
00172
00173
00174 #if defined(Q_OS_WIN)
00175 QSizeGrip* sizeGrip = new QSizeGrip( this );
00176 invisibleGrid->addWidget( sizeGrip, 1, 0, Qt::AlignRight | Qt::AlignBottom );
00177 #endif
00178
00179
00180
00181
00182
00183
00184 setCaption( tr("Album Shaper: Grain Editor") );
00185
00186 }
00187
00188 GrainEditor::~GrainEditor() { }
00189
00190 void GrainEditor::applyAction()
00191 {
00192
00193
00194
00195 if( boundariesSlider->value() != 0 )
00196
00197
00198 { accept(); }
00199 else
00200 { reject(); }
00201 }
00202
00203 void GrainEditor::resetBoundaries()
00204 {
00205 boundariesSlider->setValue( 0 );
00206 }
00207
00208 void GrainEditor::resetRegions()
00209 {
00210
00211 }
00212
00213 void GrainEditor::resetAction()
00214 {
00215 boundariesSlider->setValue( 0 );
00216
00217 }
00218
00219 QImage* GrainEditor::getModifiedImage()
00220 {
00221 QImage* adjustedImage = new QImage(fileName);
00222 adjustImage( *adjustedImage, QPoint(0,0) );
00223 return adjustedImage;
00224 }
00225
00226 void GrainEditor::selectPreviewImageType( int selection )
00227 {
00228 previewInterface->setPreviewMode( (PREVIEW_MODE)selection );
00229 }
00230
00231 void GrainEditor::previewResized()
00232 {
00233
00234 selectionPlacementInterface->setSelectedRegion( previewInterface->getSelection() );
00235
00236
00237 generateAdjustedPreviewImage();
00238 }
00239
00240 void GrainEditor::generateAdjustedPreviewImage()
00241 {
00242
00243 QImage origImage = previewInterface->getOrigImage();
00244
00245
00246 QImage adjustedImage = origImage.copy();
00247 adjustImage( adjustedImage, previewInterface->getSelection().topLeft() );
00248
00249
00250 previewInterface->setAdjustedImage( adjustedImage );
00251 }
00252
00253 void GrainEditor::adjustImage( QImage& image, QPoint offset )
00254 {
00255
00256 if( boundariesSlider->value() == 0 )
00257
00258 { return; }
00259
00260
00261 float boundariesSigma;
00262 if( boundariesSlider->value() < 0 )
00263 boundariesSigma = (80.0f * QABS(boundariesSlider->value()) ) / 255.0f;
00264 else
00265 boundariesSigma = (25.5f * QABS(boundariesSlider->value()) ) / 255.0f;
00266
00267
00268
00269
00270 if ( boundariesSlider->value() < 0 )
00271 {
00272 sharpenImage( image, boundariesSigma,
00273 offset, origImageSize,
00274 &edgesImage, true );
00275 }
00276
00277 else if( boundariesSlider->value() > 0 )
00278 {
00279 blurImage( image, boundariesSigma );
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 }
00315
00316 void GrainEditor::keyPressEvent(QKeyEvent *e)
00317 {
00318 if(e->key() == Qt::Key_Control )
00319 {
00320 PREVIEW_MODE curMode = (PREVIEW_MODE) previewSelection->currentItem();
00321 if(curMode == ORIGINAL_IMAGE)
00322 previewInterface->setPreviewMode( ADJUSTED_IMAGE, true );
00323 else if(curMode == ADJUSTED_IMAGE)
00324 previewInterface->setPreviewMode( ORIGINAL_IMAGE, true );
00325 else
00326 previewInterface->setPreviewMode( INV_SPLIT_VIEW );
00327 }
00328 else { QDialog::keyPressEvent(e); }
00329 }
00330
00331 void GrainEditor::keyReleaseEvent(QKeyEvent *e)
00332 {
00333 if(e->key() == Qt::Key_Control )
00334 {
00335 previewInterface->setPreviewMode( (PREVIEW_MODE) previewSelection->currentItem(),
00336 false );
00337 }
00338 else { QDialog::keyReleaseEvent(e); }
00339 }
00340
00341
00342
00343