]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.h
Restore the "Edit->Selection" menu from Konqueror 3 for file
[dolphin.git] / src / dolphinview.h
index 7014aeb02f595f29b07f81cf80139c619cae6030..97054b7542c8f6fbde3965125d37d0dc078ec88b 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006-2009 by Peter Penz <peter.penz@gmx.at>             *
  *   Copyright (C) 2006 by Gregor Kališnik <gregor@podnapisi.net>          *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include <QKeyEvent>
 #include <QLinkedList>
 #include <QListView>
+#include <QSet>
 #include <QWidget>
 
+typedef KIO::FileUndoManager::CommandType CommandType;
+
 class DolphinController;
-class DolphinColumnView;
+class DolphinColumnViewContainer;
 class DolphinDetailsView;
-class DolphinFileItemDelegate;
 class DolphinIconsView;
 class DolphinMainWindow;
 class DolphinModel;
@@ -51,10 +53,8 @@ class KAction;
 class KActionCollection;
 class KDirLister;
 class KUrl;
-class KToggleAction;
-class ToolTipManager;
-class QModelIndex;
 class ViewProperties;
+class DolphinDetailsViewExpander;
 
 /**
  * @short Represents a view for the directory content.
@@ -121,18 +121,12 @@ public:
     /**
      * @param parent           Parent widget of the view.
      * @param url              Specifies the content which should be shown.
-     * @param dirLister        Used directory lister. The lister is not owned
-     *                         by the view and won't get deleted.
-     * @param dolphinModel     Used directory model. The model is not owned
-     *                         by the view and won't get deleted.
      * @param proxyModel       Used proxy model which specifies the sorting. The
      *                         model is not owned by the view and won't get
      *                         deleted.
      */
     DolphinView(QWidget* parent,
                 const KUrl& url,
-                KDirLister* dirLister,
-                DolphinModel* dolphinModel,
                 DolphinSortFilterProxyModel* proxyModel);
 
     virtual ~DolphinView();
@@ -187,24 +181,6 @@ public:
      */
     bool supportsCategorizedSorting() const;
 
-    /**
-     * Selects all items.
-     * @see DolphinView::selectedItems()
-     */
-    void selectAll();
-
-    /**
-     * Inverts the current selection: selected items get unselected,
-     * unselected items get selected.
-     * @see DolphinView::selectedItems()
-     */
-    void invertSelection();
-
-    /** Returns true, if at least one item is selected. */
-    bool hasSelection() const;
-
-    void clearSelection();
-
     /**
      * Returns the selected items. The list is empty if no item has been
      * selected.
@@ -225,6 +201,8 @@ public:
      */
     int selectedItemsCount() const;
 
+    QItemSelectionModel* selectionModel() const;
+
     /**
      * Sets the upper left position of the view content
      * to (x,y). The content of the view might be larger than the visible area
@@ -232,6 +210,13 @@ public:
      */
     void setContentsPosition(int x, int y);
 
+    /**
+     * Sets the upper left position of the view content
+     * to (x,y) after the directory loading is finished.
+     * This is useful when going back or forward in history.
+     */
+    void setRestoredContentsPosition(const QPoint& pos);
+
     /** Returns the upper left position of the view content. */
     QPoint contentsPosition() const;
 
@@ -321,6 +306,12 @@ public:
      */
     QString statusBarText() const;
 
+    /**
+     * 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;
+
     /**
      * Updates the state of the 'Additional Information' actions in \a collection.
      */
@@ -342,12 +333,31 @@ public:
     void setTabsForFilesEnabled(bool tabsForFiles);
     bool isTabsForFilesEnabled() const;
 
+    /**
+     * Marks the item \a url as active item as soon as it has
+     * been loaded by the directory lister. This is useful mark
+     * the previously visited directory as active when going
+     * back in history (the URL is known, but the item is not
+     * loaded yet).
+     */
+    void activateItem(const KUrl& url);
+
     /**
      * Returns true if the current view allows folders to be expanded,
      * i.e. presents a hierarchical view to the user.
      */
     bool itemsExpandable() const;
 
