diff --git a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/empty/wizard.json b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/empty/wizard.json index 2d566dc1f66..8ca7c0cdcc5 100644 --- a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/empty/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/empty/wizard.json @@ -26,20 +26,28 @@ { "trDisplayName": "Define Project Details", "trShortTitle": "Details", - "typeId": "Fields", - "data" : - [ - { - "name": "PySideVersion", - "trDisplayName": "PySide version:", - "type": "ComboBox", - "data": + "typeId": "PythonConfiguration", + "data": + { + "index": 0, + "items": + [ { - "index": 1, - "items": [ "PySide2", "PySide6" ] + "trKey": "PySide 6", + "value": + { + "PySideVersion": "PySide6" + } + }, + { + "trKey": "PySide 2", + "value": + { + "PySideVersion": "PySide2" + } } - } - ] + ] + } }, { "trDisplayName": "Project Management", diff --git a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/mainwindow/wizard.json b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/mainwindow/wizard.json index 58e9f8cd526..9156caaffd8 100644 --- a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/mainwindow/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/mainwindow/wizard.json @@ -30,16 +30,6 @@ "typeId": "Fields", "data" : [ - { - "name": "PySideVersion", - "trDisplayName": "PySide version:", - "type": "ComboBox", - "data": - { - "index": 1, - "items": [ "PySide2", "PySide6" ] - } - }, { "name": "Class", "trDisplayName": "Class name:", @@ -77,6 +67,32 @@ } ] }, + { + "trDisplayName": "Define Project Details", + "trShortTitle": "Details", + "typeId": "PythonConfiguration", + "data": + { + "index": 0, + "items": + [ + { + "trKey": "PySide 6", + "value": + { + "PySideVersion": "PySide6" + } + }, + { + "trKey": "PySide 2", + "value": + { + "PySideVersion": "PySide2" + } + } + ] + } + }, { "trDisplayName": "Project Management", "trShortTitle": "Summary", diff --git a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/qtquickapplication/wizard.json b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/qtquickapplication/wizard.json index c04407347c8..b1b75fc0885 100644 --- a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/qtquickapplication/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/qtquickapplication/wizard.json @@ -30,67 +30,59 @@ { "trDisplayName": "Define Project Details", "trShortTitle": "Details", - "typeId": "Fields", + "typeId": "PythonConfiguration", "data": - [ - { - "name": "QtVersion", - "trDisplayName": "PySide version:", - "type": "ComboBox", - "data": + { + "index": 0, + "items": + [ { - "index": 0, - "items": - [ - { - "trKey": "PySide 6", - "value": - { - "QtQuickVersion": "", - "QtQuickWindowVersion": "", - "PySideVersion": "PySide6" - } - }, - { - "trKey": "PySide 5.15", - "value": - { - "QtQuickVersion": "2.15", - "QtQuickWindowVersion": "2.15", - "PySideVersion": "PySide2" - } - }, - { - "trKey": "PySide 5.14", - "value": - { - "QtQuickVersion": "2.14", - "QtQuickWindowVersion": "2.14", - "PySideVersion": "PySide2" - } - }, - { - "trKey": "PySide 5.13", - "value": - { - "QtQuickVersion": "2.13", - "QtQuickWindowVersion": "2.13", - "PySideVersion": "PySide2" - } - }, - { - "trKey": "PySide 5.12", - "value": - { - "QtQuickVersion": "2.12", - "QtQuickWindowVersion": "2.12", - "PySideVersion": "PySide2" - } - } - ] + "trKey": "PySide 6", + "value": + { + "QtQuickVersion": "", + "QtQuickWindowVersion": "", + "PySideVersion": "PySide6" + } + }, + { + "trKey": "PySide 5.15", + "value": + { + "QtQuickVersion": "2.15", + "QtQuickWindowVersion": "2.15", + "PySideVersion": "PySide2" + } + }, + { + "trKey": "PySide 5.14", + "value": + { + "QtQuickVersion": "2.14", + "QtQuickWindowVersion": "2.14", + "PySideVersion": "PySide2" + } + }, + { + "trKey": "PySide 5.13", + "value": + { + "QtQuickVersion": "2.13", + "QtQuickWindowVersion": "2.13", + "PySideVersion": "PySide2" + } + }, + { + "trKey": "PySide 5.12", + "value": + { + "QtQuickVersion": "2.12", + "QtQuickWindowVersion": "2.12", + "PySideVersion": "PySide2" + } } - } - ] + ] + } }, { "trDisplayName": "Project Management", diff --git a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/widget/wizard.json b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/widget/wizard.json index 951be734757..8362cd55ecc 100644 --- a/share/qtcreator/templates/wizards/projects/qtforpythonapplication/widget/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtforpythonapplication/widget/wizard.json @@ -30,16 +30,6 @@ "typeId": "Fields", "data" : [ - { - "name": "PySideVersion", - "trDisplayName": "PySide version:", - "type": "ComboBox", - "data": - { - "index": 1, - "items": [ "PySide2", "PySide6" ] - } - }, { "name": "Class", "trDisplayName": "Class name:", @@ -77,6 +67,32 @@ } ] }, + { + "trDisplayName": "Define Python Interpreter", + "trShortTitle": "Interpreter", + "typeId": "PythonConfiguration", + "data": + { + "index": 0, + "items": + [ + { + "trKey": "PySide 6", + "value": + { + "PySideVersion": "PySide6" + } + }, + { + "trKey": "PySide 2", + "value": + { + "PySideVersion": "PySide2" + } + } + ] + } + }, { "trDisplayName": "Project Management", "trShortTitle": "Summary", diff --git a/src/plugins/python/CMakeLists.txt b/src/plugins/python/CMakeLists.txt index a508e14ddc8..c1f4767f83b 100644 --- a/src/plugins/python/CMakeLists.txt +++ b/src/plugins/python/CMakeLists.txt @@ -19,4 +19,5 @@ add_qtc_plugin(Python pythonscanner.cpp pythonscanner.h pythonsettings.cpp pythonsettings.h pythonutils.cpp pythonutils.h + pythonwizardpage.cpp pythonwizardpage.h ) diff --git a/src/plugins/python/python.qbs b/src/plugins/python/python.qbs index 9f8288cb11a..5186dafcdcd 100644 --- a/src/plugins/python/python.qbs +++ b/src/plugins/python/python.qbs @@ -49,6 +49,8 @@ QtcPlugin { "pythontr.h", "pythonutils.cpp", "pythonutils.h", + "pythonwizardpage.cpp", + "pythonwizardpage.h", ] } } diff --git a/src/plugins/python/pythonplugin.cpp b/src/plugins/python/pythonplugin.cpp index dff3c0cb220..4728da37ae5 100644 --- a/src/plugins/python/pythonplugin.cpp +++ b/src/plugins/python/pythonplugin.cpp @@ -6,10 +6,12 @@ #include "pysidebuildconfiguration.h" #include "pythoneditor.h" #include "pythonproject.h" -#include "pythonsettings.h" #include "pythonrunconfiguration.h" +#include "pythonsettings.h" +#include "pythonwizardpage.h" #include +#include #include #include #include @@ -57,6 +59,7 @@ void PythonPlugin::initialize() d = new PythonPluginPrivate; ProjectManager::registerProjectType(PythonMimeType); + JsonWizardFactory::registerPageFactory(new PythonWizardPageFactory); } void PythonPlugin::extensionsInitialized() diff --git a/src/plugins/python/pythonwizardpage.cpp b/src/plugins/python/pythonwizardpage.cpp new file mode 100644 index 00000000000..9243a6375f3 --- /dev/null +++ b/src/plugins/python/pythonwizardpage.cpp @@ -0,0 +1,167 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "pythonwizardpage.h" + +#include "pythonconstants.h" +#include "pythonsettings.h" +#include "pythontr.h" + +#include + +#include +#include +#include +#include + +#include +#include +#include + +using namespace ProjectExplorer; +using namespace Utils; + +namespace Python::Internal { + +PythonWizardPageFactory::PythonWizardPageFactory() +{ + setTypeIdsSuffix("PythonConfiguration"); +} + +WizardPage *PythonWizardPageFactory::create(JsonWizard *wizard, Id typeId, const QVariant &data) +{ + Q_UNUSED(wizard) + + QTC_ASSERT(canCreate(typeId), return nullptr); + + auto page = new PythonWizardPage; + for (const QVariant &item : data.toMap().value("items").toList()) { + const QMap map = item.toMap(); + const QVariant name = map.value("trKey"); + if (name.isValid()) + page->addPySideVersions(name.toString(), map.value("value")); + } + bool validIndex = false; + const int index = data.toMap().value("index").toInt(&validIndex); + if (validIndex) + page->setDefaultPySideVersions(index); + return page; +} + +static bool validItem(const QVariant &item) +{ + QMap map = item.toMap(); + if (!map.value("trKey").canConvert()) + return false; + map = map.value("value").toMap(); + return map.value("PySideVersion").canConvert(); +} + +bool PythonWizardPageFactory::validateData(Id typeId, const QVariant &data, QString *errorMessage) +{ + QTC_ASSERT(canCreate(typeId), return false); + const QList items = data.toMap().value("items").toList(); + + if (items.isEmpty()) { + if (errorMessage) { + *errorMessage = Tr::tr("'data' of a Python wizard page expects a map with 'items' " + "containing a list of objects"); + } + return false; + } + + if (!Utils::allOf(items, &validItem)) { + if (errorMessage) { + *errorMessage = Tr::tr( + "An item of Python wizard page data expects a 'trKey' field containing the ui " + "visible string for that python version and an field 'value' containing an object " + "with a 'PySideVersion' field used for import statements in the python files."); + } + return false; + } + return true; + + + if (!items.isEmpty() && Utils::allOf(items, &validItem)) + return true; + +} + +PythonWizardPage::PythonWizardPage() +{ + m_interpreter.setSettingsDialogId(Constants::C_PYTHONOPTIONS_PAGE_ID); + connect(PythonSettings::instance(), + &PythonSettings::interpretersChanged, + this, + &PythonWizardPage::updateInterpreters); + + m_pySideVersion.setLabelText(Tr::tr("PySide version")); + m_pySideVersion.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); +} + +void PythonWizardPage::initializePage() +{ + using namespace Utils::Layouting; + + auto wiz = qobject_cast(wizard()); + QTC_ASSERT(wiz, return); + + updateInterpreters(); + + connect(wiz, &JsonWizard::filesPolished, this, &PythonWizardPage::setupProject); + + Grid { + m_pySideVersion, br, + m_interpreter, br + }.attachTo(this, WithoutMargins); +} + +bool PythonWizardPage::validatePage() +{ + auto wiz = qobject_cast(wizard()); + const QMap data = m_pySideVersion.itemValue().toMap(); + for (auto it = data.begin(), end = data.end(); it != end; ++it) + wiz->setValue(it.key(), it.value()); + return true; +} + +void PythonWizardPage::addPySideVersions(const QString &name, const QVariant &data) +{ + m_pySideVersion.addOption(SelectionAspect::Option(name, {}, data)); +} + +void PythonWizardPage::setDefaultPySideVersions(int index) +{ + m_pySideVersion.setDefaultValue(index); +} + +void PythonWizardPage::setupProject(const JsonWizard::GeneratorFiles &files) +{ + for (const JsonWizard::GeneratorFile &f : files) { + if (f.file.attributes() & Core::GeneratedFile::OpenProjectAttribute) { + Project *project = ProjectManager::openProject(Utils::mimeTypeForFile(f.file.filePath()), + f.file.filePath().absoluteFilePath()); + if (project) { + project->addTargetForDefaultKit(); + if (Target *target = project->activeTarget()) { + if (RunConfiguration *rc = target->activeRunConfiguration()) { + if (auto interpreters = rc->aspect()) { + interpreters->setCurrentInterpreter(m_interpreter.currentInterpreter()); + project->saveSettings(); + } + } + } + delete project; + } + } + } +} + +void PythonWizardPage::updateInterpreters() +{ + m_interpreter.setDefaultInterpreter(PythonSettings::defaultInterpreter()); + m_interpreter.updateInterpreters(PythonSettings::interpreters()); +} + +} // namespace Python::Internal + diff --git a/src/plugins/python/pythonwizardpage.h b/src/plugins/python/pythonwizardpage.h new file mode 100644 index 00000000000..e35e3ca55cb --- /dev/null +++ b/src/plugins/python/pythonwizardpage.h @@ -0,0 +1,42 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include +#include +#include + +#include +#include + +namespace Python::Internal { + +class PythonWizardPageFactory : public ProjectExplorer::JsonWizardPageFactory +{ +public: + PythonWizardPageFactory(); + + Utils::WizardPage *create(ProjectExplorer::JsonWizard *wizard, + Utils::Id typeId, + const QVariant &data) override; + bool validateData(Utils::Id typeId, const QVariant &data, QString *errorMessage) override; +}; + +class PythonWizardPage : public Utils::WizardPage +{ +public: + PythonWizardPage(); + void initializePage() override; + bool validatePage() override; + + void addPySideVersions(const QString &name, const QVariant &data); + void setDefaultPySideVersions(int index); + +private: + void setupProject(const ProjectExplorer::JsonWizard::GeneratorFiles &files); + void updateInterpreters(); + + ProjectExplorer::InterpreterAspect m_interpreter; + Utils::SelectionAspect m_pySideVersion; +}; + +} // namespace Python::Internal