diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index c0531ebf3797437de085759d17e4d4f8d2b4976f..620facdcd4d017d6faa5f9374f099e3755a734a5 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -378,6 +378,33 @@ void CMakeBuildSettingsWidget::updateSelection(const QModelIndex ¤t, const m_editButton->setEnabled(currentModelIndex.flags().testFlag(Qt::ItemIsEditable)); } +QAction *CMakeBuildSettingsWidget::createForceAction(int type, const QModelIndex &idx) +{ + ConfigModel::DataItem::Type t = static_cast<ConfigModel::DataItem::Type>(type); + QString typeString; + switch (type) { + case ConfigModel::DataItem::BOOLEAN: + typeString = tr("bool", "display string for cmake type BOOLEAN"); + break; + case ConfigModel::DataItem::FILE: + typeString = tr("file", "display string for cmake type FILE"); + break; + case ConfigModel::DataItem::DIRECTORY: + typeString = tr("directory", "display string for cmake type DIRECTORY"); + break; + case ConfigModel::DataItem::STRING: + typeString = tr("string", "display string for cmake type STRING"); + break; + case ConfigModel::DataItem::UNKNOWN: + return nullptr; + } + QAction *forceAction = new QAction(tr("Force to %1").arg(typeString)); + forceAction->setEnabled(m_configModel->canForceTo(idx, t)); + connect(forceAction, &QAction::triggered, + this, [this, idx, t]() { m_configModel->forceTo(idx, t); }); + return forceAction; +} + bool CMakeBuildSettingsWidget::eventFilter(QObject *target, QEvent *event) { // handle context menu events: @@ -392,10 +419,15 @@ bool CMakeBuildSettingsWidget::eventFilter(QObject *target, QEvent *event) QMenu *menu = new QMenu(this); connect(menu, &QMenu::triggered, menu, &QMenu::deleteLater); - QAction *forceToStringAction = new QAction(tr("Force to String"), nullptr); - forceToStringAction->setEnabled(m_configModel->canForceToString(idx)); - menu->addAction(forceToStringAction); - connect(forceToStringAction, &QAction::triggered, this, [this, idx]() { m_configModel->forceToString(idx); }); + QAction *action = nullptr; + if ((action = createForceAction(ConfigModel::DataItem::BOOLEAN, idx))) + menu->addAction(action); + if ((action = createForceAction(ConfigModel::DataItem::FILE, idx))) + menu->addAction(action); + if ((action = createForceAction(ConfigModel::DataItem::DIRECTORY, idx))) + menu->addAction(action); + if ((action = createForceAction(ConfigModel::DataItem::STRING, idx))) + menu->addAction(action); menu->move(e->globalPos()); menu->show(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h index a15cfe6e0aa6d18c56e514904ee3e2f6e2dacd44..e6e4b1e21c296b47e848ef927549a8eb49a06eca 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h @@ -65,6 +65,7 @@ private: void updateFromKit(); void updateSelection(const QModelIndex ¤t, const QModelIndex &previous); + QAction *createForceAction(int type, const QModelIndex &idx); bool eventFilter(QObject *target, QEvent *event); diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index f87ffb967dae54ee4fc02c521d17e4bdeddfe775..ff43d0cc63eb3dd1cd7856dbc6735e6c040bddef 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -135,23 +135,23 @@ bool ConfigModel::hasCMakeChanges() const return Utils::contains(m_configuration, [](const InternalDataItem &i) { return i.isCMakeChanged; }); } -bool ConfigModel::canForceToString(const QModelIndex &idx) const +bool ConfigModel::canForceTo(const QModelIndex &idx, const ConfigModel::DataItem::Type type) const { if (idx.model() != const_cast<ConfigModel *>(this) || idx.column() != 1) return false; Utils::TreeItem *item = itemForIndex(idx); auto cmti = dynamic_cast<Internal::ConfigModelTreeItem *>(item); - return cmti && (cmti->dataItem->type != DataItem::STRING); + return cmti && (cmti->dataItem->type != type); } -void ConfigModel::forceToString(const QModelIndex &idx) +void ConfigModel::forceTo(const QModelIndex &idx, const ConfigModel::DataItem::Type type) { - QTC_ASSERT(canForceToString(idx), return); + QTC_ASSERT(canForceTo(idx, type), return); Utils::TreeItem *item = itemForIndex(idx); auto cmti = dynamic_cast<Internal::ConfigModelTreeItem *>(item); - cmti->dataItem->type = DataItem::STRING; - const QModelIndex valueIdx = idx.sibling(1, idx.column()); + cmti->dataItem->type = type; + const QModelIndex valueIdx = idx.sibling(idx.row(), 1); emit dataChanged(valueIdx, valueIdx); } diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index adf6edc87e33fc0138c4593639a3f63f2255fafb..626d487ac63342fbff685c13146eeb221831a1c2 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -73,8 +73,8 @@ public: bool hasChanges() const; bool hasCMakeChanges() const; - bool canForceToString(const QModelIndex &idx) const; - void forceToString(const QModelIndex &idx); + bool canForceTo(const QModelIndex &idx, const DataItem::Type type) const; + void forceTo(const QModelIndex &idx, const DataItem::Type type); static DataItem dataItemFromIndex(const QModelIndex &idx);