X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/52136255d86cfdf4bcfcd865bfa14cdd481b3a77..bd47eb2e6d:/src/panels/places/placesitemmodel.cpp diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index 3143b7410..abd6bc925 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -22,6 +22,7 @@ ***************************************************************************/ #include "placesitemmodel.h" +#include "placesitemsignalhandler.h" #include "dolphin_generalsettings.h" @@ -32,7 +33,6 @@ #include #include #include -#include #include #include "placesitem.h" #include @@ -78,6 +78,7 @@ PlacesItemModel::PlacesItemModel(QObject* parent) : m_systemBookmarksIndexes(), m_bookmarkedItems(), m_hiddenItemToRemove(-1), + m_deviceToTearDown(0), m_updateBookmarksTimer(0), m_storageSetupInProgress() { @@ -101,8 +102,6 @@ PlacesItemModel::PlacesItemModel(QObject* parent) : connect(m_bookmarkManager, &KBookmarkManager::changed, m_updateBookmarksTimer, static_cast(&QTimer::start)); - connect(m_bookmarkManager, &KBookmarkManager::bookmarksChanged, - m_updateBookmarksTimer, static_cast(&QTimer::start)); } PlacesItemModel::~PlacesItemModel() @@ -251,7 +250,7 @@ QAction* PlacesItemModel::ejectAction(int index) const { const PlacesItem* item = placesItem(index); if (item && item->device().is()) { - return new QAction(QIcon::fromTheme("media-eject"), i18nc("@item", "Eject '%1'", item->text()), 0); + return new QAction(QIcon::fromTheme(QStringLiteral("media-eject")), i18nc("@item", "Eject"), 0); } return 0; @@ -285,15 +284,14 @@ QAction* PlacesItemModel::teardownAction(int index) const QString iconName; QString text; - const QString label = item->text(); if (device.is()) { - text = i18nc("@item", "Release '%1'", label); + text = i18nc("@item", "Release"); } else if (removable || hotPluggable) { - text = i18nc("@item", "Safely Remove '%1'", label); - iconName = "media-eject"; + text = i18nc("@item", "Safely Remove"); + iconName = QStringLiteral("media-eject"); } else { - text = i18nc("@item", "Unmount '%1'", label); - iconName = "media-eject"; + text = i18nc("@item", "Unmount"); + iconName = QStringLiteral("media-eject"); } if (iconName.isEmpty()) { @@ -310,7 +308,7 @@ void PlacesItemModel::requestEject(int index) Solid::OpticalDrive* drive = item->device().parent().as(); if (drive) { connect(drive, &Solid::OpticalDrive::ejectDone, - this, &PlacesItemModel::slotStorageTeardownDone); + this, &PlacesItemModel::slotStorageTearDownDone); drive->eject(); } else { const QString label = item->text(); @@ -320,15 +318,19 @@ void PlacesItemModel::requestEject(int index) } } -void PlacesItemModel::requestTeardown(int index) +void PlacesItemModel::requestTearDown(int index) { const PlacesItem* item = placesItem(index); if (item) { - Solid::StorageAccess* access = item->device().as(); - if (access) { - connect(access, &Solid::StorageAccess::teardownDone, - this, &PlacesItemModel::slotStorageTeardownDone); - access->teardown(); + Solid::StorageAccess *tmp = item->device().as(); + if (tmp) { + m_deviceToTearDown = tmp; + // disconnect the Solid::StorageAccess::teardownRequested + // to prevent emitting PlacesItemModel::storageTearDownExternallyRequested + // after we have emitted PlacesItemModel::storageTearDownRequested + disconnect(tmp, &Solid::StorageAccess::teardownRequested, + item->signalHandler(), &PlacesItemSignalHandler::onTearDownRequested); + emit storageTearDownRequested(tmp->filePath()); } } } @@ -369,7 +371,7 @@ QMimeData* PlacesItemModel::createMimeData(const KItemSet& indexes) const QDataStream stream(&itemData, QIODevice::WriteOnly); - foreach (int index, indexes) { + for (int index : indexes) { const QUrl itemUrl = placesItem(index)->url(); if (itemUrl.isValid()) { urls << itemUrl; @@ -380,6 +382,9 @@ QMimeData* PlacesItemModel::createMimeData(const KItemSet& indexes) const QMimeData* mimeData = new QMimeData(); if (!urls.isEmpty()) { mimeData->setUrls(urls); + } else { + // #378954: prevent itemDropEvent() drops if there isn't a source url. + mimeData->setData(blacklistItemDropEventMimeType(), QByteArrayLiteral("true")); } mimeData->setData(internalMimeType(), itemData); @@ -418,7 +423,7 @@ void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) const int dropIndex = groupedDropIndex(index, newItem); insertItem(dropIndex, newItem); - } else if (mimeData->hasFormat("text/uri-list")) { + } else if (mimeData->hasFormat(QStringLiteral("text/uri-list"))) { // One or more items must be added to the model const QList urls = KUrlMimeData::urlsFromMimeData(mimeData); for (int i = urls.count() - 1; i >= 0; --i) { @@ -430,7 +435,7 @@ void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) } if ((url.isLocalFile() && !QFileInfo(url.toLocalFile()).isDir()) - || url.scheme() == "trash") { + || url.scheme() == QLatin1String("trash")) { // Only directories outside the trash are allowed continue; } @@ -536,7 +541,7 @@ void PlacesItemModel::onItemChanged(int index, const QSet& changedRo if (changedRoles.contains("isHidden")) { if (!m_hiddenItemsShown && changedItem->isHidden()) { m_hiddenItemToRemove = index; - QTimer::singleShot(0, this, SLOT(hideItem())); + QTimer::singleShot(0, this, static_cast(&PlacesItemModel::hideItem)); } } } @@ -551,7 +556,11 @@ void PlacesItemModel::slotDeviceAdded(const QString& udi) m_availableDevices << udi; const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - appendItem(new PlacesItem(bookmark)); + + PlacesItem *item = new PlacesItem(bookmark); + appendItem(item); + connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, + this, &PlacesItemModel::storageTearDownExternallyRequested); } void PlacesItemModel::slotDeviceRemoved(const QString& udi) @@ -577,11 +586,13 @@ void PlacesItemModel::slotDeviceRemoved(const QString& udi) } } -void PlacesItemModel::slotStorageTeardownDone(Solid::ErrorType error, const QVariant& errorData) +void PlacesItemModel::slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData) { if (error && errorData.isValid()) { emit errorMessage(errorData.toString()); } + m_deviceToTearDown->disconnect(); + m_deviceToTearDown = nullptr; } void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error, @@ -640,7 +651,7 @@ void PlacesItemModel::updateBookmarks() // a hidden item. The content of the bookmark might // have been changed, so an update is done. found = true; - if (newBookmark.metaDataItem("UDI").isEmpty()) { + if (newBookmark.metaDataItem(QStringLiteral("UDI")).isEmpty()) { item->setBookmark(newBookmark); item->setText(i18nc("KFile System Bookmarks", newBookmark.text().toUtf8().constData())); } @@ -649,7 +660,7 @@ void PlacesItemModel::updateBookmarks() } if (!found) { - const QString udi = newBookmark.metaDataItem("UDI"); + const QString udi = newBookmark.metaDataItem(QStringLiteral("UDI")); /* * See Bug 304878 @@ -784,9 +795,13 @@ void PlacesItemModel::loadBookmarks() } // Create items for devices that have not been stored as bookmark yet + devicesItems.reserve(devicesItems.count() + devices.count()); foreach (const QString& udi, devices) { const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - devicesItems.append(new PlacesItem(bookmark)); + PlacesItem *item = new PlacesItem(bookmark); + devicesItems.append(item); + connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, + this, &PlacesItemModel::storageTearDownExternallyRequested); } QList items; @@ -812,9 +827,9 @@ void PlacesItemModel::loadBookmarks() bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark, const QSet& availableDevices) const { - const QString udi = bookmark.metaDataItem("UDI"); + const QString udi = bookmark.metaDataItem(QStringLiteral("UDI")); const QUrl url = bookmark.url(); - const QString appName = bookmark.metaDataItem("OnlyInApp"); + const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp")); const bool deviceAvailable = availableDevices.contains(udi); const bool allowedHere = (appName.isEmpty() @@ -839,7 +854,7 @@ PlacesItem* PlacesItemModel::createSystemPlacesItem(const SystemBookmarkData& da // for "Recently Saved" and "Search For" should be a setting available only // in the Places Panel (see description of AppNamePrefix for more details). const QString appName = KAboutData::applicationData().componentName() + AppNamePrefix; - bookmark.setMetaDataItem("OnlyInApp", appName); + bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), appName); } PlacesItem* item = new PlacesItem(bookmark); @@ -871,9 +886,9 @@ PlacesItem* PlacesItemModel::createSystemPlacesItem(const SystemBookmarkData& da props.setViewMode(DolphinView::IconsView); props.setPreviewsShown(true); props.setVisibleRoles({"text"}); - } else if (data.url.scheme() == "timeline") { + } else if (data.url.scheme() == QLatin1String("timeline")) { props.setViewMode(DolphinView::DetailsView); - props.setVisibleRoles({"text", "date"}); + props.setVisibleRoles({"text", "modificationtime"}); } } } @@ -890,43 +905,43 @@ void PlacesItemModel::createSystemBookmarks() // i18nc call is done after reading the bookmark. The reason why the i18nc call is not // done here is because otherwise switching the language would not result in retranslating the // bookmarks. - m_systemBookmarks.append(SystemBookmarkData(QUrl::fromLocalFile(KUser().homeDir()), - "user-home", + m_systemBookmarks.append(SystemBookmarkData(QUrl::fromLocalFile(QDir::homePath()), + QStringLiteral("user-home"), I18N_NOOP2("KFile System Bookmarks", "Home"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("remote:/"), - "network-workgroup", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("remote:/")), + QStringLiteral("network-workgroup"), I18N_NOOP2("KFile System Bookmarks", "Network"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl::fromLocalFile("/"), - "folder-red", + m_systemBookmarks.append(SystemBookmarkData(QUrl::fromLocalFile(QStringLiteral("/")), + QStringLiteral("folder-red"), I18N_NOOP2("KFile System Bookmarks", "Root"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("trash:/"), - "user-trash", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("trash:/")), + QStringLiteral("user-trash"), I18N_NOOP2("KFile System Bookmarks", "Trash"))); if (m_fileIndexingEnabled) { - m_systemBookmarks.append(SystemBookmarkData(QUrl("timeline:/today"), - "go-jump-today", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/today")), + QStringLiteral("go-jump-today"), I18N_NOOP2("KFile System Bookmarks", "Today"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("timeline:/yesterday"), - "view-calendar-day", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/yesterday")), + QStringLiteral("view-calendar-day"), I18N_NOOP2("KFile System Bookmarks", "Yesterday"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("timeline:/thismonth"), - "view-calendar-month", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/thismonth")), + QStringLiteral("view-calendar-month"), I18N_NOOP2("KFile System Bookmarks", "This Month"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("timeline:/lastmonth"), - "view-calendar-month", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/lastmonth")), + QStringLiteral("view-calendar-month"), I18N_NOOP2("KFile System Bookmarks", "Last Month"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("search:/documents"), - "folder-text", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/documents")), + QStringLiteral("folder-text"), I18N_NOOP2("KFile System Bookmarks", "Documents"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("search:/images"), - "folder-images", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/images")), + QStringLiteral("folder-images"), I18N_NOOP2("KFile System Bookmarks", "Images"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("search:/audio"), - "folder-sound", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/audio")), + QStringLiteral("folder-sound"), I18N_NOOP2("KFile System Bookmarks", "Audio Files"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl("search:/videos"), - "folder-videos", + m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/videos")), + QStringLiteral("folder-videos"), I18N_NOOP2("KFile System Bookmarks", "Videos"))); } @@ -940,18 +955,27 @@ void PlacesItemModel::clear() { KStandardItemModel::clear(); } +void PlacesItemModel::proceedWithTearDown() +{ + Q_ASSERT(m_deviceToTearDown); + + connect(m_deviceToTearDown, &Solid::StorageAccess::teardownDone, + this, &PlacesItemModel::slotStorageTearDownDone); + m_deviceToTearDown->teardown(); +} + void PlacesItemModel::initializeAvailableDevices() { - QString predicate("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]" + QString predicate(QStringLiteral("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]" " OR " "[ IS StorageAccess AND StorageDrive.driveType == 'Floppy' ]]" " OR " "OpticalDisc.availableContent & 'Audio' ]" " OR " - "StorageAccess.ignored == false ]"); + "StorageAccess.ignored == false ]")); - if (KProtocolInfo::isKnownProtocol("mtp")) { + if (KProtocolInfo::isKnownProtocol(QStringLiteral("mtp"))) { predicate.prepend("["); predicate.append(" OR PortableMediaPlayer.supportedProtocols == 'mtp']"); } @@ -1078,12 +1102,12 @@ int PlacesItemModel::groupedDropIndex(int index, const PlacesItem* item) const bool PlacesItemModel::equalBookmarkIdentifiers(const KBookmark& b1, const KBookmark& b2) { - const QString udi1 = b1.metaDataItem("UDI"); - const QString udi2 = b2.metaDataItem("UDI"); + const QString udi1 = b1.metaDataItem(QStringLiteral("UDI")); + const QString udi2 = b2.metaDataItem(QStringLiteral("UDI")); if (!udi1.isEmpty() && !udi2.isEmpty()) { return udi1 == udi2; } else { - return b1.metaDataItem("ID") == b2.metaDataItem("ID"); + return b1.metaDataItem(QStringLiteral("ID")) == b2.metaDataItem(QStringLiteral("ID")); } } @@ -1100,17 +1124,17 @@ QUrl PlacesItemModel::createTimelineUrl(const QUrl& url) const int year = date.year(); const int month = date.month(); const int day = date.day(); - timelineUrl = "timeline:/" + timelineDateString(year, month) + - '/' + timelineDateString(year, month, day); + timelineUrl = QUrl("timeline:/" + timelineDateString(year, month) + + '/' + timelineDateString(year, month, day)); } else if (path.endsWith(QLatin1String("thismonth"))) { const QDate date = QDate::currentDate(); - timelineUrl = "timeline:/" + timelineDateString(date.year(), date.month()); + timelineUrl = QUrl("timeline:/" + timelineDateString(date.year(), date.month())); } else if (path.endsWith(QLatin1String("lastmonth"))) { const QDate date = QDate::currentDate().addMonths(-1); - timelineUrl = "timeline:/" + timelineDateString(date.year(), date.month()); + timelineUrl = QUrl("timeline:/" + timelineDateString(date.year(), date.month())); } else { Q_ASSERT(path.endsWith(QLatin1String("today"))); - timelineUrl= url; + timelineUrl = url; } return timelineUrl; @@ -1142,13 +1166,13 @@ QUrl PlacesItemModel::createSearchUrl(const QUrl& url) #ifdef HAVE_BALOO const QString path = url.toDisplayString(QUrl::PreferLocalFile); if (path.endsWith(QLatin1String("documents"))) { - searchUrl = searchUrlForType("Document"); + searchUrl = searchUrlForType(QStringLiteral("Document")); } else if (path.endsWith(QLatin1String("images"))) { - searchUrl = searchUrlForType("Image"); + searchUrl = searchUrlForType(QStringLiteral("Image")); } else if (path.endsWith(QLatin1String("audio"))) { - searchUrl = searchUrlForType("Audio"); + searchUrl = searchUrlForType(QStringLiteral("Audio")); } else if (path.endsWith(QLatin1String("videos"))) { - searchUrl = searchUrlForType("Video"); + searchUrl = searchUrlForType(QStringLiteral("Video")); } else { Q_ASSERT(false); } @@ -1163,7 +1187,6 @@ QUrl PlacesItemModel::createSearchUrl(const QUrl& url) QUrl PlacesItemModel::searchUrlForType(const QString& type) { Baloo::Query query; - query.addType("File"); query.addType(type); return query.toSearchUrl();