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"