QCMakePresetItemModel.cxx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "QCMakePresetItemModel.h"
  4. #include "QCMakeSizeType.h"
  5. #include <QFont>
  6. QCMakePresetItemModel::QCMakePresetItemModel(QObject* parent)
  7. : QAbstractItemModel(parent)
  8. {
  9. }
  10. QVariant QCMakePresetItemModel::data(const QModelIndex& index, int role) const
  11. {
  12. switch (role) {
  13. case Qt::AccessibleDescriptionRole:
  14. // Separators have to return "separator" for the
  15. // AccessibleDescriptionRole. This was determined by looking at
  16. // QComboBoxDelegate::isSeparator() (located in qcombobox_p.h.)
  17. if (index.internalId() == SEPARATOR_INDEX) {
  18. return QString("separator");
  19. }
  20. return QString{};
  21. case Qt::DisplayRole: {
  22. if (index.internalId() == CUSTOM_INDEX) {
  23. return QString("<custom>");
  24. }
  25. if (index.internalId() == SEPARATOR_INDEX) {
  26. return QVariant{};
  27. }
  28. auto const& preset =
  29. this->m_presets[static_cast<cm_qsizetype>(index.internalId())];
  30. return preset.displayName.isEmpty() ? preset.name : preset.displayName;
  31. }
  32. case Qt::ToolTipRole:
  33. if (index.internalId() == CUSTOM_INDEX) {
  34. return QString("Specify all settings manually");
  35. }
  36. if (index.internalId() == SEPARATOR_INDEX) {
  37. return QVariant{};
  38. }
  39. return this->m_presets[static_cast<cm_qsizetype>(index.internalId())]
  40. .description;
  41. case Qt::UserRole:
  42. if (index.internalId() == CUSTOM_INDEX) {
  43. return QVariant{};
  44. }
  45. if (index.internalId() == SEPARATOR_INDEX) {
  46. return QVariant{};
  47. }
  48. return QVariant::fromValue(
  49. this->m_presets[static_cast<cm_qsizetype>(index.internalId())]);
  50. case Qt::FontRole:
  51. if (index.internalId() == CUSTOM_INDEX) {
  52. QFont font;
  53. font.setItalic(true);
  54. return font;
  55. }
  56. return QFont{};
  57. default:
  58. return QVariant{};
  59. }
  60. }
  61. Qt::ItemFlags QCMakePresetItemModel::flags(const QModelIndex& index) const
  62. {
  63. Qt::ItemFlags flags =
  64. Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
  65. if (index.internalId() != SEPARATOR_INDEX &&
  66. (index.internalId() == CUSTOM_INDEX ||
  67. this->m_presets[static_cast<cm_qsizetype>(index.internalId())]
  68. .enabled)) {
  69. flags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled;
  70. }
  71. return flags;
  72. }
  73. int QCMakePresetItemModel::rowCount(const QModelIndex& parent) const
  74. {
  75. if (parent.isValid()) {
  76. return 0;
  77. }
  78. if (this->m_presets.empty()) {
  79. return 1;
  80. }
  81. return static_cast<int>(this->m_presets.size() + 2);
  82. }
  83. int QCMakePresetItemModel::columnCount(const QModelIndex& parent) const
  84. {
  85. if (parent.isValid()) {
  86. return 0;
  87. }
  88. return 1;
  89. }
  90. QModelIndex QCMakePresetItemModel::index(int row, int column,
  91. const QModelIndex& parent) const
  92. {
  93. if (parent.isValid() || column != 0 || row < 0 ||
  94. row >= this->rowCount(QModelIndex{})) {
  95. return QModelIndex{};
  96. }
  97. if (this->m_presets.empty() || row == this->m_presets.size() + 1) {
  98. return this->createIndex(row, column, CUSTOM_INDEX);
  99. }
  100. if (row == this->m_presets.size()) {
  101. return this->createIndex(row, column, SEPARATOR_INDEX);
  102. }
  103. return this->createIndex(row, column, static_cast<quintptr>(row));
  104. }
  105. QModelIndex QCMakePresetItemModel::parent(const QModelIndex& /*index*/) const
  106. {
  107. return QModelIndex{};
  108. }
  109. QVector<QCMakePreset> const& QCMakePresetItemModel::presets() const
  110. {
  111. return this->m_presets;
  112. }
  113. void QCMakePresetItemModel::setPresets(QVector<QCMakePreset> const& presets)
  114. {
  115. this->beginResetModel();
  116. this->m_presets = presets;
  117. this->endResetModel();
  118. }
  119. int QCMakePresetItemModel::presetNameToRow(const QString& name) const
  120. {
  121. if (this->m_presets.empty()) {
  122. return 0;
  123. }
  124. int index = 0;
  125. for (auto const& preset : this->m_presets) {
  126. if (preset.name == name) {
  127. return index;
  128. }
  129. index++;
  130. }
  131. return static_cast<int>(this->m_presets.size() + 1);
  132. }