]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistview.h
Merge remote-tracking branch 'fork/work/zakharafoniam/useful-groups'
[dolphin.git] / src / kitemviews / kitemlistview.h
index e6bf5ad90809fdc60b25759f6e9fe09bca305356..1382405d058b89e87fe218cd6a6bd12cc20e8e89 100644 (file)
@@ -9,6 +9,8 @@
 #ifndef KITEMLISTVIEW_H
 #define KITEMLISTVIEW_H
 
+#include <optional>
+
 #include "dolphin_export.h"
 #include "kitemviews/kitemliststyleoption.h"
 #include "kitemviews/kitemlistwidget.h"
@@ -19,6 +21,8 @@
 #include <QGraphicsWidget>
 #include <QSet>
 
+class KItemListContainer;
+class KItemListContainerAccessible;
 class KItemListController;
 class KItemListGroupHeaderCreatorBase;
 class KItemListHeader;
@@ -51,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;
 
     /**
@@ -81,7 +88,7 @@ public:
 
     int maximumVisibleItems() const;
 
-    void setVisibleRoles(const QList<QByteArray>roles);
+    void setVisibleRoles(const QList<QByteArray> &roles);
     QList<QByteArray> visibleRoles() const;
 
     /**
@@ -104,14 +111,14 @@ public:
      *         initialized by KItemListController::setView() and will
      *         result in calling KItemListController::onControllerChanged().
      */
-    KItemListControllercontroller() const;
+    KItemListController *controller() const;
 
     /**
      * @return Model of the item-list. The model gets
      *         initialized by KItemListController::setModel() and will
      *         result in calling KItemListController::onModelChanged().
      */
-    KItemModelBasemodel() const;
+    KItemModelBase *model() const;
 
     /**
      * Sets the creator that creates a widget showing the
@@ -124,8 +131,8 @@ public:
      * The ownership of the widget creator is transferred to
      * the item-list view.
      **/
-    void setWidgetCreator(KItemListWidgetCreatorBasewidgetCreator);
-    KItemListWidgetCreatorBasewidgetCreator() const;
+    void setWidgetCreator(KItemListWidgetCreatorBase *widgetCreator);
+    KItemListWidgetCreatorBase *widgetCreator() const;
 
     /**
      * Sets the creator that creates a group header. Usually it is sufficient
@@ -137,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
@@ -146,9 +165,9 @@ public:
      */
     QSizeF itemSize() const;
 
-    const KItemListStyleOptionstyleOption() const;
+    const KItemListStyleOption &styleOption() const;
 
-    void setGeometry(const QRectFrect) override;
+    void setGeometry(const QRectF &rect) override;
 
     /**
      * @return The page step which should be used by the vertical scroll bar.
@@ -156,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 QPointFpos) const;
-    bool isAboveExpansionToggle(int index, const QPointFpos) const;
-    bool isAboveText(int index, const QPointFpos) const;
+    std::optional<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;
 
     /**
      * @return Index of the first item that is at least partly visible.
@@ -189,7 +213,7 @@ public:
      * @note the logical height (width) is actually the
      * width (height) if the scroll orientation is Qt::Vertical!
      */
-    void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint) const;
+    void calculateItemSizeHints(QVector<std::pair<qreal, bool>> &logicalHeightHints, qreal &logicalWidthHint) const;
 
     /**
      * If set to true, items having child-items can be expanded to show the child-items as
@@ -203,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()).
@@ -221,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
@@ -255,22 +292,28 @@ public:
      * @return Header of the list. The header is also available if it is not shown
      *         (see KItemListView::setHeaderShown()).
      */
-    KItemListHeaderheader() 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 KItemSetindexes) 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 QByteArrayrole);
+    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);
@@ -294,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 &current, const QByteArray &previous);
 
     /**
      * Is emitted if the user has changed the visible roles by moving a header
@@ -302,15 +345,24 @@ signals:
      * emitted if the roles have been changed without user interaction by
      * KItemListView::setVisibleRoles().
      */
-    void visibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous);
+    void visibleRolesChanged(const QList<QByteArray> &current, const QList<QByteArray> &previous);
 
-    void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value);
-    void roleEditingFinished(int index, const QByteArray& role, const QVariant& value);
+    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 columnHovered(int roleIndex);
+    void columnUnHovered(int roleIndex);
 
 protected:
     QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
-    void setItemSize(const QSizeFsize);
-    void setStyleOption(const KItemListStyleOptionoption);
+    void setItemSize(const QSizeF &size);
+    void setStyleOption(const KItemListStyleOption &option);
 
     /**
      * If the scroll-orientation is vertical, the items are ordered
@@ -326,7 +378,7 @@ protected:
      * @return New instance of the widget-creator that should be used per
      *         default.
      */
