]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontroller.h
GIT_SILENT Update Appstream for new release
[dolphin.git] / src / kitemviews / kitemlistcontroller.h
index ff0171a02697fe6bb6f762dce4f48281f855e045..48da07206df1231647b855a9aee48b7b4a23672b 100644 (file)
@@ -1,50 +1,41 @@
-/***************************************************************************
- *   Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com>             *
- *                                                                         *
- *   Based on the Itemviews NG project from Trolltech Labs:                *
- *   http://qt.gitorious.org/qt-labs/itemviews-ng                          *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   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.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
+ *
+ * Based on the Itemviews NG project from Trolltech Labs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
 
 #ifndef KITEMLISTCONTROLLER_H
 #define KITEMLISTCONTROLLER_H
 
-#include "dolphin_export.h"
+#include <optional>
 
+#include "dolphin_export.h"
 #include "kitemset.h"
 
 #include <QObject>
 #include <QPointF>
+#include <QScroller>
+
 class QTimer;
 class KItemModelBase;
 class KItemListKeyboardSearchManager;
 class KItemListSelectionManager;
 class KItemListView;
 class KItemListWidget;
+class QContextMenuEvent;
+class QGestureEvent;
 class QGraphicsSceneHoverEvent;
 class QGraphicsSceneDragDropEvent;
 class QGraphicsSceneMouseEvent;
 class QGraphicsSceneResizeEvent;
 class QGraphicsSceneWheelEvent;
-class QHideEvent;
 class QInputMethodEvent;
 class QKeyEvent;
-class QShowEvent;
+class QTapGesture;
 class QTransform;
+class QTouchEvent;
 
 /**
  * @brief Controls the view, model and selection of an item-list.
@@ -59,45 +50,32 @@ class QTransform;
 class DOLPHIN_EXPORT KItemListController : public QObject
 {
     Q_OBJECT
-    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)
+    Q_PROPERTY(KItemModelBase *model READ model WRITE setModel NOTIFY modelChanged)
+    Q_PROPERTY(KItemListView *view READ view WRITE setView NOTIFY viewChanged)
 
 public:
-    enum SelectionBehavior {
-        NoSelection,
-        SingleSelection,
-        MultiSelection
-    };
+    enum SelectionBehavior { NoSelection, SingleSelection, MultiSelection };
     Q_ENUM(SelectionBehavior)
 
-    enum AutoActivationBehavior {
-        ActivationAndExpansion,
-        ExpansionOnly
-    };
+    enum AutoActivationBehavior { ActivationAndExpansion, ExpansionOnly };
 
-    enum MouseDoubleClickAction {
-        ActivateAndExpandItem,
-        ActivateItemOnly
-    };
+    enum MouseDoubleClickAction { ActivateAndExpandItem, ActivateItemOnly };
 
     /**
      * @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);
+    KItemListController(KItemModelBase *model, KItemListView *view, QObject *parent = nullptr);
     ~KItemListController() override;
 
-    void setModel(KItemModelBasemodel);
-    KItemModelBasemodel() const;
+    void setModel(KItemModelBase *model);
+    KItemModelBase *model() const;
 
-    void setView(KItemListViewview);
-    KItemListViewview() const;
+    void setView(KItemListView *view);
+    KItemListView *view() const;
 
-    KItemListSelectionManagerselectionManager() const;
+    KItemListSelectionManager *selectionManager() const;
 
     void setSelectionBehavior(SelectionBehavior behavior);
     SelectionBehavior selectionBehavior() const;
@@ -108,23 +86,10 @@ public:
     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
-     * that no automatic activation will be done at all (= default value).
-     *
-     * The hovered item must support dropping (see KItemModelBase::supportsDropping()),
-     * otherwise the automatic activation is not available.
-     *
-     * After activating the item the signal itemActivated() will be
-     * emitted. If the view supports the expanding of items
-     * (KItemListView::supportsItemExpanding() returns true) and the item
-     * itself is expandable (see KItemModelBase::isExpandable()) then instead
-     * of activating the item it gets expanded instead (see
-     * KItemModelBase::setExpanded()).
-     */
-    void setAutoActivationDelay(int delay);
-    int autoActivationDelay() const;
+    int indexCloseToMousePressedPosition() const;
+
+    void setAutoActivationEnabled(bool enabled);
+    bool isAutoActivationEnabled() const;
 
     /**
      * If set to true, the signals itemActivated() and itemsActivated() are emitted
@@ -134,26 +99,21 @@ public:
     void setSingleClickActivationEnforced(bool singleClick);
     bool singleClickActivationEnforced() const;
 
-    virtual bool showEvent(QShowEvent* event);
-    virtual bool hideEvent(QHideEvent* event);
-    virtual bool keyPressEvent(QKeyEvent* event);
-    virtual bool inputMethodEvent(QInputMethodEvent* event);
-    virtual bool mousePressEvent(QGraphicsSceneMouseEvent* event, const QTransform& transform);
-    virtual bool mouseMoveEvent(QGraphicsSceneMouseEvent* event, const QTransform& transform);
-    virtual bool mouseReleaseEvent(QGraphicsSceneMouseEvent* event, const QTransform& transform);
-    virtual bool mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, const QTransform& transform);
-    virtual bool dragEnterEvent(QGraphicsSceneDragDropEvent* event, const QTransform& transform);
-    virtual bool dragLeaveEvent(QGraphicsSceneDragDropEvent* event, const QTransform& transform);
-    virtual bool dragMoveEvent(QGraphicsSceneDragDropEvent* event, const QTransform& transform);
-    virtual bool dropEvent(QGraphicsSceneDragDropEvent* event, const QTransform& transform);
-    virtual bool hoverEnterEvent(QGraphicsSceneHoverEvent* event, const QTransform& transform);
-    virtual bool hoverMoveEvent(QGraphicsSceneHoverEvent* event, const QTransform& transform);
-    virtual bool hoverLeaveEvent(QGraphicsSceneHoverEvent* event, const QTransform& transform);
-    virtual bool wheelEvent(QGraphicsSceneWheelEvent* event, const QTransform& transform);
-    virtual bool resizeEvent(QGraphicsSceneResizeEvent* event, const QTransform& transform);
-    virtual bool processEvent(QEvent* event, const QTransform& transform);
-
-signals:
+    /**
+     * 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;
+
+    /**
+     * @return \c true if search as you type is active, or \c false otherwise.
+     */
+    bool isSearchAsYouTypeActive() const;
+
+    bool processEvent(QEvent *event, const QTransform &transform);
+
+Q_SIGNALS:
     /**
      * Is emitted if exactly one item has been activated by e.g. a mouse-click
      * or by pressing Return/Enter.
@@ -164,7 +124,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);
 
@@ -172,17 +132,17 @@ signals:
      * Emitted if a context-menu is requested for the item with
      * the index \a index. It is assured that the index is valid.
      */
