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(
"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
00223
00224
if( adjustedImage->depth() < 32 )
00225 {
00226 QImage* tmp = adjustedImage;
00227 adjustedImage =
new QImage( tmp->convertDepth( 32, Qt::AutoColor ) );
00228
delete tmp; tmp=NULL;
00229 }
00230
00231
adjustImage( *adjustedImage, QPoint(0,0) );
00232
return adjustedImage;
00233 }
00234
00235 void GrainEditor::selectPreviewImageType(
int selection )
00236 {
00237
previewInterface->
setPreviewMode( (
PREVIEW_MODE)selection );
00238 }
00239
00240 void GrainEditor::previewResized()
00241 {
00242
00243
selectionPlacementInterface->
setSelectedRegion(
previewInterface->
getSelection() );
00244
00245
00246
generateAdjustedPreviewImage();
00247 }
00248
00249 void GrainEditor::generateAdjustedPreviewImage()
00250 {
00251
00252 QImage origImage =
previewInterface->
getOrigImage();
00253
00254
00255 QImage adjustedImage = origImage.copy();
00256
adjustImage( adjustedImage,
previewInterface->
getSelection().topLeft() );
00257
00258
00259
previewInterface->
setAdjustedImage( adjustedImage );
00260 }
00261
00262 void GrainEditor::adjustImage( QImage& image, QPoint offset )
00263 {
00264
00265
if(
boundariesSlider->value() == 0 )
00266
00267 {
return; }
00268
00269
00270
float boundariesSigma;
00271
if(
boundariesSlider->value() < 0 )
00272 boundariesSigma = (80.0f * QABS(
boundariesSlider->value()) ) / 255.0f;
00273
else
00274 boundariesSigma = (25.5f * QABS(
boundariesSlider->value()) ) / 255.0f;
00275
00276
00277
00278
00279
if (
boundariesSlider->value() < 0 )
00280 {
00281
sharpenImage( image, boundariesSigma,
00282 offset,
origImageSize,
00283 &
edgesImage,
true );
00284 }
00285
00286
else if(
boundariesSlider->value() > 0 )
00287 {
00288
blurImage( image, boundariesSigma );
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
00317
00318
00319
00320
00321
00322
00323 }
00324
00325 void GrainEditor::keyPressEvent(QKeyEvent *e)
00326 {
00327
if(e->key() == Qt::Key_Control )
00328 {
00329
PREVIEW_MODE curMode = (
PREVIEW_MODE)
previewSelection->currentItem();
00330
if(curMode ==
ORIGINAL_IMAGE)
00331
previewInterface->
setPreviewMode(
ADJUSTED_IMAGE,
true );
00332
else if(curMode ==
ADJUSTED_IMAGE)
00333
previewInterface->
setPreviewMode(
ORIGINAL_IMAGE,
true );
00334
else
00335
previewInterface->
setPreviewMode(
INV_SPLIT_VIEW );
00336 }
00337
else { QDialog::keyPressEvent(e); }
00338 }
00339
00340 void GrainEditor::keyReleaseEvent(QKeyEvent *e)
00341 {
00342
if(e->key() == Qt::Key_Control )
00343 {
00344
previewInterface->
setPreviewMode( (
PREVIEW_MODE)
previewSelection->currentItem(),
00345
false );
00346 }
00347
else { QDialog::keyReleaseEvent(e); }
00348 }
00349
00350
00351
00352