#ifndef DASHBOARDSECTIONORDERSTRIP_H #define DASHBOARDSECTIONORDERSTRIP_H #include #include #include #include #include class QGraphicsOpacityEffect; class QLabel; class QMouseEvent; class QResizeEvent; class DashboardSectionOrderStrip : public QFrame { Q_OBJECT public: explicit DashboardSectionOrderStrip(QWidget* parent = nullptr); void setSectionOrder(const QStringList& order, const QHash& titles); QStringList sectionOrder() const; QSize sizeHint() const override; QSize minimumSizeHint() const override; signals: void sectionOrderChanged(const QStringList& order); protected: bool eventFilter(QObject* watched, QEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void resizeEvent(QResizeEvent* event) override; private: struct ChipItem { QString sectionId; QFrame* chip = nullptr; }; QFrame* createChip(const QString& title); void rebuildChips(); int indexOfChip(const QFrame* chip) const; int insertionIndexForPosition(int localX) const; void beginDrag(QFrame* chip); void updateDrag(const QPoint& globalPos); void updateDragPreview(const QPoint& globalPos); void finishDrag(); void resetDragState(bool animateDraggedChip = false); void setDraggingChip(QFrame* chip, bool dragging); void setIndicatorIndex(int index, bool animate = true); void relayoutChips(bool animate); void moveWidgetTo(QWidget* widget, const QPoint& targetPos, bool animate, int duration = 180); void stopPosAnimations(QWidget* widget) const; int fullContentWidth() const; int contentWidthForCurrentState() const; int chipY() const; int indicatorY() const; QFrame* m_dropIndicator = nullptr; QFrame* m_dragPreview = nullptr; QLabel* m_dragPreviewLabel = nullptr; QGraphicsOpacityEffect* m_dragPreviewOpacity = nullptr; QList m_chipItems; QStringList m_order; QHash m_titles; QPointer m_pressedChip; QPointer m_draggedChip; QPoint m_pressGlobalPos; QPoint m_pressChipOffset; int m_dragSourceIndex = -1; int m_indicatorIndex = -1; bool m_dragging = false; }; #endif