X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/080498368502bfbdc4e13427ba3a9a21cefcafdf..2201018673467bf7a871082b1fd1e3f8c6f926e7:/src/kitemviews/kitemlistcontroller.h diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 6d9b2ac6a..48da07206 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -1,32 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2011 by Peter Penz * - * * - * Based on the Itemviews NG project from Trolltech Labs * - * * - * 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 + * + * Based on the Itemviews NG project from Trolltech Labs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #ifndef KITEMLISTCONTROLLER_H #define KITEMLISTCONTROLLER_H +#include + #include "dolphin_export.h" #include "kitemset.h" #include #include +#include class QTimer; class KItemModelBase; @@ -34,6 +24,8 @@ class KItemListKeyboardSearchManager; class KItemListSelectionManager; class KItemListView; class KItemListWidget; +class QContextMenuEvent; +class QGestureEvent; class QGraphicsSceneHoverEvent; class QGraphicsSceneDragDropEvent; class QGraphicsSceneMouseEvent; @@ -41,7 +33,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. @@ -56,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 = nullptr); + KItemListController(KItemModelBase *model, KItemListView *view, QObject *parent = nullptr); ~KItemListController() override; - void setModel(KItemModelBase* model); - KItemModelBase* model() const; + void setModel(KItemModelBase *model); + KItemModelBase *model() const; - void setView(KItemListView* view); - KItemListView* view() const; + void setView(KItemListView *view); + KItemListView *view() const; - KItemListSelectionManager* selectionManager() const; + KItemListSelectionManager *selectionManager() const; void setSelectionBehavior(SelectionBehavior behavior); SelectionBehavior selectionBehavior() const; @@ -107,23 +88,8 @@ public: int indexCloseToMousePressedPosition() 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; + void setAutoActivationEnabled(bool enabled); + bool isAutoActivationEnabled() const; /** * If set to true, the signals itemActivated() and itemsActivated() are emitted @@ -133,9 +99,21 @@ public: void setSingleClickActivationEnforced(bool singleClick); bool singleClickActivationEnforced() const; - bool processEvent(QEvent* event, const QTransform& transform); + /** + * 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; -signals: + /** + * @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. @@ -146,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 KItemSet& indexes); + void itemsActivated(const KItemSet &indexes); void itemMiddleClicked(int index); @@ -154,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 QPointF& pos); + void itemContextMenuRequested(int index, const QPointF &pos); /** * Emitted if a context-menu is requested for the KItemListView. */ - void viewContextMenuRequested(const QPointF& pos); + void viewContextMenuRequested(const QPointF &pos); /** * Emitted if a context-menu is requested for the header of the KItemListView. */ - void headerContextMenuRequested(const QPointF& pos); + void headerContextMenuRequested(const QPointF &pos); /** * Is emitted if the item with the index \p index gets hovered. @@ -203,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, QGraphicsSceneDragDropEvent* event); + 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); + 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); /** @@ -230,7 +233,7 @@ private slots: */ void slotRubberBandChanged(); - void slotChangeCurrentItem(const QString& text, bool searchFromNextItem); + void slotChangeCurrentItem(const QString &text, bool searchFromNextItem); void slotAutoActivationTimeout(); @@ -244,13 +247,22 @@ private: * @return Widget that is currently in the hovered state. 0 is returned * if no widget is marked as hovered. */ - KItemListWidget* hoveredWidget() 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 @@ -287,37 +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 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 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 m_pressedIndex; + QPointF m_pressedMouseGlobalPos; - QTimer* m_autoActivationTimer; + bool m_autoActivationEnabled = false; + QTimer *m_autoActivationTimer; + + Qt::GestureType m_swipeGesture; + Qt::GestureType m_twoFingerTapGesture; /** * When starting a rubberband selection during a Shift- or Control-key has been @@ -346,5 +380,3 @@ private: }; #endif - -