diff options
| author | Kai Uwe Broulik <[email protected]> | 2021-12-16 19:29:22 +0100 |
|---|---|---|
| committer | Kai Uwe Broulik <[email protected]> | 2022-01-09 18:09:10 +0100 |
| commit | 0603e18cd4e36b988196a99810f2e3e803fe3125 (patch) | |
| tree | 6d70829efea053cb36c9e6618d8feadd45569a91 /src/panels/places/placesitemmodel.cpp | |
| parent | 3abc4cfcd49df45c856e1b5f01da8de8f970ccb2 (diff) | |
Port back to KFilePlacesView
This removes the custom-view engine version of the places panel
and replaces it with the upstream `KFilePlacesView` from KIO.
Diffstat (limited to 'src/panels/places/placesitemmodel.cpp')
| -rw-r--r-- | src/panels/places/placesitemmodel.cpp | 784 |
1 files changed, 0 insertions, 784 deletions
diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp deleted file mode 100644 index 3da6f7e1f..000000000 --- a/src/panels/places/placesitemmodel.cpp +++ /dev/null @@ -1,784 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2012 Peter Penz <[email protected]> - * - * Based on KFilePlacesModel from kdelibs: - * SPDX-FileCopyrightText: 2007 Kevin Ottens <[email protected]> - * SPDX-FileCopyrightText: 2007 David Faure <[email protected]> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include "placesitemmodel.h" - -#include "dolphin_generalsettings.h" -#include "dolphindebug.h" -#include "dolphinplacesmodelsingleton.h" -#include "placesitem.h" -#include "placesitemsignalhandler.h" -#include "views/dolphinview.h" -#include "views/viewproperties.h" - -#include <KAboutData> -#include <KLocalizedString> -#include <KUrlMimeData> -#include <Solid/DeviceNotifier> -#include <Solid/OpticalDrive> -#include <KCoreAddons/KProcessList> -#include <KCoreAddons/KListOpenFilesJob> - -#include <QAction> -#include <QIcon> -#include <QMimeData> -#include <QTimer> - -PlacesItemModel::PlacesItemModel(QObject* parent) : - KStandardItemModel(parent), - m_hiddenItemsShown(false), - m_deviceToTearDown(nullptr), - m_storageSetupInProgress(), - m_sourceModel(DolphinPlacesModelSingleton::instance().placesModel()) -{ - cleanupBookmarks(); - loadBookmarks(); - initializeDefaultViewProperties(); - - connect(m_sourceModel, &KFilePlacesModel::rowsInserted, this, &PlacesItemModel::onSourceModelRowsInserted); - connect(m_sourceModel, &KFilePlacesModel::rowsAboutToBeRemoved, this, &PlacesItemModel::onSourceModelRowsAboutToBeRemoved); - connect(m_sourceModel, &KFilePlacesModel::dataChanged, this, &PlacesItemModel::onSourceModelDataChanged); - connect(m_sourceModel, &KFilePlacesModel::rowsAboutToBeMoved, this, &PlacesItemModel::onSourceModelRowsAboutToBeMoved); - connect(m_sourceModel, &KFilePlacesModel::rowsMoved, this, &PlacesItemModel::onSourceModelRowsMoved); - connect(m_sourceModel, &KFilePlacesModel::groupHiddenChanged, this, &PlacesItemModel::onSourceModelGroupHiddenChanged); -} - -PlacesItemModel::~PlacesItemModel() -{ -} - -void PlacesItemModel::createPlacesItem(const QString &text, const QUrl &url, const QString &iconName, const QString &appName) -{ - createPlacesItem(text, url, iconName, appName, -1); -} - -void PlacesItemModel::createPlacesItem(const QString &text, const QUrl &url, const QString &iconName, const QString &appName, int after) -{ - m_sourceModel->addPlace(text, url, iconName, appName, mapToSource(after)); -} - -PlacesItem* PlacesItemModel::placesItem(int index) const -{ - return dynamic_cast<PlacesItem*>(item(index)); -} - -int PlacesItemModel::hiddenCount() const -{ - return m_sourceModel->hiddenCount(); -} - -void PlacesItemModel::setHiddenItemsShown(bool show) -{ - if (m_hiddenItemsShown == show) { - return; - } - - m_hiddenItemsShown = show; - - if (show) { - for (int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { - const QModelIndex index = m_sourceModel->index(r, 0); - if (!m_sourceModel->isHidden(index)) { - continue; - } - addItemFromSourceModel(index); - } - } else { - for (int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { - const QModelIndex index = m_sourceModel->index(r, 0); - if (m_sourceModel->isHidden(index)) { - removeItemByIndex(index); - } - } - } -} - -bool PlacesItemModel::hiddenItemsShown() const -{ - return m_hiddenItemsShown; -} - -int PlacesItemModel::closestItem(const QUrl& url) const -{ - return mapFromSource(m_sourceModel->closestItem(url)); -} - -// look for the correct position for the item based on source model -void PlacesItemModel::insertSortedItem(PlacesItem* item) -{ - if (!item) { - return; - } - - const KBookmark iBookmark = item->bookmark(); - const QString iBookmarkId = bookmarkId(iBookmark); - QModelIndex sourceIndex; - int pos = 0; - - for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { - sourceIndex = m_sourceModel->index(r, 0); - const KBookmark sourceBookmark = m_sourceModel->bookmarkForIndex(sourceIndex); - - if (bookmarkId(sourceBookmark) == iBookmarkId) { - break; - } - - if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) { - pos++; - } - } - - m_indexMap.insert(pos, sourceIndex); - insertItem(pos, item); -} - -void PlacesItemModel::onItemInserted(int index) -{ - KStandardItemModel::onItemInserted(index); -} - -void PlacesItemModel::onItemRemoved(int index, KStandardItem* removedItem) -{ - m_indexMap.removeAt(index); - - KStandardItemModel::onItemRemoved(index, removedItem); -} - -void PlacesItemModel::onItemChanged(int index, const QSet<QByteArray>& changedRoles) -{ - const QModelIndex sourceIndex = mapToSource(index); - const PlacesItem *changedItem = placesItem(mapFromSource(sourceIndex)); - - if (!changedItem || !sourceIndex.isValid()) { - qWarning() << "invalid item changed signal"; - return; - } - if (changedRoles.contains("isHidden")) { - if (m_sourceModel->isHidden(sourceIndex) != changedItem->isHidden()) { - m_sourceModel->setPlaceHidden(sourceIndex, changedItem->isHidden()); - } else { - m_sourceModel->refresh(); - } - } - KStandardItemModel::onItemChanged(index, changedRoles); -} - -QAction* PlacesItemModel::ejectAction(int index) const -{ - const PlacesItem* item = placesItem(index); - if (item && item->device().is<Solid::OpticalDisc>()) { - return new QAction(QIcon::fromTheme(QStringLiteral("media-eject")), i18nc("@item", "Eject"), nullptr); - } - - return nullptr; -} - -QAction* PlacesItemModel::teardownAction(int index) const -{ - const PlacesItem* item = placesItem(index); - if (!item) { - return nullptr; - } - - Solid::Device device = item->device(); - const bool providesTearDown = device.is<Solid::StorageAccess>() && - device.as<Solid::StorageAccess>()->isAccessible(); - if (!providesTearDown) { - return nullptr; - } - - Solid::StorageDrive* drive = device.as<Solid::StorageDrive>(); - if (!drive) { - drive = device.parent().as<Solid::StorageDrive>(); - } - - bool hotPluggable = false; - bool removable = false; - if (drive) { - hotPluggable = drive->isHotpluggable(); - removable = drive->isRemovable(); - } - - QString iconName; - QString text; - if (device.is<Solid::OpticalDisc>()) { - text = i18nc("@item", "Release"); - } else if (removable || hotPluggable) { - text = i18nc("@item", "Safely Remove"); - iconName = QStringLiteral("media-eject"); - } else { - text = i18nc("@item", "Unmount"); - iconName = QStringLiteral("media-eject"); - } - - if (iconName.isEmpty()) { - return new QAction(text, nullptr); - } - - return new QAction(QIcon::fromTheme(iconName), text, nullptr); -} - -void PlacesItemModel::requestEject(int index) -{ - const PlacesItem* item = placesItem(index); - if (item) { - Solid::OpticalDrive* drive = item->device().parent().as<Solid::OpticalDrive>(); - if (drive) { - connect(drive, &Solid::OpticalDrive::ejectDone, - this, &PlacesItemModel::slotStorageTearDownDone); - drive->eject(); - } else { - const QString label = item->text(); - const QString message = i18nc("@info", "The device '%1' is not a disk and cannot be ejected.", label); - Q_EMIT errorMessage(message); - } - } -} - -void PlacesItemModel::requestTearDown(int index) -{ - const PlacesItem* item = placesItem(index); - if (item) { - Solid::StorageAccess *tmp = item->device().as<Solid::StorageAccess>(); - 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); - Q_EMIT storageTearDownRequested(tmp->filePath()); - } - } -} - -bool PlacesItemModel::storageSetupNeeded(int index) const -{ - const PlacesItem* item = placesItem(index); - return item ? item->storageSetupNeeded() : false; -} - -void PlacesItemModel::requestStorageSetup(int index) -{ - const PlacesItem* item = placesItem(index); - if (!item) { - return; - } - - Solid::Device device = item->device(); - const bool setup = device.is<Solid::StorageAccess>() - && !m_storageSetupInProgress.contains(device.as<Solid::StorageAccess>()) - && !device.as<Solid::StorageAccess>()->isAccessible(); - if (setup) { - Solid::StorageAccess* access = device.as<Solid::StorageAccess>(); - - m_storageSetupInProgress[access] = index; - - connect(access, &Solid::StorageAccess::setupDone, - this, &PlacesItemModel::slotStorageSetupDone); - - access->setup(); - } -} - -QMimeData* PlacesItemModel::createMimeData(const KItemSet& indexes) const -{ - QList<QUrl> urls; - QByteArray itemData; - - QDataStream stream(&itemData, QIODevice::WriteOnly); - - for (int index : indexes) { - const QUrl itemUrl = placesItem(index)->url(); - if (itemUrl.isValid()) { - urls << itemUrl; - } - stream << index; - } - - 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); - - return mimeData; -} - -bool PlacesItemModel::supportsDropping(int index) const -{ - return index >= 0 && index < count(); -} - -void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) -{ - if (mimeData->hasFormat(internalMimeType())) { - // The item has been moved inside the view - QByteArray itemData = mimeData->data(internalMimeType()); - QDataStream stream(&itemData, QIODevice::ReadOnly); - int oldIndex; - stream >> oldIndex; - - QModelIndex sourceIndex = mapToSource(index); - QModelIndex oldSourceIndex = mapToSource(oldIndex); - - m_sourceModel->movePlace(oldSourceIndex.row(), sourceIndex.row()); - } else if (mimeData->hasFormat(QStringLiteral("text/uri-list"))) { - // One or more items must be added to the model - const QList<QUrl> urls = KUrlMimeData::urlsFromMimeData(mimeData); - for (int i = urls.count() - 1; i >= 0; --i) { - const QUrl& url = urls[i]; - - QString text = url.fileName(); - if (text.isEmpty()) { - text = url.host(); - } - - if ((url.isLocalFile() && !QFileInfo(url.toLocalFile()).isDir()) - || url.scheme() == QLatin1String("trash")) { - // Only directories outside the trash are allowed - continue; - } - - createPlacesItem(text, url, KIO::iconNameForUrl(url), {}, qMax(0, index - 1)); - } - } - // will save bookmark alteration and fix sort if that is broken by the drag/drop operation - refresh(); -} - -void PlacesItemModel::addItemFromSourceModel(const QModelIndex &index) -{ - if (!m_hiddenItemsShown && m_sourceModel->isHidden(index)) { - return; - } - - const KBookmark bookmark = m_sourceModel->bookmarkForIndex(index); - Q_ASSERT(!bookmark.isNull()); - PlacesItem *item = new PlacesItem(bookmark); - updateItem(item, index); - insertSortedItem(item); - - if (m_sourceModel->isDevice(index)) { - connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, - this, &PlacesItemModel::storageTearDownExternallyRequested); - } -} - -void PlacesItemModel::removeItemByIndex(const QModelIndex &sourceIndex) -{ - QString id = bookmarkId(m_sourceModel->bookmarkForIndex(sourceIndex)); - - for (int i = 0, iMax = count(); i < iMax; ++i) { - if (bookmarkId(placesItem(i)->bookmark()) == id) { - removeItem(i); - return; - } - } -} - -QString PlacesItemModel::bookmarkId(const KBookmark &bookmark) const -{ - QString id = bookmark.metaDataItem(QStringLiteral("UDI")); - if (id.isEmpty()) { - id = bookmark.metaDataItem(QStringLiteral("ID")); - } - return id; -} - -void PlacesItemModel::initializeDefaultViewProperties() const -{ - for(int i = 0, iMax = m_sourceModel->rowCount(); i < iMax; i++) { - const QModelIndex index = m_sourceModel->index(i, 0); - const PlacesItem *item = placesItem(mapFromSource(index)); - if (!item) { - continue; - } - - // Create default view-properties for all "Search For" and "Recently Saved" bookmarks - // in case the user has not already created custom view-properties for a corresponding - // query yet. - const bool createDefaultViewProperties = item->isSearchOrTimelineUrl() && !GeneralSettings::self()->globalViewProps(); - if (createDefaultViewProperties) { - const QUrl itemUrl = item->url(); - ViewProperties props(KFilePlacesModel::convertedUrl(itemUrl)); - if (!props.exist()) { - const QString path = itemUrl.path(); - if (path == QLatin1String("/documents")) { - props.setViewMode(DolphinView::DetailsView); - props.setPreviewsShown(false); - props.setVisibleRoles({"text", "path"}); - } else if (path == QLatin1String("/images")) { - props.setViewMode(DolphinView::IconsView); - props.setPreviewsShown(true); - props.setVisibleRoles({"text", "height", "width"}); - } else if (path == QLatin1String("/audio")) { - props.setViewMode(DolphinView::DetailsView); - props.setPreviewsShown(false); - props.setVisibleRoles({"text", "artist", "album"}); - } else if (path == QLatin1String("/videos")) { - props.setViewMode(DolphinView::IconsView); - props.setPreviewsShown(true); - props.setVisibleRoles({"text"}); - } else if (itemUrl.scheme() == QLatin1String("timeline")) { - props.setViewMode(DolphinView::DetailsView); - props.setVisibleRoles({"text", "modificationtime"}); - } - props.save(); - } - } - } -} - -void PlacesItemModel::updateItem(PlacesItem *item, const QModelIndex &index) -{ - item->setGroup(index.data(KFilePlacesModel::GroupRole).toString()); - item->setIcon(index.data(KFilePlacesModel::IconNameRole).toString()); - item->setGroupHidden(index.data(KFilePlacesModel::GroupHiddenRole).toBool()); -} - -void PlacesItemModel::slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData) -{ - if (error && errorData.isValid()) { - if (error == Solid::ErrorType::DeviceBusy) { - KListOpenFilesJob* listOpenFilesJob = new KListOpenFilesJob(m_deviceToTearDown->filePath()); - connect(listOpenFilesJob, &KIO::Job::result, this, [this, listOpenFilesJob](KJob*) { - const KProcessList::KProcessInfoList blockingProcesses = listOpenFilesJob->processInfoList(); - QString errorString; - if (blockingProcesses.isEmpty()) { - errorString = i18n("One or more files on this device are open within an application."); - } else { - QStringList blockingApps; - for (const auto& process : blockingProcesses) { - blockingApps << process.name(); - } - blockingApps.removeDuplicates(); - errorString = xi18np("One or more files on this device are opened in application <application>\"%2\"</application>.", - "One or more files on this device are opened in following applications: <application>%2</application>.", - blockingApps.count(), blockingApps.join(i18nc("separator in list of apps blocking device unmount", ", "))); - } - Q_EMIT errorMessage(errorString); - }); - listOpenFilesJob->start(); - } else { - Q_EMIT errorMessage(errorData.toString()); - } - } else { - // No error; it must have been unmounted successfully - Q_EMIT storageTearDownSuccessful(); - } - disconnect(m_deviceToTearDown, &Solid::StorageAccess::teardownDone, - this, &PlacesItemModel::slotStorageTearDownDone); - m_deviceToTearDown = nullptr; -} - -void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error, - const QVariant& errorData, - const QString& udi) -{ - Q_UNUSED(udi) - - const int index = m_storageSetupInProgress.take(sender()); - const PlacesItem* item = placesItem(index); - if (!item) { - return; - } - - if (error != Solid::NoError) { - if (errorData.isValid()) { - Q_EMIT errorMessage(i18nc("@info", "An error occurred while accessing '%1', the system responded: %2", - item->text(), - errorData.toString())); - } else { - Q_EMIT errorMessage(i18nc("@info", "An error occurred while accessing '%1'", - item->text())); - } - Q_EMIT storageSetupDone(index, false); - } else { - Q_EMIT storageSetupDone(index, true); - } -} - -void PlacesItemModel::onSourceModelRowsInserted(const QModelIndex &parent, int first, int last) -{ - for (int i = first; i <= last; i++) { - const QModelIndex index = m_sourceModel->index(i, 0, parent); - addItemFromSourceModel(index); - } -} - -void PlacesItemModel::onSourceModelRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last) -{ - for(int r = first; r <= last; r++) { - const QModelIndex index = m_sourceModel->index(r, 0, parent); - int oldIndex = mapFromSource(index); - if (oldIndex != -1) { - removeItem(oldIndex); - } - } -} - -void PlacesItemModel::onSourceModelRowsAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) -{ - Q_UNUSED(destination) - Q_UNUSED(row) - - for(int r = start; r <= end; r++) { - const QModelIndex sourceIndex = m_sourceModel->index(r, 0, parent); - // remove moved item - removeItem(mapFromSource(sourceIndex)); - } -} - -void PlacesItemModel::onSourceModelRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) -{ - Q_UNUSED(destination) - Q_UNUSED(parent) - - const int blockSize = (end - start) + 1; - - for (int r = start; r <= end; r++) { - // insert the moved item in the new position - const int targetRow = row + (start - r) - (r < row ? blockSize : 0); - const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination); - - addItemFromSourceModel(targetIndex); - } -} - -void PlacesItemModel::onSourceModelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) -{ - Q_UNUSED(roles) - - for (int r = topLeft.row(); r <= bottomRight.row(); r++) { - const QModelIndex sourceIndex = m_sourceModel->index(r, 0); - const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex); - PlacesItem *placeItem = itemFromBookmark(bookmark); - - if (placeItem && (!m_hiddenItemsShown && m_sourceModel->isHidden(sourceIndex))) { - //hide item if it became invisible - removeItem(index(placeItem)); - return; - } - - if (!placeItem && (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex))) { - //show item if it became visible - addItemFromSourceModel(sourceIndex); - return; - } - - if (placeItem && !m_sourceModel->isDevice(sourceIndex)) { - // must update the bookmark object - placeItem->setBookmark(bookmark); - } - } -} - -void PlacesItemModel::onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden) -{ - const auto groupIndexes = m_sourceModel->groupIndexes(group); - for (const QModelIndex &sourceIndex : groupIndexes) { - PlacesItem *item = placesItem(mapFromSource(sourceIndex)); - if (item) { - item->setGroupHidden(hidden); - } - } -} - -void PlacesItemModel::cleanupBookmarks() -{ - // KIO model now provides support for baloo urls, and because of that we - // need to remove old URLs that were visible only in Dolphin to avoid duplication - - static const QVector<QUrl> balooURLs = { - QUrl(QStringLiteral("timeline:/today")), - QUrl(QStringLiteral("timeline:/yesterday")), - QUrl(QStringLiteral("timeline:/thismonth")), - QUrl(QStringLiteral("timeline:/lastmonth")), - QUrl(QStringLiteral("search:/documents")), - QUrl(QStringLiteral("search:/images")), - QUrl(QStringLiteral("search:/audio")), - QUrl(QStringLiteral("search:/videos")) - }; - - int row = 0; - do { - const QModelIndex sourceIndex = m_sourceModel->index(row, 0); - const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex); - const QUrl url = bookmark.url(); - const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp")); - - if ((appName == KAboutData::applicationData().componentName() || - appName == KAboutData::applicationData().componentName() + DolphinPlacesModelSingleton::applicationNameSuffix()) && balooURLs.contains(url)) { - qCDebug(DolphinDebug) << "Removing old baloo url:" << url; - m_sourceModel->removePlace(sourceIndex); - } else { - row++; - } - } while (row < m_sourceModel->rowCount()); -} - -void PlacesItemModel::loadBookmarks() -{ - for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { - const QModelIndex sourceIndex = m_sourceModel->index(r, 0); - if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) { - addItemFromSourceModel(sourceIndex); - } - } -} - -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::deleteItem(int index) -{ - QModelIndex sourceIndex = mapToSource(index); - Q_ASSERT(sourceIndex.isValid()); - m_sourceModel->removePlace(sourceIndex); -} - -void PlacesItemModel::refresh() -{ - m_sourceModel->refresh(); -} - -void PlacesItemModel::hideItem(int index) -{ - PlacesItem* shownItem = placesItem(index); - if (!shownItem) { - return; - } - - shownItem->setHidden(true); -} - -QString PlacesItemModel::internalMimeType() const -{ - return "application/x-dolphinplacesmodel-" + - QString::number((qptrdiff)this); -} - -int PlacesItemModel::groupedDropIndex(int index, const PlacesItem* item) const -{ - Q_ASSERT(item); - - int dropIndex = index; - const QString group = item->group(); - - const int itemCount = count(); - if (index < 0) { - dropIndex = itemCount; - } - - // Search nearest previous item with the same group - int previousIndex = -1; - for (int i = dropIndex - 1; i >= 0; --i) { - if (placesItem(i)->group() == group) { - previousIndex = i; - break; - } - } - - // Search nearest next item with the same group - int nextIndex = -1; - for (int i = dropIndex; i < count(); ++i) { - if (placesItem(i)->group() == group) { - nextIndex = i; - break; - } - } - - // Adjust the drop-index to be inserted to the - // nearest item with the same group. - if (previousIndex >= 0 && nextIndex >= 0) { - dropIndex = (dropIndex - previousIndex < nextIndex - dropIndex) ? - previousIndex + 1 : nextIndex; - } else if (previousIndex >= 0) { - dropIndex = previousIndex + 1; - } else if (nextIndex >= 0) { - dropIndex = nextIndex; - } - - return dropIndex; -} - -bool PlacesItemModel::equalBookmarkIdentifiers(const KBookmark& b1, const KBookmark& b2) -{ - 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(QStringLiteral("ID")) == b2.metaDataItem(QStringLiteral("ID")); - } -} - -int PlacesItemModel::mapFromSource(const QModelIndex &index) const -{ - if (!index.isValid()) { - return -1; - } - - return m_indexMap.indexOf(index); -} - -bool PlacesItemModel::isDir(int index) const -{ - Q_UNUSED(index) - return true; -} - -KFilePlacesModel::GroupType PlacesItemModel::groupType(int row) const -{ - return m_sourceModel->groupType(mapToSource(row)); -} - -bool PlacesItemModel::isGroupHidden(KFilePlacesModel::GroupType type) const -{ - return m_sourceModel->isGroupHidden(type); -} - -void PlacesItemModel::setGroupHidden(KFilePlacesModel::GroupType type, bool hidden) -{ - return m_sourceModel->setGroupHidden(type, hidden); -} - -QModelIndex PlacesItemModel::mapToSource(int row) const -{ - return m_indexMap.value(row); -} - -PlacesItem *PlacesItemModel::itemFromBookmark(const KBookmark &bookmark) const -{ - const QString id = bookmarkId(bookmark); - for (int i = 0, iMax = count(); i < iMax; i++) { - PlacesItem *item = placesItem(i); - const KBookmark itemBookmark = item->bookmark(); - if (bookmarkId(itemBookmark) == id) { - return item; - } - } - return nullptr; -} - |
