Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

Use Kio::KPlacesModel as source model for PlacesItemModel

Summary:
Use Kio::KPlacesModel as source model for PlacesItemModel avoiding
duplicated code.

Depends on D8862
Depends on D8332
Depends on D8434
Depends on D8348
Depends on D8630

Test Plan: Unit test created

Reviewers: elvisangelaccio, emmanuelp, mlaurent, mwolff

Reviewed By: elvisangelaccio, mlaurent, mwolff

Subscribers: mwolff, mlaurent, anthonyfieroni, nicolasfella, ngraham, #dolphin

Differential Revision: https://phabricator.kde.org/D8855
parent 8cea647c
......@@ -8,7 +8,7 @@ set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATI
project(Dolphin VERSION ${KDE_APPLICATIONS_VERSION})
set(QT_MIN_VERSION "5.5.0")
set(KF5_MIN_VERSION "5.40.0")
set(KF5_MIN_VERSION "5.41.0")
set(ECM_MIN_VERSION "1.6.0")
# ECM setup
......
......@@ -306,9 +306,7 @@ void DolphinContextMenu::openItemContextMenu()
if (selectedUrl.isValid()) {
PlacesItemModel model;
const QString text = selectedUrl.fileName();
PlacesItem* item = model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl));
model.appendItemToGroup(item);
model.saveBookmarks();
model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl));
}
} else if (activatedAction == openParentAction) {
m_command = OpenParentFolder;
......@@ -378,9 +376,7 @@ void DolphinContextMenu::openViewportContextMenu()
} else {
icon = KIO::iconNameForUrl(url);
}
PlacesItem* item = model.createPlacesItem(container->placesText(), url, icon);
model.appendItemToGroup(item);
model.saveBookmarks();
model.createPlacesItem(container->placesText(), url, icon);
}
}
}
......
......@@ -2373,7 +2373,7 @@ bool KFileItemModel::isConsistent() const
return false;
}
for (int i = 0; i < count(); ++i) {
for (int i = 0, iMax = count(); i < iMax; ++i) {
// Check if m_items and m_itemData are consistent.
const KFileItem item = fileItem(i);
if (item.isNull()) {
......
......@@ -130,35 +130,16 @@ void PlacesItem::setBookmark(const KBookmark& bookmark)
delete m_disc;
delete m_mtp;
const QString udi = bookmark.metaDataItem(QStringLiteral("UDI"));
if (udi.isEmpty()) {
setIcon(bookmark.icon());
setText(i18nc("KFile System Bookmarks", bookmark.text().toUtf8().constData()));
setUrl(bookmark.url());
setSystemItem(bookmark.metaDataItem(QStringLiteral("isSystemItem")) == QLatin1String("true"));
} else {
initializeDevice(udi);
}
const GroupType type = groupType();
if (icon().isEmpty()) {
switch (type) {
case RecentlySavedType: setIcon(QStringLiteral("chronometer")); break;
case SearchForType: setIcon(QStringLiteral("system-search")); break;
case PlacesType:
default: setIcon(QStringLiteral("folder"));
}
}
switch (type) {
case PlacesType: setGroup(i18nc("@item", "Places")); break;
case RecentlySavedType: setGroup(i18nc("@item", "Recently Saved")); break;
case SearchForType: setGroup(i18nc("@item", "Search For")); break;
case DevicesType: setGroup(i18nc("@item", "Devices")); break;
default: Q_ASSERT(false); break;
}
setHidden(bookmark.metaDataItem(QStringLiteral("IsHidden")) == QLatin1String("true"));
}
......@@ -167,62 +148,15 @@ KBookmark PlacesItem::bookmark() const
return m_bookmark;
}
PlacesItem::GroupType PlacesItem::groupType() const
{
if (udi().isEmpty()) {
const QString protocol = url().scheme();
if (protocol == QLatin1String("timeline")) {
return RecentlySavedType;
}
if (protocol.contains(QLatin1String("search"))) {
return SearchForType;
}
if (protocol == QLatin1String("bluetooth") || protocol == QLatin1String("obexftp") || protocol == QLatin1String("kdeconnect")) {
return DevicesType;
}
return PlacesType;
}
return DevicesType;
}
bool PlacesItem::storageSetupNeeded() const
{
return m_access ? !m_access->isAccessible() : false;
}
KBookmark PlacesItem::createBookmark(KBookmarkManager* manager,
const QString& text,
const QUrl& url,
const QString& iconName)
bool PlacesItem::isSearchOrTimelineUrl() const
{
KBookmarkGroup root = manager->root();
if (root.isNull()) {
return KBookmark();
}
KBookmark bookmark = root.addBookmark(text, url, iconName);
bookmark.setFullText(text);
bookmark.setMetaDataItem(QStringLiteral("ID"), generateNewId());
return bookmark;
}
KBookmark PlacesItem::createDeviceBookmark(KBookmarkManager* manager,
const QString& udi)
{
KBookmarkGroup root = manager->root();
if (root.isNull()) {
return KBookmark();
}
KBookmark bookmark = root.createNewSeparator();
bookmark.setMetaDataItem(QStringLiteral("UDI"), udi);
bookmark.setMetaDataItem(QStringLiteral("isSystemItem"), QStringLiteral("true"));
return bookmark;
const QString urlScheme = url().scheme();
return (urlScheme.contains("search") || urlScheme.contains("timeline"));
}
void PlacesItem::onDataValueChanged(const QByteArray& role,
......
......@@ -40,14 +40,6 @@ class PlacesItem : public KStandardItem
{
public:
enum GroupType
{
PlacesType,
SearchForType,
RecentlySavedType,
DevicesType
};
explicit PlacesItem(const KBookmark& bookmark, PlacesItem* parent = nullptr);
~PlacesItem() override;
......@@ -68,16 +60,9 @@ public:
void setBookmark(const KBookmark& bookmark);
KBookmark bookmark() const;
GroupType groupType() const;
bool storageSetupNeeded() const;
static KBookmark createBookmark(KBookmarkManager* manager,
const QString& text,
const QUrl& url,
const QString& iconName);
static KBookmark createDeviceBookmark(KBookmarkManager* manager,
const QString& udi);
bool isSearchOrTimelineUrl() const;
PlacesItemSignalHandler* signalHandler() const;
......
This diff is collapsed.
......@@ -20,8 +20,6 @@
#ifndef PLACESITEMMODEL_H
#define PLACESITEMMODEL_H
#include <config-baloo.h>
#include <kitemviews/kstandarditemmodel.h>
#include <QUrl>
......@@ -33,9 +31,9 @@
class KBookmark;
class KBookmarkManager;
class KFilePlacesModel;
class PlacesItem;
class QAction;
class QTimer;
// #define PLACESITEMMODEL_DEBUG
......@@ -54,15 +52,22 @@ public:
~PlacesItemModel() override;
/**
* @return A new instance of a places item with the given
* attributes.
* @brief Create a new place entry in the bookmark file
* and add it to the model
*/
PlacesItem* createPlacesItem(const QString& text,
const QUrl& url,
const QString& iconName = QString());
void createPlacesItem(const QString& text,
const QUrl& url,
const QString& iconName = QString(),
int after = -1);
PlacesItem* placesItem(int index) const;
/**
* @brief Mark an item as hiden
* @param index of the item to be hidden
*/
void hideItem(int index);
/**
* If set to true, all items that are marked as hidden
* will be shown in the view. The items will
......@@ -89,15 +94,6 @@ public:
*/
int closestItem(const QUrl& url) const;
/**
* Appends the item \a item as last element of the group
* the item belongs to. If no item with the same group is
* present, the item gets appended as last element of the
* model. PlacesItemModel takes the ownership
* of the item.
*/
void appendItemToGroup(PlacesItem* item);
QAction* ejectAction(int index) const;
QAction* teardownAction(int index) const;
......@@ -126,11 +122,19 @@ public:
void proceedWithTearDown();
/**
* Saves the bookmarks and indicates to other applications that the
* state of the bookmarks has been changed. Is only called by the
* timeout of m_saveBookmarksTimer to prevent unnecessary savings.
* @brief Remove item from bookmark
*
* This function remove the index from bookmark file permanently
*
* @param index - the item to be removed
*/
void saveBookmarks();
void deleteItem(int index);
/**
* Force a sync on the bookmarks and indicates to other applications that the
* state of the bookmarks has been changed.
*/
void refresh();
bool isDir(int index) const override;
signals:
......@@ -145,22 +149,17 @@ protected:
void onItemChanged(int index, const QSet<QByteArray>& changedRoles) override;
private slots:
void slotDeviceAdded(const QString& udi);
void slotDeviceRemoved(const QString& udi);
void slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData);
void slotStorageSetupDone(Solid::ErrorType error, const QVariant& errorData, const QString& udi);
void hideItem();
/**
* Updates the bookmarks from the model corresponding to the changed
* bookmarks stored by the bookmark-manager. Is called whenever the bookmarks
* have been changed by another application.
*/
void updateBookmarks();
// source model control
void onSourceModelRowsInserted(const QModelIndex &parent, int first, int last);
void onSourceModelRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
void onSourceModelRowsAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row);
void onSourceModelRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row);
void onSourceModelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles);
private:
struct SystemBookmarkData;
/**
* Loads the bookmarks from the bookmark-manager and creates items for
* the model or moves hidden items to m_bookmarkedItems.
......@@ -172,37 +171,7 @@ private:
* current application (e.g. bookmarks from other applications
* will be ignored).
*/
bool acceptBookmark(const KBookmark& bookmark,
const QSet<QString>& availableDevices) const;
/**
* Creates a PlacesItem for a system-bookmark:
* - PlacesItem::isSystemItem() will return true
* - Default view-properties will be created for "Search For" items
* The item is not inserted to the model yet.
*/
PlacesItem* createSystemPlacesItem(const SystemBookmarkData& data);
/**
* Creates system bookmarks that are shown per default and can
* only be hidden but not removed. The result will be stored
* in m_systemBookmarks.
*/
void createSystemBookmarks();
void initializeAvailableDevices();
/**
* @param index Item index related to the model.
* @return Corresponding index related to m_bookmarkedItems.
*/
int bookmarkIndex(int index) const;
/**
* Marks the item with the index \a index as hidden and
* removes it from the model so that it gets invisible.
*/
void hideItem(int index);
bool acceptBookmark(const KBookmark& bookmark) const;
QString internalMimeType() const;
......@@ -220,77 +189,41 @@ private:
static bool equalBookmarkIdentifiers(const KBookmark& b1, const KBookmark& b2);
/**
* @return URL using the timeline-protocol for searching (see convertedUrl()).
*/
static QUrl createTimelineUrl(const QUrl& url);
/**
* Helper method for createTimelineUrl().
* @return String that represents a date-path in the format that
* the timeline-protocol expects.
*/
static QString timelineDateString(int year, int month, int day = 0);
/**
* @return URL that can be listed by KIO and results in searching
* for a given term. The URL \a url represents a places-internal
* URL like e.g. "search:/documents" (see convertedUrl()).
*/
static QUrl createSearchUrl(const QUrl& url);
#ifdef HAVE_BALOO
/**
* Helper method for createSearchUrl()
* @return URL that can be listed by KIO and results in searching
* for the given type
* Appends the item \a item as last element of the group
* the item belongs to. If no item with the same group is
* present, the item gets appended as last element of the
* model. PlacesItemModel takes the ownership
* of the item.
*/
static QUrl searchUrlForType(const QString& type);
#endif
void insertSortedItem(PlacesItem* item);
#ifdef PLACESITEMMODEL_DEBUG
void showModelState();
#endif
PlacesItem *itemFromBookmark(const KBookmark &bookmark) const;
void addItemFromSourceModel(const QModelIndex &index);
void removeItemByIndex(const QModelIndex &mapToSource);
QString bookmarkId(const KBookmark &bookmark) const;
void initializeDefaultViewProperties() const;
int mapFromSource(const QModelIndex &index) const;
QModelIndex mapToSource(int row) const;
static void updateItem(PlacesItem *item, const QModelIndex &index);
private:
bool m_fileIndexingEnabled;
bool m_hiddenItemsShown;
QSet<QString> m_availableDevices;
Solid::Predicate m_predicate;
KBookmarkManager* m_bookmarkManager;
struct SystemBookmarkData
{
SystemBookmarkData(const QUrl& url,
const QString& icon,
const QString& text) :
url(url), icon(icon), text(text) {}
QUrl url;
QString icon;
QString text;
};
QList<SystemBookmarkData> m_systemBookmarks;
QHash<QUrl, int> m_systemBookmarksIndexes;
// Contains hidden and unhidden items that are stored as
// bookmark (the model itself only contains items that
// are shown in the view). If an entry is 0, then the
// places-item is part of the model. If an entry is not
// 0, the item is hidden and not part of the model.
QList<PlacesItem*> m_bookmarkedItems;
// Index of the hidden item that should be removed in
// removeHiddenItem(). The removing must be done
// asynchronously as in the scope of onItemChanged()
// removing an item is not allowed.
int m_hiddenItemToRemove;
Solid::StorageAccess *m_deviceToTearDown;
QTimer* m_updateBookmarksTimer;
QHash<QObject*, int> m_storageSetupInProgress;
QScopedPointer<KFilePlacesModel> m_sourceModel;
QVector<QPersistentModelIndex> m_indexMap;
};
#endif
......
......@@ -34,6 +34,7 @@
#include <KIO/DropJob>
#include <KIO/EmptyTrashJob>
#include <KIO/JobUiDelegate>
#include <KFilePlacesModel>
#include <KJobWidgets>
#include <KLocalizedString>
#include <KIconLoader>
......@@ -239,13 +240,11 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
if (action == editAction) {
editEntry(index);
} else if (action == removeAction) {
m_model->removeItem(index);
m_model->saveBookmarks();
m_model->deleteItem(index);
} else if (action == hideAction) {
item->setHidden(hideAction->isChecked());
m_model->saveBookmarks();
} else if (action == openInNewWindowAction) {
Dolphin::openNewWindow({PlacesItemModel::convertedUrl(m_model->data(index).value("url").toUrl())}, this);
Dolphin::openNewWindow({KFilePlacesModel::convertedUrl(m_model->data(index).value("url").toUrl())}, this);
} else if (action == openInNewTabAction) {
// TriggerItem does set up the storage first and then it will
// emit the slotItemMiddleClicked signal, because of Qt::MiddleButton.
......@@ -334,8 +333,8 @@ void PlacesPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
}
const PlacesItem* destItem = m_model->placesItem(index);
const PlacesItem::GroupType group = destItem->groupType();
if (group == PlacesItem::SearchForType || group == PlacesItem::RecentlySavedType) {
if (destItem->isSearchOrTimelineUrl()) {
return;
}
......@@ -396,7 +395,6 @@ void PlacesPanel::slotItemDropEventStorageSetupDone(int index, bool success)
void PlacesPanel::slotAboveItemDropEvent(int index, QGraphicsSceneDragDropEvent* event)
{
m_model->dropMimeDataBefore(index, event->mimeData());
m_model->saveBookmarks();
}
void PlacesPanel::slotUrlsDropped(const QUrl& dest, QDropEvent* event, QWidget* parent)
......@@ -456,9 +454,7 @@ void PlacesPanel::addEntry()
dialog->setAllowGlobal(true);
dialog->setUrl(url);
if (dialog->exec() == QDialog::Accepted) {
PlacesItem* item = m_model->createPlacesItem(dialog->text(), dialog->url(), dialog->icon());
m_model->appendItemToGroup(item);
m_model->saveBookmarks();
m_model->createPlacesItem(dialog->text(), dialog->url(), dialog->icon());
}
delete dialog;
......@@ -480,7 +476,7 @@ void PlacesPanel::editEntry(int index)
oldItem->setText(dialog->text());
oldItem->setUrl(dialog->url());
oldItem->setIcon(dialog->icon());
m_model->saveBookmarks();
m_model->refresh();
}
}
......@@ -517,9 +513,9 @@ void PlacesPanel::triggerItem(int index, Qt::MouseButton button)
const QUrl url = m_model->data(index).value("url").toUrl();
if (!url.isEmpty()) {
if (button == Qt::MiddleButton) {
emit placeMiddleClicked(PlacesItemModel::convertedUrl(url));
emit placeMiddleClicked(KFilePlacesModel::convertedUrl(url));
} else {
emit placeActivated(PlacesItemModel::convertedUrl(url));
emit placeActivated(KFilePlacesModel::convertedUrl(url));
}
}
}
......
......@@ -310,11 +310,9 @@ void DolphinSearchBox::slotSearchSaved()
if (searchURL.isValid()) {
PlacesItemModel model;
const QString label = i18n("Search for %1 in %2", text(), searchPath().fileName());
PlacesItem* item = model.createPlacesItem(label,
searchURL,
QStringLiteral("folder-saved-search-symbolic"));
model.appendItemToGroup(item);
model.saveBookmarks();
model.createPlacesItem(label,
searchURL,
QStringLiteral("folder-saved-search-symbolic"));
}
}
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment