#include <addPhotosDialog.h>
Public Member Functions | |
GeneratePreviewThread (FilePreview *previewWidget) | |
void | start (QString filename) |
virtual void | run () |
Private Attributes | |
QString | filename |
current file being processed | |
FilePreview * | previewWidget |
handle on preview widget necessary for posting an update event once the current file has been processed | |
bool | updating |
is the worker thread currently generating a file preview? | |
QString | queue |
next file to be processed by worker thread | |
QMutex | lockingMutex |
locking mutex - necessary to prevent multiple threads from accessing the updating bool or queue variable simultaniously |
Definition at line 29 of file addPhotosDialog.h.
GeneratePreviewThread::GeneratePreviewThread | ( | FilePreview * | previewWidget | ) |
Definition at line 60 of file addPhotosDialog.cpp.
void GeneratePreviewThread::run | ( | ) | [virtual] |
Definition at line 94 of file addPhotosDialog.cpp.
References filename, getImageSize(), lockingMutex, MIN_HEIGHT, MIN_WIDTH, previewWidget, queue, scaleImage(), and updating.
00095 { 00096 //since it is possible for another job 00097 //to be added to the queue while processing this one, it is necessary 00098 //to loop until the queue is empty 00099 while(true) 00100 { 00101 //------------------------------------------ 00102 //Get image type extension and convert to caps 00103 QString extension = QFileInfo(filename).extension(false).upper(); 00104 bool validExtension = ( (extension.compare("GIF") == 0) || 00105 (extension.compare("JPG") == 0) || 00106 (extension.compare("JPEG") == 0) || 00107 (extension.compare("PNG") == 0) || 00108 (extension.compare("XPM") == 0) ); 00109 //------------------------------------------ 00110 //Scale the image to fit nicely on the screen, aka < 300x225 00111 QImage scaledImage; 00112 if( validExtension ) 00113 { 00114 scaleImage(filename, scaledImage, MIN_WIDTH, MIN_HEIGHT ); 00115 } 00116 //------------------------------------------ 00117 //Get image resolution 00118 QString imageRes = ""; 00119 if(validExtension) 00120 { 00121 QSize res; 00122 getImageSize( filename, res ); 00123 imageRes = QString("%1 x %2").arg(res.width()).arg(res.height()); 00124 } 00125 //------------------------------------------ 00126 //Determine file size and construct a nicely formatted size string 00127 QString fileSize = "?"; 00128 QFileInfo info; 00129 info.setFile( filename ); 00130 int sizeOnDisk = info.size(); 00131 00132 if(sizeOnDisk < 1024) 00133 fileSize = QString("%1 Byte%2").arg(sizeOnDisk).arg( sizeOnDisk == 0 || sizeOnDisk > 1 ? "s" : ""); 00134 else if( sizeOnDisk/1024 < 1024) 00135 // fileSize = QString("%1 Kb").arg( ((float)*sizeOnDisk)/1024 ); 00136 fileSize = QString("%1 Kb").arg( ((float)((100*sizeOnDisk)/1024))/100 ); 00137 else if( sizeOnDisk/(1024*1024) < 1024) 00138 fileSize = QString("%1 Mb").arg( ((float)((100*sizeOnDisk)/(1024*1024)))/100 ); 00139 else 00140 fileSize = QString("%1 Gigs").arg( ((float)((100*sizeOnDisk)/(1024*1024*1024)))/100 ); 00141 //------------------------------------------ 00142 //Setup image details string 00143 QString fileDetails = QString("%1 %2, %3") 00144 .arg(imageRes) 00145 .arg(extension) 00146 .arg(fileSize); 00147 //------------------------------------------ 00148 //Post UPDATE_PREVIEW_DETAILS event 00149 UpdatePreviewEvent* upe = new UpdatePreviewEvent( scaledImage, fileDetails ); 00150 QApplication::postEvent( previewWidget, upe ); 00151 //------------------------------------------ 00152 //get lock 00153 lockingMutex.lock(); 00154 00155 //if the queue is empty we're done! 00156 if( queue.isNull() ) 00157 { 00158 updating = false; 00159 lockingMutex.unlock(); 00160 return; 00161 } 00162 //clear queue and process pending job 00163 else 00164 { 00165 filename = queue; 00166 queue = QString::null; 00167 lockingMutex.unlock(); 00168 } 00169 00170 } //end while(true) 00171 }
void GeneratePreviewThread::start | ( | QString | filename | ) |
Definition at line 72 of file addPhotosDialog.cpp.
References lockingMutex, queue, and updating.
Referenced by FilePreview::updatePreview().
00073 { 00074 //get lock 00075 lockingMutex.lock(); 00076 00077 //if currently animating then append job to queue 00078 if(updating) 00079 { 00080 queue = filename; 00081 lockingMutex.unlock(); 00082 return; 00083 } 00084 //else set animating to true, actually initiate job 00085 else 00086 { 00087 updating = true; 00088 this->filename = filename; 00089 lockingMutex.unlock(); 00090 QThread::start(); 00091 } 00092 }
QString GeneratePreviewThread::filename [private] |
QMutex GeneratePreviewThread::lockingMutex [private] |
locking mutex - necessary to prevent multiple threads from accessing the updating bool or queue variable simultaniously
Definition at line 52 of file addPhotosDialog.h.
FilePreview* GeneratePreviewThread::previewWidget [private] |
handle on preview widget necessary for posting an update event once the current file has been processed
Definition at line 42 of file addPhotosDialog.h.
Referenced by run().
QString GeneratePreviewThread::queue [private] |
next file to be processed by worker thread
Definition at line 48 of file addPhotosDialog.h.
Referenced by GeneratePreviewThread(), run(), and start().
bool GeneratePreviewThread::updating [private] |
is the worker thread currently generating a file preview?
Definition at line 45 of file addPhotosDialog.h.
Referenced by GeneratePreviewThread(), run(), and start().