3939
4040#include " FolderThumbnailGenerator.h"
4141
42- #include < QDir>
43- #include < QPainter>
44-
42+ #include " ContentFactory.h"
4543#include " ThumbnailGeneratorFactory.h"
4644#include " ThumbnailGenerator.h"
47- #include " ContentFactory.h"
4845#include " log.h"
4946
47+ #include < QDir>
48+ #include < QPainter>
49+
5050namespace
5151{
5252const int FOLDER_THUMBNAILS_X = 2 ;
@@ -57,75 +57,49 @@ const QString FOLDER_TEXT( "folder" );
5757
5858FolderThumbnailGenerator::FolderThumbnailGenerator ( const QSize& size )
5959 : ThumbnailGenerator( size )
60- {
61- }
60+ {}
6261
6362QImage FolderThumbnailGenerator::generate ( const QString& filename ) const
6463{
6564 const QDir dir ( filename );
6665 if ( dir.exists ( ))
67- return createFolderImage ( dir, true );
66+ return _createFolderImage ( dir, true );
6867
6968 put_flog ( LOG_ERROR, " invalid directory: %s" ,
7069 filename.toLocal8Bit ().constData ( ));
7170 return createErrorImage ( " folder" );
7271}
7372
7473QImage
75- FolderThumbnailGenerator::generatePlaceholderImage ( const QDir& dir ) const
74+ FolderThumbnailGenerator::_createFolderImage ( const QDir& dir,
75+ const bool generateThumbnails ) const
7676{
7777 QImage img = createGradientImage ( Qt::black, Qt::white );
78- addMetadataToImage ( img, dir.path ( ));
79- return img;
80- }
8178
82- void FolderThumbnailGenerator::addMetadataToImage ( QImage& img,
83- const QString& url ) const
84- {
85- img.setText ( " dir" , " true" );
86- ThumbnailGenerator::addMetadataToImage ( img, url );
87- }
88-
89- QVector<QRectF>
90- FolderThumbnailGenerator::calculatePlacement ( int nX, int nY, float padding,
91- float totalWidth,
92- float totalHeight ) const
93- {
94- const float totalPaddingWidth = padding*(nX+1 );
95- const float imageWidth = (1 .0f -totalPaddingWidth)/(float )nX;
79+ const QFileInfoList& fileList = _getSupportedFilesInDir ( dir );
9680
97- const float totalPaddingHeight = padding*(nY+1 );
98- const float imageHeight = (1 .0f -totalPaddingHeight)/(float )nY;
81+ if ( generateThumbnails && fileList.size () > 0 )
82+ _paintThumbnailsMosaic ( img, fileList );
83+ else
84+ paintText ( img, FOLDER_TEXT );
9985
100- QVector<QRectF> rect;
101- for ( int j = 0 ; j < nY; ++j )
102- {
103- const float y = padding + j*(imageHeight+padding);
104- for ( int i = 0 ; i < nX; ++i )
105- {
106- const float x = padding + i*(imageWidth+padding);
107- rect.append ( QRect ( x*totalWidth, y*totalHeight,
108- imageWidth*totalWidth,
109- imageHeight*totalHeight ));
110- }
111- }
112- return rect;
86+ return img;
11387}
11488
115- void FolderThumbnailGenerator::paintThumbnailsMosaic ( QImage& img,
116- const QFileInfoList&
117- fileList) const
89+ void FolderThumbnailGenerator::_paintThumbnailsMosaic ( QImage& img,
90+ const QFileInfoList&
91+ fileList ) const
11892{
11993 const int numPreviews = std::min ( FOLDER_THUMBNAILS_X*FOLDER_THUMBNAILS_Y,
12094 fileList.size ( ));
12195 if ( numPreviews == 0 )
12296 return ;
12397
124- QVector<QRectF> rect = calculatePlacement ( FOLDER_THUMBNAILS_X,
125- FOLDER_THUMBNAILS_Y,
126- FOLDER_THUMBNAILS_PADDING,
127- img.size ().width (),
128- img.size ().height ( ));
98+ QVector<QRectF> rect = _calculatePlacement ( FOLDER_THUMBNAILS_X,
99+ FOLDER_THUMBNAILS_Y,
100+ FOLDER_THUMBNAILS_PADDING,
101+ img.size ().width (),
102+ img.size ().height ( ));
129103 QPainter painter ( &img );
130104 for ( int i = 0 ; i < numPreviews; ++i )
131105 {
@@ -135,33 +109,53 @@ void FolderThumbnailGenerator::paintThumbnailsMosaic( QImage& img,
135109 QImage thumbnail;
136110 // Avoid recursion into subfolders
137111 if ( QDir ( filename ).exists ( ))
138- thumbnail = createFolderImage ( QDir ( filename ), false );
112+ thumbnail = _createFolderImage ( QDir ( filename ), false );
139113 else
140- thumbnail = ThumbnailGeneratorFactory::getGenerator ( filename, size_ )->generate ( filename );
114+ {
115+ const auto size = rect[i].size ().toSize ();
116+ auto generator =
117+ ThumbnailGeneratorFactory::getGenerator ( filename, size );
118+ thumbnail = generator->generate ( filename );
119+ }
141120
142- painter.drawImage ( rect[i], thumbnail );
121+ // Draw the thumbnail centered in its rectangle, preserving aspect ratio
122+ QSizeF paintedSize ( thumbnail.size ( ));
123+ paintedSize.scale ( rect[i].size (), Qt::KeepAspectRatio );
124+ QRectF paintRect ( QPointF (), paintedSize );
125+ paintRect.moveCenter ( rect[i].center ( ));
126+ painter.drawImage ( paintRect, thumbnail );
143127 }
144128 painter.end ();
145129}
146130
147- QImage
148- FolderThumbnailGenerator::createFolderImage ( const QDir& dir,
149- const bool generateThumbnails ) const
131+ QVector<QRectF>
132+ FolderThumbnailGenerator::_calculatePlacement ( int nX, int nY, float padding,
133+ float totalWidth,
134+ float totalHeight ) const
150135{
151- QImage img = generatePlaceholderImage ( dir );
152-
153- const QFileInfoList& fileList = getSupportedFilesInDir ( dir );
136+ const float totalPaddingWidth = padding*(nX+1 );
137+ const float imageWidth = (1 .0f -totalPaddingWidth)/(float )nX;
154138
155- if ( generateThumbnails && fileList.size () > 0 )
156- paintThumbnailsMosaic (img, fileList);
157- else
158- paintText ( img, FOLDER_TEXT );
139+ const float totalPaddingHeight = padding*(nY+1 );
140+ const float imageHeight = (1 .0f -totalPaddingHeight)/(float )nY;
159141
160- return img;
142+ QVector<QRectF> rect;
143+ for ( int j = 0 ; j < nY; ++j )
144+ {
145+ const float y = padding + j*(imageHeight+padding);
146+ for ( int i = 0 ; i < nX; ++i )
147+ {
148+ const float x = padding + i*(imageWidth+padding);
149+ rect.append ( QRect ( x*totalWidth, y*totalHeight,
150+ imageWidth*totalWidth,
151+ imageHeight*totalHeight ));
152+ }
153+ }
154+ return rect;
161155}
162156
163157QFileInfoList
164- FolderThumbnailGenerator::getSupportedFilesInDir ( QDir dir ) const
158+ FolderThumbnailGenerator::_getSupportedFilesInDir ( QDir dir ) const
165159{
166160 dir.setFilter ( QDir::Files | QDir::NoDotAndDotDot );
167161 QStringList filters = ContentFactory::getSupportedFilesFilter ();
0 commit comments