// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "dashboard/dto.h" #include #include #include namespace Axivion::Internal { class IssueHeaderView : public QHeaderView { Q_OBJECT public: struct ColumnInfo { QString key; int width = 0; std::optional sortOrder = std::nullopt; bool sortable = false; bool filterable = false; std::optional filter = std::nullopt; }; explicit IssueHeaderView(QWidget *parent = nullptr) : QHeaderView(Qt::Horizontal, parent) {} void setColumnInfoList(const QList &infos); const QString currentSortString() const; const QMap currentFilterMapping() const; void updateExistingColumnInfos(const std::map &filters, const std::optional> &sorters); signals: void filterChanged(); void sortTriggered(); protected: void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override; QSize sectionSizeFromContents(int logicalIndex) const override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; private: void onToggleSort(int index, Qt::SortOrder order, bool multi); bool m_dragging = false; enum ToggleMode {Sort, Filter}; std::optional m_maybeToggle = std::nullopt; bool m_withShift = false; int m_lastToggleLogicalPos = -1; QList m_columnInfoList; QList m_currentSortIndexes; }; } // namespace Axivion::Internal