QCMakePresetItemModel.cxx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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(QModelIndex const& 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(QModelIndex const& 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(QModelIndex const& parent) const
  74. {
  75. if (parent.isValid()) {
  76. return 0;
  77. }
  78. if (this->m_presets.empty()) {
  79. return 1;
  80. }
  81. // NOLINTNEXTLINE(readability-redundant-casting)
  82. return static_cast<int>(this->m_presets.size() + 2);
  83. }
  84. int QCMakePresetItemModel::columnCount(QModelIndex const& parent) const
  85. {
  86. if (parent.isValid()) {
  87. return 0;
  88. }
  89. return 1;
  90. }
  91. QModelIndex QCMakePresetItemModel::index(int row, int column,
  92. QModelIndex const& parent) const
  93. {
  94. if (parent.isValid() || column != 0 || row < 0 ||
  95. row >= this->rowCount(QModelIndex{})) {
  96. return QModelIndex{};
  97. }
  98. if (this->m_presets.empty() || row == this->m_presets.size() + 1) {
  99. return this->createIndex(row, column, CUSTOM_INDEX);
  100. }
  101. if (row == this->m_presets.size()) {
  102. return this->createIndex(row, column, SEPARATOR_INDEX);
  103. }
  104. return this->createIndex(row, column, static_cast<quintptr>(row));
  105. }
  106. QModelIndex QCMakePresetItemModel::parent(QModelIndex const& /*index*/) const
  107. {
  108. return QModelIndex{};
  109. }
  110. QVector<QCMakePreset> const& QCMakePresetItemModel::presets() const
  111. {
  112. return this->m_presets;
  113. }
  114. void QCMakePresetItemModel::setPresets(QVector<QCMakePreset> const& presets)
  115. {
  116. this->beginResetModel();
  117. this->m_presets = presets;
  118. this->endResetModel();
  119. }
  120. int QCMakePresetItemModel::presetNameToRow(QString const& name) const
  121. {
  122. if (this->m_presets.empty()) {
  123. return 0;
  124. }
  125. int index = 0;
  126. for (auto const& preset : this->m_presets) {
  127. if (preset.name == name) {
  128. return index;
  129. }
  130. index++;
  131. }
  132. // NOLINTNEXTLINE(readability-redundant-casting)
  133. return static_cast<int>(this->m_presets.size() + 1);
  134. }