]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.h
On middle-click, open file with the second application for the file mime
[dolphin.git] / src / views / dolphinview.h
index da74011a7215423d88d6784b761fd70d3ba0d99c..f851724c238a8bccda45dd703dcb90f798e51d8c 100644 (file)
@@ -1,56 +1,45 @@
-/***************************************************************************
- *   Copyright (C) 2006-2009 by Peter Penz <peter.penz19@gmail.com>        *
- *   Copyright (C) 2006 by Gregor Kališnik <gregor@podnapisi.net>          *
- *                                                                         *
- *   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: 2006-2009 Peter Penz <peter.penz19@gmail.com>
+ * SPDX-FileCopyrightText: 2006 Gregor Kališnik <gregor@podnapisi.net>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
 
 #ifndef DOLPHINVIEW_H
 #define DOLPHINVIEW_H
 
-#include <config-nepomuk.h>
+#include "dolphin_export.h"
+#include "dolphintabwidget.h"
+#include "tooltips/tooltipmanager.h"
 
-#include "libdolphin_export.h"
-
-#include <kparts/part.h>
+#include "config-dolphin.h"
 #include <KFileItem>
-#include <KFileItemDelegate>
-#include <kio/fileundomanager.h>
 #include <KIO/Job>
+#include <kio/fileundomanager.h>
+#include <kparts/part.h>
 
-#include <QBoxLayout>
-#include <QKeyEvent>
-#include <QLinkedList>
-#include <QSet>
+#include <QMimeData>
+#include <QPointer>
+#include <QUrl>
 #include <QWidget>
 
-typedef KIO::FileUndoManager::CommandType CommandType;
+#include <memory>
 
-class DolphinDirLister;
-class DolphinItemListContainer;
-class KAction;
-class KActionCollection;
+typedef KIO::FileUndoManager::CommandType CommandType;
+class QVBoxLayout;
+class DolphinItemListView;
 class KFileItemModel;
+class KItemListContainer;
 class KItemModelBase;
-class KUrl;
+class KItemSet;
 class ToolTipManager;
 class VersionControlObserver;
 class ViewProperties;
+class QLabel;
 class QGraphicsSceneDragDropEvent;
-class QRegExp;
+class QHelpEvent;
+class QProxyStyle;
+class QRegularExpression;
 
 /**
  * @short Represents a view for the directory content.
@@ -63,7 +52,7 @@ class QRegExp;
  * - show previews
  * - enable grouping
  */
-class LIBDOLPHINPRIVATE_EXPORT DolphinView : public QWidget
+class DOLPHIN_EXPORT DolphinView : public QWidget
 {
     Q_OBJECT
 
@@ -73,8 +62,7 @@ public:
      * view mode is automatically updated if the directory itself
      * defines a view mode (see class ViewProperties for details).
      */
-    enum Mode
-    {
+    enum Mode {
         /**
          * The items are shown as icons with a name-label below.
          */
@@ -93,48 +81,19 @@ public:
         CompactView
     };
 
-    /** Defines the sort order for the items of a directory. */
-    enum Sorting
-    {
-        SortByName = 0,
-        SortBySize,
-        SortByDate,
-        SortByPermissions,
-        SortByOwner,
-        SortByGroup,
-        SortByType,
-        SortByDestination,
-        SortByPath
-    };
-
-    /** Defines the additional information shown for the items of a directory. */
-    enum AdditionalInfo
-    {
-        NoInfo = 0,
-        NameInfo,
-        SizeInfo,
-        DateInfo,
-        PermissionsInfo,
-        OwnerInfo,
-        GroupInfo,
-        TypeInfo,
-        DestinationInfo,
-        PathInfo
-    };
-
     /**
      * @param url              Specifies the content which should be shown.
      * @param parent           Parent widget of the view.
      */
-    DolphinView(const KUrl& url, QWidget* parent);
+    DolphinView(const QUrl &url, QWidget *parent);
 
-    virtual ~DolphinView();
+    ~DolphinView() override;
 
     /**
      * Returns the current active URL, where all actions are applied.
      * The URL navigator is synchronized with this URL.
      */
-    KUrl url() const;
+    QUrl url() const;
 
     /**
      * If \a active is true, the view will marked as active. The active
@@ -149,23 +108,52 @@ public:
      * (GeneralSettings::globalViewProps() returns false), then the
      * changed view mode will be stored automatically.
      */
-    void setMode(Mode mode);
-    Mode mode() const;
+    void setViewMode(Mode mode);
+    Mode viewMode() const;
 
-    /** See setPreviewsShown */
+    /**
+     * Enables or disables a mode for quick and easy selection of items.
+     */
+    void setSelectionModeEnabled(bool enabled);
+    bool selectionMode() const;
+
+    /**
+     * Turns on the file preview for the all files of the current directory,
+     * if \a show is true.
+     * If the view properties should be remembered for each directory
+     * (GeneralSettings::globalViewProps() returns false), then the
+     * preview setting will be stored automatically.
+     */
+    void setPreviewsShown(bool show);
     bool previewsShown() const;
 
-    /** See setShowHiddenFiles */
+    /**
+     * Shows all hidden files of the current directory,
+     * if \a show is true.
+     * If the view properties should be remembered for each directory
+     * (GeneralSettings::globalViewProps() returns false), then the
+     * show hidden file setting will be stored automatically.
+     */
+    void setHiddenFilesShown(bool show);
     bool hiddenFilesShown() const;
 
-    /** See setCategorizedSorting */
-    bool categorizedSorting() const;
+    /**
+     * Turns on sorting by groups if \a enable is true.
+     */
+    void setGroupedSorting(bool grouped);
+    bool groupedSorting() const;
 
     /**
      * Returns the items of the view.
      */
     KFileItemList items() const;
 
+    /**
+     * @return The number of items. itemsCount() is faster in comparison
+     *         to items().count().
+     */
+    int itemsCount() const;
+
     /**
      * Returns the selected items. The list is empty if no item has been
      * selected.
@@ -184,19 +172,25 @@ public:
      * gets selected if no loading of a directory has been triggered
      * by DolphinView::setUrl() or DolphinView::reload().
      */
-    void markUrlsAsSelected(const QList<KUrl>& urls);
+    void markUrlsAsSelected(const QList<QUrl> &urls);
 
     /**
-     * Marks the item indicated by \p url as the current item after the
-     * directory DolphinView::url() has been loaded.
+     * Marks the item indicated by \p url to be scrolled to and as the
+     * current item after directory DolphinView::url() has been loaded.
      */
-    void markUrlAsCurrent(const KUrl& url);
+    void markUrlAsCurrent(const QUrl &url);
 
     /**
-     * All items that match to the pattern \a pattern will get selected
-     * if \a enabled is true and deselected if  \a enabled is false.
+     * All items that match the regular expression \a regexp will get selected
+     * if \a enabled is true and deselected if \a enabled is false.
+     *
+     * Note that to match the whole string the pattern should be anchored:
+     * - you can anchor the pattern with QRegularExpression::anchoredPattern()
+     * - if you use QRegularExpresssion::wildcardToRegularExpression(), don't use
+     *   QRegularExpression::anchoredPattern() as the former already returns an
+     *   anchored pattern
      */
-    void setItemSelectionEnabled(const QRegExp& pattern, bool enabled);
+    void selectItems(const QRegularExpression &regexp, bool enabled);
 
     /**
      * Sets the zoom level to \a level. It is assured that the used
@@ -207,81 +201,70 @@ public:
     int zoomLevel() const;
 
     /**
-     * Returns true, if zooming in is possible. If false is returned,
-     * the maximum zooming level has been reached.
-     */
-    bool isZoomInPossible() const;
-
-    /**
-     * Returns true, if zooming out is possible. If false is returned,
-     * the minimum zooming level has been reached.
+     * Resets the view's icon size to the default value
      */
-    bool isZoomOutPossible() const;
+    void resetZoomLevel();
 
-    /** Sets the sorting criterion (e.g., SortByName, SortBySize,...) of the items inside a directory (see DolphinView::Sorting). */
-    void setSorting(Sorting sorting);
+    void setSortRole(const QByteArray &role);
+    QByteArray sortRole() const;
 
-    /** Returns the sorting criterion (e.g., SortByName, SortBySize,...) of the items inside a directory (see DolphinView::Sorting). */
-    Sorting sorting() const;
-
-    /** Sets the sort order (Qt::Ascending or Qt::Descending) for the items. */
     void setSortOrder(Qt::SortOrder order);
-
-    /** Returns the currently used sort order (Qt::Ascending or Qt::Descending). */
     Qt::SortOrder sortOrder() const;
 
     /** Sets a separate sorting with folders first (true) or a mixed sorting of files and folders (false). */
     void setSortFoldersFirst(bool foldersFirst);
-
-    /** Returns if files and folders are sorted separately or not. */
     bool sortFoldersFirst() const;
 
+    /** Sets a separate sorting with hidden files and folders last (true) or not (false). */
+    void setSortHiddenLast(bool hiddenLast);
+    bool sortHiddenLast() const;
+
     /** Sets the additional information which should be shown for the items. */
-    void setAdditionalInfoList(const QList<AdditionalInfo>& info);
+    void setVisibleRoles(const QList<QByteArray> &roles);
 
     /** Returns the additional information which should be shown for the items. */
-    QList<AdditionalInfo> additionalInfoList() const;
+    QList<QByteArray> visibleRoles() const;
 
-    /** Reloads the current directory. */
-    void reload();
-
-    void stopLoading();
+    /**
+     * Refreshes the view to get synchronized with the settings (e.g. icons size,
+     * font, ...).
+     */
+    void readSettings();
 
     /**
-     * Refreshes the view to get synchronized with the (updated) Dolphin settings.
-     * This method only needs to get invoked if the view settings for the Icons View,
-     * Details View or Columns View have been changed.
+     * Saves the current settings (e.g. icons size, font, ..).
      */
-    void refresh();
+    void writeSettings();
 
     /**
      * Filters the currently shown items by \a nameFilter. All items
      * which contain the given filter string will be shown.
      */
-    void setNameFilter(const QStringnameFilter);
+    void setNameFilter(const QString &nameFilter);
     QString nameFilter() const;
 
     /**
-     * Calculates the number of currently shown files into
-     * \a fileCount and the number of folders into \a folderCount.
-     * The size of all files is written into \a totalFileSize.
-     * It is recommend using this method instead of asking the
-     * directory lister or the model directly, as it takes
-     * filtering and hierarchical previews into account.
+     * Filters the currently shown items by \a filters. All items
+     * whose content-type matches those given by the list of filters
+     * will be shown.
      */
-    void calculateItemCount(int& fileCount, int& folderCount, KIO::filesize_t& totalFileSize) const;
+    void setMimeTypeFilters(const QStringList &filters);
+    QStringList mimeTypeFilters() const;
 
     /**
-     * Returns a textual representation of the state of the current
+     * Tells the view to generate an updated status bar text. The result
+     * is returned through the statusBarTextChanged(QString statusBarText) signal.
+     * It will carry a textual representation of the state of the current
      * folder or selected items, suitable for use in the status bar.
+     * Any pending requests of status bar text are killed.
      */
-    QString statusBarText() const;
+    void requestStatusBarText();
 
     /**
      * Returns the version control actions that are provided for the items \p items.
      * Usually the actions are presented in the context menu.
      */
-    QList<QAction*> versionControlActions(const KFileItemList& items) const;
+    QList<QAction *> versionControlActions(const KFileItemList &items) const;
 
     /**
      * Returns the state of the paste action:
@@ -305,32 +288,71 @@ public:
      */
     bool itemsExpandable() const;
 
+    /**
+     * @returns true if the @p item is one of the items() of this view and
+     * is currently expanded. false otherwise.
+     * Only directories in view modes that allow expanding can ever be expanded.
+     */
+    bool isExpanded(const KFileItem &item) const;
+
     /**
      * Restores the view state (current item, contents position, details view expansion state)
      */
-    void restoreState(QDataStreamstream);
+    void restoreState(QDataStream &stream);
 
     /**
      * Saves the view state (current item, contents position, details view expansion state)
      */
-    void saveState(QDataStream& stream);
-
-    /** Returns true, if at least one item is selected. */
-    bool hasSelection() const;
+    void saveState(QDataStream &stream);
 
     /**
-     * Returns the root item which represents the current URL. Note that the returned
-     * item can be null (KFileItem::isNull() will return true) in case that the directory
-     * has not been loaded.
+     * Returns the root item which represents the current URL.
      */
     KFileItem rootItem() const;
 
-public slots:
+    /**
+     * Sets a context that is used for remembering the view-properties.
+     * Per default the context is empty and the path of the currently set URL
+     * is used for remembering the view-properties. Setting a custom context
+     * makes sense if specific types of URLs (e.g. search-URLs) should
+     * share common view-properties.
+     */
+    void setViewPropertiesContext(const QString &context);
+    QString viewPropertiesContext() const;
+
+    /**
+     * Checks if the given \a item can be opened as folder (e.g. archives).
+     * This function will also adjust the \a url (e.g. change the protocol).
+     * @return a valid and adjusted url if the item can be opened as folder,
+     * otherwise return an empty url.
+     */
+    static QUrl openItemAsFolderUrl(const KFileItem &item, const bool browseThroughArchives = true);
+
+    /**
+     * Hides tooltip displayed over element.
+     */
+    void hideToolTip(const ToolTipManager::HideBehavior behavior = ToolTipManager::HideBehavior::Later);
+
+    /**
+     * Check if the space key should be handled as a normal key, even if it's
+     * used as a keyboard shortcut.
+     *
+     * See BUG 465489
+     */
+    bool handleSpaceAsNormalKey() const;
+
+    /** Activates the view if the item list container gets focus. */
+    bool eventFilter(QObject *watched, QEvent *event) override;
+
+public Q_SLOTS:
+
+    void reload();
+
     /**
      * Changes the directory to \a url. If the current directory is equal to
      * \a url, nothing will be done (use DolphinView::reload() instead).
      */
-    void setUrl(const KUrl& url);
+    void setUrl(const QUrl &url);
 
     /**
      * Selects all items.
@@ -367,10 +389,20 @@ public slots:
      * Copies all selected items to the clipboard and marks
      * the items as cut.
      */
-    void cutSelectedItems();
+    void cutSelectedItemsToClipboard();
 
     /** Copies all selected items to the clipboard. */
-    void copySelectedItems();
+    void copySelectedItemsToClipboard();
+
+    /**
+     * Copies all selected items to @p destinationUrl.
+     */
+    void copySelectedItems(const KFileItemList &selection, const QUrl &destinationUrl);
+
+    /**
+     * Moves all selected items to @p destinationUrl.
+     */
+    void moveSelectedItems(const KFileItemList &selection, const QUrl &destinationUrl);
 
     /** Pastes the clipboard data to this view. */
     void paste();
@@ -383,52 +415,54 @@ public slots:
     void pasteIntoFolder();
 
     /**
-     * Turns on the file preview for the all files of the current directory,
-     * if \a show is true.
-     * If the view properties should be remembered for each directory
-     * (GeneralSettings::globalViewProps() returns false), then the
-     * preview setting will be stored automatically.
+     * Copies the path of the first selected KFileItem into Clipboard.
      */
-    void setPreviewsShown(bool show);
+    void copyPathToClipboard();
 
     /**
-     * Shows all hidden files of the current directory,
-     * if \a show is true.
-     * If the view properties should be remembered for each directory
-     * (GeneralSettings::globalViewProps() returns false), then the
-     * show hidden file setting will be stored automatically.
+     * Creates duplicates of selected items, appending "copy"
+     * to the end.
      */
-    void setHiddenFilesShown(bool show);
+    void duplicateSelectedItems();
 
     /**
-     * Summarizes all sorted items by their category \a categorized
-     * is true.
-     * If the view properties should be remembered for each directory
-     * (GeneralSettings::globalViewProps() returns false), then the
-     * categorized sorting setting will be stored automatically.
+     * Handles a drop of @p dropEvent onto widget @p dropWidget and destination @p destUrl
      */
-    void setCategorizedSorting(bool categorized);
+    void dropUrls(const QUrl &destUrl, QDropEvent *dropEvent, QWidget *dropWidget);
+
+    void stopLoading();
 
-signals:
     /**
-     * Is emitted if the view has been activated by e. g. a mouse click.
+     * Applies the state that has been restored by restoreViewState()
+     * to the view.
      */
-    void activated();
+    void updateViewState();
 
+Q_SIGNALS:
     /**
-     * Is emitted if the URL of the view will be changed to \a url.
-     * After the URL has been changed the signal urlChanged() will
-     * be emitted.
+     * Is emitted if the view has been activated by e. g. a mouse click.
      */
-    void urlAboutToBeChanged(const KUrl& url);
+    void activated();
 
     /** Is emitted if the URL of the view has been changed to \a url. */
-    void urlChanged(const KUrl& url);
+    void urlChanged(const QUrl &url);
 
     /**
      * Is emitted when clicking on an item with the left mouse button.
      */
-    void itemActivated(const KFileItem& item);
+    void itemActivated(const KFileItem &item);
+
+    /**
+     * Is emitted when clicking on a file with the middle mouse button.
+     * @note: This will not be emitted for folders or file archives that will/can be opened like folders.
+     */
+    void fileMiddleClickActivated(const KFileItem &item);
+
+    /**
+     * Is emitted when multiple items have been activated by e. g.
+     * context menu open with.
+     */
+    void itemsActivated(const KFileItemList &items);
 
     /**
      * Is emitted if items have been added or deleted.
@@ -438,7 +472,17 @@ signals:
     /**
      * Is emitted if a new tab should be opened for the URL \a url.
      */
-    void tabRequested(const KUrl& url);
+    void tabRequested(const QUrl &url);
+
+    /**
+     * Is emitted if a new tab should be opened for the URL \a url and set as active.
+     */
+    void activeTabRequested(const QUrl &url);
+
+    /**
+     * Is emitted if a new window should be opened for the URL \a url.
+     */
+    void windowRequested(const QUrl &url);
 
     /**
      * Is emitted if the view mode (IconsView, DetailsView,
@@ -452,21 +496,32 @@ signals:
     /** Is emitted if the 'show hidden files' property has been changed. */
     void hiddenFilesShownChanged(bool shown);
 
-    /** Is emitted if the 'categorized sorting' property has been changed. */
-    void categorizedSortingChanged(bool sortCategorized);
+    /** Is emitted if the 'grouped sorting' property has been changed. */
+    void groupedSortingChanged(bool groupedSorting);
+
+    /** Is emitted in reaction to a requestStatusBarText() call.
+     * @see requestStatusBarText() */
+    void statusBarTextChanged(QString statusBarText);
 
     /** Is emitted if the sorting by name, size or date has been changed. */
-    void sortingChanged(DolphinView::Sorting sorting);
+    void sortRoleChanged(const QByteArray &role);
 
     /** Is emitted if the sort order (ascending or descending) has been changed. */
     void sortOrderChanged(Qt::SortOrder order);
 
-    /** Is emitted if the sorting of files and folders (separate with folders first or mixed) has been changed. */
+    /**
+     * Is emitted if the sorting of files and folders (separate with folders
+     * first or mixed) has been changed.
+     */
     void sortFoldersFirstChanged(bool foldersFirst);
 
+    /**
+     * Is emitted if the sorting of hidden files has been changed.
+     */
+    void sortHiddenLastChanged(bool hiddenLast);
+
     /** Is emitted if the additional information shown for this view has been changed. */
-    void additionalInfoListChanged(const QList<DolphinView::AdditionalInfo>& current,
-                                   const QList<DolphinView::AdditionalInfo>& previous);
+    void visibleRolesChanged(const QList<QByteArray> &current, const QList<QByteArray> &previous);
 
     /** Is emitted if the zoom level has been changed by zooming in or out. */
     void zoomLevelChanged(int current, int previous);
@@ -475,72 +530,81 @@ signals:
      * Is emitted if information of an item is requested to be shown e. g. in the panel.
      * If item is null, no item information request is pending.
      */
-    void requestItemInfo(const KFileItemitem);
+    void requestItemInfo(const KFileItem &item);
 
     /**
      * Is emitted whenever the selection has been changed.
      */
-    void selectionChanged(const KFileItemListselection);
+    void selectionChanged(const KFileItemList &selection);
 
     /**
      * Is emitted if a context menu is requested for the item \a item,
      * which is part of \a url. If the item is null, the context menu
-     * for the URL should be shown and the custom actions \a customActions
-     * will be added.
+     * for the URL should be shown.
      */
-    void requestContextMenu(const KFileItem& item,
-                            const KUrl& url,
-                            const QList<QAction*>& customActions);
+    void requestContextMenu(const QPoint &pos, const KFileItem &item, const KFileItemList &selectedItems, const QUrl &url);
 
     /**
      * Is emitted if an information message with the content \a msg
      * should be shown.
      */
-    void infoMessage(const QStringmsg);
+    void infoMessage(const QString &msg);
 
     /**
      * Is emitted if an error message with the content \a msg
      * should be shown.
      */
-    void errorMessage(const QStringmsg);
+    void errorMessage(const QString &msg);
 
     /**
      * Is emitted if an "operation completed" message with the content \a msg
      * should be shown.
      */
-    void operationCompletedMessage(const QStringmsg);
+    void operationCompletedMessage(const QString &msg);
 
     /**
      * Is emitted after DolphinView::setUrl() has been invoked and
-     * the path \a url is currently loaded. If this signal is emitted,
+     * the current directory is loaded. If this signal is emitted,
      * it is assured that the view contains already the correct root
      * URL and property settings.
      */
-    void startedPathLoading(const KUrl& url);
+    void directoryLoadingStarted();
 
     /**
-     * Is emitted after the path triggered by DolphinView::setUrl()
+     * Is emitted after the directory triggered by DolphinView::setUrl()
      * has been loaded.
      */
-    void finishedPathLoading(const KUrl& url);
+    void directoryLoadingCompleted();
+
+    /**
+     * Is emitted after the directory loading triggered by DolphinView::setUrl()
+     * has been canceled.
+     */
+    void directoryLoadingCanceled();
 
     /**
      * Is emitted after DolphinView::setUrl() has been invoked and provides
-     * the information how much percent of the current path have been loaded.
+     * the information how much percent of the current directory have been loaded.
      */
-    void pathLoadingProgress(int percent);
+    void directoryLoadingProgress(int percent);
 
     /**
-     * Is emitted if the DolphinView::setUrl() is invoked but the URL is not
-     * a directory.
+     * Is emitted if the sorting is done asynchronously and provides the
+     * progress information of the sorting.
      */
-    void urlIsFileError(const KUrl& file);
+    void directorySortingProgress(int percent);
 
     /**
-     * Emitted when KDirLister emits redirection.
+     * Emitted when the file-item-model emits redirection.
      * Testcase: fish://localhost
      */
-    void redirection(const KUrl& oldUrl, const KUrl& newUrl);
+    void redirection(const QUrl &oldUrl, const QUrl &newUrl);
+
+    /**
+     * Is emitted when the URL set by DolphinView::setUrl() represents a file.
+     * In this case no signal errorMessage() will be emitted.
+     */
+    void urlIsFileError(const QUrl &url);
 
     /**
      * Is emitted when the write state of the folder has been changed. The application
@@ -549,12 +613,53 @@ signals:
      */
     void writeStateChanged(bool isFolderWritable);
 
+    /**
+     * Is emitted if the URL should be changed to the previous URL of the
+     * history (e.g. because the "back"-mousebutton has been pressed).
+     */
+    void goBackRequested();
+
+    /**
+     * Is emitted if the URL should be changed to the next URL of the
+     * history (e.g. because the "next"-mousebutton has been pressed).
+     */
+    void goForwardRequested();
+
+    /**
+     * Used to request either entering or leaving of selection mode
+     * Entering is typically requested on press and hold.
+     * Leaving by pressing Escape when no item is selected.
+     */
+    void selectionModeChangeRequested(bool enabled);
+
+    /**
+     * Is emitted when the user wants to move the focus to another view.
+     */
+    void toggleActiveViewRequested();
+
+    /**
+     * Is emitted when the user clicks a tag or a link
+     * in the metadata widget of a tooltip.
+     */
+    void urlActivated(const QUrl &url);
+
+    void goUpRequested();
+
+    void fileItemsChanged(const KFileItemList &changedFileItems);
+
+    /**
+     * Emitted when the current directory of the model was removed.
+     */
+    void currentDirectoryRemoved();
+
 protected:
-    virtual void mouseReleaseEvent(QMouseEvent* event);
-    virtual void contextMenuEvent(QContextMenuEvent* event);
-    virtual void wheelEvent(QWheelEvent* event);
+    /** Changes the zoom level if Control is pressed during a wheel event. */
+    void wheelEvent(QWheelEvent *event) override;
+
+    void hideEvent(QHideEvent *event) override;
+    bool event(QEvent *event) override;
 
-private slots:
+private Q_SLOTS:
     /**
      * Marks the view as active (DolphinView:isActive() will return true)
      * and emits the 'activated' signal if it is not already active.
@@ -562,13 +667,33 @@ private slots:
     void activate();
 
     void slotItemActivated(int index);
+    void slotItemsActivated(const KItemSet &indexes);
     void slotItemMiddleClicked(int index);
-    void slotContextMenuRequested(int index, const QPointF& pos);
-    void slotItemExpansionToggleClicked(int index);
+    void slotItemContextMenuRequested(int index, const QPointF &pos);
+    void slotViewContextMenuRequested(const QPointF &pos);
+    void slotHeaderContextMenuRequested(const QPointF &pos);
+    void slotHeaderColumnWidthChangeFinished(const QByteArray &role, qreal current);
+    void slotSidePaddingWidthChanged(qreal width);
     void slotItemHovered(int index);
     void slotItemUnhovered(int index);
-    void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
-    void slotModelChanged(KItemModelBase* current, KItemModelBase* previous);
+    void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent *event);
+    void slotModelChanged(KItemModelBase *current, KItemModelBase *previous);
+    void slotMouseButtonPressed(int itemIndex, Qt::MouseButtons buttons);
+    void slotRenameDialogRenamingFinished(const QList<QUrl> &urls);
+    void slotSelectedItemTextPressed(int index);
+    void slotItemCreatedFromJob(KIO::Job *, const QUrl &, const QUrl &to);
+    void slotIncreaseZoom();
+    void slotDecreaseZoom();
+    void slotSwipeUp();
+
+    /*
+     * Is called when new items get pasted or dropped.
+     */
+    void slotItemCreated(const QUrl &url);
+    /*
+     * Is called after all pasted or dropped items have been copied to destination.
+     */
+    void slotJobResult(KJob *job);
 
     /**
      * Emits the signal \a selectionChanged() with a small delay. This is
@@ -577,7 +702,7 @@ private slots:
      * the signal is emitted only after no selection change has been done
      * within a small delay.
      */
-    void slotSelectionChanged(const QSet<int>& current, const QSet<int>& previous);
+    void slotSelectionChanged(const KItemSet &current, const KItemSet &previous);
 
     /**
      * Is called by emitDelayedSelectionChangedSignal() and emits the
@@ -586,26 +711,19 @@ private slots:
     void emitSelectionChangedSignal();
 
     /**
-     * Opens the context menu on position \a pos. The position
-     * is used to check whether the context menu is related to an
-     * item or to the viewport.
+     * Helper method for DolphinView::requestStatusBarText().
+     * Calculates the amount of folders and files and their total size in
+     * response to a KStatJob::result(), then calls emitStatusBarText().
+     * @see requestStatusBarText()
+     * @see emitStatusBarText()
      */
-    void openContextMenu(const QPoint& pos, const QList<QAction*>& customActions);
-
-    /**
-     * Drops dragged URLs to the destination path \a destPath. If
-     * the URLs are dropped above an item inside the destination path,
-     * the item is indicated by \a destItem.
-     */
-    void dropUrls(const KFileItem& destItem,
-                  const KUrl& destPath,
-                  QDropEvent* event);
+    void slotStatJobResult(KJob *job);
 
     /**
      * Updates the view properties of the current URL to the
-     * sorting given by \a sorting.
+     * sorting given by \a role.
      */
-    void updateSorting(DolphinView::Sorting sorting);
+    void updateSortRole(const QByteArray &role);
 
     /**
      * Updates the view properties of the current URL to the
@@ -620,119 +738,142 @@ private slots:
     void updateSortFoldersFirst(bool foldersFirst);
 
     /**
-     * Updates the status bar to show hover information for the
-     * item \a item. If currently other items are selected,
-     * no hover information is shown.
-     * @see DolphinView::clearHoverInformation()
+     * Updates the view properties of the current URL to the
+     * sorting of hidden files given by \a hiddenLast.
      */
-    void showHoverInformation(const KFileItem& item);
+    void updateSortHiddenLast(bool hiddenLast);
 
     /**
-     * Clears the hover information shown in the status bar.
-     * @see DolphinView::showHoverInformation().
+     * Indicates in the status bar that the delete operation
+     * of the job \a job has been finished.
      */
-    void clearHoverInformation();
+    void slotDeleteFileFinished(KJob *job);
 
     /**
-     * Indicates in the status bar that the delete operation
+     * Indicates in the status bar that the trash operation
      * of the job \a job has been finished.
      */
-    void slotDeleteFileFinished(KJob* job);
+    void slotTrashFileFinished(KJob *job);
+
+    /**
+     * Invoked when the rename job is done, for error handling.
+     */
+    void slotRenamingResult(KJob *job);
+
+    /**
+     * Invoked when the file item model has started the loading
+     * of the directory specified by DolphinView::url().
+     */
+    void slotDirectoryLoadingStarted();
+
+    /**
+     * Invoked when the file item model indicates that the loading of a directory has
+     * been completed. Assures that pasted items and renamed items get selected.
+     */
+    void slotDirectoryLoadingCompleted();
+
+    /**
+     * Invoked when the file item model indicates that the loading of a directory has
+     * been canceled.
+     */
+    void slotDirectoryLoadingCanceled();
+
+    /**
+     * Is invoked when items of KFileItemModel have been changed.
+     */
+    void slotItemsChanged();
 
     /**
-     * Invoked when the directory lister has been started the
-     * loading of \a url.
+     * Is invoked when the sort order has been changed by the user by clicking
+     * on a header item. The view properties of the directory will get updated.
      */
-    void slotDirListerStarted(const KUrl& url);
+    void slotSortOrderChangedByHeader(Qt::SortOrder current, Qt::SortOrder previous);
 
     /**
-     * Invoked when the file item model indicates that the directory lister has completed the loading
-     * of items, and that expanded folders have been restored (if the view mode is 'Details', and the
-     * view state is restored after navigating back or forward in history). Assures that pasted items
-     * and renamed items get seleced.
+     * Is invoked when the sort role has been changed by the user by clicking
+     * on a header item. The view properties of the directory will get updated.
      */
-    void slotLoadingCompleted();
+    void slotSortRoleChangedByHeader(const QByteArray &current, const QByteArray &previous);
 
     /**
-     * Is invoked when the KDirLister indicates refreshed items.
+     * Is invoked when the visible roles have been changed by the user by dragging
+     * a header item. The view properties of the directory will get updated.
      */
-    void slotRefreshItems();
+    void slotVisibleRolesChangedByHeader(const QList<QByteArray> &current, const QList<QByteArray> &previous);
+
+    void slotRoleEditingCanceled();
+    void slotRoleEditingFinished(int index, const QByteArray &role, const QVariant &value);
 
     /**
      * Observes the item with the URL \a url. As soon as the directory
      * model indicates that the item is available, the item will
      * get selected and it is assured that the item stays visible.
-     *
-     * @see selectAndScrollToCreatedItem()
      */
-    void observeCreatedItem(const KUrl& url);
+    void observeCreatedItem(const QUrl &url);
 
     /**
-     * Selects and scrolls to the item that got observed
-     * by observeCreatedItem().
+     * Selects the next item after prev selection deleted/trashed
      */
-    void selectAndScrollToCreatedItem();
+    void selectNextItem();
 
     /**
      * Called when a redirection happens.
      * Testcase: fish://localhost
      */
-    void slotRedirection(const KUrl& oldUrl, const KUrl& newUrl);
+    void slotDirectoryRedirection(const QUrl &oldUrl, const QUrl &newUrl);
 
-    /**
-     * Applies the state that has been restored by restoreViewState()
-     * to the view.
-     */
-    void updateViewState();
-
-    //void slotUrlChangeRequested(const KUrl& url);
+    void slotTwoClicksRenamingTimerTimeout();
 
 private:
-    KFileItemModel* fileItemModel() const;
-
-    void loadDirectory(const KUrl& url, bool reload = false);
+    void loadDirectory(const QUrl &url, bool reload = false);
 
     /**
      * Applies the view properties which are defined by the current URL
-     * to the DolphinView properties.
+     * to the DolphinView properties. The view properties are read from a
+     * .directory file either in the current directory, or in the
+     * share/apps/dolphin/view_properties/ subfolder of the user's .kde folder.
      */
     void applyViewProperties();
 
-    void applyAdditionalInfoListToView();
+    /**
+     * Applies the given view properties to the DolphinView.
+     */
+    void applyViewProperties(const ViewProperties &props);
 
     /**
-     * Helper method for DolphinView::paste() and DolphinView::pasteIntoFolder().
-     * Pastes the clipboard data into the URL \a url.
+     * Applies the m_mode property to the corresponding
+     * itemlayout-property of the KItemListView.
      */
-    void pasteToUrl(const KUrl& url);
+    void applyModeToView();
 
+    enum Selection { HasSelection, NoSelection };
     /**
-     * Checks whether the current item view has the same zoom level
-     * as \a oldZoomLevel. If this is not the case, the zoom level
-     * of the controller is updated and a zoomLevelChanged() signal
-     * is emitted.
+     * Helper method for DolphinView::requestStatusBarText().
+     * Generates the status bar text from the parameters and
+     * then emits statusBarTextChanged().
+     * @param totalFileSize the sum of the sizes of the files
+     * @param selection     if HasSelection is passed, the emitted status bar text will say
+     *                      that the folders and files which are counted here are selected.
      */
-    void updateZoomLevel(int oldZoomLevel);
+    void emitStatusBarText(const int folderCount, const int fileCount, KIO::filesize_t totalFileSize, const Selection selection);
+
+    /**
+     * Helper method for DolphinView::paste() and DolphinView::pasteIntoFolder().
+     * Pastes the clipboard data into the URL \a url.
+     */
+    void pasteToUrl(const QUrl &url);
 
     /**
      * Returns a list of URLs for all selected items. The list is
      * simplified, so that when the URLs are part of different tree
      * levels, only the parent is returned.
      */
-    KUrl::List simplifiedSelectedUrls() const;
+    QList<QUrl> simplifiedSelectedUrls() const;
 
     /**
      * Returns the MIME data for all selected items.
      */
-    QMimeData* selectionMimeData() const;
-
-    /**
-     * Is invoked after a paste operation or a drag & drop
-     * operation and URLs from \a mimeData as selected.
-     * This allows to select all newly pasted
-     * items in restoreViewState().
-     */
-    void markPastedUrlsAsSelected(const QMimeData* mimeData);
+    QMimeData *selectionMimeData() const;
 
     /**
      * Updates m_isFolderWritable dependent on whether the folder represented by
@@ -741,38 +882,92 @@ private:
      */
     void updateWritableState();
 
-    QByteArray sortRoleForSorting(Sorting sorting) const;
-    Sorting sortingForSortRole(const QByteArray& sortRole) const;
+    /**
+     * @return The current URL if no viewproperties-context is given (see
+     *         DolphinView::viewPropertiesContext(), otherwise the context
+     *         is returned.
+     */
+    QUrl viewPropertiesUrl() const;
 
-private:
-    bool m_active : 1;
-    bool m_tabsForFiles : 1;
-    bool m_assureVisibleCurrentIndex : 1;
-    bool m_isFolderWritable : 1;
+    /**
+     * Clears the selection and updates current item and selection according to the parameters
+     *
+     * @param current URL to be set as current
+     * @param selected list of selected items
+     */
+    void forceUrlsSelection(const QUrl &current, const QList<QUrl> &selected);
+
+    void abortTwoClicksRenaming();
+
+    void updatePlaceholderLabel();
 
-    KUrl m_url;
+    bool tryShowNameToolTip(QHelpEvent *event);
+
+private:
+    void updatePalette();
+    void showLoadingPlaceholder();
+
+    bool m_active;
+    bool m_tabsForFiles;
+    bool m_assureVisibleCurrentIndex;
+    bool m_isFolderWritable;
+    bool m_dragging; // True if a dragging is done. Required to be able to decide whether a
+                     // tooltip may be shown when hovering an item.
+    bool m_selectNextItem;
+
+    enum class LoadingState { Idle, Loading, Canceled, Completed };
+    LoadingState m_loadingState = LoadingState::Idle;
+
+    QUrl m_url;
+    QString m_viewPropertiesContext;
     Mode m_mode;
-    QList<AdditionalInfo> m_additionalInfoList;
+    QList<QByteArray> m_visibleRoles;
+
+    QPointer<KIO::StatJob> m_statJobForStatusBarText;
 
-    QVBoxLayoutm_topLayout;
+    QVBoxLayout *m_topLayout;
 
-    DolphinDirLister* m_dirLister;
-    DolphinItemListContainer* m_container;
+    KFileItemModel *m_model;
+    DolphinItemListView *m_view;
+    KItemListContainer *m_container;
 
-    ToolTipManagerm_toolTipManager;
+    ToolTipManager *m_toolTipManager;
 
-    QTimerm_selectionChangedTimer;
+    QTimer *m_selectionChangedTimer;
 
-    KUrl m_currentItemUrl;
+    QUrl m_currentItemUrl; // Used for making the view to remember the current URL after F5
+    bool m_scrollToCurrentItem; // Used for marking we need to scroll to current item or not
     QPoint m_restoredContentsPosition;
-    KUrl m_createdItemUrl; // URL for a new item that got created by the "Create New..." menu
-    QList<KUrl> m_selectedUrls; // this is used for making the View to remember selections after F5
-    
-    VersionControlObserver* m_versionControlObserver;
+
+    // Used for tracking the accumulated scroll amount (for zooming with high
+    // resolution scroll wheels)
+    int m_controlWheelAccumulatedDelta;
+
+    QList<QUrl> m_selectedUrls; // Used for making the view to remember selections after F5 and file operations
+    bool m_clearSelectionBeforeSelectingNewItems;
+    bool m_markFirstNewlySelectedItemAsCurrent;
+    /// Decides whether items created by jobs should automatically be selected.
+    bool m_selectJobCreatedItems;
+
+    VersionControlObserver *m_versionControlObserver;
+
+    QTimer *m_twoClicksRenamingTimer;
+    QUrl m_twoClicksRenamingItemUrl;
+    QLabel *m_placeholderLabel;
+    QTimer *m_showLoadingPlaceholderTimer;
+
+    /// The information roleIndex of the list column header currently hovered
+    std::optional<int> m_hoveredColumnHeaderIndex;
+
+    /// Used for selection mode. @see setSelectionMode()
+    std::unique_ptr<QProxyStyle> m_proxyStyle;
 
     // For unit tests
     friend class TestBase;
     friend class DolphinDetailsViewTest;
+    friend class DolphinMainWindowTest;
+    friend class DolphinPart; // Accesses m_model
+    void updateSelectionState();
 };
 
 /// Allow using DolphinView::Mode in QVariant