]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.h
don't lose the history of the URL navigator if the settings of the Icons View, Detail...
[dolphin.git] / src / dolphinview.h
index 5c7fb5c2cf555aa0bb22d6b93d0c18952bd45541..b3b20600216b031182ed37e437d6dc47a27a3b49 100644 (file)
  *   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.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
  ***************************************************************************/
 
 
 #ifndef _DOLPHINVIEW_H_
 #define _DOLPHINVIEW_H_
 
-#include <qwidget.h>
-//Added by qt3to4:
-#include <QDropEvent>
-#include <Q3ValueList>
-#include <QMouseEvent>
-#include <Q3VBoxLayout>
 #include <kparts/part.h>
 #include <kfileitem.h>
-#include <kfileiconview.h>
+#include <kfileitemdelegate.h>
 #include <kio/job.h>
-#include <urlnavigator.h>
 
-#include <QListView>
+#include <kurlnavigator.h>
 
-class QPainter;
+#include <QtGui/QKeyEvent>
+#include <QtCore/QLinkedList>
+#include <QtGui/QListView>
+#include <QtGui/QBoxLayout>
+#include <QtGui/QWidget>
+
+class DolphinController;
+class FilterBar;
+class KFileItemDelegate;
 class KUrl;
 class KDirModel;
-class QLineEdit;
-class UrlNavigator;
-class QTimer;
-class Q3IconViewItem;
-class Q3ListViewItem;
-class Q3VBoxLayout;
-//class KFileView;
-class Dolphin;
+class KUrlNavigator;
+class DolphinColumnView;
+class DolphinDetailsView;
 class DolphinDirLister;
-class DolphinStatusBar;
 class DolphinIconsView;
-class DolphinDetailsView;
-class ViewProperties;
-class Q3ScrollView;
-class KProgress;
-class ItemEffectsManager;
-class FilterBar;
-
+class DolphinMainWindow;
+class DolphinSortFilterProxyModel;
+class DolphinStatusBar;
 class QModelIndex;
