* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-
#ifndef DOLPHINVIEW_H
#define DOLPHINVIEW_H
#include <QBoxLayout>
#include <QKeyEvent>
#include <QLinkedList>
-#include <QListView>
#include <QSet>
#include <QWidget>
typedef KIO::FileUndoManager::CommandType CommandType;
-class DolphinDirLister;
-class DolphinItemListContainer;
+class DolphinItemListView;
class KAction;
class KActionCollection;
class KFileItemModel;
+class KItemListContainer;
+class KItemModelBase;
class KUrl;
+class ToolTipManager;
+class VersionControlObserver;
class ViewProperties;
+class QGraphicsSceneDragDropEvent;
class QRegExp;
/**
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.
void setMode(Mode mode);
Mode mode() const;
- /** See setPreviewsShown */
+ /**
+ * Turns on the file preview for the all files of the current directory,
+ * if \a show is true.
+ * If the view properties should be remembered for each directory
+ * (GeneralSettings::globalViewProps() returns false), then the
+ * preview setting will be stored automatically.
+ */
+ void setPreviewsShown(bool show);
bool previewsShown() const;
- /** See setShowHiddenFiles */
+ /**
+ * Shows all hidden files of the current directory,
+ * if \a show is true.
+ * If the view properties should be remembered for each directory
+ * (GeneralSettings::globalViewProps() returns false), then the
+ * show hidden file setting will be stored automatically.
+ */
+ void setHiddenFilesShown(bool show);
bool hiddenFilesShown() const;
- /** See setCategorizedSorting */
- bool categorizedSorting() const;
+ /**
+ * Turns on sorting by groups if \a enable is true.
+ */
+ void setGroupedSorting(bool grouped);
+ bool groupedSorting() const;
/**
* Returns the items of the view.
*/
KFileItemList items() const;
+ /**
+ * @return The number of items. itemsCount() is faster in comparison
+ * to items().count().
+ */
+ int itemsCount() const;
+
/**
* Returns the selected items. The list is empty if no item has been
* selected.
*/
void markUrlsAsSelected(const QList<KUrl>& urls);
+ /**
+ * Marks the item indicated by \p url as the current item after the
+ * directory DolphinView::url() has been loaded.
+ */
+ void markUrlAsCurrent(const KUrl& 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.
*/
- void setItemSelectionEnabled(const QRegExp& pattern, bool enabled);
+ void selectItems(const QRegExp& pattern, bool enabled);
/**
* Sets the zoom level to \a level. It is assured that the used
void setZoomLevel(int level);
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.
- */
- bool isZoomOutPossible() const;
-
- /** 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 the additional information which should be shown for the items. */
- void setAdditionalInfoList(const QList<AdditionalInfo>& info);
+ void setVisibleRoles(const QList<QByteArray>& roles);
/** Returns the additional information which should be shown for the items. */
- QList<AdditionalInfo> additionalInfoList() const;
+ QList<QByteArray> visibleRoles() const;
- /** Reloads the current directory. */
void reload();
-
void stopLoading();
/**
- * Refreshes the view to get synchronized with the (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.
+ * 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, ..).
*/
- void refresh();
+ void writeSettings();
/**
* Filters the currently shown items by \a nameFilter. All items
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.
- */
- void calculateItemCount(int& fileCount, int& folderCount, KIO::filesize_t& totalFileSize) const;
-
/**
* Returns a textual representation of the state of the current
* folder or selected items, suitable for use in the status bar.
*/
void saveState(QDataStream& stream);
- /** Returns true, if at least one item is selected. */
- bool hasSelection() const;
-
/**
- * 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;
*/
void pasteIntoFolder();
- /**
- * Turns on the file preview for the all files of the current directory,
- * if \a show is true.
- * If the view properties should be remembered for each directory
- * (GeneralSettings::globalViewProps() returns false), then the
- * preview setting will be stored automatically.
- */
- void setPreviewsShown(bool show);
-
- /**
- * Shows all hidden files of the current directory,
- * if \a show is true.
- * If the view properties should be remembered for each directory
- * (GeneralSettings::globalViewProps() returns false), then the
- * show hidden file setting will be stored automatically.
- */
- void setHiddenFilesShown(bool show);
-
- /**
- * Summarizes all sorted items by their category \a categorized
- * is true.
- * If the view properties should be remembered for each directory
- * (GeneralSettings::globalViewProps() returns false), then the
- * categorized sorting setting will be stored automatically.
- */
- void setCategorizedSorting(bool categorized);
+ /** Activates the view if the item list container gets focus. */
+ virtual bool eventFilter(QObject* watched, QEvent* event);
signals:
/**
/**
* Is emitted when clicking on an item with the left mouse button.
*/
- void itemTriggered(const KFileItem& item);
+ void itemActivated(const KFileItem& item);
/**
* Is emitted if items have been added or deleted.
* Is emitted if the view mode (IconsView, DetailsView,
* PreviewsView) has been changed.
*/
- void modeChanged(Mode current, Mode previous);
+ void modeChanged(DolphinView::Mode current, DolphinView::Mode previous);
/** Is emitted if the 'show preview' property has been changed. */
void previewsShownChanged(bool shown);
/** Is emitted if the 'show hidden files' property has been changed. */
void hiddenFilesShownChanged(bool shown);
- /** Is emitted if the 'categorized sorting' property has been changed. */
- void categorizedSortingChanged(bool sortCategorized);
+ /** Is emitted if the 'grouped sorting' property has been changed. */
+ void groupedSortingChanged(bool groupedSorting);
/** Is emitted 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 additional information shown for this view has been changed. */
- void additionalInfoListChanged(const QList<DolphinView::AdditionalInfo>& current,
- const QList<DolphinView::AdditionalInfo>& previous);
+ void visibleRolesChanged(const QList<QByteArray>& current,
+ const QList<QByteArray>& previous);
/** Is emitted if the zoom level has been changed by zooming in or out. */
void zoomLevelChanged(int current, int previous);
* for the URL should be shown and the custom actions \a customActions
* will be added.
*/
- void requestContextMenu(const KFileItem& item,
+ void requestContextMenu(const QPoint& pos,
+ const KFileItem& item,
const KUrl& url,
const QList<QAction*>& customActions);
/**
* 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 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 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();
+
protected:
- virtual void mouseReleaseEvent(QMouseEvent* event);
- virtual void contextMenuEvent(QContextMenuEvent* event);
+ /** Changes the zoom level if Control is pressed during a wheel event. */
+ virtual void wheelEvent(QWheelEvent* event);
+
+ /** @reimp */
+ virtual void hideEvent(QHideEvent* event);
private slots:
/**
*/
void activate();
- void slotItemClicked(int index, Qt::MouseButton button);
-
- void slotItemExpansionToggleClicked(int index);
+ void slotItemActivated(int index);
+ void slotItemsActivated(const QSet<int>& indexes);
+ void slotItemMiddleClicked(int index);
+ 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 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);
/**
* Emits the signal \a selectionChanged() with a small delay. This is
- * because getting all file items for the signal can be an expensive
+ * because getting all file items for the selection can be an expensive
* operation. Fast selection changes are collected in this case and
* the signal is emitted only after no selection change has been done
* within a small delay.
*/
- void slotSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
+ void slotSelectionChanged(const QSet<int>& current, const QSet<int>& previous);
/**
* Is called by emitDelayedSelectionChangedSignal() and emits the
*/
void emitSelectionChangedSignal();
- /**
- * Opens the context menu on position \a pos. The position
- * is used to check whether the context menu is related to an
- * item or to the viewport.
- */
- void openContextMenu(const QPoint& pos, const QList<QAction*>& customActions);
-
- /**
- * Drops dragged URLs to the destination path \a destPath. If
- * the URLs are dropped above an item inside the destination path,
- * the item is indicated by \a destItem.
- */
- void dropUrls(const KFileItem& destItem,
- const KUrl& destPath,
- QDropEvent* event);
-
/**
* 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 slotDeleteFileFinished(KJob* job);
/**
- * Invoked when the directory lister has been started the
- * loading of \a url.
+ * Invoked when the file item model has started the loading
+ * of the directory specified by DolphinView::url().
*/
- void slotDirListerStarted(const KUrl& url);
+ void slotDirectoryLoadingStarted();
/**
- * Invoked when the directory lister has completed the loading of
- * items. Assures that pasted items and renamed items get seleced.
+ * 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.
*/
- void slotDirListerCompleted();
+ void slotDirectoryLoadingCompleted();
/**
- * Invoked when the loading of the directory is finished.
- * Restores the active item and the scroll position if possible.
+ * Is invoked when items of KFileItemModel have been changed.
*/
- void slotLoadingCompleted();
+ void slotItemsChanged();
/**
- * Is invoked when the KDirLister indicates refreshed items.
+ * 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 slotRefreshItems();
+ void slotSortOrderChangedByHeader(Qt::SortOrder current, Qt::SortOrder previous);
+
+ /**
+ * 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);
+
+ /**
+ * 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<QByteArray>& current,
+ const QList<QByteArray>& previous);
+
+ void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value);
/**
* Observes the item with the URL \a url. As soon as the directory
* Called when a redirection happens.
* Testcase: fish://localhost
*/
- void slotRedirection(const KUrl& oldUrl, const KUrl& newUrl);
+ void slotDirectoryRedirection(const KUrl& oldUrl, const KUrl& newUrl);
/**
- * Restores the contents position, if history information about the old position is available.
+ * Applies the state that has been restored by restoreViewState()
+ * to the view.
*/
- void restoreContentsPosition();
+ void updateViewState();
- //void slotUrlChangeRequested(const KUrl& url);
+ void hideToolTip();
-private:
- KFileItemModel* fileItemModel() 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.
+ */
+ void calculateItemCount(int& fileCount, int& folderCount, KIO::filesize_t& totalFileSize) const;
+private:
void loadDirectory(const KUrl& url, bool reload = false);
/**
*/
void applyViewProperties();
- void applyAdditionalInfoListToView();
+ /**
+ * Applies the m_mode property to the corresponding
+ * itemlayout-property of the KItemListView.
+ */
+ void applyModeToView();
/**
* Helper method for DolphinView::paste() and DolphinView::pasteIntoFolder().
*/
void pasteToUrl(const KUrl& url);
- /**
- * 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.
- */
- void updateZoomLevel(int oldZoomLevel);
-
/**
* Returns a list of URLs for all selected items. The list is
* simplified, so that when the URLs are part of different tree
/**
* Is invoked after a paste operation or a drag & drop
- * operation and adds the filenames of all URLs from \a mimeData to
- * m_newFileNames. This allows to select all newly added
- * items in slotDirListerCompleted().
+ * operation and URLs from \a mimeData as selected.
+ * This allows to select all newly pasted
+ * items in restoreViewState().
*/
- void addNewFileNames(const QMimeData* mimeData);
-
- /**
- * Helper method for DolphinView::setItemSelectionEnabled(): Returns the selection for
- * all items of \p parent that match with the regular expression defined by \p pattern.
- */
- QItemSelection childrenMatchingPattern(const QModelIndex& parent, const QRegExp& pattern) const;
+ void markPastedUrlsAsSelected(const QMimeData* mimeData);
/**
* Updates m_isFolderWritable dependent on whether the folder represented by
*/
void updateWritableState();
- QByteArray sortRoleForSorting(Sorting sorting) const;
-
private:
- bool m_active : 1;
- bool m_tabsForFiles : 1;
- bool m_assureVisibleCurrentIndex : 1;
- bool m_expanderActive : 1;
- bool m_isFolderWritable : 1;
+ 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.
KUrl m_url;
Mode m_mode;
- QList<AdditionalInfo> m_additionalInfoList;
+ QList<QByteArray> m_visibleRoles;
QVBoxLayout* m_topLayout;
- DolphinDirLister* m_dirLister;
- DolphinItemListContainer* m_container;
+ KFileItemModel* m_model;
+ DolphinItemListView* m_view;
+ KItemListContainer* m_container;
+
+ ToolTipManager* m_toolTipManager;
QTimer* m_selectionChangedTimer;
- KUrl m_activeItemUrl;
+ KUrl m_currentItemUrl; // Used for making the view to remember the current URL after F5
QPoint m_restoredContentsPosition;
KUrl m_createdItemUrl; // URL for a new item that got created by the "Create New..." menu
- KFileItemList m_selectedItems; // this is used for making the View to remember selections after F5
- /**
- * Remembers the filenames that have been added by a paste operation
- * or a drag & drop operation. Allows to select the items in
- * slotDirListerCompleted().
- */
- QSet<QString> m_newFileNames;
+ QList<KUrl> m_selectedUrls; // Used for making the view to remember selections after F5
+
+ VersionControlObserver* m_versionControlObserver;
// For unit tests
friend class TestBase;