Warning, file /maui/mauikit-filebrowsing/src/code/fmstatic.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 #include "fmstatic.h" 0002 #include "placeslist.h" 0003 #include "tagging.h" 0004 0005 #include <QDesktopServices> 0006 #include <QDirIterator> 0007 #include <QFileInfo> 0008 #include <QDateTime> 0009 #include <QDebug> 0010 #include <QSettings> 0011 0012 #include <KLocalizedString> 0013 0014 #if (defined Q_OS_LINUX || defined Q_OS_FREEBSD) && !defined Q_OS_ANDROID 0015 #include <KConfig> 0016 #include <KConfigGroup> 0017 #endif 0018 0019 #ifdef KIO_AVAILABLE 0020 #include <KIO/CopyJob> 0021 #include <KIO/DeleteJob> 0022 #include <KIO/EmptyTrashJob> 0023 #include <KIO/MkdirJob> 0024 #include <KIO/SimpleJob> 0025 #include <KIO/OpenUrlJob> 0026 #include <KApplicationTrader> 0027 #include <KIO/PreviewJob> 0028 #include <KFileItem> 0029 #endif 0030 0031 QString FMStatic::PathTypeLabel(const FMStatic::PATHTYPE_KEY& key) 0032 { 0033 static const QHash<FMStatic::PATHTYPE_KEY, QString> PATHTYPE_LABEL = {{PATHTYPE_KEY::PLACES_PATH, i18n("Places")}, 0034 {PATHTYPE_KEY::BOOKMARKS_PATH, i18n("Bookmarks")}, 0035 {PATHTYPE_KEY::DRIVES_PATH, i18n("Drives")}, 0036 {PATHTYPE_KEY::APPS_PATH, i18n("Apps")}, 0037 {PATHTYPE_KEY::REMOTE_PATH, i18n("Remote")}, 0038 {PATHTYPE_KEY::REMOVABLE_PATH, i18n("Removable")}, 0039 {PATHTYPE_KEY::UNKNOWN_TYPE, i18n("Unknown")}, 0040 {PATHTYPE_KEY::TRASH_PATH, i18n("Trash")}, 0041 {PATHTYPE_KEY::TAGS_PATH, i18n("Tags")}, 0042 {PATHTYPE_KEY::SEARCH_PATH, i18n("Search")}, 0043 {PATHTYPE_KEY::CLOUD_PATH, i18n("Cloud")}, 0044 {PATHTYPE_KEY::FISH_PATH, i18n("Remote")}, 0045 {PATHTYPE_KEY::MTP_PATH, i18n("Drives")}, 0046 {PATHTYPE_KEY::OTHER_PATH, i18n("Others")}, 0047 {PATHTYPE_KEY::QUICK_PATH, i18n("Quick")}}; 0048 0049 return PATHTYPE_LABEL[key]; 0050 } 0051 0052 0053 FMStatic::FMStatic(QObject *parent) 0054 : QObject(parent) 0055 {} 0056 0057 FMH::MODEL_LIST FMStatic::packItems(const QStringList &items, const QString &type) 0058 { 0059 FMH::MODEL_LIST data; 0060 0061 for (const auto &path : items) 0062 { 0063 if (QUrl(path).isLocalFile() && !FMH::fileExists(QUrl(path))) 0064 continue; 0065 0066 auto model = FMStatic::getFileInfoModel(QUrl(path)); 0067 model.insert(FMH::MODEL_KEY::TYPE, type); 0068 data << model; 0069 } 0070 0071 return data; 0072 } 0073 0074 FMH::MODEL_LIST FMStatic::getDefaultPaths() 0075 { 0076 return FMStatic::packItems(FMStatic::defaultPaths, PathTypeLabel(FMStatic::PATHTYPE_KEY::PLACES_PATH)); 0077 } 0078 0079 FMH::MODEL_LIST FMStatic::search(const QString &query, const QUrl &path, const bool &hidden, const bool &onlyDirs, const QStringList &filters) 0080 { 0081 FMH::MODEL_LIST content; 0082 0083 if (!path.isLocalFile()) { 0084 qWarning() << "URL recived is not a local file. FM::search" << path; 0085 return content; 0086 } 0087 0088 if (FMStatic::isDir(path)) { 0089 QDir::Filters dirFilter; 0090 0091 dirFilter = (onlyDirs ? QDir::AllDirs | QDir::NoDotDot | QDir::NoDot : QDir::Files | QDir::AllDirs | QDir::NoDotDot | QDir::NoDot); 0092 0093 if (hidden) 0094 dirFilter = dirFilter | QDir::Hidden | QDir::System; 0095 0096 QDirIterator it(path.toLocalFile(), filters, dirFilter, QDirIterator::Subdirectories); 0097 while (it.hasNext()) { 0098 auto url = it.next(); 0099 if (it.fileName().contains(query, Qt::CaseInsensitive)) { 0100 content << FMStatic::getFileInfoModel(QUrl::fromLocalFile(url)); 0101 } 0102 } 0103 } else 0104 qWarning() << "Search path does not exists" << path; 0105 0106 qDebug() << content; 0107 return content; 0108 } 0109 0110 FMH::MODEL_LIST FMStatic::getDevices() 0111 { 0112 FMH::MODEL_LIST drives; 0113 0114 #ifdef Q_OS_ANDROID 0115 drives << packItems(MAUIAndroid::sdDirs(), PathTypeLabel(FMStatic::PATHTYPE_KEY::DRIVES_PATH)); 0116 return drives; 0117 #endif 0118 0119 return drives; 0120 } 0121 0122 bool FMStatic::isDefaultPath(const QString &path) 0123 { 0124 return FMStatic::defaultPaths.contains(path); 0125 } 0126 0127 QUrl FMStatic::parentDir(const QUrl &path) 0128 { 0129 if (!path.isLocalFile()) { 0130 qWarning() << "URL recived is not a local file, FM::parentDir" << path; 0131 return path; 0132 } 0133 0134 QDir dir(path.toLocalFile()); 0135 dir.cdUp(); 0136 return QUrl::fromLocalFile(dir.absolutePath()); 0137 } 0138 0139 bool FMStatic::isDir(const QUrl &path) 0140 { 0141 if (!path.isLocalFile()) { 0142 // qWarning() << "URL recived is not a local file. FM::isDir" << path; 0143 return false; 0144 } 0145 0146 const QFileInfo file(path.toLocalFile()); 0147 return file.isDir(); 0148 } 0149 0150 bool FMStatic::isCloud(const QUrl &path) 0151 { 0152 return path.scheme() == FMStatic::PATHTYPE_SCHEME[FMStatic::PATHTYPE_KEY::CLOUD_PATH]; 0153 } 0154 0155 bool FMStatic::fileExists(const QUrl &path) 0156 { 0157 return FMH::fileExists(path); 0158 } 0159 0160 QUrl FMStatic::fileDir(const QUrl &path) // the directory path of the file 0161 { 0162 QUrl res = path; 0163 if (path.isLocalFile()) { 0164 const QFileInfo file(path.toLocalFile()); 0165 if (file.isDir()) 0166 res = path; 0167 else 0168 res = QUrl::fromLocalFile(file.dir().absolutePath()); 0169 } else 0170 qWarning() << "The path is not a local one. FM::fileDir"; 0171 0172 return res; 0173 } 0174 0175 QString FMStatic::homePath() 0176 { 0177 return FMStatic::HomePath; 0178 } 0179 #if !defined KIO_AVAILABLE 0180 0181 static bool copyRecursively(QString sourceFolder, QString destFolder) 0182 { 0183 bool success = false; 0184 QDir sourceDir(sourceFolder); 0185 0186 if (!sourceDir.exists()) 0187 return false; 0188 0189 QDir destDir(destFolder); 0190 if (!destDir.exists()) 0191 destDir.mkdir(destFolder); 0192 0193 QStringList files = sourceDir.entryList(QDir::Files); 0194 for (int i = 0; i < files.count(); i++) { 0195 QString srcName = sourceFolder + QDir::separator() + files[i]; 0196 QString destName = destFolder + QDir::separator() + files[i]; 0197 success = QFile::copy(srcName, destName); 0198 if (!success) 0199 return false; 0200 } 0201 0202 files.clear(); 0203 files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); 0204 for (int i = 0; i < files.count(); i++) { 0205 QString srcName = sourceFolder + QDir::separator() + files[i]; 0206 QString destName = destFolder + QDir::separator() + files[i]; 0207 success = copyRecursively(srcName, destName); 0208 if (!success) 0209 return false; 0210 } 0211 0212 return true; 0213 } 0214 #endif 0215 0216 bool FMStatic::copy(const QList<QUrl> &urls, const QUrl &destinationDir) 0217 { 0218 #ifdef KIO_AVAILABLE 0219 auto job = KIO::copy(urls, destinationDir); 0220 job->start(); 0221 return true; 0222 #else 0223 for (const auto &url : std::as_const(urls)) { 0224 QFileInfo srcFileInfo(url.toLocalFile()); 0225 if (!srcFileInfo.isDir() && srcFileInfo.isFile()) { 0226 const auto _destination = QUrl(destinationDir.toString() + QStringLiteral("/") + FMStatic::getFileInfoModel(url)[FMH::MODEL_KEY::LABEL]); 0227 if (!QFile::copy(url.toLocalFile(), _destination.toLocalFile())) { 0228 continue; 0229 } 0230 } else { 0231 const auto _destination = QUrl(destinationDir.toString() + QStringLiteral("/") + FMStatic::getFileInfoModel(url)[FMH::MODEL_KEY::LABEL]); 0232 QDir destDir(_destination.toLocalFile()); 0233 if (!destDir.exists()) 0234 destDir.mkdir(_destination.toLocalFile()); 0235 0236 if (!copyRecursively(url.toLocalFile(), _destination.toLocalFile())) 0237 continue; 0238 } 0239 } 0240 return true; 0241 #endif 0242 } 0243 0244 bool FMStatic::group(const QList<QUrl>& urls, const QUrl& destinationDir, const QString &name) 0245 { 0246 if(!FMStatic::fileExists(QUrl(destinationDir.toString() + QStringLiteral("/") + name))) 0247 { 0248 QDir(destinationDir.toLocalFile()).mkdir(name); 0249 } 0250 0251 return FMStatic::cut(urls, destinationDir, name); 0252 } 0253 0254 0255 bool FMStatic::cut(const QList<QUrl> &urls, const QUrl &where) 0256 { 0257 return FMStatic::cut(urls, where, QString()); 0258 } 0259 0260 bool FMStatic::cut(const QList<QUrl> &urls, const QUrl &where, const QString &name) 0261 { 0262 #ifdef KIO_AVAILABLE 0263 QUrl _where = where; 0264 if (!name.isEmpty()) 0265 _where = QUrl(where.toString() + QStringLiteral("/") + name); 0266 0267 auto job = KIO::move(urls, _where, KIO::HideProgressInfo); 0268 job->start(); 0269 0270 for (const auto &url : urls) { 0271 QUrl where_ = QUrl(where.toString() + QStringLiteral("/") + FMStatic::getFileInfoModel(url)[FMH::MODEL_KEY::LABEL]); 0272 if (!name.isEmpty()) 0273 where_ = QUrl(where.toString() + QStringLiteral("/") + name); 0274 0275 Tagging::getInstance()->updateUrl(url.toString(), where_.toString()); 0276 } 0277 #else 0278 for (const auto &url : std::as_const(urls)) { 0279 QUrl _where; 0280 if (name.isEmpty()) 0281 _where = QUrl(where.toString() + QStringLiteral("/") + FMStatic::getFileInfoModel(url)[FMH::MODEL_KEY::LABEL]); 0282 else 0283 _where = QUrl(where.toString() + QStringLiteral("/") + name); 0284 0285 QFile file(url.toLocalFile()); 0286 file.rename(_where.toLocalFile()); 0287 0288 Tagging::getInstance()->updateUrl(url.toString(), _where.toString()); 0289 } 0290 #endif 0291 0292 return true; 0293 } 0294 0295 bool FMStatic::removeFiles(const QList<QUrl> &urls) 0296 { 0297 for (const auto &url : std::as_const(urls)) { 0298 Tagging::getInstance()->removeUrl(url.toString()); 0299 } 0300 0301 #ifdef KIO_AVAILABLE 0302 auto job = KIO::del(urls); 0303 job->start(); 0304 return true; 0305 #else 0306 qDebug() << "ASKED GTO DELETE FILES" << urls; 0307 for (const auto &url : std::as_const(urls)) { 0308 qDebug() << "@ Want to remove files << " << url.toLocalFile(); 0309 0310 if (isDir(url)) { 0311 qDebug() << "Want to remove dir << " << url.toLocalFile(); 0312 FMStatic::removeDir(url); 0313 } else { 0314 qDebug() << "Want to remove files << " << url.toLocalFile(); 0315 QFile::remove(url.toLocalFile()); 0316 } 0317 } 0318 return true; 0319 #endif 0320 } 0321 0322 void FMStatic::moveToTrash(const QList<QUrl> &urls) 0323 { 0324 #ifdef KIO_AVAILABLE 0325 auto job = KIO::trash(urls); 0326 job->start(); 0327 #else 0328 Q_UNUSED(urls) 0329 #endif 0330 } 0331 0332 void FMStatic::emptyTrash() 0333 { 0334 #ifdef KIO_AVAILABLE 0335 auto job = KIO::emptyTrash(); 0336 job->start(); 0337 #endif 0338 } 0339 0340 bool FMStatic::removeDir(const QUrl &path) 0341 { 0342 bool result = true; 0343 QDir dir(path.toLocalFile()); 0344 qDebug() << "TRYING TO REMOVE DIR" << path << path.toLocalFile(); 0345 if (dir.exists()) 0346 { 0347 for (const QFileInfo &info : dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) 0348 { 0349 if (info.isDir()) { 0350 result = removeDir(QUrl::fromLocalFile(info.absoluteFilePath())); 0351 } else { 0352 result = QFile::remove(info.absoluteFilePath()); 0353 } 0354 0355 if (!result) { 0356 return result; 0357 } 0358 } 0359 result = dir.rmdir(path.toLocalFile()); 0360 } 0361 0362 return result; 0363 } 0364 0365 bool FMStatic::rename(const QUrl &url, const QString &name) 0366 { 0367 return FMStatic::cut({url}, QUrl(url.toString().left(url.toString().lastIndexOf(QStringLiteral("/")))), name); 0368 } 0369 0370 bool FMStatic::createDir(const QUrl &path, const QString &name) 0371 { 0372 #ifdef KIO_AVAILABLE 0373 auto job = KIO::mkdir(name.isEmpty() ? path : QUrl(path.toString() + QStringLiteral("/") + name)); 0374 job->start(); 0375 return true; 0376 #else 0377 return QDir(path.toLocalFile()).mkdir(name); 0378 #endif 0379 } 0380 0381 bool FMStatic::createFile(const QUrl &path, const QString &name) 0382 { 0383 QFile file(path.toLocalFile() + QStringLiteral("/") + name); 0384 0385 if (file.open(QIODevice::ReadWrite)) { 0386 file.close(); 0387 return true; 0388 } 0389 0390 return false; 0391 } 0392 0393 bool FMStatic::createSymlink(const QUrl &path, const QUrl &where) 0394 { 0395 #ifdef KIO_AVAILABLE 0396 qDebug() << "trying to create symlink" << path << where; 0397 const auto job = KIO::link({path}, where); 0398 job->start(); 0399 return true; 0400 #else 0401 return QFile::link(path.toLocalFile(), where.toLocalFile() + QStringLiteral("/") + QFileInfo(path.toLocalFile()).fileName()); 0402 #endif 0403 } 0404 0405 void FMStatic::openUrl(const QUrl &url) 0406 { 0407 #ifdef KIO_AVAILABLE 0408 KIO::OpenUrlJob *job = new KIO::OpenUrlJob(url); 0409 job->setRunExecutables(true); 0410 job->start(); 0411 #else 0412 0413 #if defined Q_OS_ANDROID 0414 MAUIAndroid::openUrl(url); 0415 #else 0416 QDesktopServices::openUrl(url); 0417 #endif 0418 0419 #endif 0420 } 0421 0422 void FMStatic::openLocation(const QStringList &urls) 0423 { 0424 for (const auto &url : qAsConst(urls)) 0425 { 0426 if(isDir(QUrl(url))) 0427 { 0428 QDesktopServices::openUrl(QUrl(url)); 0429 }else 0430 { 0431 QDesktopServices::openUrl(fileDir(QUrl(url))); 0432 } 0433 } 0434 } 0435 0436 const QString FMStatic::dirConfIcon(const QUrl &path) 0437 { 0438 QString icon = QStringLiteral("folder"); 0439 0440 if (!path.isLocalFile()) { 0441 qWarning() << "URL recived is not a local file" << path; 0442 return icon; 0443 } 0444 0445 if (!fileExists(path)) 0446 return icon; 0447 0448 0449 #if defined Q_OS_ANDROID || defined Q_OS_WIN || defined Q_OS_MACOS || defined Q_OS_IOS 0450 QSettings file(path.toLocalFile(), QSettings::Format::NativeFormat); 0451 file.beginGroup(QStringLiteral("Desktop Entry")); 0452 icon = file.value(QStringLiteral("Icon"), icon).toString(); 0453 file.endGroup(); 0454 #else 0455 KConfig file(path.toLocalFile()); 0456 const auto map = file.entryMap(QStringLiteral("Desktop Entry")); 0457 icon = map.isEmpty() ? QStringLiteral("folder") : map.value(QStringLiteral("Icon")); 0458 #endif 0459 0460 return icon; 0461 } 0462 0463 void FMStatic::setDirConf(const QUrl &path, const QString &group, const QString &key, const QVariant &value) 0464 { 0465 if (!path.isLocalFile()) { 0466 qWarning() << "URL recived is not a local file" << path; 0467 return; 0468 } 0469 0470 #if defined Q_OS_ANDROID || defined Q_OS_WIN || defined Q_OS_MACOS || defined Q_OS_IOS 0471 QSettings file(path.toLocalFile(), QSettings::Format::IniFormat); 0472 file.beginGroup(group); 0473 file.setValue(key, value); 0474 file.endGroup(); 0475 file.sync(); 0476 #else 0477 KConfig file(path.toLocalFile(), KConfig::SimpleConfig); 0478 auto kgroup = file.group(group); 0479 kgroup.writeEntry(key, value); 0480 // file.reparseConfiguration(); 0481 file.sync(); 0482 #endif 0483 } 0484 0485 bool FMStatic::checkFileType(const int &type, const QString &mimeTypeName) 0486 { 0487 return FMStatic::checkFileType(static_cast<FMStatic::FILTER_TYPE>(type), mimeTypeName); 0488 } 0489 0490 bool FMStatic::checkFileType(const FMStatic::FILTER_TYPE &type, const QString &mimeTypeName) 0491 { 0492 return SUPPORTED_MIMETYPES[type].contains(mimeTypeName); 0493 } 0494 0495 void FMStatic::bookmark(const QUrl &url) 0496 { 0497 PlacesList::addBookmark(url); 0498 } 0499 0500 QStringList FMStatic::nameFilters(const int &type) 0501 { 0502 return FMStatic::FILTER_LIST[static_cast<FMStatic::FILTER_TYPE>(type)]; 0503 } 0504 0505 const QString FMStatic::getMime(const QUrl &path) 0506 { 0507 if (!path.isLocalFile()) { 0508 qWarning() << "URL recived is not a local file, getMime" << path; 0509 return QString(); 0510 } 0511 0512 const QMimeDatabase mimedb; 0513 return mimedb.mimeTypeForFile(path.toLocalFile()).name(); 0514 } 0515 0516 static const QUrl thumbnailUrl(const QUrl &url, const QString &mimetype) 0517 { 0518 #ifdef KIO_AVAILABLE 0519 if (FMStatic::checkFileType(FMStatic::FILTER_TYPE::FONT, mimetype) || FMStatic::checkFileType(FMStatic::FILTER_TYPE::TEXT, mimetype) || FMStatic::checkFileType(FMStatic::FILTER_TYPE::AUDIO, mimetype) || FMStatic::checkFileType(FMStatic::FILTER_TYPE::DOCUMENT, mimetype) || FMStatic::checkFileType(FMStatic::FILTER_TYPE::VIDEO, mimetype) || url.toString().endsWith(QStringLiteral(".appimage"), Qt::CaseInsensitive)) { 0520 return QUrl(QStringLiteral("image://thumbnailer/") + url.toString()); 0521 } 0522 0523 // if (KIO::PreviewJob::supportedMimeTypes().contains(mimetype)) { 0524 // return QUrl("image://thumbnailer/" + url.toString()); 0525 // } 0526 #endif 0527 0528 if (FMStatic::checkFileType(FMStatic::FILTER_TYPE::IMAGE, mimetype)) { 0529 return url; 0530 } 0531 0532 return QUrl(); 0533 } 0534 0535 #ifdef KIO_AVAILABLE 0536 const FMH::MODEL FMStatic::getFileInfo(const KFileItem &kfile) 0537 { 0538 return FMH::MODEL { 0539 {FMH::MODEL_KEY::LABEL, kfile.name()}, 0540 {FMH::MODEL_KEY::NAME, kfile.name()}, 0541 {FMH::MODEL_KEY::DATE, kfile.time(KFileItem::FileTimes::CreationTime).toString(Qt::TextDate)}, 0542 {FMH::MODEL_KEY::MODIFIED, kfile.time(KFileItem::FileTimes::ModificationTime).toString(Qt::TextDate)}, 0543 {FMH::MODEL_KEY::LAST_READ, kfile.time(KFileItem::FileTimes::AccessTime).toString(Qt::TextDate)}, 0544 {FMH::MODEL_KEY::PATH, kfile.mostLocalUrl().toString()}, 0545 {FMH::MODEL_KEY::URL, kfile.mostLocalUrl().toString()}, 0546 {FMH::MODEL_KEY::THUMBNAIL, thumbnailUrl(kfile.mostLocalUrl(), kfile.mimetype()).toString()}, 0547 {FMH::MODEL_KEY::SYMLINK, kfile.linkDest()}, 0548 {FMH::MODEL_KEY::IS_SYMLINK, QVariant(kfile.isLink()).toString()}, 0549 {FMH::MODEL_KEY::HIDDEN, QVariant(kfile.isHidden()).toString()}, 0550 {FMH::MODEL_KEY::IS_DIR, QVariant(kfile.isDir()).toString()}, 0551 {FMH::MODEL_KEY::IS_FILE, QVariant(kfile.isFile()).toString()}, 0552 {FMH::MODEL_KEY::MIME, kfile.mimetype()}, 0553 {FMH::MODEL_KEY::ICON, kfile.iconName()}, 0554 {FMH::MODEL_KEY::SIZE, QString::number(kfile.size())}, 0555 {FMH::MODEL_KEY::COUNT, kfile.isLocalFile() && kfile.isDir() ? QString::number(QDir(kfile.localPath()).count()-2) : QStringLiteral("0")}}; 0556 } 0557 #endif 0558 0559 const FMH::MODEL FMStatic::getFileInfoModel(const QUrl &path) 0560 { 0561 FMH::MODEL res; 0562 #ifdef KIO_AVAILABLE 0563 res = FMStatic::getFileInfo(KFileItem(path, KFileItem::MimeTypeDetermination::NormalMimeTypeDetermination)); 0564 #else 0565 if(FMStatic::getPathType(path) == FMStatic::PATHTYPE_KEY::TAGS_PATH) 0566 { 0567 res = FMH::MODEL { 0568 {FMH::MODEL_KEY::LABEL, path.fileName()}, 0569 {FMH::MODEL_KEY::NAME, path.fileName()}, 0570 {FMH::MODEL_KEY::IS_SYMLINK, QStringLiteral("false")}, 0571 {FMH::MODEL_KEY::IS_FILE, QStringLiteral("false")}, 0572 {FMH::MODEL_KEY::HIDDEN, QStringLiteral("false")}, 0573 {FMH::MODEL_KEY::IS_DIR, QStringLiteral("false")}, 0574 {FMH::MODEL_KEY::SIZE, QStringLiteral("0")}, /*locale.formattedDataSize(file.size())*/ 0575 {FMH::MODEL_KEY::PATH, path.toString()}, 0576 {FMH::MODEL_KEY::URL, path.toString()}}; 0577 0578 }else 0579 { 0580 const QFileInfo file(path.toLocalFile()); 0581 if (!file.exists()) 0582 return FMH::MODEL(); 0583 0584 const auto mime = FMStatic::getMime(path); 0585 res = FMH::MODEL { 0586 {FMH::MODEL_KEY::SUFFIX, file.completeSuffix()}, 0587 {FMH::MODEL_KEY::LABEL, path.toString() == HomePath ? QStringLiteral("Home") : file.fileName()}, 0588 {FMH::MODEL_KEY::NAME, file.fileName()}, 0589 {FMH::MODEL_KEY::DATE, file.birthTime().toString(Qt::TextDate)}, 0590 {FMH::MODEL_KEY::MODIFIED, file.lastModified().toString(Qt::TextDate)}, 0591 {FMH::MODEL_KEY::LAST_READ, file.lastRead().toString(Qt::TextDate)}, 0592 {FMH::MODEL_KEY::MIME, mime}, 0593 {FMH::MODEL_KEY::SYMLINK, file.symLinkTarget()}, 0594 {FMH::MODEL_KEY::IS_SYMLINK, QVariant(file.isSymLink()).toString()}, 0595 {FMH::MODEL_KEY::IS_FILE, QVariant(file.isFile()).toString()}, 0596 {FMH::MODEL_KEY::HIDDEN, QVariant(file.isHidden()).toString()}, 0597 {FMH::MODEL_KEY::IS_DIR, QVariant(file.isDir()).toString()}, 0598 {FMH::MODEL_KEY::SIZE, QString::number(file.size()) /*locale.formattedDataSize(file.size())*/}, 0599 {FMH::MODEL_KEY::PATH, path.toString()}, 0600 {FMH::MODEL_KEY::URL, path.toString()}, 0601 {FMH::MODEL_KEY::THUMBNAIL, thumbnailUrl(path, mime).toString()}, 0602 {FMH::MODEL_KEY::COUNT, file.isDir() ? QString::number(QDir(path.toLocalFile()).count()) : QStringLiteral("0")}}; 0603 } 0604 #endif 0605 0606 0607 res[FMH::MODEL_KEY::ICON] = getIconName(path); //to control what icon is shown 0608 return res; 0609 } 0610 0611 0612 const QVariantMap FMStatic::getFileInfo(const QUrl &path) 0613 { 0614 return FMH::toMap(getFileInfoModel(path)); 0615 } 0616 0617 const QString FMStatic::getIconName(const QUrl &path) 0618 { 0619 if(FMStatic::getPathType(path) == FMStatic::PATHTYPE_KEY::TAGS_PATH) 0620 { 0621 return QStringLiteral("tag"); 0622 } 0623 0624 if (path.isLocalFile() && QFileInfo(path.toLocalFile()).isDir()) 0625 { 0626 if (folderIcon.contains(path.toString())) 0627 return folderIcon[path.toString()]; 0628 else 0629 { 0630 return dirConfIcon(QUrl(QString(path.toString() + QStringLiteral("/%1")).arg(QStringLiteral(".directory")))); 0631 } 0632 0633 } else { 0634 #ifdef KIO_AVAILABLE 0635 KFileItem mime(path); 0636 return mime.iconName(); 0637 #else 0638 QMimeDatabase mime; 0639 const auto type = mime.mimeTypeForFile(path.toString()); 0640 return type.iconName(); 0641 #endif 0642 } 0643 } 0644 0645 FMStatic::PATHTYPE_KEY FMStatic::getPathType(const QUrl &url) 0646 { 0647 return FMStatic::PATHTYPE_SCHEME_NAME[url.scheme()]; 0648 }