X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/da6f8fe0862585287153f0d90e19eab0b34bfbef..87e8d0ba:/src/panels/places/placesitemmodel.cpp diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index 074b7ab45..077c9044c 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -53,9 +53,19 @@ #include namespace { - // Hence a prefix to the application-name of the stored bookmarks is + // A suffix to the application-name of the stored bookmarks is // added, which is only read by PlacesItemModel. - const char AppNamePrefix[] = "-places-panel"; + const QString AppNameSuffix = QStringLiteral("-places-panel"); + static QList 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")) + }; } PlacesItemModel::PlacesItemModel(QObject* parent) : @@ -63,8 +73,9 @@ PlacesItemModel::PlacesItemModel(QObject* parent) : m_hiddenItemsShown(false), m_deviceToTearDown(nullptr), m_storageSetupInProgress(), - m_sourceModel(new KFilePlacesModel(this)) + m_sourceModel(new KFilePlacesModel(KAboutData::applicationData().componentName() + AppNameSuffix, this)) { + cleanupBookmarks(); loadBookmarks(); initializeDefaultViewProperties(); @@ -73,6 +84,7 @@ PlacesItemModel::PlacesItemModel(QObject* parent) : connect(m_sourceModel.data(), &KFilePlacesModel::dataChanged, this, &PlacesItemModel::onSourceModelDataChanged); connect(m_sourceModel.data(), &KFilePlacesModel::rowsAboutToBeMoved, this, &PlacesItemModel::onSourceModelRowsAboutToBeMoved); connect(m_sourceModel.data(), &KFilePlacesModel::rowsMoved, this, &PlacesItemModel::onSourceModelRowsMoved); + connect(m_sourceModel.data(), &KFilePlacesModel::groupHiddenChanged, this, &PlacesItemModel::onSourceModelGroupHiddenChanged); } PlacesItemModel::~PlacesItemModel() @@ -152,12 +164,13 @@ void PlacesItemModel::insertSortedItem(PlacesItem* item) 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(m_sourceModel->bookmarkForIndex(sourceIndex)) == iBookmarkId) { + if (bookmarkId(sourceBookmark) == iBookmarkId) { break; } - if (!m_sourceModel->isHidden(sourceIndex)) { + if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) { pos++; } } @@ -195,11 +208,13 @@ void PlacesItemModel::onItemChanged(int index, const QSet& changedRo qWarning() << "invalid item changed signal"; return; } - if (changedRoles.contains("isHidden")) { - m_sourceModel->setPlaceHidden(sourceIndex, changedItem->isHidden()); + if (m_sourceModel->isHidden(sourceIndex) != changedItem->isHidden()) { + m_sourceModel->setPlaceHidden(sourceIndex, changedItem->isHidden()); + } else { + m_sourceModel->refresh(); + } } - KStandardItemModel::onItemChanged(index, changedRoles); } @@ -380,7 +395,7 @@ void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) continue; } - createPlacesItem(text, url, QString(), qMax(0, index - 1)); + 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 @@ -389,9 +404,16 @@ void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) 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); + PlacesItem *item = itemFromBookmark(bookmark); + if (!item) { + item = new PlacesItem(bookmark); + } updateItem(item, index); insertSortedItem(item); @@ -470,6 +492,7 @@ 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) @@ -551,11 +574,7 @@ void PlacesItemModel::onSourceModelRowsMoved(const QModelIndex &parent, int star const int targetRow = row + (start - r) - (r < row ? blockSize : 0); const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination); - const KBookmark bookmark = m_sourceModel->bookmarkForIndex(targetIndex); - PlacesItem *item = new PlacesItem(bookmark); - updateItem(item, targetIndex); - - insertSortedItem(item); + addItemFromSourceModel(targetIndex); } } @@ -586,17 +605,48 @@ void PlacesItemModel::onSourceModelDataChanged(const QModelIndex &topLeft, const placeItem->setUrl(m_sourceModel->url(sourceIndex)); placeItem->bookmark().setMetaDataItem(QStringLiteral("OnlyInApp"), bookmark.metaDataItem(QStringLiteral("OnlyInApp"))); + // must update the bookmark object + placeItem->setBookmark(bookmark); } } } +void PlacesItemModel::onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden) +{ + for(const QModelIndex &sourceIndex : m_sourceModel->groupIndexes(group)) { + 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 + 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() + AppNameSuffix) && 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); - KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex); - if (acceptBookmark(bookmark) && - (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex))) { + if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) { addItemFromSourceModel(sourceIndex); } } @@ -607,18 +657,6 @@ void PlacesItemModel::loadBookmarks() #endif } -bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark) const -{ - const QString udi = bookmark.metaDataItem(QStringLiteral("UDI")); - const QUrl url = bookmark.url(); - const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp")); - const bool allowedHere = (appName.isEmpty() - || appName == KAboutData::applicationData().componentName() - || appName == KAboutData::applicationData().componentName() + AppNamePrefix); - - return (udi.isEmpty() && allowedHere); -} - void PlacesItemModel::clear() { KStandardItemModel::clear(); } @@ -730,6 +768,21 @@ bool PlacesItemModel::isDir(int index) const 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);