X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/86df5ae994e96483559020befd96b838aee4d3ee..6e752f507a1dd82a40d4bd140457203842fc0c80:/src/views/dolphinview.h diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index b40be8936..2c772ad90 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -8,13 +8,13 @@ #ifndef DOLPHINVIEW_H #define DOLPHINVIEW_H -#include "dolphintabwidget.h" #include "dolphin_export.h" +#include "dolphintabwidget.h" #include "tooltips/tooltipmanager.h" +#include "config-dolphin.h" #include -#include -#include +#include #include #include @@ -23,6 +23,8 @@ #include #include +#include + typedef KIO::FileUndoManager::CommandType CommandType; class QVBoxLayout; class DolphinItemListView; @@ -35,6 +37,8 @@ class VersionControlObserver; class ViewProperties; class QLabel; class QGraphicsSceneDragDropEvent; +class QHelpEvent; +class QProxyStyle; class QRegularExpression; /** @@ -47,6 +51,8 @@ class QRegularExpression; * - show hidden files * - show previews * - enable grouping + * - grouping order + * - grouping type */ class DOLPHIN_EXPORT DolphinView : public QWidget { @@ -58,8 +64,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. */ @@ -82,7 +87,7 @@ public: * @param url Specifies the content which should be shown. * @param parent Parent widget of the view. */ - DolphinView(const QUrl& url, QWidget* parent); + DolphinView(const QUrl &url, QWidget *parent); ~DolphinView() override; @@ -105,8 +110,14 @@ 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; + + /** + * 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, @@ -169,7 +180,7 @@ public: * 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 QUrl& url); + void markUrlAsCurrent(const QUrl &url); /** * All items that match the regular expression \a regexp will get selected @@ -196,12 +207,34 @@ public: */ void resetZoomLevel(); - void setSortRole(const QByteArray& role); + /** + * Updates the view properties of the current URL to the + * sorting given by \a role. + */ + void setSortRole(const QByteArray &role); QByteArray sortRole() const; + /** + * Updates the view properties of the current URL to the + * sort order given by \a order. + */ void setSortOrder(Qt::SortOrder order); Qt::SortOrder sortOrder() const; + /** + * Updates the view properties of the current URL to the + * grouping given by \a role. + */ + void setGroupRole(const QByteArray &role); + QByteArray groupRole() const; + + /** + * Updates the view properties of the current URL to the + * sort order given by \a order. + */ + void setGroupOrder(Qt::SortOrder order); + Qt::SortOrder groupOrder() const; + /** Sets a separate sorting with folders first (true) or a mixed sorting of files and folders (false). */ void setSortFoldersFirst(bool foldersFirst); bool sortFoldersFirst() const; @@ -211,13 +244,11 @@ public: bool sortHiddenLast() const; /** Sets the additional information which should be shown for the items. */ - void setVisibleRoles(const QList& roles); + void setVisibleRoles(const QList &roles); /** Returns the additional information which should be shown for the items. */ QList visibleRoles() const; - void reload(); - /** * Refreshes the view to get synchronized with the settings (e.g. icons size, * font, ...). @@ -233,7 +264,7 @@ public: * Filters the currently shown items by \a nameFilter. All items * which contain the given filter string will be shown. */ - void setNameFilter(const QString& nameFilter); + void setNameFilter(const QString &nameFilter); QString nameFilter() const; /** @@ -241,7 +272,7 @@ public: * whose content-type matches those given by the list of filters * will be shown. */ - void setMimeTypeFilters(const QStringList& filters); + void setMimeTypeFilters(const QStringList &filters); QStringList mimeTypeFilters() const; /** @@ -257,7 +288,7 @@ public: * Returns the version control actions that are provided for the items \p items. * Usually the actions are presented in the context menu. */ - QList versionControlActions(const KFileItemList& items) const; + QList versionControlActions(const KFileItemList &items) const; /** * Returns the state of the paste action: @@ -281,15 +312,22 @@ 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(QDataStream& stream); + void restoreState(QDataStream &stream); /** * Saves the view state (current item, contents position, details view expansion state) */ - void saveState(QDataStream& stream); + void saveState(QDataStream &stream); /** * Returns the root item which represents the current URL. @@ -303,7 +341,7 @@ public: * makes sense if specific types of URLs (e.g. search-URLs) should * share common view-properties. */ - void setViewPropertiesContext(const QString& context); + void setViewPropertiesContext(const QString &context); QString viewPropertiesContext() const; /** @@ -312,19 +350,38 @@ public: * @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); + 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; + + /** + * Returns whether the folder represented by the current URL is writable. + */ + bool isFolderWritable() const; + 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 QUrl& url); + void setUrl(const QUrl &url); /** * Selects all items. @@ -410,9 +467,6 @@ public Q_SLOTS: */ void updateViewState(); - /** Activates the view if the item list container gets focus. */ - bool eventFilter(QObject* watched, QEvent* event) override; - Q_SIGNALS: /** * Is emitted if the view has been activated by e. g. a mouse click. @@ -420,13 +474,19 @@ Q_SIGNALS: void activated(); /** Is emitted if the URL of the view has been changed to \a url. */ - void urlChanged(const QUrl& url); + void urlChanged(const QUrl &url); /** * Is emitted when clicking on an item with the left mouse button. */ 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. @@ -441,7 +501,7 @@ Q_SIGNALS: /** * Is emitted if a new tab should be opened for the URL \a url. */ - void tabRequested(const QUrl& url); + void tabRequested(const QUrl &url); /** * Is emitted if a new tab should be opened for the URL \a url and set as active. @@ -473,11 +533,17 @@ Q_SIGNALS: void statusBarTextChanged(QString statusBarText); /** Is emitted if the sorting by name, size or date has been changed. */ - void sortRoleChanged(const QByteArray& role); + 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 grouping by name, size or date has been changed. */ + void groupRoleChanged(const QByteArray &role); + + /** Is emitted if the group order (ascending or descending) has been changed. */ + void groupOrderChanged(Qt::SortOrder order); + /** * Is emitted if the sorting of files and folders (separate with folders * first or mixed) has been changed. @@ -490,8 +556,7 @@ Q_SIGNALS: void sortHiddenLastChanged(bool hiddenLast); /** Is emitted if the additional information shown for this view has been changed. */ - void visibleRolesChanged(const QList& current, - const QList& previous); + void visibleRolesChanged(const QList ¤t, const QList &previous); /** Is emitted if the zoom level has been changed by zooming in or out. */ void zoomLevelChanged(int current, int previous); @@ -500,40 +565,37 @@ Q_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 KFileItem& item); + void requestItemInfo(const KFileItem &item); /** * Is emitted whenever the selection has been changed. */ - void selectionChanged(const KFileItemList& selection); + 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. */ - void requestContextMenu(const QPoint& pos, - const KFileItem& item, - const KFileItemList &selectedItems, - const QUrl& url); + 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 QString& msg); + void infoMessage(const QString &msg); /** * Is emitted if an error message with the content \a msg * should be shown. */ - void errorMessage(const QString& msg); + void errorMessage(const QString &message, const int kioErrorCode); /** * Is emitted if an "operation completed" message with the content \a msg * should be shown. */ - void operationCompletedMessage(const QString& msg); + void operationCompletedMessage(const QString &msg); /** * Is emitted after DolphinView::setUrl() has been invoked and @@ -571,13 +633,13 @@ Q_SIGNALS: * Emitted when the file-item-model emits redirection. * Testcase: fish://localhost */ - void redirection(const QUrl& oldUrl, const QUrl& 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); + void urlIsFileError(const QUrl &url); /** * Is emitted when the write state of the folder has been changed. The application @@ -598,6 +660,13 @@ Q_SIGNALS: */ 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. */ @@ -607,18 +676,29 @@ Q_SIGNALS: * Is emitted when the user clicks a tag or a link * in the metadata widget of a tooltip. */ - void urlActivated(const QUrl& url); + void urlActivated(const QUrl &url); void goUpRequested(); void fileItemsChanged(const KFileItemList &changedFileItems); + /** + * Emitted when the current directory of the model was removed. + */ + void currentDirectoryRemoved(); + + /** + * Emitted when the view's background is double-clicked. + * Used to trigger an user configured action. + */ + void doubleClickViewBackground(Qt::MouseButton button); + protected: /** Changes the zoom level if Control is pressed during a wheel event. */ - void wheelEvent(QWheelEvent* event) override; + void wheelEvent(QWheelEvent *event) override; - void hideEvent(QHideEvent* event) override; - bool event(QEvent* event) override; + void hideEvent(QHideEvent *event) override; + bool event(QEvent *event) override; private Q_SLOTS: /** @@ -630,19 +710,20 @@ private Q_SLOTS: void slotItemActivated(int index); void slotItemsActivated(const KItemSet &indexes); void slotItemMiddleClicked(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 slotLeadingPaddingWidthChanged(qreal width); + 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& urls); + void slotRenameDialogRenamingFinished(const QList &urls); void slotSelectedItemTextPressed(int index); - void slotCopyingDone(KIO::Job *, const QUrl &, const QUrl &to); + void slotItemCreatedFromJob(KIO::Job *, const QUrl &, const QUrl &to); + void slotItemLinkCreatedFromJob(KIO::Job *, const QUrl &, const QString &, const QUrl &to); void slotIncreaseZoom(); void slotDecreaseZoom(); void slotSwipeUp(); @@ -663,7 +744,7 @@ private Q_SLOTS: * the signal is emitted only after no selection change has been done * within a small delay. */ - void slotSelectionChanged(const KItemSet& current, const KItemSet& previous); + void slotSelectionChanged(const KItemSet ¤t, const KItemSet &previous); /** * Is called by emitDelayedSelectionChangedSignal() and emits the @@ -680,18 +761,6 @@ private Q_SLOTS: */ void slotStatJobResult(KJob *job); - /** - * Updates the view properties of the current URL to the - * sorting given by \a role. - */ - void updateSortRole(const QByteArray& role); - - /** - * Updates the view properties of the current URL to the - * sort order given by \a order. - */ - void updateSortOrder(Qt::SortOrder order); - /** * Updates the view properties of the current URL to the * sorting of files and folders (separate with folders first or mixed) given by \a foldersFirst. @@ -708,18 +777,18 @@ private Q_SLOTS: * Indicates in the status bar that the delete operation * of the job \a job has been finished. */ - void slotDeleteFileFinished(KJob* job); + void slotDeleteFileFinished(KJob *job); /** * Indicates in the status bar that the trash operation * of the job \a job has been finished. */ - void slotTrashFileFinished(KJob* job); + void slotTrashFileFinished(KJob *job); /** * Invoked when the rename job is done, for error handling. */ - void slotRenamingResult(KJob* job); + void slotRenamingResult(KJob *job); /** * Invoked when the file item model has started the loading @@ -754,17 +823,16 @@ private Q_SLOTS: * 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 slotSortRoleChangedByHeader(const QByteArray& current, const QByteArray& previous); + void slotSortRoleChangedByHeader(const QByteArray ¤t, const QByteArray &previous); /** * 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 slotVisibleRolesChangedByHeader(const QList& current, - const QList& previous); + void slotVisibleRolesChangedByHeader(const QList ¤t, const QList &previous); void slotRoleEditingCanceled(); - void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); + void slotRoleEditingFinished(int index, const QByteArray &role, const QVariant &value); /** * Observes the item with the URL \a url. As soon as the directory @@ -773,16 +841,23 @@ private Q_SLOTS: */ void observeCreatedItem(const QUrl &url); + /** + * Selects the next item after prev selection deleted/trashed + */ + void selectNextItem(); + /** * Called when a redirection happens. * Testcase: fish://localhost */ - void slotDirectoryRedirection(const QUrl& oldUrl, const QUrl& newUrl); + void slotDirectoryRedirection(const QUrl &oldUrl, const QUrl &newUrl); void slotTwoClicksRenamingTimerTimeout(); + void onDirectoryLoadingCompletedAfterJob(); + private: - void loadDirectory(const QUrl& url, bool reload = false); + void loadDirectory(const QUrl &url, bool reload = false); /** * Applies the view properties which are defined by the current URL @@ -795,7 +870,7 @@ private: /** * Applies the given view properties to the DolphinView. */ - void applyViewProperties(const ViewProperties& props); + void applyViewProperties(const ViewProperties &props); /** * Applies the m_mode property to the corresponding @@ -803,10 +878,7 @@ private: */ void applyModeToView(); - enum Selection { - HasSelection, - NoSelection - }; + enum Selection { HasSelection, NoSelection }; /** * Helper method for DolphinView::requestStatusBarText(). * Generates the status bar text from the parameters and @@ -815,14 +887,13 @@ private: * @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); + 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); + void pasteToUrl(const QUrl &url); /** * Returns a list of URLs for all selected items. The list is @@ -834,12 +905,12 @@ private: /** * Returns the MIME data for all selected items. */ - QMimeData* selectionMimeData() const; + QMimeData *selectionMimeData() const; /** * Updates m_isFolderWritable dependent on whether the folder represented by * the current URL is writable. If the state has changed, the signal - * writeableStateChanged() will be emitted. + * writeStateChanged() will be emitted. */ void updateWritableState(); @@ -856,13 +927,13 @@ private: * @param current URL to be set as current * @param selected list of selected items */ - void forceUrlsSelection(const QUrl& current, const QList& selected); + void forceUrlsSelection(const QUrl ¤t, const QList &selected); void abortTwoClicksRenaming(); void updatePlaceholderLabel(); - void tryShowNameToolTip(QEvent* event); + bool tryShowNameToolTip(QHelpEvent *event); private: void updatePalette(); @@ -874,7 +945,10 @@ private: 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; + bool m_selectNextItem; + + enum class LoadingState { Idle, Loading, Canceled, Completed }; + LoadingState m_loadingState = LoadingState::Idle; QUrl m_url; QString m_viewPropertiesContext; @@ -883,35 +957,49 @@ private: QPointer m_statJobForStatusBarText; - QVBoxLayout* m_topLayout; + QVBoxLayout *m_topLayout; - KFileItemModel* m_model; - DolphinItemListView* m_view; - KItemListContainer* m_container; + KFileItemModel *m_model; + DolphinItemListView *m_view; + KItemListContainer *m_container; - ToolTipManager* m_toolTipManager; + ToolTipManager *m_toolTipManager; - QTimer* m_selectionChangedTimer; + QTimer *m_selectionChangedTimer; 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 m_selectedUrls; // Used for making the view to remember selections after F5 + // Used for tracking the accumulated scroll amount (for zooming with high + // resolution scroll wheels) + int m_controlWheelAccumulatedDelta; + + QList 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; + VersionControlObserver *m_versionControlObserver; - QTimer* m_twoClicksRenamingTimer; + QTimer *m_twoClicksRenamingTimer; QUrl m_twoClicksRenamingItemUrl; - QLabel* m_placeholderLabel; - QTimer* m_showLoadingPlaceholderTimer; + QLabel *m_placeholderLabel; + QTimer *m_showLoadingPlaceholderTimer; + + /// The information roleIndex of the list column header currently hovered + std::optional m_hoveredColumnHeaderIndex; + + /// Used for selection mode. @see setSelectionMode() + std::unique_ptr m_proxyStyle; // For unit tests friend class TestBase; friend class DolphinDetailsViewTest; - friend class DolphinPart; // Accesses m_model + friend class DolphinMainWindowTest; + friend class DolphinPart; // Accesses m_model + void updateSelectionState(); }; /// Allow using DolphinView::Mode in QVariant