+    /**
+     * Restores the view state (current item, contents position, details view expansion state)
+     */
+    void restoreState(QDataStream &stream);
+
+    /**
+     * Saves the view state (current item, contents position, details view expansion state)
+     */
+    void saveState(QDataStream &stream);
+
 public slots:
     /**
      * Changes the directory to \a url. If the current directory is equal to
@@ -355,6 +365,24 @@ public slots:
      */
     void setUrl(const KUrl& url);
 
+    /**
+     * Selects all items.
+     * @see DolphinView::selectedItems()
+     */
+    void selectAll();
+
+    /**
+     * Inverts the current selection: selected items get unselected,
+     * unselected items get selected.
+     * @see DolphinView::selectedItems()
+     */
+    void invertSelection();
+
+    /** Returns true, if at least one item is selected. */
+    bool hasSelection() const;
+
+    void clearSelection();
+
     /**
      * Request of a selection change. The view will do its best to accommodate
      * the request, but it is not guaranteed that all items in \a selection
@@ -381,7 +409,7 @@ public slots:
 
     /**
      * Copies all selected items to the clipboard and marks
-     * the items as cutted.
+     * the items as cut.
      */
     void cutSelectedItems();
 
@@ -551,7 +579,6 @@ signals:
 protected:
     /** @see QWidget::mouseReleaseEvent */
     virtual void mouseReleaseEvent(QMouseEvent* event);
-    virtual void wheelEvent(QWheelEvent* event);
     virtual bool eventFilter(QObject* watched, QEvent* event);
 
 private slots:
@@ -568,6 +595,19 @@ private slots:
      */
     void triggerItem(const KFileItem& index);
 
+    /**
+     * Emits the signal \a selectionChanged() with a small delay. This is
+     * because getting all file items for the signal 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 emitDelayedSelectionChangedSignal();
+
+    /**
+     * Is called by emitDelayedSelectionChangedSignal() and emits the
+     * signal \a selectionChanged() with all selected file items as parameter.
+     */
     void emitSelectionChangedSignal();
 
     /**
@@ -643,22 +683,21 @@ private slots:
     void slotRequestUrlChange(const KUrl& url);
 
     /**
-     * Restores the current item (= item that has the keyboard focus)
-     * to m_currentItemUrl.
+     * Invoked when the directory lister has completed the loading of
+     * items. Assures that pasted items and renamed items get seleced.
      */
-    void restoreCurrentItem();
+    void slotDirListerCompleted();
 
     /**
-     * Is invoked when the KDirLister indicates refreshed items.
+     * Invoked when the loading of the directory is finished.
+     * Restores the active item and the scroll position if possible.
      */
-    void slotRefreshItems();
+    void slotLoadingCompleted();
 
     /**
-     * If \a view can be positively identified as not being the source for the
-     * current drag operation, deleteLater() it immediately.  Else stores
-     * it for later deletion.
+     * Is invoked when the KDirLister indicates refreshed items.
      */
-    void deleteWhenNotDragSource(QAbstractItemView* view);
+    void slotRefreshItems();
 
     /**
      * Observes the item with the URL \a url. As soon as the directory
@@ -680,23 +719,25 @@ private slots:
      */
     void restoreSelection();
 
-private:
-    void loadDirectory(const KUrl& url, bool reload = false);
+    /**
+     * Called when a redirection happens.
+     * Testcase: fish://localhost
+     */
+    void slotRedirection(const KUrl& oldUrl, const KUrl& newUrl);
 
     /**
-     * Returns the URL where the view properties should be stored. Usually
-     * DolphinView::url() is returned, but in the case of a Column View the
-     * view properties are always stored in the directory represented by the
-     * first column. It is recommendend whenever using the ViewProperties class
-     * to use DolphinView::viewPropertiesUrl() as URL.
+     * Restores the contents position, if history information about the old position is available.
      */
