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: