summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2023-03-07 13:00:44 +0100
committerDavid Schulz <david.schulz@qt.io>2023-03-14 05:44:46 +0000
commit1811c3149057df42e70e71bf8ad4fdeab75fdd66 (patch)
treede1a1a35193701fbb3f2277f2972944fefa6be49 /src/plugins
parent169b4110400e3b20fb2e87a5795d5b3964ff3887 (diff)
downloadqt-creator-1811c3149057df42e70e71bf8ad4fdeab75fdd66.tar.gz
Python: add interpreter selector to the python project wizard
Change-Id: I7ea1df34fa0096a84a0d611b401f991508c826c1 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/python/CMakeLists.txt1
-rw-r--r--src/plugins/python/python.qbs2
-rw-r--r--src/plugins/python/pythonplugin.cpp5
-rw-r--r--src/plugins/python/pythonwizardpage.cpp167
-rw-r--r--src/plugins/python/pythonwizardpage.h42
5 files changed, 216 insertions, 1 deletions
diff --git a/src/plugins/python/CMakeLists.txt b/src/plugins/python/CMakeLists.txt
index a508e14ddc..c1f4767f83 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 9f8288cb11..5186dafcdc 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 dff3c0cb22..4728da37ae 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 <projectexplorer/buildtargetinfo.h>
+#include <projectexplorer/jsonwizard/jsonwizardfactory.h>
#include <projectexplorer/localenvironmentaspect.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectmanager.h>
@@ -57,6 +59,7 @@ void PythonPlugin::initialize()
d = new PythonPluginPrivate;
ProjectManager::registerProjectType<PythonProject>(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 0000000000..9243a6375f
--- /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 <coreplugin/generatedfile.h>
+
+#include <utils/algorithm.h>
+#include <utils/layoutbuilder.h>
+#include <utils/mimeutils.h>
+#include <utils/qtcassert.h>
+
+#include <projectexplorer/project.h>
+#include <projectexplorer/projectmanager.h>
+#include <projectexplorer/target.h>
+
+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<QString, QVariant> 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<QString, QVariant> map = item.toMap();
+ if (!map.value("trKey").canConvert<QString>())
+ return false;
+ map = map.value("value").toMap();
+ return map.value("PySideVersion").canConvert<QString>();
+}
+
+bool PythonWizardPageFactory::validateData(Id typeId, const QVariant &data, QString *errorMessage)
+{
+ QTC_ASSERT(canCreate(typeId), return false);
+ const QList<QVariant> 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<JsonWizard *>(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<JsonWizard *>(wizard());
+ const QMap<QString, QVariant> 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<InterpreterAspect>()) {
+ 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 0000000000..e35e3ca55c
--- /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 <projectexplorer/jsonwizard/jsonwizard.h>
+#include <projectexplorer/jsonwizard/jsonwizardpagefactory.h>
+#include <projectexplorer/runconfigurationaspects.h>
+
+#include <utils/aspects.h>
+#include <utils/wizardpage.h>
+
+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