You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.0 KiB
149 lines
4.0 KiB
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#include "QCMakePresetItemModel.h"
|
|
|
|
#include "QCMakeSizeType.h"
|
|
#include <QFont>
|
|
|
|
QCMakePresetItemModel::QCMakePresetItemModel(QObject* parent)
|
|
: QAbstractItemModel(parent)
|
|
{
|
|
}
|
|
|
|
QVariant QCMakePresetItemModel::data(const QModelIndex& index, int role) const
|
|
{
|
|
switch (role) {
|
|
case Qt::AccessibleDescriptionRole:
|
|
// Separators have to return "separator" for the
|
|
// AccessibleDescriptionRole. This was determined by looking at
|
|
// QComboBoxDelegate::isSeparator() (located in qcombobox_p.h.)
|
|
if (index.internalId() == SEPARATOR_INDEX) {
|
|
return QString("separator");
|
|
}
|
|
return QString{};
|
|
case Qt::DisplayRole: {
|
|
if (index.internalId() == CUSTOM_INDEX) {
|
|
return QString("<custom>");
|
|
}
|
|
if (index.internalId() == SEPARATOR_INDEX) {
|
|
return QVariant{};
|
|
}
|
|
auto const& preset =
|
|
this->m_presets[static_cast<cm_qsizetype>(index.internalId())];
|
|
return preset.displayName.isEmpty() ? preset.name : preset.displayName;
|
|
}
|
|
case Qt::ToolTipRole:
|
|
if (index.internalId() == CUSTOM_INDEX) {
|
|
return QString("Specify all settings manually");
|
|
}
|
|
if (index.internalId() == SEPARATOR_INDEX) {
|
|
return QVariant{};
|
|
}
|
|
return this->m_presets[static_cast<cm_qsizetype>(index.internalId())]
|
|
.description;
|
|
case Qt::UserRole:
|
|
if (index.internalId() == CUSTOM_INDEX) {
|
|
return QVariant{};
|
|
}
|
|
if (index.internalId() == SEPARATOR_INDEX) {
|
|
return QVariant{};
|
|
}
|
|
return QVariant::fromValue(
|
|
this->m_presets[static_cast<cm_qsizetype>(index.internalId())]);
|
|
case Qt::FontRole:
|
|
if (index.internalId() == CUSTOM_INDEX) {
|
|
QFont font;
|
|
font.setItalic(true);
|
|
return font;
|
|
}
|
|
return QFont{};
|
|
default:
|
|
return QVariant{};
|
|
}
|
|
}
|
|
|
|
Qt::ItemFlags QCMakePresetItemModel::flags(const QModelIndex& index) const
|
|
{
|
|
Qt::ItemFlags flags =
|
|
Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
|
|
if (index.internalId() != SEPARATOR_INDEX &&
|
|
(index.internalId() == CUSTOM_INDEX ||
|
|
this->m_presets[static_cast<cm_qsizetype>(index.internalId())]
|
|
.enabled)) {
|
|
flags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled;
|
|
}
|
|
return flags;
|
|
}
|
|
|
|
int QCMakePresetItemModel::rowCount(const QModelIndex& parent) const
|
|
{
|
|
if (parent.isValid()) {
|
|
return 0;
|
|
}
|
|
if (this->m_presets.empty()) {
|
|
return 1;
|
|
}
|
|
return static_cast<int>(this->m_presets.size() + 2);
|
|
}
|
|
|
|
int QCMakePresetItemModel::columnCount(const QModelIndex& parent) const
|
|
{
|
|
if (parent.isValid()) {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
QModelIndex QCMakePresetItemModel::index(int row, int column,
|
|
const QModelIndex& parent) const
|
|
{
|
|
if (parent.isValid() || column != 0 || row < 0 ||
|
|
row >= this->rowCount(QModelIndex{})) {
|
|
return QModelIndex{};
|
|
}
|
|
|
|
if (this->m_presets.empty() || row == this->m_presets.size() + 1) {
|
|
return this->createIndex(row, column, CUSTOM_INDEX);
|
|
}
|
|
|
|
if (row == this->m_presets.size()) {
|
|
return this->createIndex(row, column, SEPARATOR_INDEX);
|
|
}
|
|
|
|
return this->createIndex(row, column, static_cast<quintptr>(row));
|
|
}
|
|
|
|
QModelIndex QCMakePresetItemModel::parent(const QModelIndex& /*index*/) const
|
|
{
|
|
return QModelIndex{};
|
|
}
|
|
|
|
QVector<QCMakePreset> const& QCMakePresetItemModel::presets() const
|
|
{
|
|
return this->m_presets;
|
|
}
|
|
|
|
void QCMakePresetItemModel::setPresets(QVector<QCMakePreset> const& presets)
|
|
{
|
|
this->beginResetModel();
|
|
this->m_presets = presets;
|
|
this->endResetModel();
|
|
}
|
|
|
|
int QCMakePresetItemModel::presetNameToRow(const QString& name) const
|
|
{
|
|
if (this->m_presets.empty()) {
|
|
return 0;
|
|
}
|
|
|
|
int index = 0;
|
|
for (auto const& preset : this->m_presets) {
|
|
if (preset.name == name) {
|
|
return index;
|
|
}
|
|
index++;
|
|
}
|
|
|
|
return static_cast<int>(this->m_presets.size() + 1);
|
|
}
|