From be376ae7060e547c6dc9092e7e77dde6e9e6570f Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 14 Sep 2017 15:36:18 +0200 Subject: [PATCH] CMake: Enable type forcing for CMake configuation values Allow to force the type for CMake configuration values, now that this type changes how you can edit the values. Change-Id: Id89e0ec8547b778fc0aff9a2e00c0d7406cbcac1 Reviewed-by: hjk --- .../cmakebuildsettingswidget.cpp | 40 +++++++++++++++++-- .../cmakebuildsettingswidget.h | 1 + .../cmakeprojectmanager/configmodel.cpp | 12 +++--- src/plugins/cmakeprojectmanager/configmodel.h | 4 +- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index c0531ebf37..620facdcd4 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(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 a15cfe6e0a..e6e4b1e21c 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 f87ffb967d..ff43d0cc63 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(this) || idx.column() != 1) return false; Utils::TreeItem *item = itemForIndex(idx); auto cmti = dynamic_cast(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(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 adf6edc87e..626d487ac6 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); -- GitLab