-    virtual KItemListWidgetCreatorBasedefaultWidgetCreator() const;
+    virtual KItemListWidgetCreatorBase *defaultWidgetCreator() const;
 
     /**
      * Factory method for creating a default group-header-creator. The method will be used
@@ -334,13 +386,13 @@ protected:
      * @return New instance of the group-header-creator that should be used per
      *         default.
      */
-    virtual KItemListGroupHeaderCreatorBasedefaultGroupHeaderCreator() 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(KItemListWidgetitem);
+    virtual void initializeItemListWidget(KItemListWidget *item);
 
     /**
      * @return True if at least one of the changed roles \p changedRoles might result
@@ -350,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<QByteArray>changedRoles) const;
+    virtual bool itemSizeHintUpdateRequired(const QSet<QByteArray> &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 &current, const QSizeF &previous);
     virtual void onScrollOffsetChanged(qreal current, qreal previous);
-    virtual void onVisibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous);
-    virtual void onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous);
+    virtual void onVisibleRolesChanged(const QList<QByteArray> &current, const QList<QByteArray> &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();
 
-    bool event(QEventevent) override;
-    void mousePressEvent(QGraphicsSceneMouseEventevent) override;
-    void mouseMoveEvent(QGraphicsSceneMouseEventevent) override;
-    void dragEnterEvent(QGraphicsSceneDragDropEventevent) override;
-    void dragMoveEvent(QGraphicsSceneDragDropEventevent) override;
-    void dragLeaveEvent(QGraphicsSceneDragDropEventevent) override;
-    void dropEvent(QGraphicsSceneDragDropEventevent) 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<KItemListWidget*> visibleItemListWidgets() const;
+    QList<KItemListWidget *> 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<int>& movedToIndexes);
-    virtual void slotItemsChanged(const KItemRangeList& itemRanges,
-                                  const QSet<QByteArray>& roles);
+protected Q_SLOTS:
+    virtual void slotItemsInserted(const KItemRangeList &itemRanges);
+    virtual void slotItemsRemoved(const KItemRangeList &itemRanges);
+    virtual void slotItemsMoved(const KItemRange &itemRange, const QList<int> &movedToIndexes);
+    virtual void slotItemsChanged(const KItemRangeList &itemRanges, const QSet<QByteArray> &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 &current, const QByteArray &previous);
+    virtual void slotGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous);
+    virtual void slotGroupRoleChanged(const QByteArray &current, const QByteArray &previous);
     virtual void slotCurrentChanged(int current, int previous);
-    virtual void slotSelectionChanged(const KItemSet& current, const KItemSet& previous);
+    virtual void slotSelectionChanged(const KItemSet &current, 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);
@@ -406,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
@@ -433,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(KItemListControllercontroller);
-    void setModel(KItemModelBasemodel);
+    void setController(KItemListController *controller);
+    void setModel(KItemModelBase *model);
 
-    KItemListRubberBandrubberBand() const;
+    KItemListRubberBand *rubberBand() const;
 
     void doLayout(LayoutAnimationHint hint, int changedIndex = 0, int changedCount = 0);
 
@@ -463,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<int> recycleInvisibleItems(int firstVisibleIndex,
-                                     int lastVisibleIndex,
-                                     LayoutAnimationHint hint);
+    QList<int> recycleInvisibleItems(int firstVisibleIndex, int lastVisibleIndex, LayoutAnimationHint hint);
 
     /**
      * Helper method for doLayout: Starts a moving-animation for the widget to the given
@@ -473,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();
 
-    KItemListWidgetcreateWidget(int index);
-    void recycleWidget(KItemListWidgetwidget);
+    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(KItemListWidgetwidget, int index);
+    void setWidgetIndex(KItemListWidget *widget, int index);
 
     /**
      * Changes the index of the widget to \a index. In opposite to
@@ -493,40 +533,41 @@ private:
      * This update gives doLayout() the chance to animate the moving
      * of the item visually (see moveWidget()).
      */
-    void moveWidgetToIndex(KItemListWidgetwidget, int index);
+    void moveWidgetToIndex(KItemListWidget *widget, int index);
 
     /**
      * Helper method for prepareLayoutForIncreasedItemCount().
      */
