File indexing completed on 2024-04-28 04:21:21
0001 // SPDX-FileCopyrightText: 2003-2020 Jesper K. Pedersen <blackie@kde.org> 0002 // SPDX-FileCopyrightText: 2022 Johannes Zarl-Zierl <johannes@zarl-zierl.at> 0003 // 0004 // SPDX-License-Identifier: GPL-2.0-or-later 0005 0006 #include "CellGeometry.h" 0007 0008 #include "ThumbnailModel.h" 0009 #include "ThumbnailWidget.h" 0010 0011 #include <DB/ImageDB.h> 0012 #include <kpabase/SettingsData.h> 0013 0014 #include <KLocalizedString> 0015 0016 using Utilities::StringSet; 0017 0018 ThumbnailView::CellGeometry::CellGeometry(ThumbnailFactory *factory) 0019 : ThumbnailComponent(factory) 0020 { 0021 } 0022 0023 /** 0024 * Return desired size of the pixmap 0025 */ 0026 QSize ThumbnailView::CellGeometry::preferredIconSize() 0027 { 0028 int width = Settings::SettingsData::instance()->actualThumbnailSize(); 0029 int height = width * Settings::SettingsData::instance()->getThumbnailAspectRatio(); 0030 return QSize(width, height); 0031 } 0032 0033 /** 0034 * Return base size of the pixmap. 0035 * I.e. the unscaled thumbnail size, as it is set in the settings page. 0036 */ 0037 QSize ThumbnailView::CellGeometry::baseIconSize() 0038 { 0039 int width = Settings::SettingsData::instance()->thumbnailSize(); 0040 int height = width * Settings::SettingsData::instance()->getThumbnailAspectRatio(); 0041 return QSize(width, height); 0042 } 0043 0044 /** 0045 * Return the geometry for the icon in the cell. The coordinates are relative to the cell. 0046 */ 0047 QRect ThumbnailView::CellGeometry::iconGeometry(const QPixmap &pixmap) const 0048 { 0049 const QSize cellSize = preferredIconSize(); 0050 const int space = Settings::SettingsData::instance()->thumbnailSpace() + 5; /* 5 pixels for 3d effect */ 0051 int width = cellSize.width() - space; 0052 0053 int xoff = space / 2 + qMax(0, (width - pixmap.width()) / 2); 0054 int yoff = space / 2 + cellSize.height() - pixmap.height(); 0055 return QRect(QPoint(xoff, yoff), pixmap.size()); 0056 } 0057 0058 /** 0059 * Return the height of the text under the thumbnails. 0060 */ 0061 int ThumbnailView::CellGeometry::textHeight() const 0062 { 0063 if (!m_cacheInitialized) 0064 const_cast<CellGeometry *>(this)->flushCache(); 0065 0066 return m_textHeight; 0067 } 0068 0069 QSize ThumbnailView::CellGeometry::cellSize() const 0070 { 0071 if (!m_cacheInitialized) 0072 const_cast<CellGeometry *>(this)->flushCache(); 0073 return m_cellSize; 0074 } 0075 0076 QRect ThumbnailView::CellGeometry::cellTextGeometry() const 0077 { 0078 if (!m_cacheInitialized) 0079 const_cast<CellGeometry *>(this)->flushCache(); 0080 return m_cellTextGeometry; 0081 } 0082 0083 void ThumbnailView::CellGeometry::flushCache() 0084 { 0085 m_cacheInitialized = true; 0086 calculateTextHeight(); 0087 calculateCellSize(); 0088 calculateCellTextGeometry(); 0089 } 0090 0091 void ThumbnailView::CellGeometry::calculateTextHeight() 0092 { 0093 static const QString folder(i18n("Folder")); 0094 m_textHeight = 0; 0095 0096 const int charHeight = QFontMetrics(widget()->font()).height(); 0097 if (Settings::SettingsData::instance()->displayLabels()) 0098 m_textHeight += charHeight + 2; 0099 0100 if (Settings::SettingsData::instance()->displayCategories()) { 0101 int maxCatsInText = 0; 0102 const auto images = model()->imageList(ViewOrder); 0103 for (const DB::FileName &fileName : images) { 0104 const DB::ImageInfoPtr info = DB::ImageDB::instance()->info(fileName); 0105 int grps = info->availableCategories().length(); 0106 if (grps > maxCatsInText - 2) { 0107 grps -= info->itemsOfCategory(folder).empty() ? 1 : 2; 0108 if (grps > maxCatsInText) 0109 maxCatsInText = grps; 0110 } 0111 } 0112 0113 m_textHeight += charHeight * maxCatsInText + 5; 0114 } 0115 } 0116 0117 void ThumbnailView::CellGeometry::calculateCellSize() 0118 { 0119 const QSize iconSize = preferredIconSize(); 0120 const int height = iconSize.height() + 2 + m_textHeight; 0121 const int space = Settings::SettingsData::instance()->thumbnailSpace() + 5; /* 5 pixels for 3d effect */ 0122 m_cellSize = QSize(iconSize.width() + space, height + space); 0123 } 0124 0125 void ThumbnailView::CellGeometry::calculateCellTextGeometry() 0126 { 0127 if (!Settings::SettingsData::instance()->displayLabels() && !Settings::SettingsData::instance()->displayCategories()) 0128 m_cellTextGeometry = QRect(); 0129 else { 0130 const int h = m_textHeight; 0131 m_cellTextGeometry = QRect(1, m_cellSize.height() - h - 1, m_cellSize.width() - 2, h); 0132 } 0133 } 0134 0135 // vi:expandtab:tabstop=4 shiftwidth=4: