]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.h
Build with QT_NO_KEYWORDS
[dolphin.git] / src / views / dolphinview.h
index 688699096f3be34d9f4e4728961a150572cc42fb..be8263917dea4dfde9ca9f0919a8d64ee99759c1 100644 (file)
@@ -1,56 +1,41 @@
-/***************************************************************************
- *   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-baloo.h>
+#include "dolphintabwidget.h"
+#include "dolphin_export.h"
+#include "tooltips/tooltipmanager.h"
 
-#include "libdolphin_export.h"
-
-#include <kparts/part.h>
 #include <KFileItem>
-#include <KFileItemDelegate>
-#include <kio/fileundomanager.h>
 #include <KIO/Job>
-#include <KUrl>
+#include <config-baloo.h>
+#include <kio/fileundomanager.h>
+#include <kparts/part.h>
 
-#include <QBoxLayout>
-#include <QKeyEvent>
-#include <QLinkedList>
+#include <QMimeData>
+#include <QPointer>
+#include <QUrl>
 #include <QWidget>
 
 typedef KIO::FileUndoManager::CommandType CommandType;
-
+class QVBoxLayout;
 class DolphinItemListView;
-class KActionCollection;
 class KFileItemModel;
 class KItemListContainer;
 class KItemModelBase;
 class KItemSet;
-class KUrl;
 class ToolTipManager;
 class VersionControlObserver;
 class ViewProperties;
+class QLabel;
 class QGraphicsSceneDragDropEvent;
-class QRegExp;
+class QRegularExpression;
 
 /**
  * @short Represents a view for the directory content.
@@ -63,7 +48,7 @@ class QRegExp;
  * - show previews
  * - enable grouping
  */
-class LIBDOLPHINPRIVATE_EXPORT DolphinView : public QWidget
+class DOLPHIN_EXPORT DolphinView : public QWidget
 {
     Q_OBJECT
 
@@ -97,15 +82,15 @@ public:
      * @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
@@ -178,19 +163,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 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 selectItems(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
@@ -200,6 +191,11 @@ public:
     void setZoomLevel(int level);
     int zoomLevel() const;
 
+    /**
+     * Resets the view's icon size to the default value
+     */
+    void resetZoomLevel();
+
     void setSortRole(const QByteArray& role);
     QByteArray sortRole() const;
 
@@ -245,10 +241,13 @@ public:
     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.
@@ -309,14 +308,19 @@ public:
      * @return a valid and adjusted url if the item can be opened as folder,
      * otherwise return an empty url.
      */
-    static KUrl openItemAsFolderUrl(const KFileItem& item, const bool browseThroughArchives = true);
+    static QUrl openItemAsFolderUrl(const KFileItem& item, const bool browseThroughArchives = true);
+
+    /**
+     * Hides tooltip displayed over element.
+     */
+    void hideToolTip(const ToolTipManager::HideBehavior behavior = ToolTipManager::HideBehavior::Later);
 
-public slots:
+public Q_SLOTS:
     /**
      * 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.
@@ -353,10 +357,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();
@@ -368,26 +382,41 @@ public slots:
      */
     void pasteIntoFolder();
 
+    /**
+     * Copies the path of the first selected KFileItem into Clipboard.
+     */
+    void copyPathToClipboard();
+
+    /**
+     * Creates duplicates of selected items, appending "copy"
+     * to the end.
+     */
+    void duplicateSelectedItems();
+
+    /**
+     * Handles a drop of @p dropEvent onto widget @p dropWidget and destination @p destUrl
+     */
+    void dropUrls(const QUrl &destUrl, QDropEvent *dropEvent, QWidget *dropWidget);
+
     void stopLoading();
 
+    /**
+     * Applies the state that has been restored by restoreViewState()
+     * to the view.
+     */
+    void updateViewState();
+
     /** Activates the view if the item list container gets focus. */
-    virtual bool eventFilter(QObject* watched, QEvent* event);
+    bool eventFilter(QObject* watched, QEvent* event) override;
 
-signals:
+Q_SIGNALS:
     /**
      * Is emitted if the view has been activated by e. g. a mouse click.
      */
     void activated();
 
-    /**
-     * 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.
-     */
-    void urlAboutToBeChanged(const KUrl& url);
-
     /** 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.
@@ -408,7 +437,7 @@ 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 the view mode (IconsView, DetailsView,
@@ -425,6 +454,10 @@ signals:
     /** Is emitted if the 'grouped sorting' property has been changed. */
     void groupedSortingChanged(bool groupedSorting);
 
+    /** Is emmited 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 sortRoleChanged(const QByteArray& role);
 
@@ -463,7 +496,7 @@ signals:
      */
     void requestContextMenu(const QPoint& pos,
                             const KFileItem& item,
-                            const KUrl& url,
+                            const QUrl& url,
                             const QList<QAction*>& customActions);
 
     /**
@@ -520,13 +553,13 @@ signals:
      * 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 KUrl& url);
+    void urlIsFileError(const QUrl& url);
 
     /**
      * Is emitted when the write state of the folder has been changed. The application
@@ -547,15 +580,27 @@ signals:
      */
     void goForwardRequested();
 
+    /**
+     * 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();
+
 protected:
     /** Changes the zoom level if Control is pressed during a wheel event. */
-    virtual void wheelEvent(QWheelEvent* event);
+    void wheelEvent(QWheelEvent* event) override;
 
-    /** @reimp */
-    virtual void hideEvent(QHideEvent* event);
-    virtual bool event(QEvent* event);
+    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.
@@ -568,17 +613,27 @@ private slots:
     void slotItemContextMenuRequested(int index, const QPointF& pos);
     void slotViewContextMenuRequested(const QPointF& pos);
     void slotHeaderContextMenuRequested(const QPointF& pos);
-    void slotHeaderColumnWidthChanged(const QByteArray& role, qreal current, qreal previous);
+    void slotHeaderColumnWidthChangeFinished(const QByteArray& role, qreal current);
     void slotItemHovered(int index);
     void slotItemUnhovered(int index);
     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 slotCopyingDone(KIO::Job *, const QUrl &, const QUrl &to);
+    void slotIncreaseZoom();
+    void slotDecreaseZoom();
+    void slotSwipeUp();
 
     /*
      * Is called when new items get pasted or dropped.
      */
-    void slotAboutToCreate(const KUrl::List& urls);
+    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
@@ -595,6 +650,15 @@ private slots:
      */
     void emitSelectionChangedSignal();
 
+    /**
+     * 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 slotStatJobResult(KJob *job);
+
     /**
      * Updates the view properties of the current URL to the
      * sorting given by \a role.
@@ -625,7 +689,10 @@ private slots:
      */
     void slotTrashFileFinished(KJob* job);
 
-    void slotRenamingFailed(const KUrl& oldUrl, const KUrl& newUrl);
+    /**
+     * Invoked when the rename job is done, for error handling.
+     */
+    void slotRenamingResult(KJob* job);
 
     /**
      * Invoked when the file item model has started the loading
@@ -635,10 +702,16 @@ private slots:
 
     /**
      * Invoked when the file item model indicates that the loading of a directory has
-     * been completed. Assures that pasted items and renamed items get seleced.
+     * 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.
      */
@@ -671,34 +744,18 @@ private slots:
      * model indicates that the item is available, the item will
      * get selected and it is assured that the item stays visible.
      */
-    void observeCreatedItem(const KUrl& url);
+    void observeCreatedItem(const QUrl &url);
 
     /**
      * Called when a redirection happens.
      * Testcase: fish://localhost
      */
-    void slotDirectoryRedirection(const KUrl& oldUrl, const KUrl& newUrl);
-
-    /**
-     * Applies the state that has been restored by restoreViewState()
-     * to the view.
-     */
-    void updateViewState();
+    void slotDirectoryRedirection(const QUrl& oldUrl, const QUrl& newUrl);
 
-    void hideToolTip();
-
-    /**
-     * 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.
-     */
-    void calculateItemCount(int& fileCount, int& folderCount, KIO::filesize_t& totalFileSize) const;
+    void slotTwoClicksRenamingTimerTimeout();
 
 private:
-    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
@@ -719,18 +776,33 @@ private:
      */
     void applyModeToView();
 
+    enum Selection {
+        HasSelection,
+        NoSelection
+    };
+    /**
+     * 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 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 KUrl& 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.
@@ -749,21 +821,38 @@ private:
      *         DolphinView::viewPropertiesContext(), otherwise the context
      *         is returned.
      */
-    KUrl viewPropertiesUrl() const;
+    QUrl viewPropertiesUrl() const;
+
+    /**
+     * 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();
 
 private:
+    void updatePalette();
+
     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_loading;
 
-    KUrl m_url;
+    QUrl m_url;
     QString m_viewPropertiesContext;
     Mode m_mode;
     QList<QByteArray> m_visibleRoles;
 
+    QPointer<KIO::StatJob> m_statJobForStatusBarText;
+
     QVBoxLayout* m_topLayout;
 
     KFileItemModel* m_model;
@@ -774,16 +863,20 @@ private:
 
     QTimer* m_selectionChangedTimer;
 
-    KUrl m_currentItemUrl; // Used for making the view to remember the current URL after F5
+    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;
 
-    QList<KUrl> m_selectedUrls; // Used for making the view to remember selections after F5
+    QList<QUrl> m_selectedUrls; // Used for making the view to remember selections after F5
     bool m_clearSelectionBeforeSelectingNewItems;
     bool m_markFirstNewlySelectedItemAsCurrent;
 
     VersionControlObserver* m_versionControlObserver;
 
+    QTimer* m_twoClicksRenamingTimer;
+    QUrl m_twoClicksRenamingItemUrl;
+    QLabel* m_placeholderLabel;
+
     // For unit tests
     friend class TestBase;
     friend class DolphinDetailsViewTest;