X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c12dc996f535f787ab828560068a2c8b7f98c5cf..c68f1f6f8d6c24123c9c5df4d2e91a9d2462ceb6:/src/kitemviews/kitemlistview.h diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index cf6f27c03..2aedf5832 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -1,35 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2011 by Peter Penz * - * * - * 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 + * + * Based on the Itemviews NG project from Trolltech Labs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #ifndef KITEMLISTVIEW_H #define KITEMLISTVIEW_H -#include +#include + +#include "dolphin_export.h" +#include "kitemviews/kitemliststyleoption.h" +#include "kitemviews/kitemlistwidget.h" +#include "kitemviews/kitemmodelbase.h" +#include "kitemviews/kstandarditemlistgroupheader.h" +#include "kitemviews/private/kitemlistviewanimation.h" -#include -#include -#include -#include -#include #include #include @@ -44,8 +32,9 @@ class KItemListViewLayouter; class KItemListWidget; class KItemListWidgetInformant; class KItemListWidgetCreatorBase; -class KItemListViewCreatorBase; class QTimer; +class QPropertyAnimation; +class QVariantAnimation; /** * @brief Represents the view of an item-list. @@ -60,7 +49,7 @@ class QTimer; * @see KItemListWidget * @see KItemModelBase */ -class LIBDOLPHINPRIVATE_EXPORT KItemListView : public QGraphicsWidget +class DOLPHIN_EXPORT KItemListView : public QGraphicsWidget { Q_OBJECT @@ -68,8 +57,8 @@ class LIBDOLPHINPRIVATE_EXPORT KItemListView : public QGraphicsWidget Q_PROPERTY(qreal itemOffset READ itemOffset WRITE setItemOffset) public: - KItemListView(QGraphicsWidget* parent = 0); - virtual ~KItemListView(); + explicit KItemListView(QGraphicsWidget* parent = nullptr); + ~KItemListView() override; /** * Offset of the scrollbar that represents the scroll-orientation @@ -155,14 +144,13 @@ public: /** * @return The basic size of all items. The size of an item may be larger than - * the basic size (see KItemListView::itemSizeHint() and KItemListView::itemRect()). + * the basic size (see KItemListView::itemRect()). */ QSizeF itemSize() const; const KItemListStyleOption& styleOption() const; - /** @reimp */ - virtual void setGeometry(const QRectF& rect); + void setGeometry(const QRectF& rect) override; /** * @return The page step which should be used by the vertical scroll bar. @@ -174,12 +162,13 @@ public: * @return Index of the item that is below the point \a pos. * The position is relative to the upper right of * the visible area. Only (at least partly) visible - * items are considered. -1 is returned if no item is - * below the position. + * items are considered. std::nullopt is returned if + * no item is below the position. */ - int itemAt(const QPointF& pos) const; + std::optional itemAt(const QPointF& pos) const; bool isAboveSelectionToggle(int index, const QPointF& pos) const; bool isAboveExpansionToggle(int index, const QPointF& pos) const; + bool isAboveText(int index, const QPointF& pos) const; /** * @return Index of the first item that is at least partly visible. @@ -194,18 +183,19 @@ public: int lastVisibleIndex() const; /** - * @return Calculates the required size for all items in the model. - * It might be larger than KItemListView::itemSize(). - * In this case the layout grid will be stretched to assure an - * unclipped item. - * NOTE: the logical height (width) is actually the - * width (height) if the scroll orientation is Qt::Vertical! + * Calculates the required size for all items in the model. + * It might be larger than KItemListView::itemSize(). + * In this case the layout grid will be stretched to assure an + * unclipped item. + * + * @note the logical height (width) is actually the + * width (height) if the scroll orientation is Qt::Vertical! */ - void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint) const; + void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint) const; /** * If set to true, items having child-items can be expanded to show the child-items as - * part of the view. Per default the expanding of items is is disabled. If expanding of + * part of the view. Per default the expanding of items is disabled. If expanding of * items is enabled, the methods KItemModelBase::setExpanded(), KItemModelBase::isExpanded(), * KItemModelBase::isExpandable() and KItemModelBase::expandedParentsCount() * must be reimplemented. The view-implementation @@ -215,6 +205,12 @@ public: void setSupportsItemExpanding(bool supportsExpanding); bool supportsItemExpanding() const; + void setHighlightEntireRow(bool highlightEntireRow); + bool highlightEntireRow() const; + + void setAlternateBackgrounds(bool alternate); + bool alternateBackgrounds() const; + /** * @return The rectangle of the item relative to the top/left of * the currently visible area (see KItemListView::offset()). @@ -224,7 +220,7 @@ public: /** * @return The context rectangle of the item relative to the top/left of * the currently visible area (see KItemListView::offset()). The - * context rectangle is defined by by the united rectangle of + * context rectangle is defined by the united rectangle of * the icon rectangle and the text rectangle (see KItemListWidget::iconRect() * and KItemListWidget::textRect()) and is useful as reference for e.g. aligning * a tooltip or a context-menu for an item. Note that a context rectangle will @@ -233,6 +229,12 @@ public: */ QRectF itemContextRect(int index) const; + /** + * @return Whether or not the name of the file has been elided. At present this will + * only ever be true when in icons view. + */ + bool isElided(int index) const; + /** * Scrolls to the item with the index \a index so that the item * will be fully visible. @@ -280,12 +282,9 @@ public: */ void editRole(int index, const QByteArray& role); - /** - * @reimp - */ - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; -signals: +Q_SIGNALS: void scrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous); void scrollOffsetChanged(qreal current, qreal previous); void maximumScrollOffsetChanged(qreal current, qreal previous); @@ -322,8 +321,14 @@ signals: void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); + /** + * Emitted once scrolling has finished, or immediately if no scrolling was necessary + * to get item in view in scrollToItem. + */ + void scrollingStopped(); + protected: - virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); + QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; void setItemSize(const QSizeF& size); void setStyleOption(const KItemListStyleOption& option); @@ -375,25 +380,28 @@ protected: virtual void onScrollOffsetChanged(qreal current, qreal previous); virtual void onVisibleRolesChanged(const QList& current, const QList& previous); virtual void onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous); + virtual void onHighlightEntireRowChanged(bool highlightEntireRow); virtual void onSupportsItemExpandingChanged(bool supportsExpanding); virtual void onTransactionBegin(); virtual void onTransactionEnd(); - virtual bool event(QEvent* event); - virtual void mousePressEvent(QGraphicsSceneMouseEvent* event); - virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event); - virtual void dragEnterEvent(QGraphicsSceneDragDropEvent* event); - virtual void dragMoveEvent(QGraphicsSceneDragDropEvent* event); - virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent* event); - virtual void dropEvent(QGraphicsSceneDragDropEvent* event); + bool event(QEvent* event) override; + void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; + void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override; + void dragMoveEvent(QGraphicsSceneDragDropEvent* event) override; + void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) override; + void dropEvent(QGraphicsSceneDragDropEvent* event) override; QList visibleItemListWidgets() const; virtual void updateFont(); virtual void updatePalette(); -protected slots: + KItemListSizeHintResolver* m_sizeHintResolver; + +protected Q_SLOTS: virtual void slotItemsInserted(const KItemRangeList& itemRanges); virtual void slotItemsRemoved(const KItemRangeList& itemRanges); virtual void slotItemsMoved(const KItemRange& itemRange, const QList& movedToIndexes); @@ -407,10 +415,9 @@ protected slots: virtual void slotCurrentChanged(int current, int previous); virtual void slotSelectionChanged(const KItemSet& current, const KItemSet& previous); -private slots: +private Q_SLOTS: void slotAnimationFinished(QGraphicsWidget* widget, KItemListViewAnimation::AnimationType type); - void slotLayoutTimerFinished(); void slotRubberBandPosChanged(); void slotRubberBandActivationChanged(bool active); @@ -425,6 +432,8 @@ private slots: qreal currentWidth, qreal previousWidth); + void slotLeadingPaddingChanged(qreal width); + /** * Is invoked if a column has been moved by the user. Applies * the moved role to the view. @@ -606,7 +615,7 @@ private: /** * Resizes the column-widths of m_headerWidget based on the preferred widths - * and the vailable view-size. + * and the available view-size. */ void applyAutomaticColumnWidths(); @@ -647,7 +656,7 @@ private: /** * Shows a drop-indicator between items dependent on the given - * cursor position. The cursor position is relative the the upper left + * cursor position. The cursor position is relative to the upper left * edge of the view. * @return Index of the item where the dropping is done. An index of -1 * indicates that the item has been dropped after the last item. @@ -706,6 +715,8 @@ private: private: bool m_enabledSelectionToggles; bool m_grouped; + bool m_highlightEntireRow; + bool m_alternateBackgrounds; bool m_supportsItemExpanding; bool m_editingRole; int m_activeTransactions; // Counter for beginTransaction()/endTransaction() @@ -732,11 +743,9 @@ private: QHash m_visibleCells; int m_scrollBarExtent; - KItemListSizeHintResolver* m_sizeHintResolver; KItemListViewLayouter* m_layouter; KItemListViewAnimation* m_animation; - QTimer* m_layoutTimer; // Triggers an asynchronous doLayout() call. qreal m_oldScrollOffset; qreal m_oldMaximumScrollOffset; qreal m_oldItemOffset; @@ -744,6 +753,7 @@ private: bool m_skipAutoScrollForRubberBand; KItemListRubberBand* m_rubberBand; + KItemListRubberBand* m_tapAndHoldIndicator; QPointF m_mousePos; int m_autoScrollIncrement; @@ -752,6 +762,8 @@ private: KItemListHeader* m_header; KItemListHeaderWidget* m_headerWidget; + QPropertyAnimation* m_indicatorAnimation; + // When dragging items into the view where the sort-role of the model // is empty, a visual indicator should be shown during dragging where // the dropping will happen. This indicator is specified by an index @@ -760,6 +772,8 @@ private: // by KItemListView::showDropIndicator() and KItemListView::hideDropIndicator(). QRectF m_dropIndicator; + QList m_rubberBandAnimations; + friend class KItemListContainer; // Accesses scrollBarRequired() friend class KItemListHeader; // Accesses m_headerWidget friend class KItemListController; @@ -774,7 +788,7 @@ private: * KItemListWidgetCreatorBase and KItemListGroupHeaderCreatorBase. * @internal */ -class LIBDOLPHINPRIVATE_EXPORT KItemListCreatorBase +class DOLPHIN_EXPORT KItemListCreatorBase { public: virtual ~KItemListCreatorBase(); @@ -798,16 +812,16 @@ private: * expensive instantiations and deletions of KItemListWidgets by recycling existing widget * instances. */ -class LIBDOLPHINPRIVATE_EXPORT KItemListWidgetCreatorBase : public KItemListCreatorBase +class DOLPHIN_EXPORT KItemListWidgetCreatorBase : public KItemListCreatorBase { public: - virtual ~KItemListWidgetCreatorBase(); + ~KItemListWidgetCreatorBase() override; virtual KItemListWidget* create(KItemListView* view) = 0; virtual void recycle(KItemListWidget* widget); - virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; + virtual void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; virtual qreal preferredRoleColumnWidth(const QByteArray& role, int index, @@ -822,15 +836,15 @@ class KItemListWidgetCreator : public KItemListWidgetCreatorBase { public: KItemListWidgetCreator(); - virtual ~KItemListWidgetCreator(); + ~KItemListWidgetCreator() override; - virtual KItemListWidget* create(KItemListView* view); + KItemListWidget* create(KItemListView* view) override; - virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; + void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; - virtual qreal preferredRoleColumnWidth(const QByteArray& role, + qreal preferredRoleColumnWidth(const QByteArray& role, int index, - const KItemListView* view) const; + const KItemListView* view) const override; private: KItemListWidgetInformant* m_informant; }; @@ -855,11 +869,12 @@ KItemListWidget* KItemListWidgetCreator::create(KItemListView* view) widget = new T(m_informant, view); addCreatedWidget(widget); } + widget->setParentItem(view); return widget; } template -void KItemListWidgetCreator::calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +void KItemListWidgetCreator::calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { return m_informant->calculateItemSizeHints(logicalHeightHints, logicalWidthHint, view); } @@ -876,14 +891,14 @@ qreal KItemListWidgetCreator::preferredRoleColumnWidth(const QByteArray& role * @brief Base class for creating KItemListGroupHeaders. * * It is recommended that applications simply use the KItemListGroupHeaderCreator-template class. - * For a custom implementation the methods create() and recyle() must be reimplemented. + * For a custom implementation the methods create() and recycle() must be reimplemented. * The intention of the group-header creator is to prevent repetitive and expensive instantiations and * deletions of KItemListGroupHeaders by recycling existing header instances. */ -class LIBDOLPHINPRIVATE_EXPORT KItemListGroupHeaderCreatorBase : public KItemListCreatorBase +class DOLPHIN_EXPORT KItemListGroupHeaderCreatorBase : public KItemListCreatorBase { public: - virtual ~KItemListGroupHeaderCreatorBase(); + ~KItemListGroupHeaderCreatorBase() override; virtual KItemListGroupHeader* create(KItemListView* view) = 0; virtual void recycle(KItemListGroupHeader* header); }; @@ -892,8 +907,8 @@ template class KItemListGroupHeaderCreator : public KItemListGroupHeaderCreatorBase { public: - virtual ~KItemListGroupHeaderCreator(); - virtual KItemListGroupHeader* create(KItemListView* view); + ~KItemListGroupHeaderCreator() override; + KItemListGroupHeader* create(KItemListView* view) override; }; template