diff options
| author | Christian Kandeler <christian.kandeler@qt.io> | 2024-10-02 16:57:44 +0200 |
|---|---|---|
| committer | Christian Kandeler <christian.kandeler@qt.io> | 2024-10-09 09:15:04 +0000 |
| commit | 79774519ccaa19fbee58c8a191281f286eb83be2 (patch) | |
| tree | 35a8ce94247c7cbe126148e0cff981c3841fe791 /src/plugins/python/pythonsettings.cpp | |
| parent | 5a09ce5d53357f312df741beb731cd2d2a04dc5b (diff) | |
Python: Use model in aspect combo box
For icons and tooltips consistent with the settings page.
Task-number: QTCREATORBUG-31574
Change-Id: Ib567f43e0b29fa058770eefb4b16e8610fd28adf
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/python/pythonsettings.cpp')
| -rw-r--r-- | src/plugins/python/pythonsettings.cpp | 126 |
1 files changed, 71 insertions, 55 deletions
diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index 6c8fff0e615..ab8650be0b3 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -144,7 +144,7 @@ public: private: QTreeView *m_view = nullptr; - ListModel<Interpreter> m_model; + ListModel<Interpreter> * const m_model; InterpreterDetailsWidget *m_detailsWidget = nullptr; QPushButton *m_deleteButton = nullptr; QPushButton *m_makeDefaultButton = nullptr; @@ -164,42 +164,10 @@ private: }; InterpreterOptionsWidget::InterpreterOptionsWidget() - : m_detailsWidget(new InterpreterDetailsWidget(this)) + : m_model(createInterpreterModel(this)) + , m_detailsWidget(new InterpreterDetailsWidget(this)) , m_defaultId(PythonSettings::defaultInterpreter().id) { - m_model.setDataAccessor([this](const Interpreter &interpreter, int column, int role) -> QVariant { - switch (role) { - case Qt::DisplayRole: - return interpreter.name; - case Qt::FontRole: { - QFont f = font(); - f.setBold(interpreter.id == m_defaultId); - return f; - } - case Qt::ToolTipRole: - if (interpreter.command.needsDevice()) - break; - if (interpreter.command.isEmpty()) - return Tr::tr("Executable is empty."); - if (!interpreter.command.exists()) - return Tr::tr("\"%1\" does not exist.").arg(interpreter.command.toUserOutput()); - if (!interpreter.command.isExecutableFile()) - return Tr::tr("\"%1\" is not an executable file.") - .arg(interpreter.command.toUserOutput()); - break; - case Qt::DecorationRole: - if (interpreter.command.needsDevice()) - break; - if (column == 0 && !interpreter.command.isExecutableFile()) - return Utils::Icons::CRITICAL.icon(); - break; - default: - break; - } - return {}; - }); - m_model.setAllData(PythonSettings::interpreters()); - auto addButton = new QPushButton(Tr::tr("&Add"), this); m_deleteButton = new QPushButton(Tr::tr("&Delete"), this); @@ -232,7 +200,7 @@ InterpreterOptionsWidget::InterpreterOptionsWidget() m_detailsWidget->hide(); - m_view->setModel(&m_model); + m_view->setModel(m_model); m_view->setHeaderHidden(true); m_view->setSelectionMode(QAbstractItemView::SingleSelection); m_view->setSelectionBehavior(QAbstractItemView::SelectItems); @@ -256,35 +224,35 @@ void InterpreterOptionsWidget::apply() void InterpreterOptionsWidget::addInterpreter(const Interpreter &interpreter) { - m_model.appendItem(interpreter); + m_model->appendItem(interpreter); } void InterpreterOptionsWidget::removeInterpreterFrom(const QString &detectionSource) { - m_model.destroyItems(Utils::equal(&Interpreter::detectionSource, detectionSource)); + m_model->destroyItems(Utils::equal(&Interpreter::detectionSource, detectionSource)); } QList<Interpreter> InterpreterOptionsWidget::interpreters() const { QList<Interpreter> interpreters; - for (const TreeItem *treeItem : m_model) + for (const TreeItem *treeItem : *m_model) interpreters << static_cast<const ListItem<Interpreter> *>(treeItem)->itemData; return interpreters; } QList<Interpreter> InterpreterOptionsWidget::interpreterFrom(const QString &detectionSource) const { - return m_model.allData(Utils::equal(&Interpreter::detectionSource, detectionSource)); + return m_model->allData(Utils::equal(&Interpreter::detectionSource, detectionSource)); } void InterpreterOptionsWidget::currentChanged(const QModelIndex &index, const QModelIndex &previous) { if (previous.isValid()) { - m_model.itemAt(previous.row())->itemData = m_detailsWidget->toInterpreter(); - emit m_model.dataChanged(previous, previous); + m_model->itemAt(previous.row())->itemData = m_detailsWidget->toInterpreter(); + emit m_model->dataChanged(previous, previous); } if (index.isValid()) { - const Interpreter interpreter = m_model.itemAt(index.row())->itemData; + const Interpreter interpreter = m_model->itemAt(index.row())->itemData; m_detailsWidget->updateInterpreter(interpreter); m_detailsWidget->show(); updateGenerateKitButton(interpreter); @@ -301,8 +269,8 @@ void InterpreterOptionsWidget::detailsChanged() const QModelIndex &index = m_view->currentIndex(); if (index.isValid()) { const Interpreter interpreter = m_detailsWidget->toInterpreter(); - m_model.itemAt(index.row())->itemData = interpreter; - emit m_model.dataChanged(index, index); + m_model->itemAt(index.row())->itemData = interpreter; + emit m_model->dataChanged(index, index); updateGenerateKitButton(interpreter); } updateCleanButton(); @@ -310,7 +278,7 @@ void InterpreterOptionsWidget::detailsChanged() void InterpreterOptionsWidget::updateCleanButton() { - m_cleanButton->setEnabled(Utils::anyOf(m_model.allData(), [](const Interpreter &interpreter) { + m_cleanButton->setEnabled(Utils::anyOf(m_model->allData(), [](const Interpreter &interpreter) { return !interpreter.command.isExecutableFile(); })); } @@ -324,8 +292,8 @@ void InterpreterOptionsWidget::updateGenerateKitButton(const Interpreter &interp void InterpreterOptionsWidget::addItem() { - const QModelIndex &index = m_model.indexForItem( - m_model.appendItem({QUuid::createUuid().toString(), QString("Python"), FilePath(), false})); + const QModelIndex &index = m_model->indexForItem(m_model->appendItem( + {QUuid::createUuid().toString(), QString("Python"), FilePath(), false})); QTC_ASSERT(index.isValid(), return); m_view->setCurrentIndex(index); updateCleanButton(); @@ -335,7 +303,7 @@ void InterpreterOptionsWidget::deleteItem() { const QModelIndex &index = m_view->currentIndex(); if (index.isValid()) - m_model.destroyItem(m_model.itemAt(index.row())); + m_model->destroyItem(m_model->itemAt(index.row())); updateCleanButton(); } @@ -564,13 +532,13 @@ void InterpreterOptionsWidget::makeDefault() { const QModelIndex &index = m_view->currentIndex(); if (index.isValid()) { - QModelIndex defaultIndex = m_model.findIndex([this](const Interpreter &interpreter) { + QModelIndex defaultIndex = m_model->findIndex([this](const Interpreter &interpreter) { return interpreter.id == m_defaultId; }); - m_defaultId = m_model.itemAt(index.row())->itemData.id; - emit m_model.dataChanged(index, index, {Qt::FontRole}); + m_defaultId = m_model->itemAt(index.row())->itemData.id; + emit m_model->dataChanged(index, index, {Qt::FontRole}); if (defaultIndex.isValid()) - emit m_model.dataChanged(defaultIndex, defaultIndex, {Qt::FontRole}); + emit m_model->dataChanged(defaultIndex, defaultIndex, {Qt::FontRole}); } } @@ -578,13 +546,13 @@ void InterpreterOptionsWidget::generateKit() { const QModelIndex &index = m_view->currentIndex(); if (index.isValid()) - PythonSettings::addKitsForInterpreter(m_model.itemAt(index.row())->itemData, true); + PythonSettings::addKitsForInterpreter(m_model->itemAt(index.row())->itemData, true); m_generateKitButton->setEnabled(false); } void InterpreterOptionsWidget::cleanUp() { - m_model.destroyItems( + m_model->destroyItems( [](const Interpreter &interpreter) { return !interpreter.command.isExecutableFile(); }); updateCleanButton(); } @@ -846,6 +814,11 @@ void PythonSettings::removeKitsForInterpreter(const Interpreter &interpreter) KitManager::deregisterKit(k); } +bool PythonSettings::interpreterIsValid(const Interpreter &interpreter) +{ + return !interpreter.command.needsDevice() || interpreter.command.isExecutableFile(); +} + void PythonSettings::setInterpreter(const QList<Interpreter> &interpreters, const QString &defaultId) { if (defaultId == settingsInstance->m_defaultInterpreterId @@ -1203,6 +1176,49 @@ void setupPythonSettings(QObject *guard) settingsInstance->setParent(guard); } +Utils::ListModel<ProjectExplorer::Interpreter> *createInterpreterModel(QObject *parent) +{ + const auto model = new ListModel<Interpreter>(parent); + model->setDataAccessor([](const Interpreter &interpreter, int column, int role) -> QVariant { + if (interpreter.id == "none") { + if (role == Qt::DisplayRole) + return Tr::tr("none"); + return {}; + } + switch (role) { + case Qt::DisplayRole: + return interpreter.name; + case Qt::FontRole: { + QFont f; + f.setBold(interpreter.id == PythonSettings::defaultInterpreter().id); + return f; + } + case Qt::ToolTipRole: + if (interpreter.command.needsDevice()) + break; + if (interpreter.command.isEmpty()) + return Tr::tr("Executable is empty."); + if (!interpreter.command.exists()) + return Tr::tr("\"%1\" does not exist.").arg(interpreter.command.toUserOutput()); + if (!interpreter.command.isExecutableFile()) + return Tr::tr("\"%1\" is not an executable file.") + .arg(interpreter.command.toUserOutput()); + break; + case Qt::DecorationRole: + if (column == 0 && !PythonSettings::interpreterIsValid(interpreter)) + return Utils::Icons::CRITICAL.icon(); + break; + case Qt::UserRole: + return interpreter.id; + default: + break; + } + return {}; + }); + model->setAllData(PythonSettings::interpreters()); + return model; +} + } // Python::Internal #include "pythonsettings.moc" |
