File indexing completed on 2024-05-05 16:27:55

0001 // SPDX-FileCopyrightText: 2009 Yuri Chornoivan <yurchor@ukr.net>
0002 // SPDX-FileCopyrightText: 2009-2010 Jan Kundrát <jkt@flaska.net>
0003 // SPDX-FileCopyrightText: 2009-2010 Jesper K. Pedersen <jesper.pedersen@kdab.com>
0004 // SPDX-FileCopyrightText: 2011 Andreas Neustifter <andreas.neustifter@gmail.com>
0005 // SPDX-FileCopyrightText: 2013-2023 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0006 // SPDX-FileCopyrightText: 2015-2016 Tobias Leupold <tl@stonemx.de>
0007 //
0008 // SPDX-License-Identifier: GPL-2.0-or-later
0009 
0010 #include "AbstractCategoryModel.h"
0011 
0012 #include "enums.h"
0013 
0014 #include <DB/ImageDB.h>
0015 #include <DB/MemberMap.h>
0016 #include <kpabase/SettingsData.h>
0017 
0018 #include <KLocalizedString>
0019 #include <QApplication>
0020 #include <QIcon>
0021 
0022 Browser::AbstractCategoryModel::AbstractCategoryModel(const DB::CategoryPtr &category, const DB::ImageSearchInfo &info)
0023     : m_category(category)
0024     , m_info(info)
0025 {
0026     m_images = DB::ImageDB::instance()->classify(info, m_category->name(), DB::Image);
0027     m_videos = DB::ImageDB::instance()->classify(info, m_category->name(), DB::Video);
0028 }
0029 
0030 bool Browser::AbstractCategoryModel::hasNoneEntry() const
0031 {
0032     int imageCount = m_images[DB::ImageDB::NONE()].count;
0033     int videoCount = m_videos[DB::ImageDB::NONE()].count;
0034     return (imageCount + videoCount != 0);
0035 }
0036 
0037 QString Browser::AbstractCategoryModel::text(const QString &name) const
0038 {
0039     if (name == DB::ImageDB::NONE()) {
0040         if (m_info.categoryMatchText(m_category->name()).length() == 0)
0041             return i18nc("As in No persons, no locations etc.", "None");
0042         else
0043             return i18nc("As in no other persons, or no other locations. ", "No other");
0044     }
0045 
0046     else {
0047         if (m_category->type() == DB::Category::FolderCategory) {
0048             QRegExp rx(QString::fromLatin1("(.*/)(.*)$"));
0049             QString value = name;
0050             value.replace(rx, QString::fromLatin1("\\2"));
0051             return value;
0052         } else {
0053             return name;
0054         }
0055     }
0056 }
0057 
0058 QPixmap Browser::AbstractCategoryModel::icon(const QString &name) const
0059 {
0060     int size = m_category->thumbnailSize();
0061     if (m_category->viewType() == DB::Category::TreeView) {
0062         // for generic tree view, icons are less important and carry few information
0063         // Maybe we should query the system for some sensible value here somehow, but I didn't find
0064         // anything reasonable during a cursory search and 22px has been hardcoded in some parts of kphotoalbum
0065         // for this kind of items without complaints so far...
0066         size = 22;
0067     }
0068 
0069     if (m_category->viewType() == DB::Category::TreeView || m_category->viewType() == DB::Category::IconView) {
0070         if (DB::ImageDB::instance()->memberMap().isGroup(m_category->name(), name)) {
0071             return QIcon::fromTheme(QString::fromUtf8("folder-image")).pixmap(size);
0072         } else {
0073             return m_category->icon(size);
0074         }
0075     } else {
0076         // The category images are screenshot from the size of the viewer (Which might very well be considered a bug)
0077         return m_category->categoryImage(m_category->name(), name, size, size * Settings::SettingsData::instance()->getThumbnailAspectRatio());
0078     }
0079 }
0080 
0081 QVariant Browser::AbstractCategoryModel::data(const QModelIndex &index, int role) const
0082 {
0083     if (!index.isValid())
0084         return QVariant();
0085     const QString name = indexToName(index);
0086     const int column = index.column();
0087 
0088     if (role == Qt::DisplayRole) {
0089         switch (column) {
0090         case 0:
0091             return text(name);
0092         case 1:
0093             return i18ncp("@item:intable number of images with a specific tag.", "1 image", "%1 images", m_images[name].count);
0094         case 2:
0095             return i18ncp("@item:intable number of videos with a specific tag.", "1 video", "%1 videos", m_videos[name].count);
0096         case 3: {
0097             DB::ImageDate range = m_images[name].range;
0098             range.extendTo(m_videos[name].range);
0099             return DB::ImageDate(range.start()).toString(false);
0100         }
0101         case 4: {
0102             DB::ImageDate range = m_images[name].range;
0103             range.extendTo(m_videos[name].range);
0104             return DB::ImageDate(range.end()).toString(false);
0105         }
0106         }
0107     }
0108 
0109     else if (role == Qt::DecorationRole && column == 0) {
0110         return icon(name);
0111     }
0112 
0113     else if (role == Qt::ToolTipRole)
0114         return text(name);
0115 
0116     else if (role == ItemNameRole)
0117         return name;
0118 
0119     else if (role == ValueRole) {
0120         switch (column) {
0121         case 0:
0122             return name;
0123         case 1:
0124             return m_images[name].count;
0125         case 2:
0126             return m_videos[name].count;
0127         case 3: {
0128             DB::ImageDate range = m_images[name].range;
0129             range.extendTo(m_videos[name].range);
0130             return range.start().toSecsSinceEpoch();
0131         }
0132         case 4: {
0133             DB::ImageDate range = m_images[name].range;
0134             range.extendTo(m_videos[name].range);
0135             return range.end().toSecsSinceEpoch();
0136         }
0137         }
0138     } else if (role == SortPriorityRole) {
0139         switch (column) {
0140         case 0:
0141             // none is to be sorted first
0142             return (name == DB::ImageDB::NONE()) ? -1 : 0;
0143         default:
0144             return 0;
0145         }
0146     }
0147 
0148     return QVariant();
0149 }
0150 
0151 Qt::ItemFlags Browser::AbstractCategoryModel::flags(const QModelIndex &index) const
0152 {
0153     return index.isValid() ? Qt::ItemIsSelectable | Qt::ItemIsEnabled : Qt::ItemFlags();
0154 }
0155 
0156 QVariant Browser::AbstractCategoryModel::headerData(int section, Qt::Orientation orientation, int role) const
0157 {
0158     if (orientation == Qt::Vertical || role != Qt::DisplayRole)
0159         return QVariant();
0160 
0161     switch (section) {
0162     case 0:
0163         return m_category->name();
0164     case 1:
0165         return i18n("Images");
0166     case 2:
0167         return i18n("Videos");
0168     case 3:
0169         return i18n("Start Date");
0170     case 4:
0171         return i18n("End Date");
0172     }
0173 
0174     return QVariant();
0175 }
0176 
0177 // vi:expandtab:tabstop=4 shiftwidth=4: