]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/places/placesitemmodel.h
Build with QT_NO_KEYWORDS
[dolphin.git] / src / panels / places / placesitemmodel.h
index a50375a69a90063735a5dd08becc129eecda3dcd..cd4079a73a0adcd9ebe47d2d2ca9fae9a9e3d7eb 100644 (file)
@@ -1,80 +1,71 @@
-/***************************************************************************
- *   Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com>             *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
 
 #ifndef PLACESITEMMODEL_H
 #define PLACESITEMMODEL_H
 
-#include <config-nepomuk.h>
+#include "kitemviews/kstandarditemmodel.h"
 
-#include <kitemviews/kstandarditemmodel.h>
+#include <KFilePlacesModel>
+#include <Solid/Predicate>
+#include <Solid/StorageAccess>
 
-#include <KUrl>
 #include <QHash>
 #include <QList>
 #include <QSet>
-#include <Solid/Predicate>
+#include <QUrl>
 
-class KBookmarkManager;
+class KBookmark;
 class PlacesItem;
 class QAction;
 
-#ifdef HAVE_NEPOMUK
-    namespace Nepomuk
-    {
-        namespace Query
-        {
-            class Term;
-        }
-    }
-#endif
-
-#define PLACESITEMMODEL_DEBUG
-
 /**
  * @brief Model for maintaining the bookmarks of the places panel.
  *
- * It is compatible to the KFilePlacesModel from kdelibs but adds
- * the ability to have groups for places.
+ * It is based on KFilePlacesModel from KIO.
  */
 class PlacesItemModel: public KStandardItemModel
 {
     Q_OBJECT
 
 public:
-    explicit PlacesItemModel(QObject* parent = 0);
-    virtual ~PlacesItemModel();
+    explicit PlacesItemModel(QObject* parent = nullptr);
+    ~PlacesItemModel() override;
+
+    /**
+     * @brief Create a new place entry in the bookmark file
+     * and add it to the model
+     */
+    void createPlacesItem(const QString& text, const QUrl& url, const QString& iconName = {}, const QString& appName = {});
+    void createPlacesItem(const QString& text, const QUrl& url, const QString& iconName, const QString& appName, int after);
 
     PlacesItem* placesItem(int index) const;
 
+    /**
+     * @brief Mark an item as hidden
+     * @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
+     * stay marked as hidden, which is visually indicated
+     * by the view by desaturating the icon and the text.
+     */
     void setHiddenItemsShown(bool show);
     bool hiddenItemsShown() const;
 
-    int hiddenCount() const;
-
-    void setItemHidden(int index, bool hide);
-    bool isItemHidden(int index) const;
-
     /**
-     * @return True if the item is a default item created by
-     *         the system (e.g. the places for home, root, trash etc.)
+     * @return Number of items that are marked as hidden.
+     *         Note that this does not mean that the items
+     *         are really hidden
+     *         (see PlacesItemModel::setHiddenItemsShown()).
      */
-    bool isSystemItem(int index) const;
+    int hiddenCount() const;
 
     /**
      * Search the item which is equal to the URL or at least
@@ -83,113 +74,141 @@ public:
      * range of the URL. -1 is returned if no closest item
      * could be found.
      */
-    int closestItem(const KUrl& url) const;
-
-    /**
-     * @return Name of the group where the item with the URL
-     *         \a URL belongs to.
-     */
-    QString groupName(const KUrl& url) const;
+    int closestItem(const QUrl& url) const;
 
     QAction* ejectAction(int index) const;
-    QAction* tearDownAction(int index) const;
+    QAction* teardownAction(int index) const;
 
-protected:
-    virtual void onItemInserted(int index);
-    virtual void onItemRemoved(int index);
+    void requestEject(int index);
+    void requestTearDown(int index);
 
-private slots:
-    void slotDeviceAdded(const QString& udi);
-    void slotDeviceRemoved(const QString& udi);
+    bool storageSetupNeeded(int index) const;
+    void requestStorageSetup(int index);
 
-private:
-    void loadBookmarks();
+    QMimeData* createMimeData(const KItemSet& indexes) const override;
 
-    /**
-     * Helper method for loadBookmarks(): Adds the items
-     * to the model if the "isHidden"-property is false,
-     * otherwise the items get added to m_hiddenItems.
-     */
-    void addItems(const QList<PlacesItem*>& items);
+    bool supportsDropping(int index) const override;
+
+    void dropMimeDataBefore(int index, const QMimeData* mimeData);
 
     /**
-     * Creates system bookmarks that are shown per default and can
-     * only be hidden but not removed. The result will be stored
-     * in m_systemBookmarks.
+     * @return Converts the URL, which contains "virtual" URLs for system-items like
+     *         "search:/documents" into a Query-URL that will be handled by
+     *         the corresponding IO-slave. Virtual URLs for bookmarks are used to
+     *         be independent from internal format changes.
      */
-    void createSystemBookmarks();
+    static QUrl convertedUrl(const QUrl& url);
+
+    void clear() override;
 
-    void initializeAvailableDevices();
+    void proceedWithTearDown();
 
     /**
-     * @param index Item index related to the model.
-     * @return      Corresponding item index related to m_hiddenItems.
+     * @brief Remove item from bookmark
+     *
+     * This function remove the index from bookmark file permanently
+     *
+     * @param index - the item to be removed
      */
-    int hiddenIndex(int index) const;
+    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;
 
-    static QString placesGroupName();
-    static QString recentlyAccessedGroupName();
-    static QString searchForGroupName();
 
-    static KUrl translatedSystemBookmarkUrl(const KUrl& url);
+    KFilePlacesModel::GroupType groupType(int row) const;
+    bool isGroupHidden(KFilePlacesModel::GroupType type) const;
+    void setGroupHidden(KFilePlacesModel::GroupType type, bool hidden);
 
+Q_SIGNALS:
+    void errorMessage(const QString& message);
+    void storageSetupDone(int index, bool success);
+    void storageTearDownRequested(const QString& mountPath);
+    void storageTearDownExternallyRequested(const QString& mountPath);
+    void storageTearDownSuccessful();
+
+protected:
+    void onItemInserted(int index) override;
+    void onItemRemoved(int index, KStandardItem* removedItem) override;
+    void onItemChanged(int index, const QSet<QByteArray>& changedRoles) override;
+
+private Q_SLOTS:
+    void slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData);
+    void slotStorageSetupDone(Solid::ErrorType error, const QVariant& errorData, const QString& udi);
+
+    // 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);
+    void onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden);
+
+private:
     /**
-     * @return URL using the timeline-protocol for searching.
+     * Remove bookmarks created by the previous version of dolphin that are
+     * not valid anymore
      */
