]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontroller.h
Merge branch 'master' of git.kde.org:dolphin
[dolphin.git] / src / kitemviews / kitemlistcontroller.h
index d0e5f72ec7882b11905462467159cd32320c1f99..5e5e6b7c3eedc2a142552bd4c44ac635811a3b21 100644 (file)
 #ifndef KITEMLISTCONTROLLER_H
 #define KITEMLISTCONTROLLER_H
 
-#include <libdolphin_export.h>
+#include "dolphin_export.h"
+
+#include "kitemset.h"
 
 #include <QObject>
-#include <QPixmap>
 #include <QPointF>
-#include <QSet>
-
+class QTimer;
 class KItemModelBase;
 class KItemListKeyboardSearchManager;
 class KItemListSelectionManager;
@@ -43,7 +43,6 @@ class QGraphicsSceneWheelEvent;
 class QHideEvent;
 class QInputMethodEvent;
 class QKeyEvent;
-class QMimeData;
 class QShowEvent;
 class QTransform;
 
@@ -57,13 +56,14 @@ class QTransform;
  * @see KItemModelBase
  * @see KItemListSelectionManager
  */
-class LIBDOLPHINPRIVATE_EXPORT KItemListController : public QObject
+class DOLPHIN_EXPORT KItemListController : public QObject
 {
     Q_OBJECT
-    Q_ENUMS(SelectionBehavior)
     Q_PROPERTY(KItemModelBase* model READ model WRITE setModel)
     Q_PROPERTY(KItemListView *view READ view WRITE setView)
     Q_PROPERTY(SelectionBehavior selectionBehavior READ selectionBehavior WRITE setSelectionBehavior)
+    Q_PROPERTY(AutoActivationBehavior autoActivationBehavior READ autoActivationBehavior WRITE setAutoActivationBehavior)
+    Q_PROPERTY(MouseDoubleClickAction mouseDoubleClickAction READ mouseDoubleClickAction WRITE setMouseDoubleClickAction)
 
 public:
     enum SelectionBehavior {
@@ -71,8 +71,24 @@ public:
         SingleSelection,
         MultiSelection
     };
+    Q_ENUM(SelectionBehavior)
+
+    enum AutoActivationBehavior {
+        ActivationAndExpansion,
+        ExpansionOnly
+    };
+
+    enum MouseDoubleClickAction {
+        ActivateAndExpandItem,
+        ActivateItemOnly
+    };
 
-    KItemListController(QObject* parent = 0);
+    /**
+     * @param model  Model of the controller. The ownership is passed to the controller.
+     * @param view   View of the controller. The ownership is passed to the controller.
+     * @param parent Optional parent object.
+     */
+    KItemListController(KItemModelBase* model, KItemListView* view, QObject* parent = 0);
     virtual ~KItemListController();
 
     void setModel(KItemModelBase* model);
@@ -86,6 +102,12 @@ public:
     void setSelectionBehavior(SelectionBehavior behavior);
     SelectionBehavior selectionBehavior() const;
 
+    void setAutoActivationBehavior(AutoActivationBehavior behavior);
+    AutoActivationBehavior autoActivationBehavior() const;
+
+    void setMouseDoubleClickAction(MouseDoubleClickAction action);
+    MouseDoubleClickAction mouseDoubleClickAction() const;
+
     /**
      * Sets the delay in milliseconds when dragging an object above an item
      * until the item gets activated automatically. A value of -1 indicates
@@ -106,12 +128,11 @@ public:
 
     /**
      * If set to true, the signals itemActivated() and itemsActivated() are emitted
-     * after a single-click of the left mouse button. If set to false, a double-click
-     * is required. Per default the setting from KGlobalSettings::singleClick() is
-     * used.
+     * after a single-click of the left mouse button. If set to false (the default),
+     * the setting from style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) is used.
      */
-    void setSingleClickActivation(bool singleClick);
-    bool singleClickActivation() const;
+    void setSingleClickActivationEnforced(bool singleClick);
+    bool singleClickActivationEnforced() const;
 
     virtual bool showEvent(QShowEvent* event);
     virtual bool hideEvent(QHideEvent* event);
@@ -143,7 +164,7 @@ signals:
      * Is emitted if more than one item has been activated by pressing Return/Enter
      * when having a selection.
      */
-    void itemsActivated(const QSet<int>& indexes);
+    void itemsActivated(const KItemSet& indexes);
 
     void itemMiddleClicked(int index);
 
@@ -177,14 +198,18 @@ signals:
 
     /**
      * Is emitted if a mouse-button has been pressed above an item.
+     * If the index is smaller than 0, the mouse-button has been pressed
+     * above the viewport.
      */
-    void itemPressed(int index, Qt::MouseButton button);
+    void mouseButtonPressed(int itemIndex, Qt::MouseButtons buttons);
 
     /**
      * Is emitted if a mouse-button has been released above an item.
-     * It is assured that the signal itemPressed() has been emitted before.
+     * It is assured that the signal mouseButtonPressed() has been emitted before.
+     * If the index is smaller than 0, the mouse-button has been pressed
+     * above the viewport.
      */
-    void itemReleased(int index, Qt::MouseButton button);
+    void mouseButtonReleased(int itemIndex, Qt::MouseButtons buttons);
 
     void itemExpansionToggleClicked(int index);
 
@@ -192,9 +217,23 @@ signals:
      * Is emitted if a drop event is done above the item with the index
      * \a index. If \a index is < 0 the drop event is done above an
      * empty area of the view.
+     * TODO: Introduce a new signal viewDropEvent(QGraphicsSceneDragDropEvent),
+     *       which is emitted if the drop event occurs on an empty area in
+     *       the view, and make sure that index is always >= 0 in itemDropEvent().
      */
     void itemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
 
+    /**
+     * Is emitted if a drop event is done between the item with the index
+     * \a index and the previous item.
+     */
+    void aboveItemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
+
+    /**
+     * Is emitted if the Escape key is pressed.
+     */
+    void escapePressed();
+
     void modelChanged(KItemModelBase* current, KItemModelBase* previous);
     void viewChanged(KItemListView* current, KItemListView* previous);
 
@@ -238,16 +277,16 @@ private:
     void updateKeyboardAnchor();
 
     /**
-     * @return Index for the next row based on the current index.
-     *         If there is no next row the current index will be returned.
+     * @return Index for the next row based on \a index.
+     *         If there is no next row \a index will be returned.
      */
-    int nextRowIndex() const;
+    int nextRowIndex(int index) const;
 
     /**
-     * @return Index for the previous row based on the current index.
-     *         If there is no previous row the current index will be returned.
+     * @return Index for the previous row based on  \a index.
+     *         If there is no previous row \a index will be returned.
      */
-    int previousRowIndex() const;
+    int previousRowIndex(int index) const;
 
     /**
      * Helper method for updateKeyboardAnchor(), previousRowIndex() and nextRowIndex().
@@ -257,11 +296,20 @@ private:
      */
     qreal keyboardAnchorPos(int index) const;
 
+    /**
+     * Dependent on the selection-behavior the extendedSelectionRegion-property
+     * of the KItemListStyleOption from the view should be adjusted: If no
+     * rubberband selection is used the property should be enabled.
+     */
+    void updateExtendedSelectionRegion();
+
 private:
-    bool m_singleClickActivation;
+    bool m_singleClickActivationEnforced;
     bool m_selectionTogglePressed;
     bool m_clearSelectionIfItemsAreNotDragged;
     SelectionBehavior m_selectionBehavior;
+    AutoActivationBehavior m_autoActivationBehavior;
+    MouseDoubleClickAction m_mouseDoubleClickAction;
     KItemModelBase* m_model;
     KItemListView* m_view;
     KItemListSelectionManager* m_selectionManager;
@@ -277,7 +325,7 @@ private:
      * the current selection it is remembered in m_oldSelection before the
      * rubberband gets activated.
      */
-    QSet<int> m_oldSelection;
+    KItemSet m_oldSelection;
 
     /**
      * Assuming a view is given with a vertical scroll-orientation, grouped items and