X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/7a2885853a424042cb631f83a1db278560679d9e..refs/heads/master:/src/kitemviews/kitemlistview.h diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 2a3b7ada2..1382405d0 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -1,27 +1,16 @@ -/*************************************************************************** - * 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 KITEMLISTVIEW_H #define KITEMLISTVIEW_H +#include + #include "dolphin_export.h" #include "kitemviews/kitemliststyleoption.h" #include "kitemviews/kitemlistwidget.h" @@ -32,6 +21,8 @@ #include #include +class KItemListContainer; +class KItemListContainerAccessible; class KItemListController; class KItemListGroupHeaderCreatorBase; class KItemListHeader; @@ -44,6 +35,8 @@ class KItemListWidget; class KItemListWidgetInformant; class KItemListWidgetCreatorBase; class QTimer; +class QPropertyAnimation; +class QVariantAnimation; /** * @brief Represents the view of an item-list. @@ -62,11 +55,14 @@ class DOLPHIN_EXPORT KItemListView : public QGraphicsWidget { Q_OBJECT - Q_PROPERTY(qreal scrollOffset READ scrollOffset WRITE setScrollOffset) - Q_PROPERTY(qreal itemOffset READ itemOffset WRITE setItemOffset) + Q_PROPERTY(qreal scrollOffset READ scrollOffset WRITE setScrollOffset NOTIFY scrollOffsetChanged) + Q_PROPERTY(qreal itemOffset READ itemOffset WRITE setItemOffset NOTIFY itemOffsetChanged) public: - explicit KItemListView(QGraphicsWidget* parent = nullptr); + /** The position in the view to which an item should be scrolled to. */ + enum ViewItemPosition { Beginning, Middle, End, Nearest }; + + explicit KItemListView(QGraphicsWidget *parent = nullptr); ~KItemListView() override; /** @@ -92,7 +88,7 @@ public: int maximumVisibleItems() const; - void setVisibleRoles(const QList& roles); + void setVisibleRoles(const QList &roles); QList visibleRoles() const; /** @@ -115,14 +111,14 @@ public: * initialized by KItemListController::setView() and will * result in calling KItemListController::onControllerChanged(). */ - KItemListController* controller() const; + KItemListController *controller() const; /** * @return Model of the item-list. The model gets * initialized by KItemListController::setModel() and will * result in calling KItemListController::onModelChanged(). */ - KItemModelBase* model() const; + KItemModelBase *model() const; /** * Sets the creator that creates a widget showing the @@ -135,8 +131,8 @@ public: * The ownership of the widget creator is transferred to * the item-list view. **/ - void setWidgetCreator(KItemListWidgetCreatorBase* widgetCreator); - KItemListWidgetCreatorBase* widgetCreator() const; + void setWidgetCreator(KItemListWidgetCreatorBase *widgetCreator); + KItemListWidgetCreatorBase *widgetCreator() const; /** * Sets the creator that creates a group header. Usually it is sufficient @@ -148,8 +144,20 @@ public: * The ownership of the gropup header creator is transferred to * the item-list view. **/ - void setGroupHeaderCreator(KItemListGroupHeaderCreatorBase* groupHeaderCreator); - KItemListGroupHeaderCreatorBase* groupHeaderCreator() const; + void setGroupHeaderCreator(KItemListGroupHeaderCreatorBase *groupHeaderCreator); + KItemListGroupHeaderCreatorBase *groupHeaderCreator() const; + +#ifndef QT_NO_ACCESSIBILITY + /** + * Uses \a parent to create an accessible object for \a parent. That accessible object will + * then be used as the accessible parent of the accessible object for this KItemListView. + * Make sure \a parent is the container which contains this specific KItemListView. + * This method must be called once before the accessible interface is queried for this class. + */ + void setAccessibleParentsObject(KItemListContainer *accessibleParentsObject); + /** The parent of the QAccessibilityInterface of this class. */ + KItemListContainerAccessible *accessibleParent(); +#endif /** * @return The basic size of all items. The size of an item may be larger than @@ -157,9 +165,9 @@ public: */ QSizeF itemSize() const; - const KItemListStyleOption& styleOption() const; + const KItemListStyleOption &styleOption() const; - void setGeometry(const QRectF& rect) override; + void setGeometry(const QRectF &rect) override; /** * @return The page step which should be used by the vertical scroll bar. @@ -167,17 +175,22 @@ public: */ qreal verticalPageStep() const; + /** + * @return The line step which should be used for the scroll by mouse wheel. + */ + virtual qreal scrollSingleStep() const; + /** * @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; - bool isAboveSelectionToggle(int index, const QPointF& pos) const; - bool isAboveExpansionToggle(int index, const QPointF& pos) const; - bool isAboveText(int index, 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. @@ -200,7 +213,7 @@ public: * @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 @@ -214,6 +227,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()). @@ -232,11 +251,18 @@ 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. + * will be fully visible. The item is positioned within the view + * as specified by \a viewItemPosition. */ - void scrollToItem(int index); + void scrollToItem(int index, ViewItemPosition viewItemPosition = ViewItemPosition::Nearest); /** * If several properties of KItemListView are changed synchronously, it is @@ -266,22 +292,28 @@ public: * @return Header of the list. The header is also available if it is not shown * (see KItemListView::setHeaderShown()). */ - KItemListHeader* header() const; + KItemListHeader *header() const; /** * @return Pixmap that is used for a drag operation based on the * items given by \a indexes. */ - virtual QPixmap createDragPixmap(const KItemSet& indexes) const; + virtual QPixmap createDragPixmap(const KItemSet &indexes) const; /** * Lets the user edit the role \a role for item with the index \a index. */ - void editRole(int index, const QByteArray& role); + void editRole(int index, const QByteArray &role); - void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; -signals: + /** + * Set the bottom offset for moving the view so that the small overlayed statusbar + * won't cover any items by accident. + */ + void setStatusBarOffset(int offset); + +Q_SIGNALS: void scrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous); void scrollOffsetChanged(qreal current, qreal previous); void maximumScrollOffsetChanged(qreal current, qreal previous); @@ -305,7 +337,7 @@ signals: * the current sort role. Note that no signal will be emitted if the * sort role of the model has been changed without user interaction. */ - void sortRoleChanged(const QByteArray& current, const QByteArray& previous); + void sortRoleChanged(const QByteArray ¤t, const QByteArray &previous); /** * Is emitted if the user has changed the visible roles by moving a header @@ -313,15 +345,24 @@ signals: * emitted if the roles have been changed without user interaction by * KItemListView::setVisibleRoles(). */ - void visibleRolesChanged(const QList& current, const QList& previous); + void visibleRolesChanged(const QList ¤t, const QList &previous); + + 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(); - void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); - void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); + void columnHovered(int roleIndex); + void columnUnHovered(int roleIndex); protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - void setItemSize(const QSizeF& size); - void setStyleOption(const KItemListStyleOption& option); + void setItemSize(const QSizeF &size); + void setStyleOption(const KItemListStyleOption &option); /** * If the scroll-orientation is vertical, the items are ordered @@ -337,7 +378,7 @@ protected: * @return New instance of the widget-creator that should be used per * default. */ - virtual KItemListWidgetCreatorBase* defaultWidgetCreator() const; + virtual KItemListWidgetCreatorBase *defaultWidgetCreator() const; /** * Factory method for creating a default group-header-creator. The method will be used @@ -345,13 +386,13 @@ protected: * @return New instance of the group-header-creator that should be used per * default. */ - virtual KItemListGroupHeaderCreatorBase* defaultGroupHeaderCreator() const; + virtual KItemListGroupHeaderCreatorBase *defaultGroupHeaderCreator() const; /** * Is called when creating a new KItemListWidget instance and allows derived * classes to do a custom initialization. */ - virtual void initializeItemListWidget(KItemListWidget* item); + virtual void initializeItemListWidget(KItemListWidget *item); /** * @return True if at least one of the changed roles \p changedRoles might result @@ -361,52 +402,52 @@ protected: * to return false in case if a role-change will not result in a changed * item-size hint. */ - virtual bool itemSizeHintUpdateRequired(const QSet& changedRoles) const; + virtual bool itemSizeHintUpdateRequired(const QSet &changedRoles) const; - virtual void onControllerChanged(KItemListController* current, KItemListController* previous); - virtual void onModelChanged(KItemModelBase* current, KItemModelBase* previous); + virtual void onControllerChanged(KItemListController *current, KItemListController *previous); + virtual void onModelChanged(KItemModelBase *current, KItemModelBase *previous); virtual void onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous); - virtual void onItemSizeChanged(const QSizeF& current, const QSizeF& previous); + virtual void onItemSizeChanged(const QSizeF ¤t, const QSizeF &previous); 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 onVisibleRolesChanged(const QList ¤t, const QList &previous); + virtual void onStyleOptionChanged(const KItemListStyleOption ¤t, const KItemListStyleOption &previous); + virtual void onHighlightEntireRowChanged(bool highlightEntireRow); virtual void onSupportsItemExpandingChanged(bool supportsExpanding); virtual void onTransactionBegin(); virtual void onTransactionEnd(); - 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; + 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; + QList visibleItemListWidgets() const; virtual void updateFont(); virtual void updatePalette(); -protected slots: - virtual void slotItemsInserted(const KItemRangeList& itemRanges); - virtual void slotItemsRemoved(const KItemRangeList& itemRanges); - virtual void slotItemsMoved(const KItemRange& itemRange, const QList& movedToIndexes); - virtual void slotItemsChanged(const KItemRangeList& itemRanges, - const QSet& roles); +protected Q_SLOTS: + virtual void slotItemsInserted(const KItemRangeList &itemRanges); + virtual void slotItemsRemoved(const KItemRangeList &itemRanges); + virtual void slotItemsMoved(const KItemRange &itemRange, const QList &movedToIndexes); + virtual void slotItemsChanged(const KItemRangeList &itemRanges, const QSet &roles); virtual void slotGroupsChanged(); virtual void slotGroupedSortingChanged(bool current); virtual void slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); - virtual void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous); + virtual void slotSortRoleChanged(const QByteArray ¤t, const QByteArray &previous); + virtual void slotGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); + virtual void slotGroupRoleChanged(const QByteArray ¤t, const QByteArray &previous); virtual void slotCurrentChanged(int current, int previous); - virtual void slotSelectionChanged(const KItemSet& current, const KItemSet& previous); + virtual void slotSelectionChanged(const KItemSet ¤t, const KItemSet &previous); -private slots: - void slotAnimationFinished(QGraphicsWidget* widget, - KItemListViewAnimation::AnimationType type); - void slotLayoutTimerFinished(); +private Q_SLOTS: + void slotAnimationFinished(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType type); void slotRubberBandPosChanged(); void slotRubberBandActivationChanged(bool active); @@ -417,17 +458,15 @@ private slots: * will be turned off as soon as this method has been called at * least once. */ - void slotHeaderColumnWidthChanged(const QByteArray& role, - qreal currentWidth, - qreal previousWidth); + void slotHeaderColumnWidthChanged(const QByteArray &role, qreal currentWidth, qreal previousWidth); + + void slotSidePaddingChanged(qreal width); /** * Is invoked if a column has been moved by the user. Applies * the moved role to the view. */ - void slotHeaderColumnMoved(const QByteArray& role, - int currentIndex, - int previousIndex); + void slotHeaderColumnMoved(const QByteArray &role, int currentIndex, int previousIndex); /** * Triggers the autoscrolling if autoScroll() is enabled by checking the @@ -444,26 +483,18 @@ private slots: */ void slotGeometryOfGroupHeaderParentChanged(); - void slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value); - void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); + void slotRoleEditingCanceled(int index, const QByteArray &role, const QVariant &value); + void slotRoleEditingFinished(int index, const QByteArray &role, const QVariant &value); private: - enum LayoutAnimationHint - { - NoAnimation, - Animation - }; + enum LayoutAnimationHint { NoAnimation, Animation }; - enum SizeType - { - LayouterSize, - ItemSize - }; + enum SizeType { LayouterSize, ItemSize }; - void setController(KItemListController* controller); - void setModel(KItemModelBase* model); + void setController(KItemListController *controller); + void setModel(KItemModelBase *model); - KItemListRubberBand* rubberBand() const; + KItemListRubberBand *rubberBand() const; void doLayout(LayoutAnimationHint hint, int changedIndex = 0, int changedCount = 0); @@ -474,9 +505,7 @@ private: * won't be reused. Reusing items is faster in comparison to deleting invisible * items and creating a new instance for visible items. */ - QList recycleInvisibleItems(int firstVisibleIndex, - int lastVisibleIndex, - LayoutAnimationHint hint); + QList recycleInvisibleItems(int firstVisibleIndex, int lastVisibleIndex, LayoutAnimationHint hint); /** * Helper method for doLayout: Starts a moving-animation for the widget to the given @@ -484,19 +513,19 @@ private: * the same row or column, otherwise the create-animation is used instead. * @return True if the moving-animation has been applied. */ - bool moveWidget(KItemListWidget* widget, const QPointF& newPos); + bool moveWidget(KItemListWidget *widget, const QPointF &newPos); void emitOffsetChanges(); - KItemListWidget* createWidget(int index); - void recycleWidget(KItemListWidget* widget); + KItemListWidget *createWidget(int index); + void recycleWidget(KItemListWidget *widget); /** * Changes the index of the widget to \a index and assures a consistent * update for m_visibleItems and m_visibleCells. The cell-information * for the new index will not be updated and be initialized as empty cell. */ - void setWidgetIndex(KItemListWidget* widget, int index); + void setWidgetIndex(KItemListWidget *widget, int index); /** * Changes the index of the widget to \a index. In opposite to @@ -504,40 +533,41 @@ private: * This update gives doLayout() the chance to animate the moving * of the item visually (see moveWidget()). */ - void moveWidgetToIndex(KItemListWidget* widget, int index); + void moveWidgetToIndex(KItemListWidget *widget, int index); /** * Helper method for prepareLayoutForIncreasedItemCount(). */ - void setLayouterSize(const QSizeF& size, SizeType sizeType); + void setLayouterSize(const QSizeF &size, SizeType sizeType); /** * Helper method for createWidget() and setWidgetIndex() to update the properties * of the itemlist widget. */ - void updateWidgetProperties(KItemListWidget* widget, int index); + void updateWidgetProperties(KItemListWidget *widget, int index); /** * Helper method for updateWidgetPropertes() to create or update * the itemlist group-header. */ - void updateGroupHeaderForWidget(KItemListWidget* widget); + void updateGroupHeaderForWidget(KItemListWidget *widget); /** * Updates the position and size of the group-header that belongs * to the itemlist widget \a widget. The given widget must represent * the first item of a group. */ - void updateGroupHeaderLayout(KItemListWidget* widget); + void updateGroupHeaderLayout(KItemListWidget *widget); /** * Recycles the group-header for the widget. */ - void recycleGroupHeaderForWidget(KItemListWidget* widget); + void recycleGroupHeaderForWidget(KItemListWidget *widget); /** - * Helper method for slotGroupedSortingChanged(), slotSortOrderChanged() - * and slotSortRoleChanged(): Iterates through all visible items and updates + * Helper method for slotGroupedSortingChanged(), slotSortOrderChanged(), + * slotSortRoleChanged(), slotGroupOrderChanged() and slotGroupRoleChanged(): + * Iterates through all visible items and updates * the group-header widgets. */ void updateVisibleGroupHeaders(); @@ -559,7 +589,7 @@ private: * Updates the alternateBackground-property of the widget dependent * on the state of useAlternateBackgrounds() and the grouping state. */ - void updateAlternateBackgroundForWidget(KItemListWidget* widget); + void updateAlternateBackgroundForWidget(KItemListWidget *widget); /** * @return True if alternate backgrounds should be used for the items. @@ -575,7 +605,7 @@ private: * KItemListView::setItemSize()). Per default an empty hash * is returned. */ - QHash preferredColumnWidths(const KItemRangeList& itemRanges) const; + QHash preferredColumnWidths(const KItemRangeList &itemRanges) const; /** * Applies the column-widths from m_headerWidget to the layout @@ -586,13 +616,13 @@ private: /** * Applies the column-widths from m_headerWidget to \a widget. */ - void updateWidgetColumnWidths(KItemListWidget* widget); + void updateWidgetColumnWidths(KItemListWidget *widget); /** * Updates the preferred column-widths of m_groupHeaderWidget by * invoking KItemListView::columnWidths(). */ - void updatePreferredColumnWidths(const KItemRangeList& itemRanges); + void updatePreferredColumnWidths(const KItemRangeList &itemRanges); /** * Convenience method for @@ -602,7 +632,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(); @@ -622,9 +652,7 @@ private: * the new grid- and item-size. Used to determine whether an animation * should be done when applying the new layout. */ - bool changesItemGridLayout(const QSizeF& newGridSize, - const QSizeF& newItemSize, - const QSizeF& newItemMargin) const; + bool changesItemGridLayout(const QSizeF &newGridSize, const QSizeF &newItemSize, const QSizeF &newItemMargin) const; /** * @param changedItemCount Number of inserted or removed items. @@ -639,7 +667,7 @@ private: * when using a size of \p size for the view. Calling the method is rather * expansive as a temporary relayout needs to be done. */ - bool scrollBarRequired(const QSizeF& size) const; + bool scrollBarRequired(const QSizeF &size) const; /** * Shows a drop-indicator between items dependent on the given @@ -648,7 +676,7 @@ private: * @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. */ - int showDropIndicator(const QPointF& pos); + int showDropIndicator(const QPointF &pos); void hideDropIndicator(); /** @@ -702,51 +730,67 @@ 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() LayoutAnimationHint m_endTransactionAnimationHint; QSizeF m_itemSize; - KItemListController* m_controller; - KItemModelBase* m_model; + KItemListController *m_controller; + KItemModelBase *m_model; QList m_visibleRoles; - mutable KItemListWidgetCreatorBase* m_widgetCreator; - mutable KItemListGroupHeaderCreatorBase* m_groupHeaderCreator; + mutable KItemListWidgetCreatorBase *m_widgetCreator; + mutable KItemListGroupHeaderCreatorBase *m_groupHeaderCreator; +#ifndef QT_NO_ACCESSIBILITY + /** The object that will be the parent of this classes QAccessibleInterface. */ + KItemListContainerAccessible *m_accessibleParent = nullptr; +#endif KItemListStyleOption m_styleOption; - QHash m_visibleItems; - QHash m_visibleGroups; - - struct Cell - { - Cell() : column(-1), row(-1) {} - Cell(int c, int r) : column(c), row(r) {} + QHash m_visibleItems; + QHash m_visibleGroups; + + struct Cell { + Cell() + : column(-1) + , row(-1) + { + } + Cell(int c, int r) + : column(c) + , row(r) + { + } int column; int row; }; QHash m_visibleCells; int m_scrollBarExtent; - KItemListSizeHintResolver* m_sizeHintResolver; - KItemListViewLayouter* m_layouter; - KItemListViewAnimation* m_animation; + KItemListViewLayouter *m_layouter; + KItemListViewAnimation *m_animation; - QTimer* m_layoutTimer; // Triggers an asynchronous doLayout() call. qreal m_oldScrollOffset; qreal m_oldMaximumScrollOffset; qreal m_oldItemOffset; qreal m_oldMaximumItemOffset; bool m_skipAutoScrollForRubberBand; - KItemListRubberBand* m_rubberBand; + KItemListRubberBand *m_rubberBand; + KItemListRubberBand *m_tapAndHoldIndicator; QPointF m_mousePos; int m_autoScrollIncrement; - QTimer* m_autoScrollTimer; + QTimer *m_autoScrollTimer; + + KItemListHeader *m_header; + KItemListHeaderWidget *m_headerWidget; - KItemListHeader* m_header; - KItemListHeaderWidget* m_headerWidget; + QPropertyAnimation *m_indicatorAnimation; + + int m_statusBarOffset; // When dragging items into the view where the sort-role of the model // is empty, a visual indicator should be shown during dragging where @@ -756,12 +800,18 @@ private: // by KItemListView::showDropIndicator() and KItemListView::hideDropIndicator(). QRectF m_dropIndicator; + QList m_rubberBandAnimations; + + KItemListSizeHintResolver *m_sizeHintResolver; + friend class KItemListContainer; // Accesses scrollBarRequired() - friend class KItemListHeader; // Accesses m_headerWidget + friend class KItemListHeader; // Accesses m_headerWidget friend class KItemListController; friend class KItemListControllerTest; friend class KItemListViewAccessible; - friend class KItemListAccessibleCell; + friend class KItemListDelegateAccessible; + + friend class DolphinMainWindowTest; }; /** @@ -776,13 +826,13 @@ public: virtual ~KItemListCreatorBase(); protected: - void addCreatedWidget(QGraphicsWidget* widget); - void pushRecycleableWidget(QGraphicsWidget* widget); - QGraphicsWidget* popRecycleableWidget(); + void addCreatedWidget(QGraphicsWidget *widget); + void pushRecycleableWidget(QGraphicsWidget *widget); + QGraphicsWidget *popRecycleableWidget(); private: - QSet m_createdWidgets; - QList m_recycleableWidgets; + QSet m_createdWidgets; + QList m_recycleableWidgets; }; /** @@ -799,71 +849,69 @@ class DOLPHIN_EXPORT KItemListWidgetCreatorBase : public KItemListCreatorBase public: ~KItemListWidgetCreatorBase() override; - virtual KItemListWidget* create(KItemListView* view) = 0; + virtual KItemListWidget *create(KItemListView *view) = 0; - virtual void recycle(KItemListWidget* widget); + 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, - const KItemListView* view) const = 0; + virtual qreal preferredRoleColumnWidth(const QByteArray &role, int index, const KItemListView *view) const = 0; }; /** * @brief Template class for creating KItemListWidgets. */ -template +template class KItemListWidgetCreator : public KItemListWidgetCreatorBase { public: KItemListWidgetCreator(); ~KItemListWidgetCreator() override; - KItemListWidget* create(KItemListView* view) override; + KItemListWidget *create(KItemListView *view) override; - void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; + void calculateItemSizeHints(QVector> &logicalHeightHints, qreal &logicalWidthHint, const KItemListView *view) const override; + + qreal preferredRoleColumnWidth(const QByteArray &role, int index, const KItemListView *view) const override; - qreal preferredRoleColumnWidth(const QByteArray& role, - int index, - const KItemListView* view) const override; private: - KItemListWidgetInformant* m_informant; + KItemListWidgetInformant *m_informant; }; -template -KItemListWidgetCreator::KItemListWidgetCreator() : - m_informant(T::createInformant()) +template +KItemListWidgetCreator::KItemListWidgetCreator() + : m_informant(T::createInformant()) { } -template +template KItemListWidgetCreator::~KItemListWidgetCreator() { delete m_informant; } -template -KItemListWidget* KItemListWidgetCreator::create(KItemListView* view) +template +KItemListWidget *KItemListWidgetCreator::create(KItemListView *view) { - KItemListWidget* widget = static_cast(popRecycleableWidget()); + KItemListWidget *widget = static_cast(popRecycleableWidget()); if (!widget) { 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); } template -qreal KItemListWidgetCreator::preferredRoleColumnWidth(const QByteArray& role, - int index, - const KItemListView* view) const +qreal KItemListWidgetCreator::preferredRoleColumnWidth(const QByteArray &role, int index, const KItemListView *view) const { return m_informant->preferredRoleColumnWidth(role, index, view); } @@ -872,7 +920,7 @@ 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. */ @@ -880,27 +928,27 @@ class DOLPHIN_EXPORT KItemListGroupHeaderCreatorBase : public KItemListCreatorBa { public: ~KItemListGroupHeaderCreatorBase() override; - virtual KItemListGroupHeader* create(KItemListView* view) = 0; - virtual void recycle(KItemListGroupHeader* header); + virtual KItemListGroupHeader *create(KItemListView *view) = 0; + virtual void recycle(KItemListGroupHeader *header); }; -template +template class KItemListGroupHeaderCreator : public KItemListGroupHeaderCreatorBase { public: ~KItemListGroupHeaderCreator() override; - KItemListGroupHeader* create(KItemListView* view) override; + KItemListGroupHeader *create(KItemListView *view) override; }; -template +template KItemListGroupHeaderCreator::~KItemListGroupHeaderCreator() { } -template -KItemListGroupHeader* KItemListGroupHeaderCreator::create(KItemListView* view) +template +KItemListGroupHeader *KItemListGroupHeaderCreator::create(KItemListView *view) { - KItemListGroupHeader* widget = static_cast(popRecycleableWidget()); + KItemListGroupHeader *widget = static_cast(popRecycleableWidget()); if (!widget) { widget = new T(view); addCreatedWidget(widget);