]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontroller.h
Simplify implementation of mouse long-press detection
[dolphin.git] / src / kitemviews / kitemlistcontroller.h
index d929027b7b364ce35f396b1ed28713fcde6dad93..b6a2f05feeec5986c7843f5b488d4c289df72826 100644 (file)
@@ -9,6 +9,8 @@
 #ifndef KITEMLISTCONTROLLER_H
 #define KITEMLISTCONTROLLER_H
 
+#include <optional>
+
 #include "dolphin_export.h"
 #include "kitemset.h"
 
@@ -32,6 +34,7 @@ class QInputMethodEvent;
 class QKeyEvent;
 class QTapGesture;
 class QTransform;
+class QTouchEvent;
 
 /**
  * @brief Controls the view, model and selection of an item-list.
@@ -123,9 +126,16 @@ public:
     void setSingleClickActivationEnforced(bool singleClick);
     bool singleClickActivationEnforced() const;
 
+    /**
+     * Setting the selection mode to enabled will make selecting and deselecting easier by acting
+     * kind of similar to when the Control Key is held down.
+     */
+    void setSelectionModeEnabled(bool enabled);
+    bool selectionMode() const;
+
     bool processEvent(QEvent* event, const QTransform& transform);
 
-signals:
+Q_SIGNALS:
     /**
      * Is emitted if exactly one item has been activated by e.g. a mouse-click
      * or by pressing Return/Enter.
@@ -136,7 +146,7 @@ signals:
      * Is emitted if more than one item has been activated by pressing Return/Enter
      * when having a selection.
      */
-    void itemsActivated(const KItemSetindexes);
+    void itemsActivated(const KItemSet &indexes);
 
     void itemMiddleClicked(int index);
 
@@ -206,6 +216,17 @@ signals:
      */
     void escapePressed();
 
+    /**
+     * Used to request either entering or leaving of selection mode
+     * Leaving is requested by pressing Escape when no item is selected.
+     *
+     * Entering is requested if left click is pressed down for a long time without moving the cursor too much.
+     * Moving the cursor would either trigger an item drag if the click was initiated on top of an item
+     * or a selection rectangle if the click was not initiated on top of an item.
+     * So long press is only emitted if there wasn't a lot of cursor movement.
+     */
+    void selectionModeChangeRequested(bool enabled);
+
     void modelChanged(KItemModelBase* current, KItemModelBase* previous);
     void viewChanged(KItemListView* current, KItemListView* previous);
 
@@ -216,10 +237,10 @@ signals:
     void decreaseZoom();
     void swipeUp();
 
-public slots:
+public Q_SLOTS:
     void slotStateChanged(QScroller::State newState);
 
-private slots:
+private Q_SLOTS:
     void slotViewScrollOffsetChanged(qreal current, qreal previous);
 
     /**
@@ -250,6 +271,15 @@ private:
      */
     KItemListWidget* widgetForPos(const QPointF& pos) const;
 
+    /**
+     * @return Widget that should receive a drop event if an item is dropped at \a pos. 0 is returned
+     *         if no widget should receive a drop event at the position.
+     *
+     * While widgetForPos() returns a widget if \a pos is anywhere inside the hover highlight area of the widget,
+     * widgetForDropPos() only returns a widget if \a pos is directly above the widget (widget->contains(pos) == true).
+     */
+    KItemListWidget* widgetForDropPos(const QPointF& pos) const;
+
     /**
      * Updates m_keyboardAnchorIndex and m_keyboardAnchorPos. If no anchor is
      * set, it will be adjusted to the current item. If it is set it will be
@@ -301,6 +331,7 @@ private:
     bool wheelEvent(QGraphicsSceneWheelEvent* event, const QTransform& transform);
     bool resizeEvent(QGraphicsSceneResizeEvent* event, const QTransform& transform);
     bool gestureEvent(QGestureEvent* event, const QTransform& transform);
+    bool touchBeginEvent(QTouchEvent* event, const QTransform& transform);
     void tapTriggered(QTapGesture* tap, const QTransform& transform);
     void tapAndHoldTriggered(QGestureEvent* event, const QTransform& transform);
     void pinchTriggered(QGestureEvent* event, const QTransform& transform);
@@ -312,6 +343,7 @@ private:
 
 private:
     bool m_singleClickActivationEnforced;
+    bool m_selectionMode;
     bool m_selectionTogglePressed;
     bool m_clearSelectionIfItemsAreNotDragged;
     bool m_isSwipeGesture;
@@ -319,6 +351,7 @@ private:
     bool m_scrollerIsScrolling;
     bool m_pinchGestureInProgress;
     bool m_mousePress;
+    bool m_isTouchEvent;
     SelectionBehavior m_selectionBehavior;
     AutoActivationBehavior m_autoActivationBehavior;
     MouseDoubleClickAction m_mouseDoubleClickAction;
@@ -326,14 +359,13 @@ private:
     KItemListView* m_view;
     KItemListSelectionManager* m_selectionManager;
     KItemListKeyboardSearchManager* m_keyboardManager;
-    int m_pressedIndex;
+    std::optional<int> m_pressedIndex;
     QPointF m_pressedMousePos;
 
     QTimer* m_autoActivationTimer;
 
     Qt::GestureType m_swipeGesture;
     Qt::GestureType m_twoFingerTapGesture;
-    Qt::MouseEventSource m_lastSource;
 
     /**
      * When starting a rubberband selection during a Shift- or Control-key has been