X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f65b0899c3666561cafac14f67ab0bb8a5bfa00a..dd07a327:/src/kitemviews/private/kitemlistheaderwidget.h diff --git a/src/kitemviews/private/kitemlistheaderwidget.h b/src/kitemviews/private/kitemlistheaderwidget.h index 44adc23c5..42dfda503 100644 --- a/src/kitemviews/private/kitemlistheaderwidget.h +++ b/src/kitemviews/private/kitemlistheaderwidget.h @@ -1,5 +1,6 @@ /* * SPDX-FileCopyrightText: 2011 Peter Penz + * SPDX-FileCopyrightText: 2022, 2024 Felix Ernst * * SPDX-License-Identifier: GPL-2.0-or-later */ @@ -26,54 +27,57 @@ class DOLPHIN_EXPORT KItemListHeaderWidget : public QGraphicsWidget Q_OBJECT public: - explicit KItemListHeaderWidget(QGraphicsWidget* parent = nullptr); + explicit KItemListHeaderWidget(QGraphicsWidget *parent = nullptr); ~KItemListHeaderWidget() override; - void setModel(KItemModelBase* model); - KItemModelBase* model() const; + void setModel(KItemModelBase *model); + KItemModelBase *model() const; void setAutomaticColumnResizing(bool automatic); bool automaticColumnResizing() const; - void setColumns(const QList& roles); + void setColumns(const QList &roles); QList columns() const; - void setColumnWidth(const QByteArray& role, qreal width); - qreal columnWidth(const QByteArray& role) const; + void setColumnWidth(const QByteArray &role, qreal width); + qreal columnWidth(const QByteArray &role) const; /** * Sets the column-width that is required to show the role unclipped. */ - void setPreferredColumnWidth(const QByteArray& role, qreal width); - qreal preferredColumnWidth(const QByteArray& role) const; + void setPreferredColumnWidth(const QByteArray &role, qreal width); + qreal preferredColumnWidth(const QByteArray &role) const; void setOffset(qreal offset); qreal offset() const; + void setSidePadding(qreal leftPaddingWidth, qreal rightPaddingWidth); + qreal leftPadding() const; + qreal rightPadding() const; + qreal minimumColumnWidth() const; - void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; Q_SIGNALS: /** * Is emitted if the width of a visible role has been adjusted by the user with the mouse * (no signal is emitted if KItemListHeader::setVisibleRoleWidth() is invoked). */ - void columnWidthChanged(const QByteArray& role, - qreal currentWidth, - qreal previousWidth); + void columnWidthChanged(const QByteArray &role, qreal currentWidth, qreal previousWidth); + + void sidePaddingChanged(qreal leftPaddingWidth, qreal rightPaddingWidth); /** * Is emitted if the user has released the mouse button after adjusting the * width of a visible role. */ - void columnWidthChangeFinished(const QByteArray& role, - qreal currentWidth); + void columnWidthChangeFinished(const QByteArray &role, qreal currentWidth); /** * Is emitted if the position of the column has been changed. */ - void columnMoved(const QByteArray& role, int currentIndex, int previousIndex); + void columnMoved(const QByteArray &role, int currentIndex, int previousIndex); /** * Is emitted if the user has changed the sort order by clicking on a @@ -89,32 +93,42 @@ Q_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); + + void columnUnHovered(int columnIndex); + void columnHovered(int columnIndex); protected: - void mousePressEvent(QGraphicsSceneMouseEvent* event) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) override; - void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override; - void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override; - void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override; + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; + void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; + void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; private Q_SLOTS: - void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous); + void slotSortRoleChanged(const QByteArray ¤t, const QByteArray &previous); void slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); private: - void paintRole(QPainter* painter, - const QByteArray& role, - const QRectF& rect, - int orderIndex, - QWidget* widget = nullptr) const; + struct Grip { + QByteArray roleToTheLeft; + QByteArray roleToTheRight; + }; - void updatePressedRoleIndex(const QPointF& pos); - void updateHoveredRoleIndex(const QPointF& pos); - int roleIndexAt(const QPointF& pos) const; - bool isAboveRoleGrip(const QPointF& pos, int roleIndex) const; + void paintRole(QPainter *painter, const QByteArray &role, const QRectF &rect, int orderIndex, QWidget *widget = nullptr) const; + + void updatePressedRoleIndex(const QPointF &pos); + void updateHoveredIndex(const QPointF &pos); + int roleIndexAt(const QPointF &pos) const; + + /** + * @returns std::nullopt if none of the resize grips is below @p position. + * Otherwise returns a Grip defined by the two roles on each side of @p position. + * @note If the Grip is between a padding and a role, a class-specific "leftPadding" or "rightPadding" role is used. + */ + std::optional isAboveResizeGrip(const QPointF &position) const; /** * Creates a pixmap of the role with the index \a roleIndex that is shown @@ -131,37 +145,37 @@ private: /** * @return x-position of the left border of the role \a role. */ - qreal roleXPosition(const QByteArray& role) const; + qreal roleXPosition(const QByteArray &role) const; -private: - enum RoleOperation - { - NoRoleOperation, - ResizeRoleOperation, - MoveRoleOperation - }; + /** + * @returns 0 for left-to-right layoutDirection(). + * Otherwise returns the space that is left over when space is distributed between padding and role columns. + * Used to make the column headers stay above their information columns for right-to-left layout directions. + */ + qreal unusedSpace() const; +private: bool m_automaticColumnResizing; - KItemModelBase* m_model; + KItemModelBase *m_model; qreal m_offset; + qreal m_leftPadding; + qreal m_rightPadding; QList m_columns; QHash m_columnWidths; QHash m_preferredColumnWidths; - int m_hoveredRoleIndex; + int m_hoveredIndex; + std::optional m_pressedGrip; int m_pressedRoleIndex; - RoleOperation m_roleOperation; QPointF m_pressedMousePos; - struct MovingRole - { + struct MovingRole { QPixmap pixmap; int x; int xDec; int index; - } m_movingRole; + }; + MovingRole m_movingRole; }; #endif - -