-    void itemContextMenuRequested(int index, const QPointFpos);
+    void itemContextMenuRequested(int index, const QPointF &pos);
 
     /**
      * Emitted if a context-menu is requested for the KItemListView.
      */
-    void viewContextMenuRequested(const QPointFpos);
+    void viewContextMenuRequested(const QPointF &pos);
 
     /**
      * Emitted if a context-menu is requested for the header of the KItemListView.
      */
-    void headerContextMenuRequested(const QPointFpos);
+    void headerContextMenuRequested(const QPointF &pos);
 
     /**
      * Is emitted if the item with the index \p index gets hovered.
@@ -221,25 +181,50 @@ signals:
      *       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, QGraphicsSceneDragDropEventevent);
+    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, QGraphicsSceneDragDropEventevent);
+    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);
+    /**
+     * 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();
+
+    /**
+     * Emitted when the view's background is double-clicked.
+     * Used to trigger an user configured action.
+     */
+    void doubleClickViewBackground(Qt::MouseButton button);
+
+public Q_SLOTS:
+    void slotStateChanged(QScroller::State newState);
+
+private Q_SLOTS:
     void slotViewScrollOffsetChanged(qreal current, qreal previous);
 
     /**
@@ -248,7 +233,7 @@ private slots:
      */
     void slotRubberBandChanged();
 
-    void slotChangeCurrentItem(const QStringtext, bool searchFromNextItem);
+    void slotChangeCurrentItem(const QString &text, bool searchFromNextItem);
 
     void slotAutoActivationTimeout();
 
@@ -262,13 +247,22 @@ private:
      * @return Widget that is currently in the hovered state. 0 is returned
      *         if no widget is marked as hovered.
      */
-    KItemListWidgethoveredWidget() const;
+    KItemListWidget *hoveredWidget() const;
 
     /**
      * @return Widget that is below the position \a pos. 0 is returned
      *         if no widget is below the position.
      */
-    KItemListWidget* widgetForPos(const QPointF& pos) const;
+    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
@@ -305,21 +299,59 @@ private:
      */
     void updateExtendedSelectionRegion();
 
+    bool keyPressEvent(QKeyEvent *event);
+    bool inputMethodEvent(QInputMethodEvent *event);
+    bool mousePressEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform);
+    bool mouseMoveEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform);
+    bool mouseReleaseEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform);
+    bool mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform);
+    bool contextMenuEvent(QContextMenuEvent *event);
+    bool dragEnterEvent(QGraphicsSceneDragDropEvent *event, const QTransform &transform);
+    bool dragLeaveEvent(QGraphicsSceneDragDropEvent *event, const QTransform &transform);
+    bool dragMoveEvent(QGraphicsSceneDragDropEvent *event, const QTransform &transform);
+    bool dropEvent(QGraphicsSceneDragDropEvent *event, const QTransform &transform);
+    bool hoverEnterEvent(QGraphicsSceneHoverEvent *event, const QTransform &transform);
+    bool hoverMoveEvent(QGraphicsSceneHoverEvent *event, const QTransform &transform);
+    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 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;
-    KItemModelBase* m_model;
-    KItemListView* m_view;
-    KItemListSelectionManager* m_selectionManager;
-    KItemListKeyboardSearchManager* m_keyboardManager;
-    int m_pressedIndex;
-    QPointF m_pressedMousePos;
+    KItemModelBase *m_model;
+    KItemListView *m_view;
+    KItemListSelectionManager *m_selectionManager;
+    KItemListKeyboardSearchManager *m_keyboardManager;
+    std::optional<int> m_pressedIndex;
+    QPointF m_pressedMouseGlobalPos;
+
+    bool m_autoActivationEnabled = false;
+    QTimer *m_autoActivationTimer;
 
-    QTimer* m_autoActivationTimer;
+    Qt::GestureType m_swipeGesture;
+    Qt::GestureType m_twoFingerTapGesture;
 
     /**
      * When starting a rubberband selection during a Shift- or Control-key has been
@@ -348,5 +380,3 @@ private:
 };
 
 #endif
-
-