-    static KUrl createTimelineUrl(const KUrl& url);
+    void cleanupBookmarks();
 
     /**
-     * Helper method for createTimelineUrl().
-     * @return String that represents a date-path in the format that
-     *         the timeline-protocol expects.
+     * Loads the bookmarks from the bookmark-manager and creates items for
+     * the model or moves hidden items to m_bookmarkedItems.
      */
-    static QString timelineDateString(int year, int month, int day = 0);
+    void loadBookmarks();
+
+    QString internalMimeType() const;
 
     /**
-     * @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"
+     * @return Adjusted drop index which assures that the item is aligned
+     *         into the same group as specified by PlacesItem::groupType().
      */
-    static KUrl createSearchUrl(const KUrl& url);
+    int groupedDropIndex(int index, const PlacesItem* item) const;
 
-#ifdef HAVE_NEPOMUK
     /**
-     * Helper method for createSearchUrl().
-     * @return URL that can be listed by KIO and results in searching
-     *         for the given term.
+     * @return True if the bookmarks have the same identifiers. The identifier
+     *         is the unique "ID"-property in case if no UDI is set, otherwise
+     *         the UDI is used as identifier.
      */
-    static KUrl searchUrlForTerm(const Nepomuk::Query::Term& term);
-#endif
+    static bool equalBookmarkIdentifiers(const KBookmark& b1, const KBookmark& b2);
 
-#ifdef PLACESITEMMODEL_DEBUG
-    void showModelState();
-#endif
+    /**
+     * 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 insertSortedItem(PlacesItem* item);
+
+    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_nepomukRunning;
     bool m_hiddenItemsShown;
 
-    QSet<QString> m_availableDevices;
-    Solid::Predicate m_predicate;
-    KBookmarkManager* m_bookmarkManager;
-
-    struct SystemBookmarkData
-    {
-        SystemBookmarkData(const KUrl& url,
-                            const QString& icon,
-                            const QString& text,
-                            const QString& group) :
-            url(url), icon(icon), text(text), group(group) {}
-        KUrl url;
-        QString icon;
-        QString text;
-        QString group;
-    };
-
-    QList<SystemBookmarkData> m_systemBookmarks;
-    QHash<KUrl, int> m_systemBookmarksIndexes;
-
-    QList<PlacesItem*> m_hiddenItems;
+    Solid::StorageAccess *m_deviceToTearDown;
+
+    QHash<QObject*, int> m_storageSetupInProgress;
+
+    KFilePlacesModel *m_sourceModel;
+
+    QVector<QPersistentModelIndex> m_indexMap;
 };
 
 #endif