Files
o3de/Code/Framework/AzQtComponents/AzQtComponents/Components/StyledDetailsTableModel.h
T
Steve Pham 38261d0800 Shorten copyright headers by splitting into 2 lines (#2213)
* Updated all copyright headers to split the longer original copyright line into 2 shorter lines

Signed-off-by: Steve Pham <spham@amazon.com>
2021-07-16 15:25:48 -07:00

142 lines
4.5 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#if !defined(Q_MOC_RUN)
#include <AzQtComponents/AzQtComponentsAPI.h>
#include <QAbstractListModel>
#include <QString>
#include <QPixmap>
#include <QMap>
#endif
namespace AzQtComponents
{
// Used in conjunction with a StyledDetailsTableView to display
// a list of key value pairs. Any keys mapped to columns
// be displayed in columns, everything else will be combined, in priority
// order, into the Details view, shown when a row is selected.
class AZ_QT_COMPONENTS_API StyledDetailsTableModel
: public QAbstractListModel
{
Q_OBJECT
public:
enum StyledTableRoles
{
Details = Qt::UserRole,
HasOnlyDetails
};
enum ColumnStyle
{
/// Display value as text
TextString,
/// Display an icon representing value text ("error", "warning" or "status")
StatusIcon,
};
enum StatusType
{
StatusError = 100,
StatusWarning = 200,
StatusSuccess = 300,
StatusUser = 400
};
class TableEntry
{
public:
void Add(const QString& key, const QString& value)
{
m_entries.push_back(QPair<QString, QVariant>(key, value));
}
void Add(const QString& key, int statusValue)
{
m_entries.push_back(QPair<QString, QVariant>(key, statusValue));
}
private:
QVector<QPair<QString, QVariant>> m_entries;
friend class StyledDetailsTableModel;
};
explicit StyledDetailsTableModel(QObject* parent = nullptr);
~StyledDetailsTableModel() override;
void AddColumn(const QString& name, ColumnStyle style = TextString);
void MoveColumn(const QString& name, int toIndex);
void AddColumnAlias(const QString& aliasName, const QString& columnName);
int GetColumnIndex(const QString& name) const;
void AddEntry(const TableEntry& entry);
void AddPrioritizedKey(const QString& key);
void RemovePrioritizedKey(const QString& key);
void AddDeprioritizedKey(const QString& key);
void RemoveDeprioritizedKey(const QString& key);
void sort(int colIndex, Qt::SortOrder order = Qt::AscendingOrder) override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
int columnCount(const QModelIndex& index = {}) const override;
int rowCount(const QModelIndex& index = {}) const override;
void RegisterStatusIcon(int statusType, const QPixmap& icon);
private:
struct InternalTableData
{
QString key;
QVariant value;
};
typedef QVector<InternalTableData> InternalTableEntry;
struct Column
{
QString name;
bool hidden = false;
ColumnStyle style = TextString;
};
enum EntryType
{
Prioritized,
Normal,
Deprioritized
};
QString GetColumnName(int colIndex) const;
QVariant GetEntryData(const InternalTableEntry* entry, const QString& column) const;
bool AppearsAbove(const InternalTableEntry* lhs, const InternalTableEntry* rhs, const QString& column, Qt::SortOrder) const;
void DetailsUpdated();
int m_sortColumn = -1;
Qt::SortOrder m_sortOrder = Qt::AscendingOrder;
AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: 'AzQtComponents::StyledDetailsTableModel::m_columnAliases': class 'QHash<QString,QString>' needs to have dll-interface to be used by clients of class 'AzQtComponents::StyledDetailsTableModel'
QHash<QString, QString> m_columnAliases;
QVector<Column> m_columns;
QVector<InternalTableEntry*> m_entries;
QVector<QString> m_prioritizedKeys;
QVector<QString> m_deprioritizedKeys;
QMap<int, QPixmap> m_statusIcons;
// non-static for allocation tracking
QVector<int> m_detailsChangedRoleVector;
AZ_POP_DISABLE_WARNING
};
} // namespace AzQtComponents