X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/576a97d8eb9601f4ad74def6528cc90fffe97b1c..40cc5f665d:/src/kitemviews/kitemlistcontroller.h diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index a84d1b8c8..b6a2f05fe 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -9,11 +9,14 @@ #ifndef KITEMLISTCONTROLLER_H #define KITEMLISTCONTROLLER_H +#include + #include "dolphin_export.h" #include "kitemset.h" #include #include +#include class QTimer; class KItemModelBase; @@ -21,6 +24,7 @@ class KItemListKeyboardSearchManager; class KItemListSelectionManager; class KItemListView; class KItemListWidget; +class QGestureEvent; class QGraphicsSceneHoverEvent; class QGraphicsSceneDragDropEvent; class QGraphicsSceneMouseEvent; @@ -28,7 +32,9 @@ class QGraphicsSceneResizeEvent; class QGraphicsSceneWheelEvent; class QInputMethodEvent; class QKeyEvent; +class QTapGesture; class QTransform; +class QTouchEvent; /** * @brief Controls the view, model and selection of an item-list. @@ -120,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. @@ -133,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 KItemSet& indexes); + void itemsActivated(const KItemSet &indexes); void itemMiddleClicked(int index); @@ -203,12 +216,31 @@ 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); void selectedItemTextPressed(int index); -private slots: + void scrollerStop(); + void increaseZoom(); + void decreaseZoom(); + void swipeUp(); + +public Q_SLOTS: + void slotStateChanged(QScroller::State newState); + +private Q_SLOTS: void slotViewScrollOffsetChanged(qreal current, qreal previous); /** @@ -239,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 @@ -289,11 +330,28 @@ private: bool hoverLeaveEvent(QGraphicsSceneHoverEvent* event, const QTransform& transform); 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); + void swipeTriggered(QGestureEvent* event, const QTransform& transform); + void twoFingerTapTriggered(QGestureEvent* event, const QTransform& transform); + bool onPress(const QPoint& screenPos, const QPointF& pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons); + bool onRelease(const QPointF& pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons, bool touch); + void startRubberBand(); private: bool m_singleClickActivationEnforced; + bool m_selectionMode; bool m_selectionTogglePressed; bool m_clearSelectionIfItemsAreNotDragged; + bool m_isSwipeGesture; + bool m_dragActionOrRightClick; + bool m_scrollerIsScrolling; + bool m_pinchGestureInProgress; + bool m_mousePress; + bool m_isTouchEvent; SelectionBehavior m_selectionBehavior; AutoActivationBehavior m_autoActivationBehavior; MouseDoubleClickAction m_mouseDoubleClickAction; @@ -301,11 +359,14 @@ private: KItemListView* m_view; KItemListSelectionManager* m_selectionManager; KItemListKeyboardSearchManager* m_keyboardManager; - int m_pressedIndex; + std::optional m_pressedIndex; QPointF m_pressedMousePos; QTimer* m_autoActivationTimer; + Qt::GestureType m_swipeGesture; + Qt::GestureType m_twoFingerTapGesture; + /** * When starting a rubberband selection during a Shift- or Control-key has been * pressed the current selection should never be deleted. To be able to restore