-/***************************************************************************
- * 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 "libdolphin_export.h"
+#include "dolphin_export.h"
+#include "dolphintabwidget.h"
+#include "tooltips/tooltipmanager.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.
* - show previews
* - enable grouping
*/
-class LIBDOLPHINPRIVATE_EXPORT DolphinView : public QWidget
+class DOLPHIN_EXPORT DolphinView : public QWidget
{
Q_OBJECT
* 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.
*/
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
* (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,
*/
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.
* 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 ®exp, bool enabled);
/**
* Sets the zoom level to \a level. It is assured that the used
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;
-
- /** Reloads the current directory. */
- void reload();
+ QList<QByteArray> visibleRoles() const;
- 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 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<QAction*> versionControlActions(const KFileItemList& items) const;
+ QList<QAction *> versionControlActions(const KFileItemList &items) const;
/**
* Returns the state of the paste action:
*/
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. 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.
* 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();
*/
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();
/**
- * 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.
+ * Handles a drop of @p dropEvent onto widget @p dropWidget and destination @p destUrl
*/
- void urlAboutToBeChanged(const KUrl& url);
+ 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();
+
+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.
/**
* 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,
/** 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> ¤t, const QList<QByteArray> &previous);
/** Is emitted if the zoom level has been changed by zooming in or out. */
void zoomLevelChanged(int current, int previous);
* 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<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 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
*/
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;
-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.
void activate();
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 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
* 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 ¤t, const KItemSet &previous);
/**
* Is called by emitDelayedSelectionChangedSignal() and emits the
void emitSelectionChangedSignal();
/**
- * 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.
+ * 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 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
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 ¤t, 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> ¤t, 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
*/
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<QUrl> &selected);
-private:
- bool m_active : 1;
- bool m_tabsForFiles : 1;
- bool m_assureVisibleCurrentIndex : 1;
- bool m_isFolderWritable : 1;
+ void abortTwoClicksRenaming();
+
+ void updatePlaceholderLabel();
+
+ bool tryShowNameToolTip(QHelpEvent *event);
- KUrl m_url;
+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;
- 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;
+ 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