File indexing completed on 2024-05-05 04:50:35
0001 /* 0002 SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #include "viewsmodel.h" 0008 0009 #include "viewslistdata.h" 0010 0011 #include <KLocalizedString> 0012 0013 class ViewsModelPrivate 0014 { 0015 0016 public: 0017 0018 ViewsListData *mViewsData = nullptr; 0019 0020 ElisaUtils::PlayListEntryType mEmbeddedCategory = ElisaUtils::Unknown; 0021 0022 QMap<ElisaUtils::PlayListEntryType, QUrl> mDefaultIcons = {{ElisaUtils::Album, QUrl{QStringLiteral("image://icon/view-media-album-cover")}}, 0023 {ElisaUtils::Artist, QUrl{QStringLiteral("image://icon/view-media-artist")}}, 0024 {ElisaUtils::Genre, QUrl{QStringLiteral("image://icon/view-media-genre")}},}; 0025 }; 0026 0027 ViewsModel::ViewsModel(QObject *parent) 0028 : QAbstractListModel(parent), d(std::make_unique<ViewsModelPrivate>()) 0029 { 0030 } 0031 0032 ViewsModel::~ViewsModel() = default; 0033 0034 QHash<int, QByteArray> ViewsModel::roleNames() const 0035 { 0036 auto result = QAbstractListModel::roleNames(); 0037 0038 result[ImageNameRole] = "image"; 0039 result[DatabaseIdRole] = "databaseId"; 0040 result[UseSecondTitleRole] = "useSecondTitle"; 0041 result[SecondTitleRole] = "secondTitle"; 0042 result[EntryCategoryRole] = "entryCategory"; 0043 0044 return result; 0045 } 0046 0047 Qt::ItemFlags ViewsModel::flags(const QModelIndex &index) const 0048 { 0049 if (!index.isValid()) { 0050 return Qt::NoItemFlags; 0051 } 0052 0053 return Qt::ItemIsSelectable | Qt::ItemIsEnabled; 0054 } 0055 0056 int ViewsModel::rowCount(const QModelIndex &parent) const 0057 { 0058 if (parent.isValid()) { 0059 return 0; 0060 } 0061 0062 if (!d->mViewsData) { 0063 return 0; 0064 } 0065 0066 return d->mViewsData->count(); 0067 } 0068 0069 QVariant ViewsModel::data(const QModelIndex &index, int role) const 0070 { 0071 auto result = QVariant{}; 0072 0073 if (!d->mViewsData) { 0074 return result; 0075 } 0076 0077 if (!index.isValid()) { 0078 return result; 0079 } 0080 0081 switch(role) 0082 { 0083 case Qt::DisplayRole: 0084 result = d->mViewsData->title(index.row()); 0085 break; 0086 case ColumnRoles::ImageNameRole: 0087 result = d->mViewsData->iconUrl(index.row()); 0088 break; 0089 case ColumnRoles::DatabaseIdRole: 0090 result = d->mViewsData->databaseId(index.row()); 0091 break; 0092 case ColumnRoles::SecondTitleRole: 0093 result = d->mViewsData->secondTitle(index.row()); 0094 break; 0095 case ColumnRoles::UseSecondTitleRole: 0096 result = d->mViewsData->useSecondTitle(index.row()); 0097 break; 0098 case ColumnRoles::EntryCategoryRole: 0099 if (d->mViewsData->defaultEntry(index.row())) { 0100 result = QStringLiteral("default"); 0101 } else { 0102 switch (d->mViewsData->embeddedCategory()) 0103 { 0104 case ElisaUtils::Album: 0105 result = i18nc("@title:window Title of the view of all albums", "Albums"); 0106 break; 0107 case ElisaUtils::Genre: 0108 result = i18nc("@title:window Title of the view of all genres", "Genres"); 0109 break; 0110 case ElisaUtils::Artist: 0111 result = i18nc("@title:window Title of the view of all artists", "Artists"); 0112 break; 0113 case ElisaUtils::Radio: 0114 case ElisaUtils::Track: 0115 case ElisaUtils::Unknown: 0116 case ElisaUtils::Composer: 0117 case ElisaUtils::FileName: 0118 case ElisaUtils::Lyricist: 0119 case ElisaUtils::Container: 0120 case ElisaUtils::PlayList: 0121 break; 0122 } 0123 } 0124 break; 0125 case DataTypeRole: 0126 result = d->mViewsData->dataType(index.row()); 0127 break; 0128 } 0129 0130 return result; 0131 } 0132 0133 QModelIndex ViewsModel::index(int row, int column, const QModelIndex &parent) const 0134 { 0135 auto result = QModelIndex(); 0136 0137 if (column != 0) { 0138 return result; 0139 } 0140 0141 if (parent.isValid()) { 0142 return result; 0143 } 0144 0145 result = createIndex(row, column); 0146 0147 return result; 0148 } 0149 0150 QModelIndex ViewsModel::parent(const QModelIndex &child) const 0151 { 0152 Q_UNUSED(child) 0153 0154 auto result = QModelIndex(); 0155 0156 return result; 0157 } 0158 0159 ViewsListData *ViewsModel::viewsData() const 0160 { 0161 return d->mViewsData; 0162 } 0163 0164 void ViewsModel::setViewsData(ViewsListData *viewsData) 0165 { 0166 if (d->mViewsData == viewsData) { 0167 return; 0168 } 0169 0170 if (viewsData) { 0171 beginResetModel(); 0172 } 0173 0174 d->mViewsData = viewsData; 0175 Q_EMIT viewsDataChanged(); 0176 0177 if (d->mViewsData) { 0178 connect(d->mViewsData, &ViewsListData::dataAboutToBeAdded, 0179 this, &ViewsModel::dataAboutToBeAdded); 0180 connect(d->mViewsData, &ViewsListData::dataAdded, 0181 this, &ViewsModel::dataAdded); 0182 connect(d->mViewsData, &ViewsListData::dataAboutToBeRemoved, 0183 this, &ViewsModel::dataAboutToBeRemoved); 0184 connect(d->mViewsData, &ViewsListData::dataRemoved, 0185 this, &ViewsModel::dataRemoved); 0186 connect(d->mViewsData, &ViewsListData::dataModified, 0187 this, &ViewsModel::dataModified); 0188 connect(d->mViewsData, &ViewsListData::dataAboutToBeReset, 0189 this, &ViewsModel::dataAboutToBeReset); 0190 connect(d->mViewsData, &ViewsListData::dataReset, 0191 this, &ViewsModel::dataReset); 0192 0193 endResetModel(); 0194 } 0195 } 0196 0197 void ViewsModel::dataAboutToBeAdded(int startIndex, int lastIndex) 0198 { 0199 beginInsertRows({}, startIndex, lastIndex); 0200 } 0201 0202 void ViewsModel::dataAdded() 0203 { 0204 endInsertRows(); 0205 } 0206 0207 void ViewsModel::dataAboutToBeRemoved(int startIndex, int lastIndex) 0208 { 0209 beginRemoveRows({}, startIndex, lastIndex); 0210 } 0211 0212 void ViewsModel::dataRemoved() 0213 { 0214 endRemoveRows(); 0215 } 0216 0217 void ViewsModel::dataModified(int currentIndex) 0218 { 0219 Q_EMIT dataChanged(index(currentIndex, 0), index(currentIndex, 0)); 0220 } 0221 0222 void ViewsModel::dataAboutToBeReset() 0223 { 0224 beginResetModel(); 0225 } 0226 0227 void ViewsModel::dataReset() 0228 { 0229 endResetModel(); 0230 } 0231 0232 0233 #include "moc_viewsmodel.cpp"