-    KUrl viewPropertiesUrl() const;
+    void restoreContentsPosition();
+
+private:
+    void loadDirectory(const KUrl& url, bool reload = false);
 
     /**
      * Applies the view properties which are defined by the current URL
-     * m_url to the DolphinView properties.
+     * to the DolphinView properties.
      */
-    void applyViewProperties(const KUrl& url);
+    void applyViewProperties();
 
     /**
      * Creates a new view representing the given view mode (DolphinView::mode()).
@@ -706,12 +747,6 @@ private:
 
     void deleteView();
 
-    /**
-     * Returns a pointer to the currently used item view, which is either
-     * a ListView or a TreeView.
-     */
-    QAbstractItemView* itemView() const;
-
     /**
      * Helper method for DolphinView::paste() and DolphinView::pasteIntoFolder().
      * Pastes the clipboard data into the URL \a url.
@@ -734,18 +769,75 @@ private:
     KUrl::List simplifiedSelectedUrls() const;
 
     /**
-     * Returns true, if the ColumnView is activated. As the column view
-     * requires some special handling for iterating through directories,
-     * this method has been introduced for convenience.
+     * Returns the MIME data for all selected items.
      */
-    bool isColumnViewActive() const;
+    QMimeData* selectionMimeData() const;
 
     /**
-     * Returns the MIME data for all selected items.
+     * 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().
      */
-    QMimeData* selectionMimeData() const;
+    void addNewFileNames(const QMimeData* mimeData);
 
 private:
+    /**
+     * Abstracts the access to the different view implementations
+     * for icons-, details- and column-view.
+     */
+    class ViewAccessor
+    {
+    public:
+        ViewAccessor(DolphinSortFilterProxyModel* proxyModel);
+        ~ViewAccessor();
+
+        void createView(QWidget* parent, DolphinController* controller, 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<KUrl> expandedUrls() const;
+        const DolphinDetailsViewExpander* setExpandedUrls(const QSet<KUrl>& urlsToExpand);
+
+        /**
+         * 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<DolphinDetailsViewExpander> m_detailsViewExpander;
+    };
+
     bool m_active : 1;
     bool m_showPreview : 1;
     bool m_loadingDirectory : 1;
@@ -754,6 +846,7 @@ private:
     bool m_isContextMenuOpen : 1;   // TODO: workaround for Qt-issue 207192
     bool m_ignoreViewProperties : 1;
     bool m_assureVisibleCurrentIndex : 1;
+    bool m_expanderActive : 1;
 
     Mode m_mode;
 
@@ -761,32 +854,25 @@ private:
     QVBoxLayout* m_topLayout;
 
     DolphinController* m_controller;
-    DolphinIconsView* m_iconsView;
-    DolphinDetailsView* m_detailsView;
-    DolphinColumnView* m_columnView;
-    DolphinFileItemDelegate* m_fileItemDelegate;
-    QItemSelectionModel* m_selectionModel;
-
-    DolphinModel* m_dolphinModel;
-    KDirLister* m_dirLister;
-    DolphinSortFilterProxyModel* m_proxyModel;
+    ViewAccessor m_viewAccessor;
 
-    KFilePreviewGenerator* m_previewGenerator;
-    ToolTipManager* m_toolTipManager;
+    QItemSelectionModel* m_selectionModel; // allow to switch views without losing the selection
+    QTimer* m_selectionChangedTimer;
 
     KUrl m_rootUrl;
-    KUrl m_currentItemUrl;
+    KUrl m_activeItemUrl;
+    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
+    KFileItemList m_selectedItems; // this is used for making the View to remember selections after F5
 
-    QAbstractItemView* m_expandedDragSource;
+    /**
+     * 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;
 };
 
-inline bool DolphinView::isColumnViewActive() const
-{
-    return m_columnView != 0;
-}
-
 /// Allow using DolphinView::Mode in QVariant
 Q_DECLARE_METATYPE(DolphinView::Mode)