X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a6627b9f2345eac9cc650aa9f87f9c69db8c707f..d27ee07d:/src/views/dolphinview.h diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 42ad26098..f851724c2 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -1,56 +1,45 @@ -/*************************************************************************** - * Copyright (C) 2006-2009 by Peter Penz * - * Copyright (C) 2006 by Gregor KaliÅ¡nik * - * * - * 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 + * SPDX-FileCopyrightText: 2006 Gregor KaliÅ¡nik + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #ifndef DOLPHINVIEW_H #define DOLPHINVIEW_H -#include - -#include "libdolphin_export.h" +#include "dolphin_export.h" +#include "dolphintabwidget.h" +#include "tooltips/tooltipmanager.h" -#include +#include "config-dolphin.h" #include -#include -#include #include +#include +#include -#include -#include -#include -#include +#include +#include +#include #include -typedef KIO::FileUndoManager::CommandType CommandType; +#include -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,8 +108,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, @@ -183,6 +148,12 @@ public: */ 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. @@ -201,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& urls); + void markUrlsAsSelected(const QList &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 ®exp, bool enabled); /** * Sets the zoom level to \a level. It is assured that the used @@ -224,52 +201,36 @@ 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& info); + void setVisibleRoles(const QList &roles); /** Returns the additional information which should be shown for the items. */ - QList additionalInfoList() const; - - /** Reloads the current directory. */ - void reload(); - - void stopLoading(); + QList visibleRoles() const; /** * Refreshes the view to get synchronized with the settings (e.g. icons size, * font, ...). */ void readSettings(); - + /** * Saves the current settings (e.g. icons size, font, ..). */ @@ -279,30 +240,31 @@ 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; /** - * 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 versionControlActions(const KFileItemList& items) const; + QList versionControlActions(const KFileItemList &items) const; /** * Returns the state of the paste action: @@ -326,30 +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(QDataStream& stream); + 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. */ 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. @@ -386,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(); @@ -401,29 +414,55 @@ public slots: */ void pasteIntoFolder(); - /** Activates the view if the item list container gets focus. */ - virtual bool eventFilter(QObject* watched, QEvent* event); + /** + * Copies the path of the first selected KFileItem into Clipboard. + */ + void copyPathToClipboard(); -signals: /** - * Is emitted if the view has been activated by e. g. a mouse click. + * Creates duplicates of selected items, appending "copy" + * to the end. */ - void activated(); + 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(); /** - * 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. + * Applies the state that has been restored by restoreViewState() + * to the view. */ - void urlAboutToBeChanged(const KUrl& url); + void updateViewState(); + +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 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. @@ -433,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, @@ -450,18 +499,29 @@ signals: /** 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& 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); @@ -470,73 +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 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 and the custom actions \a customActions - * will be added. + * for the URL should be shown. */ - void requestContextMenu(const QPoint& pos, - const KFileItem& item, - const KUrl& url, - const QList& 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 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 &msg); /** * 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 - * 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 @@ -545,14 +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: /** 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); - -private slots: + void hideEvent(QHideEvent *event) override; + bool event(QEvent *event) override; + +private Q_SLOTS: /** * Marks the view as active (DolphinView:isActive() will return true) * and emits the 'activated' signal if it is not already active. @@ -560,15 +667,33 @@ private slots: void activate(); void slotItemActivated(int index); - void slotItemsActivated(const QSet& indexes); + 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 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 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& current, const QSet& previous); + void slotSelectionChanged(const KItemSet ¤t, const KItemSet &previous); /** * Is called by emitDelayedSelectionChangedSignal() and emits the @@ -585,11 +710,20 @@ 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 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 @@ -604,43 +738,50 @@ 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 directory lister has been started the - * loading of \a url. + * Invoked when the rename job is done, for error handling. */ - void slotDirListerStarted(const KUrl& url); + void slotRenamingResult(KJob *job); /** - * 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. + * Invoked when the file item model has started the loading + * of the directory specified by DolphinView::url(). */ - void slotLoadingCompleted(); + void slotDirectoryLoadingStarted(); /** - * Is invoked when the KDirLister indicates refreshed items. + * 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 slotRefreshItems(); + 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(); /** * Is invoked when the sort order has been changed by the user by clicking @@ -652,77 +793,87 @@ private 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 ¤t, const QList &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 hideToolTip(); - - //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); + + /** + * Applies the m_mode property to the corresponding + * itemlayout-property of the KItemListView. + */ + 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 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 @@ -731,47 +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; /** - * Returns the text for the filesize by converting it to the best fitting - * unit. + * 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 */ - static QString fileSizeText(KIO::filesize_t fileSize); + void forceUrlsSelection(const QUrl ¤t, const QList &selected); + + void abortTwoClicksRenaming(); + + void updatePlaceholderLabel(); + + 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; - KUrl m_url; + QUrl m_url; + QString m_viewPropertiesContext; Mode m_mode; - QList m_additionalInfoList; + QList m_visibleRoles; + + QPointer m_statJobForStatusBarText; - QVBoxLayout* m_topLayout; + QVBoxLayout *m_topLayout; - DolphinDirLister* m_dirLister; - DolphinItemListContainer* m_container; + KFileItemModel *m_model; + DolphinItemListView *m_view; + KItemListContainer *m_container; - ToolTipManager* m_toolTipManager; + ToolTipManager *m_toolTipManager; - QTimer* m_selectionChangedTimer; + 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; - KUrl m_createdItemUrl; // URL for a new item that got created by the "Create New..." menu - QList m_selectedUrls; // 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 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 m_hoveredColumnHeaderIndex; + + /// Used for selection mode. @see setSelectionMode() + std::unique_ptr 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