#include <grainEditor.h>
Inheritance diagram for GrainEditor:
Definition at line 31 of file grainEditor.h.
Public Member Functions | |
GrainEditor (QString filename, QWidget *parent=0, const char *name=0) | |
Constructs layout. | |
~GrainEditor () | |
QImage * | getModifiedImage () |
get modified image that resulted from adjustments | |
Protected Member Functions | |
void | keyPressEvent (QKeyEvent *e) |
void | keyReleaseEvent (QKeyEvent *e) |
Private Slots | |
void | selectPreviewImageType (int selection) |
updates preview image | |
void | resetBoundaries () |
reset blur/sharpen of object boundaries | |
void | resetRegions () |
reset blur/sharpen of regions | |
void | applyAction () |
check for changes to settings, if so | |
void | resetAction () |
resets image grain to original state | |
void | previewResized () |
handle resize preview signals | |
void | generateAdjustedPreviewImage () |
generate and set adjusted image | |
Private Member Functions | |
void | adjustImage (QImage &image, QPoint offset) |
Private Attributes | |
QString | fileName |
QSize | origImageSize |
QImage | edgesImage |
int * | clusterMap |
int | numRegions |
PanningPreviewInterface * | previewInterface |
Preview image. | |
SelectionPlacementInterface * | selectionPlacementInterface |
Interface for placing selection. | |
QComboBox * | previewSelection |
QFrame * | buttonsFrame |
BlurSharpenSlider * | boundariesSlider |
Grain slider. | |
ClickableLabel * | boundariesIcon |
BlurSharpenSlider * | regionsSlider |
ClickableLabel * | regionsIcon |
GrainEditor::GrainEditor | ( | QString | filename, | |
QWidget * | parent = 0 , |
|||
const char * | name = 0 | |||
) |
Constructs layout.
Definition at line 36 of file grainEditor.cpp.
References applyAction(), boundariesIcon, boundariesSlider, buttonsFrame, clusterMap, edgesImage, generateAdjustedPreviewImage(), EdgeDetect::getClusterMap(), getImageSize(), EdgeDetect::getNumClusters(), IMAGE_PATH, numRegions, origImageSize, previewInterface, previewResized(), previewSelection, resetAction(), resetBoundaries(), scaleImage(), selectionPlacementInterface, selectPreviewImageType(), ClickableLabel::setPixmap(), SLIDER_RADIUS, and WIDGET_SPACING.
00036 : QDialog(parent,name,true) 00037 { 00038 //record filename 00039 this->fileName = fileName; 00040 00041 //record original image size 00042 getImageSize( fileName, origImageSize ); 00043 00044 //construct edges image 00045 //speed up edge finding by scaling image down to < 800x600 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 //Preview frame 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 //Controls frame 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 // boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/boundaries.png") ); 00087 // QToolTip::add( boundariesSlider, tr("Blur/sharpen boundaries") ); 00088 // QToolTip::add( boundariesIcon, tr("Reset boundaries") ); 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 regionsSlider = new QSlider(Qt::Vertical, controlsFrame ); 00095 regionsSlider->setMinValue( -SLIDER_RADIUS ); 00096 regionsSlider->setMaxValue( SLIDER_RADIUS ); 00097 connect( regionsSlider, SIGNAL(valueChanged(int)), 00098 this, SLOT(generateAdjustedPreviewImage()) ); 00099 QToolTip::add( regionsSlider, tr("Blur/sharpen regions") ); 00100 00101 regionsIcon = new ClickableLabel( controlsFrame, "regionsIcon" ); 00102 regionsIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/regions.png") ); 00103 connect( regionsIcon, SIGNAL(clicked()), SLOT(resetRegions()) ); 00104 QToolTip::add( regionsIcon, tr("Reset regions") ); 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 // controlsGrid->addWidget( regionsSlider, 3, 2 ); 00117 // controlsGrid->addWidget( regionsIcon, 4, 2 ); 00118 00119 //make sure sliders have enough space so all slider units are settable 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 //Dialog buttons: 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 //Top level grid 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 //PLATFORM_SPECIFIC_CODE 00172 //windows users expect a grip, but qt doesn't put one in by default. we'll add 00173 //it for them too. :-) 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 //Window caption 00184 setCaption( tr("Grain Editor") ); 00185 //------------------------------- 00186 }
GrainEditor::~GrainEditor | ( | ) |
QImage * GrainEditor::getModifiedImage | ( | ) |
get modified image that resulted from adjustments
Definition at line 219 of file grainEditor.cpp.
References adjustImage(), and fileName.
00220 { 00221 QImage* adjustedImage = new QImage(fileName); 00222 00223 //convert to 32-bit depth if necessary 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 }
void GrainEditor::keyPressEvent | ( | QKeyEvent * | e | ) | [protected] |
Definition at line 325 of file grainEditor.cpp.
References ADJUSTED_IMAGE, INV_SPLIT_VIEW, ORIGINAL_IMAGE, previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().
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 }
void GrainEditor::keyReleaseEvent | ( | QKeyEvent * | e | ) | [protected] |
Definition at line 340 of file grainEditor.cpp.
References previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().
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 }
void GrainEditor::selectPreviewImageType | ( | int | selection | ) | [private, slot] |
updates preview image
Definition at line 235 of file grainEditor.cpp.
References previewInterface, and SplitViewInterface::setPreviewMode().
Referenced by GrainEditor().
00236 { 00237 previewInterface->setPreviewMode( (PREVIEW_MODE)selection ); 00238 }
void GrainEditor::resetBoundaries | ( | ) | [private, slot] |
reset blur/sharpen of object boundaries
Definition at line 203 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
00204 { 00205 boundariesSlider->setValue( 0 ); 00206 }
void GrainEditor::resetRegions | ( | ) | [private, slot] |
void GrainEditor::applyAction | ( | ) | [private, slot] |
check for changes to settings, if so
Definition at line 190 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
00191 { 00192 //check if user has adjusted grain. 00193 //if any changes have taken place call "accept", else "reject" so image is not 00194 //updated and appear modified 00195 if( boundariesSlider->value() != 0 ) 00196 //|| 00197 // regionsSlider->value() != 0 ) 00198 { accept(); } 00199 else 00200 { reject(); } 00201 }
void GrainEditor::resetAction | ( | ) | [private, slot] |
resets image grain to original state
Definition at line 213 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
00214 { 00215 boundariesSlider->setValue( 0 ); 00216 //regionsSlider->setValue( 0 ); 00217 }
void GrainEditor::previewResized | ( | ) | [private, slot] |
handle resize preview signals
Definition at line 240 of file grainEditor.cpp.
References generateAdjustedPreviewImage(), PanningPreviewInterface::getSelection(), previewInterface, selectionPlacementInterface, and SelectionPlacementInterface::setSelectedRegion().
Referenced by GrainEditor().
00241 { 00242 //reset selected region in selection placement interface 00243 selectionPlacementInterface->setSelectedRegion( previewInterface->getSelection() ); 00244 00245 //regenerate adjusted image and repaint 00246 generateAdjustedPreviewImage(); 00247 }
void GrainEditor::generateAdjustedPreviewImage | ( | ) | [private, slot] |
generate and set adjusted image
Definition at line 249 of file grainEditor.cpp.
References adjustImage(), SplitViewInterface::getOrigImage(), PanningPreviewInterface::getSelection(), previewInterface, and SplitViewInterface::setAdjustedImage().
Referenced by GrainEditor(), and previewResized().
00250 { 00251 //get original image 00252 QImage origImage = previewInterface->getOrigImage(); 00253 00254 //construct adjusted image 00255 QImage adjustedImage = origImage.copy(); 00256 adjustImage( adjustedImage, previewInterface->getSelection().topLeft() ); 00257 00258 //set adjusted image 00259 previewInterface->setAdjustedImage( adjustedImage ); 00260 }
void GrainEditor::adjustImage | ( | QImage & | image, | |
QPoint | offset | |||
) | [private] |
Definition at line 262 of file grainEditor.cpp.
References blurImage(), boundariesSlider, edgesImage, origImageSize, and sharpenImage().
Referenced by generateAdjustedPreviewImage(), and getModifiedImage().
00263 { 00264 //no adjustment - don't change the image at all 00265 if( boundariesSlider->value() == 0 )//&& 00266 //regionsSlider->value() == 0 ) 00267 { return; } 00268 00269 //compute sigma 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 // float regionsSigma = (20.0f * QABS(regionsSlider->value()) ) / 255.0f; 00276 00277 00278 //sharpen 00279 if ( boundariesSlider->value() < 0 ) 00280 { 00281 sharpenImage( image, boundariesSigma, 00282 offset, origImageSize, 00283 &edgesImage, true ); 00284 } 00285 //blur 00286 else if( boundariesSlider->value() > 0 ) 00287 { 00288 blurImage( image, boundariesSigma ); 00289 } 00290 00291 /* 00292 //sharpen boundaries 00293 if ( boundariesSlider->value() < 0 ) 00294 { 00295 sharpenImage( image, boundariesSigma, 00296 offset, origImageSize, 00297 &edgesImage, true ); 00298 } 00299 //blur boundaries 00300 else if( boundariesSlider->value() > 0 ) 00301 { 00302 blurImage( image, boundariesSigma, 00303 offset, origImageSize, 00304 &edgesImage, NULL, numRegions, true ); 00305 } 00306 00307 //sharpen regions 00308 if ( regionsSlider->value() < 0 ) 00309 { 00310 sharpenImage( image, regionsSigma, 00311 offset, origImageSize, 00312 &edgesImage, false ); 00313 } 00314 //blur regions 00315 else if( regionsSlider->value() > 0 ) 00316 { 00317 blurImage( image, regionsSigma, 00318 offset, origImageSize, 00319 &edgesImage, clusterMap, numRegions, false ); 00320 } 00321 */ 00322 00323 }
QString GrainEditor::fileName [private] |
QSize GrainEditor::origImageSize [private] |
QImage GrainEditor::edgesImage [private] |
int* GrainEditor::clusterMap [private] |
int GrainEditor::numRegions [private] |
Preview image.
Definition at line 91 of file grainEditor.h.
Referenced by generateAdjustedPreviewImage(), GrainEditor(), keyPressEvent(), keyReleaseEvent(), previewResized(), and selectPreviewImageType().
Interface for placing selection.
Definition at line 94 of file grainEditor.h.
Referenced by GrainEditor(), and previewResized().
QComboBox* GrainEditor::previewSelection [private] |
Definition at line 96 of file grainEditor.h.
Referenced by GrainEditor(), keyPressEvent(), and keyReleaseEvent().
QFrame* GrainEditor::buttonsFrame [private] |
BlurSharpenSlider* GrainEditor::boundariesSlider [private] |
Grain slider.
Definition at line 100 of file grainEditor.h.
Referenced by adjustImage(), applyAction(), GrainEditor(), resetAction(), and resetBoundaries().
ClickableLabel* GrainEditor::boundariesIcon [private] |
BlurSharpenSlider* GrainEditor::regionsSlider [private] |
Definition at line 103 of file grainEditor.h.
ClickableLabel* GrainEditor::regionsIcon [private] |
Definition at line 104 of file grainEditor.h.