X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b1e69cae00a708aa50dbd03eca944e83a639d861..2f0ceedae088158b8af24a5e94500a7d1c0edecb:/src/views/dolphinview.h diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 9d2032e9f..437f12f39 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Peter Penz * + * 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 * @@ -27,47 +27,39 @@ #include "libdolphin_export.h" #include -#include -#include +#include +#include #include -#include +#include #include #include #include -#include #include #include typedef KIO::FileUndoManager::CommandType CommandType; -class DolphinColumnViewContainer; -class DolphinDetailsView; -class DolphinIconsView; -class DolphinModel; -class DolphinSortFilterProxyModel; -class DolphinViewController; +class DolphinDirLister; +class DolphinItemListContainer; class KAction; class KActionCollection; -class KDirLister; +class KFileItemModel; class KUrl; -class ViewModeController; +class ToolTipManager; class ViewProperties; -class DolphinDetailsViewExpander; +class QRegExp; /** * @short Represents a view for the directory content. * - * View modes for icons, details and columns are supported. It's + * View modes for icons, compact and details are supported. It's * possible to adjust: * - sort order * - sort type * - show hidden files * - show previews - * - * @see DolphinIconsView - * @see DolphinDetailsView - * @see DolphinColumnView + * - enable grouping */ class LIBDOLPHINPRIVATE_EXPORT DolphinView : public QWidget { @@ -75,31 +67,28 @@ class LIBDOLPHINPRIVATE_EXPORT DolphinView : public QWidget public: /** - * Defines the view mode for a directory. The view mode - * can be defined when constructing a DolphinView. The + * Defines the view mode for a directory. The * view mode is automatically updated if the directory itself * defines a view mode (see class ViewProperties for details). */ enum Mode { /** - * The directory items are shown as icons including an - * icon name. + * The items are shown as icons with a name-label below. */ IconsView = 0, /** - * The icon, the name and at least the size of the directory - * items are shown in a table. It is possible to add columns - * for date, group and permissions. + * The icon, the name and the size of the items are + * shown per default as a table. */ - DetailsView = 1, + DetailsView, /** - * Each folder is shown in a separate column. + * The items are shown as icons with the name-label aligned + * to the right side. */ - ColumnView = 2, - MaxModeEnum = ColumnView + CompactView }; /** Defines the sort order for the items of a directory. */ @@ -113,20 +102,29 @@ public: SortByGroup, SortByType, SortByDestination, - SortByPath, - MaxSortingEnum = SortByPath + 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 parent Parent widget of the view. * @param url Specifies the content which should be shown. - * @param proxyModel Used proxy model which specifies the sorting. The - * model is not owned by the view and won't get - * deleted. + * @param parent Parent widget of the view. */ - DolphinView(QWidget* parent, - const KUrl& url, - DolphinSortFilterProxyModel* proxyModel); + DolphinView(const KUrl& url, QWidget* parent); virtual ~DolphinView(); @@ -136,17 +134,6 @@ public: */ KUrl url() const; - /** - * Returns the root URL of the view, which is defined as the first - * visible path of DolphinView::url(). Usually the root URL is - * equal to DolphinView::url(), but in the case of the column view - * when 2 columns are shown, the root URL might be: - * /home/peter/Documents - * and DolphinView::url() might return - * /home/peter/Documents/Music/ - */ - KUrl rootUrl() const; - /** * If \a active is true, the view will marked as active. The active * view is defined as view where all actions are applied to. @@ -163,35 +150,23 @@ public: void setMode(Mode mode); Mode mode() const; - /** See setShowPreview */ - bool showPreview() const; + /** See setPreviewsShown */ + bool previewsShown() const; /** See setShowHiddenFiles */ - bool showHiddenFiles() const; + bool hiddenFilesShown() const; /** See setCategorizedSorting */ bool categorizedSorting() const; /** - * Returns true, if the categorized sorting is supported by the current - * used mode (see DolphinView::setMode()). Currently only DolphinView::IconsView - * supports categorizations. To check whether the categorized - * sorting is set, use DolphinView::categorizedSorting(). + * Returns the items of the view. */ - bool supportsCategorizedSorting() const; - - /** - * Marks the items indicated by \p urls to get selected after the - * directory DolphinView::url() has been loaded. Note that nothing - * gets selected if no loading of a directory has been triggered - * by DolphinView::setUrl() or DolphinView::reload(). - */ - void markUrlsAsSelected(const QList& urls); + KFileItemList items() const; /** * Returns the selected items. The list is empty if no item has been * selected. - * @see DolphinView::selectedUrls() */ KFileItemList selectedItems() const; @@ -201,7 +176,19 @@ public: */ int selectedItemsCount() const; - QItemSelectionModel* selectionModel() const; + /** + * Marks the items indicated by \p urls to get selected after the + * directory DolphinView::url() has been loaded. Note that nothing + * gets selected if no loading of a directory has been triggered + * by DolphinView::setUrl() or DolphinView::reload(). + */ + void markUrlsAsSelected(const QList& urls); + + /** + * 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); /** * Sets the zoom level to \a level. It is assured that the used @@ -223,16 +210,16 @@ public: */ bool isZoomOutPossible() const; - /** Sets the sort order of the items inside a directory (see DolphinView::Sorting). */ + /** Sets the sorting criterion (e.g., SortByName, SortBySize,...) of the items inside a directory (see DolphinView::Sorting). */ void setSorting(Sorting sorting); - /** Returns the sort order of the items inside a directory (see DolphinView::Sorting). */ + /** 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 current used sort order (Qt::Ascending or Qt::Descending). */ + /** 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). */ @@ -242,10 +229,10 @@ public: bool sortFoldersFirst() const; /** Sets the additional information which should be shown for the items. */ - void setAdditionalInfo(KFileItemDelegate::InformationList info); + void setAdditionalInfoList(const QList& info); /** Returns the additional information which should be shown for the items. */ - KFileItemDelegate::InformationList additionalInfo() const; + QList additionalInfoList() const; /** Reloads the current directory. */ void reload(); @@ -264,6 +251,7 @@ public: * which contain the given filter string will be shown. */ void setNameFilter(const QString& nameFilter); + QString nameFilter() const; /** * Calculates the number of currently shown files into @@ -287,11 +275,6 @@ public: */ QList versionControlActions(const KFileItemList& items) const; - /** - * Updates the state of the 'Additional Information' actions in \a collection. - */ - void updateAdditionalInfoActions(KActionCollection* collection); - /** * Returns the state of the paste action: * first is whether the action should be enabled @@ -324,6 +307,16 @@ public: */ 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. + */ + KFileItem rootItem() const; + public slots: /** * Changes the directory to \a url. If the current directory is equal to @@ -344,9 +337,6 @@ public slots: */ void invertSelection(); - /** Returns true, if at least one item is selected. */ - bool hasSelection() const; - void clearSelection(); /** @@ -391,7 +381,7 @@ public slots: * (GeneralSettings::globalViewProps() returns false), then the * preview setting will be stored automatically. */ - void setShowPreview(bool show); + void setPreviewsShown(bool show); /** * Shows all hidden files of the current directory, @@ -400,7 +390,7 @@ public slots: * (GeneralSettings::globalViewProps() returns false), then the * show hidden file setting will be stored automatically. */ - void setShowHiddenFiles(bool show); + void setHiddenFilesShown(bool show); /** * Summarizes all sorted items by their category \a categorized @@ -417,7 +407,14 @@ signals: */ void activated(); - /** Is emitted if URL of the view has been changed to \a url. */ + /** + * Is emitted if the URL of the view will be changed to \a url. + * After the URL has been changed the signal urlChanged() will + * be emitted. + */ + void urlAboutToBeChanged(const KUrl& url); + + /** Is emitted if the URL of the view has been changed to \a url. */ void urlChanged(const KUrl& url); /** @@ -425,6 +422,11 @@ signals: */ void itemTriggered(const KFileItem& item); + /** + * Is emitted if items have been added or deleted. + */ + void itemCountChanged(); + /** * Is emitted if a new tab should be opened for the URL \a url. */ @@ -434,16 +436,16 @@ signals: * Is emitted if the view mode (IconsView, DetailsView, * PreviewsView) has been changed. */ - void modeChanged(); + void modeChanged(DolphinView::Mode current, DolphinView::Mode previous); /** Is emitted if the 'show preview' property has been changed. */ - void showPreviewChanged(); + void previewsShownChanged(bool shown); /** Is emitted if the 'show hidden files' property has been changed. */ - void showHiddenFilesChanged(); + void hiddenFilesShownChanged(bool shown); /** Is emitted if the 'categorized sorting' property has been changed. */ - void categorizedSortingChanged(); + void categorizedSortingChanged(bool sortCategorized); /** Is emitted if the sorting by name, size or date has been changed. */ void sortingChanged(DolphinView::Sorting sorting); @@ -455,10 +457,11 @@ signals: void sortFoldersFirstChanged(bool foldersFirst); /** Is emitted if the additional information shown for this view has been changed. */ - void additionalInfoChanged(); + void additionalInfoListChanged(const QList& current, + const QList& previous); /** Is emitted if the zoom level has been changed by zooming in or out. */ - void zoomLevelChanged(int level); + void zoomLevelChanged(int current, int previous); /** * Is emitted if information of an item is requested to be shown e. g. in the panel. @@ -513,16 +516,34 @@ signals: */ void finishedPathLoading(const KUrl& url); + /** + * Is emitted after DolphinView::setUrl() has been invoked and provides + * the information how much percent of the current path have been loaded. + */ + void pathLoadingProgress(int percent); + + /** + * Is emitted if the DolphinView::setUrl() is invoked but the URL is not + * a directory. + */ + void urlIsFileError(const KUrl& file); + /** * Emitted when KDirLister emits redirection. * Testcase: fish://localhost */ void redirection(const KUrl& oldUrl, const KUrl& newUrl); + /** + * Is emitted when the write state of the folder has been changed. The application + * should disable all actions like "Create New..." that depend on the write + * state. + */ + void writeStateChanged(bool isFolderWritable); + protected: - /** @see QWidget::mouseReleaseEvent */ virtual void mouseReleaseEvent(QMouseEvent* event); - virtual bool eventFilter(QObject* watched, QEvent* event); + virtual void contextMenuEvent(QContextMenuEvent* event); private slots: /** @@ -531,21 +552,19 @@ private slots: */ void activate(); - /** - * If the item \a item is a directory, then this - * directory will be loaded. If the item is a file, the corresponding - * application will get started. - */ - void triggerItem(const KFileItem& index); + void slotItemClicked(int index, Qt::MouseButton button); + void slotItemExpansionToggleClicked(int index); + void slotItemHovered(int index); + void slotItemUnhovered(int index); /** * 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& current, const QSet& previous); /** * Is called by emitDelayedSelectionChangedSignal() and emits the @@ -587,12 +606,6 @@ private slots: */ void updateSortFoldersFirst(bool foldersFirst); - /** - * Updates the view properties of the current URL to the - * additional information given by \a info. - */ - void updateAdditionalInfo(const KFileItemDelegate::InformationList& info); - /** * Updates the status bar to show hover information for the * item \a item. If currently other items are selected, @@ -614,16 +627,16 @@ private slots: void slotDeleteFileFinished(KJob* job); /** - * Invoked when the directory lister has completed the loading of - * items. Assures that pasted items and renamed items get seleced. + * Invoked when the directory lister has been started the + * loading of \a url. */ - void slotDirListerCompleted(); + void slotDirListerStarted(const KUrl& url); /** - * Invoked when the loading of the directory is finished. - * Restores the active item and the scroll position if possible. + * Invoked when the directory lister has completed the loading of + * items. Assures that pasted items and renamed items get seleced. */ - void slotLoadingCompleted(); + void slotDirListerCompleted(); /** * Is invoked when the KDirLister indicates refreshed items. @@ -633,7 +646,7 @@ private slots: /** * 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 assure that the item stays visible. + * get selected and it is assured that the item stays visible. * * @see selectAndScrollToCreatedItem() */ @@ -652,11 +665,16 @@ private slots: void slotRedirection(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); private: + KFileItemModel* fileItemModel() const; + void loadDirectory(const KUrl& url, bool reload = false); /** @@ -665,13 +683,7 @@ private: */ void applyViewProperties(); - /** - * Creates a new view representing the given view mode (DolphinView::mode()). - * The current view will get deleted. - */ - void createView(); - - void deleteView(); + void applyAdditionalInfoListToView(); /** * Helper method for DolphinView::paste() and DolphinView::pasteIntoFolder(). @@ -701,105 +713,48 @@ private: /** * 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); + void markPastedUrlsAsSelected(const QMimeData* mimeData); -private: /** - * Abstracts the access to the different view implementations - * for icons-, details- and column-view. + * 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. */ - class ViewAccessor - { - public: - ViewAccessor(DolphinSortFilterProxyModel* proxyModel); - ~ViewAccessor(); - - void createView(QWidget* parent, - DolphinViewController* dolphinViewController, - const ViewModeController* viewModeController, - Mode mode); - void deleteView(); - - /** - * Must be invoked before the URL has been changed and allows view implementations - * like the column view to create a new column. - */ - void prepareUrlChange(const KUrl& url); - - QAbstractItemView* itemView() const; - KFileItemDelegate* itemDelegate() const; - - /** - * Returns the widget that should be added to the layout as target. Usually - * the item view itself is returned, but in the case of the column view - * a container widget is returned. - */ - QWidget* layoutTarget() const; - - KUrl rootUrl() const; - - bool supportsCategorizedSorting() const; - bool itemsExpandable() const; - QSet expandedUrls() const; - const DolphinDetailsViewExpander* setExpandedUrls(const QSet& urlsToExpand); + void updateWritableState(); - /** - * Returns true, if a reloading of the items is required - * when the additional information properties have been changed - * by the user. - */ - bool reloadOnAdditionalInfoChange() const; - - DolphinModel* dirModel() const; - DolphinSortFilterProxyModel* proxyModel() const; - KDirLister* dirLister() const; - - private: - DolphinIconsView* m_iconsView; - DolphinDetailsView* m_detailsView; - DolphinColumnViewContainer* m_columnsContainer; - DolphinSortFilterProxyModel* m_proxyModel; - QAbstractItemView* m_dragSource; - QPointer m_detailsViewExpander; - }; + QByteArray sortRoleForSorting(Sorting sorting) const; +private: bool m_active : 1; - bool m_showPreview : 1; - bool m_storedCategorizedSorting : 1; bool m_tabsForFiles : 1; - bool m_isContextMenuOpen : 1; // TODO: workaround for Qt-issue 207192 bool m_assureVisibleCurrentIndex : 1; - bool m_expanderActive : 1; + bool m_isFolderWritable : 1; + KUrl m_url; Mode m_mode; + QList m_additionalInfoList; QVBoxLayout* m_topLayout; - DolphinViewController* m_dolphinViewController; - ViewModeController* m_viewModeController; - ViewAccessor m_viewAccessor; + DolphinDirLister* m_dirLister; + DolphinItemListContainer* m_container; + + ToolTipManager* m_toolTipManager; QTimer* m_selectionChangedTimer; - KUrl m_rootUrl; - KUrl m_activeItemUrl; + int m_currentItemIndex; 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 m_newFileNames; - // For unit tests friend class TestBase; + friend class DolphinDetailsViewTest; }; /// Allow using DolphinView::Mode in QVariant