+class QPainter;
+class QTimer;
+class ViewProperties;
 
 /**
  * @short Represents a view for the directory content
- * including the navigation bar and status bar.
+ *        including the navigation bar, filter bar and status bar.
  *
- * View modes for icons, details and previews are supported. Currently
+ * View modes for icons, details and columns are supported. Currently
  * Dolphin allows to have up to two views inside the main window.
  *
  * @see DolphinIconsView
  * @see DolphinDetailsView
- * @see UrlNavigator
+ * @see DolphinColumnView
+ * @see KUrlNavigator
  * @see DolphinStatusBar
- *
- * @author Peter Penz <peter.penz@gmx.at>
  */
 class DolphinView : public QWidget
 {
     Q_OBJECT
 
 public:
-       /**
-     * Defines the view mode for a directory. The view mode
-     * can be defined when constructing a DolphinView. The
-     * view mode is automatically updated if the directory itself
-     * defines a view mode (see class ViewProperties for details).
-     */
+    /**
+        * Defines the view mode for a directory. The view mode
+        * can be defined when constructing a DolphinView. The
+        * view mode is automatically updated if the directory itself
+        * defines a view mode (see class ViewProperties for details).
+        */
     enum Mode
     {
         /**
@@ -99,23 +92,27 @@ public:
         DetailsView = 1,
 
         /**
-         * The directory items are shown as preview if possible. As
-         * fallback the items are shown as icons.
+         * Each folder is shown in a separate column.
          */
-        PreviewsView = 2,
-        MaxModeEnum = PreviewsView
+        ColumnView = 2,
+        MaxModeEnum = ColumnView
     };
 
     /** Defines the sort order for the items of a directory. */
     enum Sorting
     {
         SortByName = 0,
-        SortBySize = 1,
-        SortByDate = 2,
-        MaxSortEnum = SortByDate
+        SortBySize,
+        SortByDate,
+        SortByPermissions,
+        SortByOwner,
+        SortByGroup,
+        SortByType,
+        MaxSortEnum = SortByType
     };
 
-    DolphinView(QWidget* parent,
+    DolphinView(DolphinMainWindow* mainwindow,
+                QWidget *parent,
                 const KUrl& url,
                 Mode mode = IconsView,
                 bool showHiddenFiles = false);
@@ -123,24 +120,67 @@ public:
     virtual ~DolphinView();
 
     /**
-     * Sets the current active Url.
-     * The signals UrlNavigator::urlChanged and UrlNavigator::historyChanged
-     * are submitted.
+     * Sets the current active URL.
+     * The signals KUrlNavigator::urlChanged() and KUrlNavigator::historyChanged()
+     * are emitted.
      */
     void setUrl(const KUrl& url);
 
-    /** Returns the current active Url. */
+    /** Returns the current active URL. */
     const KUrl& url() const;
 
-    void requestActivation();
+    /**
+     * Returns true if the view is active and hence all actions are
+     * applied to this view.
+     */
     bool isActive() const;
 
+    /**
+     * Changes the view mode for the current directory to \a mode.
+     * If the view properties should be remembered for each directory
+     * (GeneralSettings::globalViewProps() returns false), then the
+     * changed view mode will be be stored automatically.
+     */
     void setMode(Mode mode);
     Mode mode() const;
-    void setShowHiddenFilesEnabled(bool show);
-    bool isShowHiddenFilesEnabled() const;
 
-    void setViewProperties(const ViewProperties& props);
+    /**
+     * 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 be stored automatically.
+     */
+    void setShowPreview(bool show);
+    bool showPreview() const;
+
+    /**
+     * 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 be stored automatically.
+     */
+    void setShowHiddenFiles(bool show);
+    bool showHiddenFiles() const;
+
+    /**
+     * 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 be stored automatically.
+     */
+    void setCategorizedSorting(bool categorized);
+    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().
+     */
+    bool supportsCategorizedSorting() const;
 
     /**
      * Triggers the renaming of the currently selected items, where
@@ -162,89 +202,70 @@ public:
     void invertSelection();
 
     /**
-     * Goes back one step in the Url history. The signals
-     * UrlNavigator::urlChanged and UrlNavigator::historyChanged
+     * Goes back one step in the URL history. The signals
+     * KUrlNavigator::urlChanged() and KUrlNavigator::historyChanged()
      * are submitted.
      */
     void goBack();
 
     /**
      * Goes forward one step in the Url history. The signals
-     * UrlNavigator::urlChanged and UrlNavigator::historyChanged
+     * KUrlNavigator::urlChanged() and KUrlNavigator::historyChanged()
      * are submitted.
      */
     void goForward();
 
     /**
      * Goes up one step of the Url path. The signals
-     * UrlNavigator::urlChanged and UrlNavigator::historyChanged
+     * KUrlNavigator::urlChanged() and KUrlNavigator::historyChanged()
      * are submitted.
      */
     void goUp();
 
     /**
-     * Goes to the home Url. The signals UrlNavigator::urlChanged
-     * and UrlNavigator::historyChanged are submitted.
+     * Goes to the home URL. The signals KUrlNavigator::urlChanged()
+     * and KUrlNavigator::historyChanged() are submitted.
      */
     void goHome();
 
     /**
-     * Sets the Url of the navigation bar to an editable state
+     * Sets the URL of the navigation bar to an editable state
      * if \a editable is true. If \a editable is false, each part of
      * the location is presented by a button for a fast navigation.
      */
     void setUrlEditable(bool editable);
 
-    /**
-     * Returns the complete Url history. The index 0 indicates the oldest
-     * history element.
-     * @param index     Output parameter which indicates the current
-     *                  index of the location.
-     */
-    const Q3ValueList<UrlNavigator::HistoryElem> urlHistory(int& index) const;
-
-    /**
-     * Returns true, if at least one item is selected.
-     */
+    /** Returns true, if at least one item is selected. */
     bool hasSelection() const;
 
+    void clearSelection();
+
     /**
-     * Returns the selected items. 0 is returned, if no item
-     * is selected.
+     * Returns the selected items. The list is empty if no item has been
+     * selected.
      * @see DolphinView::selectedUrls()
      */
-    const KFileItemList* selectedItems() const;
+    KFileItemList selectedItems() const;
 
     /**
-     * Returns a list of Urls for all selected items. An empty list
+     * Returns a list of URLs for all selected items. An empty list
      * is returned, if no item is selected.
      * @see DolphinView::selectedItems()
      */
     KUrl::List selectedUrls() const;
 
     /**
-     * Returns the current item, where the cursor is. 0 is returned, if there is no
-     * current item (e. g. if the view is empty). Note that the current item must
-     * not be a selected item.
-     * @see DolphinView::selectedItems()
+     * Returns the file item for the given model index \a index.
      */
-    const KFileItem* currentFileItem() const;
+    KFileItem* fileItem(const QModelIndex index) const;
 
     /**
-     * Opens the context menu for the item indicated by \a fileInfo
-     * on the position \a pos. If 0 is passed for the file info, a context
-     * menu for the viewport is opened.
-     */
-    void openContextMenu(KFileItem* fileInfo, const QPoint& pos);
-
-    /**
-     * Renames the filename of the source Url by the new file name.
+     * Renames the filename of the source URL by the new file name.
      * If the new file name already exists, a dialog is opened which
      * asks the user to enter a new name.
      */
     void rename(const KUrl& source, const QString& newName);
 
-    /** Returns the status bar of the view. */
     DolphinStatusBar* statusBar() const;
 
     /**
@@ -262,8 +283,8 @@ public:
     int contentsY() const;
 
     /**
-     * Returns true, if the Url shown by the navigation bar is editable.
-     * @see UrlNavigator
+     * Returns true, if the URL shown by the navigation bar is editable.
+     * @see KUrlNavigator
      */
     bool isUrlEditable() const;
 
@@ -297,123 +318,217 @@ public:
     /** Returns the current used sort order (Qt::Ascending or Qt::Descending). */
     Qt::SortOrder sortOrder() const;
 
-    /** Refreshs the view settings by reading out the stored settings. */
-    void refreshSettings();
+    /** Sets the additional information which should be shown for the items. */
+    void setAdditionalInfo(KFileItemDelegate::AdditionalInformation info);
 
-    /**
-     * Updates the number of items (= number of files + number of
-     * directories) in the statusbar. If files are selected, the number
-     * of selected files and the sum of the filesize is shown.
-     */
-    void updateStatusBar();
+    /** Returns the additional information which should be shown for the items. */
+    KFileItemDelegate::AdditionalInformation additionalInfo() const;
 
-    /** Returns the UrlNavigator of the view for read access. */
-    const UrlNavigator* urlNavigator() const { return m_urlNavigator; }
+    /** Returns the KUrlNavigator of the view for read access. */
+    const KUrlNavigator* urlNavigator() const
+    {
+        return m_urlNavigator;
+    }
 
     /**
      * Triggers to request user information for the item given
-     * by the Url \a url. The signal signalRequestItemInfo is emitted,
+     * by the URL \a url. The signal requestItemInfo is emitted,
      * which provides a way for widgets to get an indication to update
      * the item information.
      */
-    void requestItemInfo(const KUrl& url);
+    void emitRequestItemInfo(const KUrl& url);
+
+    /** Returns true, if the filter bar is visible. */
+    bool isFilterBarVisible() const;
 
     /**
-     * Checks if the filter bar is visible.
-     *
-     * @return @c true Filter bar is visible.
-     * @return @c false Filter bar is not visible.
+     * Return the DolphinMainWindow this View belongs to. It is guranteed
+     * that we have one.
      */
-    bool isFilterBarVisible();
+    DolphinMainWindow* mainWindow() const ;
 
-public slots:
+    /** Reloads the current directory. */
     void reload();
-    void slotUrlListDropped(QDropEvent* event,
-                            const KUrl::List& urls,
-                            const KUrl& url);
 
     /**
-     * Slot that popups the filter bar like FireFox popups his Search bar.
+     * Refreshs 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.
      */
-    void slotShowFilterBar(bool show);
+    void refresh();
+
+public slots:
+    /**
+     * Popups the filter bar above the status bar if \a show is true.
+     */
+    void showFilterBar(bool show);
+
+    /**
+     * Updates the number of items (= number of files + number of
+     * directories) in the statusbar. If files are selected, the number
+     * of selected files and the sum of the filesize is shown.
+     */
+    void updateStatusBar();
+
+    /**
+     * Requests the main window to set this view as active view, which
+     * means that all actions are applied to this view.
+     */
+    void requestActivation();
+
+    /**
+     * 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
+     * will actually get selected. The view will e.g. not select items which
+     * are not in the currently displayed folder.
+     */
+    void changeSelection(const KFileItemList& selection);
 
 signals:
-    /** Is emitted if Url of the view has been changed to \a url. */
-    void signalUrlChanged(const KUrl& url);
+    /** Is emitted if URL of the view has been changed to \a url. */
+    void urlChanged(const KUrl& url);
 
     /**
      * Is emitted if the view mode (IconsView, DetailsView,
      * PreviewsView) has been changed.
      */
-    void signalModeChanged();
+    void modeChanged();
+
+    /** Is emitted if the 'show preview' property has been changed. */
+    void showPreviewChanged();
 
     /** Is emitted if the 'show hidden files' property has been changed. */
-    void signalShowHiddenFilesChanged();
+    void showHiddenFilesChanged();
+
+    /** Is emitted if the 'categorized sorting' property has been changed. */
+    void categorizedSortingChanged();
 
     /** Is emitted if the sorting by name, size or date has been changed. */
-    void signalSortingChanged(DolphinView::Sorting sorting);
+    void sortingChanged(DolphinView::Sorting sorting);
 
     /** Is emitted if the sort order (ascending or descending) has been changed. */
-    void signalSortOrderChanged(Qt::SortOrder order);
+    void sortOrderChanged(Qt::SortOrder order);
+
+    /** Is emitted if the addtional information for an item has been changed. */
+    void additionalInfoChanged(KFileItemDelegate::AdditionalInformation info);
 
     /**
      * Is emitted if information of an item is requested to be shown e. g. in the sidebar.
-     * It the Url is empty, no item information request is pending.
+     * It the URL is empty, no item information request is pending.
      */
-    void signalRequestItemInfo(const KUrl& url);
+    void requestItemInfo(const KUrl& url);
 
     /** Is emitted if the contents has been moved to \a x, \a y. */
     void contentsMoved(int x, int y);
 
     /**
-     * Is emitted whenever the selection has been changed. The current selection can
-     * be retrieved by Dolphin::mainWin().activeView()->selectedItems() or by
-     * Dolphin::mainWin().activeView()->selectedUrls().
+     * Is emitted whenever the selection has been changed.
      */
-    void signalSelectionChanged();
+    void selectionChanged(const KFileItemList& selection);
 
     /**
-     * Is emitted whenever the directory view is redirected by an ioslave
+     * Is emitted whenever the filter bar has been turned show or hidden.
      */
-    void redirection(const KUrl& oldUrl, const KUrl& newUrl);
+    void showFilterBarChanged(bool shown);
 
 protected:
     /** @see QWidget::mouseReleaseEvent */
     virtual void mouseReleaseEvent(QMouseEvent* event);
 
 private slots:
-    void slotUrlChanged(const KUrl& kurl);
-    void triggerIconsViewItem(Q3IconViewItem *item);
+    void changeDirectory(const KUrl& url);
     void triggerItem(const QModelIndex& index);
-    void updateUrl();
+    void updateProgress(int percent);
 
-    void slotPercent(int percent);
-    void slotClear();
-    void slotDeleteItem(KFileItem* item);
-    void slotCompleted();
-    void slotInfoMessage(const QString& msg);
-    void slotErrorMessage(const QString& msg);
+    /**
+     * Updates the number of items (= number of directories + number of files)
+     * and shows this information in the statusbar.
+     */
+    void updateItemCount();
+
+    /**
+     * Generates a preview image for each file item in \a items.
+     * The current preview settings (maximum size, 'Show Preview' menu)
+     * are respected.
+     */
+    void generatePreviews(const KFileItemList& items);
 
-    void slotGrabActivation();
+    /**
+     * Replaces the icon of the item \a item by the preview pixmap
+     * \a pixmap.
+     */
+    void showPreview(const KFileItem& item, const QPixmap& pixmap);
 
     /**
-     * Is invoked shortly before the contents of a view implementation
-     * has been moved and emits the signal contentsMoved. Note that no
-     * signal is emitted when the contents moving is only temporary by
-     * e. g. reloading a directory.
+     * Restores the x- and y-position of the contents if the
+     * current view is part of the history.
      */
-    void slotContentsMoving(int x, int y);
+    void restoreContentsPos();
+
+    /** Shows the information \a msg inside the statusbar. */
+    void showInfoMessage(const QString& msg);
+
+    /** Shows the error message \a msg inside the statusbar. */
+    void showErrorMessage(const QString& msg);
+
+    void emitSelectionChangedSignal();
+    void closeFilterBar();
 
     /**
      * Filters the currently shown items by \a nameFilter. All items
      * which contain the given filter string will be shown.
      */
-    void slotChangeNameFilter(const QString& nameFilter);
+    void changeNameFilter(const QString& nameFilter);
+
+    /**
+     * 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);
+
+    /**
+     * Drops the URLs \a urls to the index \a index. \a source
+     * indicates the widget where the dragging has been started from.
+     */
+    void dropUrls(const KUrl::List& urls,
+                  const QModelIndex& index,
+                  QWidget* source);
+
+    /**
+     * Drops the URLs \a urls at the
+     * destination \a destination.
+     */
+    void dropUrls(const KUrl::List& urls,
+                  const KUrl& destination);
+    /**
+     * Updates the view properties of the current URL to the
+     * sorting given by \a sorting.
+     */
+    void updateSorting(DolphinView::Sorting sorting);
+
+    /**
+     * Updates the view properties of the current URL to the
+     * sort order given by \a order.
+     */
+    void updateSortOrder(Qt::SortOrder order);
+
+    /**
+     * Emits the signal contentsMoved with the current coordinates
+     * of the viewport as parameters.
+     */
+    void emitContentsMoved();
+
+    /**
+     * Updates the activation state of the view by checking whether
+     * the currently active view is this view.
+     */
+    void updateActivationState();
+
+    /** Applies an item effect to all cut items of the clipboard. */
+    void updateCutItems();
 
 private:
-    //KFileView* fileView() const;
-    Q3ScrollView* scrollView() const;
-    ItemEffectsManager* itemEffectsManager() const;
     void startDirLister(const KUrl& url, bool reload = false);
 
     /**
@@ -429,33 +544,86 @@ private:
     QString selectionStatusBarText() const;
 
     /**
-     * Returns the string representation for the index \a index
-     * for renaming \itemCount items.
+     * Creates a new view representing the given view mode (DolphinView::mode()).
+     * The current view will get deleted.
+     */
+    void createView();
+
+    /**
+     * Selects all items by using the selection flags \a flags. This is a helper
+     * method for the slots DolphinView::selectAll() and DolphinView::invertSelection().
+     */
+    void selectAll(QItemSelectionModel::SelectionFlags flags);
+
+    /**
+     * Returns a pointer to the currently used item view, which is either
+     * a ListView or a TreeView.
+     */
+    QAbstractItemView* itemView() const;
+
+    /**
+     * Returns true if the index is valid and represents
+     * the column KDirModel::Name.
+     */
+    bool isValidNameIndex(const QModelIndex& index) const;
+
+    /**
+     * Returns true, if the item \a item has been cut into
+     * the clipboard.
      */
-    QString renameIndexPresentation(int index, int itemCount) const;
+    bool isCutItem(const KFileItem& item) const;
+
+    /** Applies an item effect to all cut items. */
+    void applyCutItemEffect();
 
     /**
-     * Applies the current view mode m_mode to the
-     * view implementation.
+     * 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.
      */
-    void applyModeToView();
+    bool isColumnViewActive() const
+    {
+        return m_columnView != 0;
+    }
+
+private:
+    /**
+     * Remembers the original pixmap for an item before
+     * the cut effect is applied.
+     */
+    struct CutItem
+    {
+        KUrl url;
+        QPixmap pixmap;
+    };
 
-    bool m_refreshing;
     bool m_showProgress;
+    bool m_blockContentsMovedSignal;
+    bool m_initializeColumnView;
     Mode m_mode;
 
-    Q3VBoxLayout* m_topLayout;
-    UrlNavigator* m_urlNavigator;
-    DolphinIconsView* m_iconsView;
-    DolphinStatusBar* m_statusBar;
-
     int m_iconSize;
     int m_folderCount;
     int m_fileCount;
 
+    DolphinMainWindow* m_mainWindow;
+    QVBoxLayout* m_topLayout;
+    KUrlNavigator* m_urlNavigator;
+
+    DolphinController* m_controller;
+    DolphinIconsView* m_iconsView;
+    DolphinDetailsView* m_detailsView;
+    DolphinColumnView* m_columnView;
+    KFileItemDelegate* m_fileItemDelegate;
+
+    FilterBar* m_filterBar;
+    DolphinStatusBar* m_statusBar;
+
+    KDirModel* m_dirModel;
     DolphinDirLister* m_dirLister;
+    DolphinSortFilterProxyModel* m_proxyModel;
 
-    FilterBar *m_filterBar;
+    QList<CutItem> m_cutItemsCache;
 };
 
 #endif // _DOLPHINVIEW_H_