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: