File indexing completed on 2024-05-05 04:50:33
0001 /* 0002 SPDX-FileCopyrightText: 2018 (c) Alexander Stippich <a.stippich@gmx.net> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #include "filebrowsermodel.h" 0008 0009 #include <QUrl> 0010 #include <QString> 0011 #include <QMimeDatabase> 0012 #include <KDirLister> 0013 0014 #include "models/modelLogging.h" 0015 0016 FileBrowserModel::FileBrowserModel(QObject *parent) : KDirModel(parent) 0017 { 0018 QMimeDatabase db; 0019 const QList<QMimeType> mimeList = db.allMimeTypes(); 0020 QStringList mimeTypes = { QStringLiteral("inode/directory") }; 0021 for (const QMimeType &mime : mimeList) { 0022 if (mime.name().startsWith(QLatin1String("audio/"))) { 0023 mimeTypes << mime.name(); 0024 } 0025 } 0026 0027 dirLister()->setMimeFilter(mimeTypes); 0028 } 0029 0030 FileBrowserModel::~FileBrowserModel() 0031 = default; 0032 0033 void FileBrowserModel::setUrl(const QUrl &url) 0034 { 0035 if (dirLister()->url() == url) { 0036 dirLister()->updateDirectory(url); 0037 return; 0038 } 0039 0040 beginResetModel(); 0041 dirLister()->openUrl(url); 0042 0043 endResetModel(); 0044 } 0045 0046 bool FileBrowserModel::isBusy() const 0047 { 0048 return false; 0049 } 0050 0051 QHash<int, QByteArray> FileBrowserModel::roleNames() const 0052 { 0053 auto roles = KDirModel::roleNames(); 0054 0055 roles[static_cast<int>(DataTypes::ColumnsRoles::TitleRole)] = "title"; 0056 roles[static_cast<int>(DataTypes::ColumnsRoles::SecondaryTextRole)] = "secondaryText"; 0057 roles[static_cast<int>(DataTypes::ColumnsRoles::ImageUrlRole)] = "imageUrl"; 0058 roles[static_cast<int>(DataTypes::ColumnsRoles::DatabaseIdRole)] = "databaseId"; 0059 roles[static_cast<int>(DataTypes::ColumnsRoles::ElementTypeRole)] = "dataType"; 0060 roles[static_cast<int>(DataTypes::ColumnsRoles::ResourceRole)] = "url"; 0061 0062 roles[static_cast<int>(DataTypes::ColumnsRoles::ArtistRole)] = "artist"; 0063 roles[static_cast<int>(DataTypes::ColumnsRoles::AllArtistsRole)] = "allArtists"; 0064 roles[static_cast<int>(DataTypes::ColumnsRoles::HighestTrackRating)] = "highestTrackRating"; 0065 roles[static_cast<int>(DataTypes::ColumnsRoles::GenreRole)] = "genre"; 0066 0067 roles[static_cast<int>(DataTypes::ColumnsRoles::AlbumRole)] = "album"; 0068 roles[static_cast<int>(DataTypes::ColumnsRoles::AlbumArtistRole)] = "albumArtist"; 0069 roles[static_cast<int>(DataTypes::ColumnsRoles::DurationRole)] = "duration"; 0070 roles[static_cast<int>(DataTypes::ColumnsRoles::TrackNumberRole)] = "trackNumber"; 0071 roles[static_cast<int>(DataTypes::ColumnsRoles::DiscNumberRole)] = "discNumber"; 0072 roles[static_cast<int>(DataTypes::ColumnsRoles::RatingRole)] = "rating"; 0073 roles[static_cast<int>(DataTypes::ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; 0074 roles[static_cast<int>(DataTypes::ColumnsRoles::FullDataRole)] = "fullData"; 0075 roles[static_cast<int>(DataTypes::ColumnsRoles::HasChildrenRole)] = "hasChildren"; 0076 0077 roles[static_cast<int>(DataTypes::ColumnsRoles::IsDirectoryRole)] = "isDirectory"; 0078 roles[static_cast<int>(DataTypes::ColumnsRoles::IsPlayListRole)] = "isPlaylist"; 0079 0080 return roles; 0081 } 0082 0083 QVariant FileBrowserModel::data(const QModelIndex &index, int role) const 0084 { 0085 auto result = QVariant(); 0086 0087 switch(role) 0088 { 0089 case DataTypes::ColumnsRoles::ResourceRole: 0090 { 0091 KFileItem item = itemForIndex(index); 0092 result = item.url(); 0093 break; 0094 } 0095 case DataTypes::ColumnsRoles::ImageUrlRole: 0096 { 0097 KFileItem item = itemForIndex(index); 0098 if (item.isDir()) { 0099 result = QUrl(QStringLiteral("image://icon/folder")); 0100 } else { 0101 result = QUrl(QStringLiteral("image://icon/audio-x-generic")); 0102 } 0103 break; 0104 } 0105 case DataTypes::ColumnsRoles::IsDirectoryRole: 0106 case DataTypes::ColumnsRoles::HasChildrenRole: 0107 { 0108 KFileItem item = itemForIndex(index); 0109 result = item.isDir(); 0110 break; 0111 } 0112 case DataTypes::ColumnsRoles::IsPlayListRole: 0113 { 0114 KFileItem item = itemForIndex(index); 0115 result = (ElisaUtils::isPlayList(item.currentMimeType())); 0116 break; 0117 } 0118 case DataTypes::ColumnsRoles::ElementTypeRole: 0119 { 0120 KFileItem item = itemForIndex(index); 0121 result = (item.isDir() ? ElisaUtils::Container : ElisaUtils::FileName); 0122 break; 0123 } 0124 case DataTypes::ColumnsRoles::FullDataRole: 0125 { 0126 KFileItem item = itemForIndex(index); 0127 if (item.isDir()) { 0128 result = QVariant::fromValue(DataTypes::MusicDataType{{DataTypes::ColumnsRoles::FilePathRole, item.url()}, 0129 {DataTypes::ColumnsRoles::ElementTypeRole, ElisaUtils::Container}, 0130 {DataTypes::TitleRole, item.name()}, 0131 {DataTypes::ImageUrlRole, QUrl(QStringLiteral("image://icon/folder"))}}); 0132 } else { 0133 auto mimeType = item.currentMimeType(); 0134 if (ElisaUtils::isPlayList(mimeType)) { 0135 result = QVariant::fromValue(DataTypes::MusicDataType{{DataTypes::ColumnsRoles::ResourceRole, item.url()}, 0136 {DataTypes::ColumnsRoles::ElementTypeRole, ElisaUtils::PlayList}, 0137 {DataTypes::TitleRole, item.name()}, 0138 {DataTypes::ImageUrlRole, QUrl(QStringLiteral("image://icon/audio-x-generic"))}}); 0139 } else { 0140 result = QVariant::fromValue(DataTypes::MusicDataType{{DataTypes::ColumnsRoles::ResourceRole, item.url()}, 0141 {DataTypes::ColumnsRoles::ElementTypeRole, ElisaUtils::Track}, 0142 {DataTypes::TitleRole, item.name()}, 0143 {DataTypes::ImageUrlRole, QUrl(QStringLiteral("image://icon/audio-x-generic"))}}); 0144 } 0145 } 0146 break; 0147 } 0148 case DataTypes::ColumnsRoles::FilePathRole: 0149 { 0150 KFileItem item = itemForIndex(index); 0151 result = item.url(); 0152 break; 0153 } 0154 default: 0155 result = KDirModel::data(index,role); 0156 } 0157 0158 return result; 0159 } 0160 0161 void FileBrowserModel::initialize(MusicListenersManager *manager, DatabaseInterface *database, 0162 ElisaUtils::PlayListEntryType modelType, ElisaUtils::FilterType filter, 0163 const QString &genre, const QString &artist, qulonglong databaseId, 0164 const QUrl &pathFilter) 0165 { 0166 Q_UNUSED(manager) 0167 Q_UNUSED(database) 0168 Q_UNUSED(modelType) 0169 Q_UNUSED(filter) 0170 Q_UNUSED(genre) 0171 Q_UNUSED(artist) 0172 Q_UNUSED(databaseId) 0173 0174 setUrl(pathFilter); 0175 } 0176 0177 void FileBrowserModel::initializeByData(MusicListenersManager *manager, DatabaseInterface *database, 0178 ElisaUtils::PlayListEntryType modelType, ElisaUtils::FilterType filter, 0179 const DataTypes::DataType &dataFilter) 0180 { 0181 Q_UNUSED(manager) 0182 Q_UNUSED(database) 0183 Q_UNUSED(modelType) 0184 Q_UNUSED(filter) 0185 0186 setUrl(dataFilter[DataTypes::FilePathRole].toUrl()); 0187 } 0188 0189 0190 #include "moc_filebrowsermodel.cpp"