-    void setLayouterSize(const QSizeFsize, 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(KItemListWidgetwidget, int index);
+    void updateWidgetProperties(KItemListWidget *widget, int index);
 
     /**
      * Helper method for updateWidgetPropertes() to create or update
      * the itemlist group-header.
      */
-    void updateGroupHeaderForWidget(KItemListWidgetwidget);
+    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(KItemListWidgetwidget);
+    void updateGroupHeaderLayout(KItemListWidget *widget);
 
     /**
      * Recycles the group-header for the widget.
      */
-    void recycleGroupHeaderForWidget(KItemListWidgetwidget);
+    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();
@@ -548,7 +589,7 @@ private:
      * Updates the alternateBackground-property of the widget dependent
      * on the state of useAlternateBackgrounds() and the grouping state.
      */
-    void updateAlternateBackgroundForWidget(KItemListWidgetwidget);
+    void updateAlternateBackgroundForWidget(KItemListWidget *widget);
 
     /**
      * @return True if alternate backgrounds should be used for the items.
@@ -564,7 +605,7 @@ private:
      *                   KItemListView::setItemSize()). Per default an empty hash
      *                   is returned.
      */
-    QHash<QByteArray, qreal> preferredColumnWidths(const KItemRangeListitemRanges) const;
+    QHash<QByteArray, qreal> preferredColumnWidths(const KItemRangeList &itemRanges) const;
 
     /**
      * Applies the column-widths from m_headerWidget to the layout
@@ -575,13 +616,13 @@ private:
     /**
      * Applies the column-widths from m_headerWidget to \a widget.
      */
-    void updateWidgetColumnWidths(KItemListWidgetwidget);
+    void updateWidgetColumnWidths(KItemListWidget *widget);
 
     /**
      * Updates the preferred column-widths of m_groupHeaderWidget by
      * invoking KItemListView::columnWidths().
      */
-    void updatePreferredColumnWidths(const KItemRangeListitemRanges);
+    void updatePreferredColumnWidths(const KItemRangeList &itemRanges);
 
     /**
      * Convenience method for
@@ -591,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();
 
@@ -611,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.
@@ -628,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 QSizeFsize) const;
+    bool scrollBarRequired(const QSizeF &size) const;
 
     /**
      * Shows a drop-indicator between items dependent on the given
@@ -637,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 QPointFpos);
+    int showDropIndicator(const QPointF &pos);
     void hideDropIndicator();
 
     /**
@@ -691,54 +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;
-    KItemListControllerm_controller;
-    KItemModelBasem_model;
+    KItemListController *m_controller;
+    KItemModelBase *m_model;
     QList<QByteArray> 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<int, KItemListWidget*> m_visibleItems;
-    QHash<KItemListWidget*, KItemListGroupHeader*> m_visibleGroups;
-
-    struct Cell
-    {
-        Cell() : column(-1), row(-1) {}
-        Cell(int c, int r) : column(c), row(r) {}
+    QHash<int, KItemListWidget *> m_visibleItems;
+    QHash<KItemListWidget *, KItemListGroupHeader *> m_visibleGroups;
+
+    struct Cell {
+        Cell()
+            : column(-1)
+            , row(-1)
+        {
+        }
+        Cell(int c, int r)
+            : column(c)
+            , row(r)
+        {
+        }
         int column;
         int row;
     };
     QHash<int, Cell> 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;
-    KItemListRubberBandm_rubberBand;
-    KItemListRubberBandm_tapAndHoldIndicator;
+    KItemListRubberBand *m_rubberBand;
+    KItemListRubberBand *m_tapAndHoldIndicator;
 
     QPointF m_mousePos;
     int m_autoScrollIncrement;
-    QTimerm_autoScrollTimer;
+    QTimer *m_autoScrollTimer;
 
-    KItemListHeaderm_header;
-    KItemListHeaderWidgetm_headerWidget;
+    KItemListHeader *m_header;
+    KItemListHeaderWidget *m_headerWidget;
 
-    QPropertyAnimation* m_indicatorAnimation;
+    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
@@ -748,14 +800,18 @@ private:
     // by KItemListView::showDropIndicator() and KItemListView::hideDropIndicator().
     QRectF m_dropIndicator;
 
-    QList<QVariantAnimation*> m_rubberBandAnimations;
+    QList<QVariantAnimation *> 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;
 };
 
 /**
@@ -770,13 +826,13 @@ public:
     virtual ~KItemListCreatorBase();
 
 protected:
-    void addCreatedWidget(QGraphicsWidgetwidget);
-    void pushRecycleableWidget(QGraphicsWidgetwidget);
-    QGraphicsWidgetpopRecycleableWidget();
+    void addCreatedWidget(QGraphicsWidget *widget);
+    void pushRecycleableWidget(QGraphicsWidget *widget);
+    QGraphicsWidget *popRecycleableWidget();
 
 private:
-    QSet<QGraphicsWidget*> m_createdWidgets;
-    QList<QGraphicsWidget*> m_recycleableWidgets;
+    QSet<QGraphicsWidget *> m_createdWidgets;
+    QList<QGraphicsWidget *> m_recycleableWidgets;
 };
 
 /**
@@ -793,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(KItemListWidgetwidget);
+    virtual void recycle(KItemListWidget *widget);
 
-    virtual void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0;
+    virtual void calculateItemSizeHints(QVector<std::pair<qreal, bool>> &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 <class T>
+template<class T>
 class KItemListWidgetCreator : public KItemListWidgetCreatorBase
 {
 public:
     KItemListWidgetCreator();
     ~KItemListWidgetCreator() override;
 
-    KItemListWidget* create(KItemListView* view) override;
+    KItemListWidget *create(KItemListView *view) override;
+
+    void calculateItemSizeHints(QVector<std::pair<qreal, bool>> &logicalHeightHints, qreal &logicalWidthHint, const KItemListView *view) const override;
 
-    void calculateItemSizeHints(QVector<qreal>& 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:
-    KItemListWidgetInformantm_informant;
+    KItemListWidgetInformant *m_informant;
 };
 
-template <class T>
-KItemListWidgetCreator<T>::KItemListWidgetCreator() :
-    m_informant(T::createInformant())
+template<class T>
+KItemListWidgetCreator<T>::KItemListWidgetCreator()
+    m_informant(T::createInformant())
 {
 }
 
-template <class T>
+template<class T>
 KItemListWidgetCreator<T>::~KItemListWidgetCreator()
 {
     delete m_informant;
 }
 
-template <class T>
-KItemListWidget* KItemListWidgetCreator<T>::create(KItemListView* view)
+template<class T>
+KItemListWidget *KItemListWidgetCreator<T>::create(KItemListView *view)
 {
-    KItemListWidget* widget = static_cast<KItemListWidget*>(popRecycleableWidget());
+    KItemListWidget *widget = static_cast<KItemListWidget *>(popRecycleableWidget());
     if (!widget) {
         widget = new T(m_informant, view);
         addCreatedWidget(widget);
     }
+    widget->setParentItem(view);
     return widget;
 }
 
 template<class T>
-void KItemListWidgetCreator<T>::calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
+void KItemListWidgetCreator<T>::calculateItemSizeHints(QVector<std::pair<qreal, bool>> &logicalHeightHints,
+                                                       qreal &logicalWidthHint,
+                                                       const KItemListView *view) const
 {
     return m_informant->calculateItemSizeHints(logicalHeightHints, logicalWidthHint, view);
 }
 
 template<class T>
-qreal KItemListWidgetCreator<T>::preferredRoleColumnWidth(const QByteArray& role,
-                                                          int index,
-                                                          const KItemListView* view) const
+qreal KItemListWidgetCreator<T>::preferredRoleColumnWidth(const QByteArray &role, int index, const KItemListView *view) const
 {
     return m_informant->preferredRoleColumnWidth(role, index, view);
 }
@@ -866,7 +920,7 @@ qreal KItemListWidgetCreator<T>::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.
  */
@@ -874,27 +928,27 @@ class DOLPHIN_EXPORT KItemListGroupHeaderCreatorBase : public KItemListCreatorBa
 {
 public:
     ~KItemListGroupHeaderCreatorBase() override;
-    virtual KItemListGroupHeader* create(KItemListView* view) = 0;
-    virtual void recycle(KItemListGroupHeaderheader);
+    virtual KItemListGroupHeader *create(KItemListView *view) = 0;
+    virtual void recycle(KItemListGroupHeader *header);
 };
 
-template <class T>
+template<class T>
 class KItemListGroupHeaderCreator : public KItemListGroupHeaderCreatorBase
 {
 public:
     ~KItemListGroupHeaderCreator() override;
-    KItemListGroupHeader* create(KItemListView* view) override;
+    KItemListGroupHeader *create(KItemListView *view) override;
 };
 
-template <class T>
+template<class T>
 KItemListGroupHeaderCreator<T>::~KItemListGroupHeaderCreator()
 {
 }
 
-template <class T>
-KItemListGroupHeader* KItemListGroupHeaderCreator<T>::create(KItemListView* view)
+template<class T>
+KItemListGroupHeader *KItemListGroupHeaderCreator<T>::create(KItemListView *view)
 {
-    KItemListGroupHeader* widget = static_cast<KItemListGroupHeader*>(popRecycleableWidget());
+    KItemListGroupHeader *widget = static_cast<KItemListGroupHeader *>(popRecycleableWidget());
     if (!widget) {
         widget = new T(view);
         addCreatedWidget(widget);