summaryrefslogtreecommitdiff
path: root/src/plugins/studiowelcome/studiowelcomeplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/studiowelcome/studiowelcomeplugin.cpp')
-rw-r--r--src/plugins/studiowelcome/studiowelcomeplugin.cpp230
1 files changed, 79 insertions, 151 deletions
diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp
index 17acc9b651..ba58c0bd74 100644
--- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp
+++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp
@@ -10,14 +10,18 @@
#include <coreplugin/coreconstants.h>
#include <coreplugin/dialogs/restartdialog.h>
-#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/documentmanager.h>
+#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/icore.h>
#include <coreplugin/imode.h>
#include <coreplugin/modemanager.h>
+#include "projectexplorer/target.h"
+#include <projectexplorer/devicesupport/idevice.h>
#include <projectexplorer/jsonwizard/jsonwizardfactory.h>
+#include <projectexplorer/kitinformation.h>
+#include <projectexplorer/kitmanager.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectmanager.h>
@@ -25,10 +29,16 @@
#include <qmlprojectmanager/projectfilecontenttools.h>
#include <qmlprojectmanager/qmlproject.h>
+#include <qtsupport/baseqtversion.h>
+#include <qtsupport/qtkitinformation.h>
+
#include <qmldesigner/components/componentcore/theme.h>
#include <qmldesigner/dynamiclicensecheck.h>
+#include <qmldesigner/qmldesignerconstants.h>
#include <qmldesigner/qmldesignerplugin.h>
+#include <qmljs/qmljsmodelmanagerinterface.h>
+
#include <utils/checkablemessagebox.h>
#include <utils/hostosinfo.h>
#include <utils/icon.h>
@@ -38,14 +48,11 @@
#include <QAbstractListModel>
#include <QApplication>
-#include <QCheckBox>
#include <QDesktopServices>
#include <QFileInfo>
#include <QFontDatabase>
-#include <QGroupBox>
#include <QMainWindow>
#include <QPointer>
-#include <QPushButton>
#include <QQmlContext>
#include <QQmlEngine>
#include <QQuickItem>
@@ -90,12 +97,35 @@ const char STATISTICS_COLLECTION_MODE[] = "StatisticsCollectionMode";
const char NO_TELEMETRY[] = "NoTelemetry";
const char CRASH_REPORTER_SETTING[] = "CrashReportingEnabled";
-const char EXAMPLES_DOWNLOAD_PATH[] = "StudioWelcome/ExamplesDownloadPath";
-
QPointer<QQuickView> s_viewWindow = nullptr;
QPointer<QQuickWidget> s_viewWidget = nullptr;
static StudioWelcomePlugin *s_pluginInstance = nullptr;
+static Utils::FilePath getMainUiFileWithFallback()
+{
+ auto project = ProjectExplorer::ProjectManager::startupProject();
+ if (!project)
+ return {};
+
+ if (!project->activeTarget())
+ return {};
+
+ auto qmlBuildSystem = qobject_cast<QmlProjectManager::QmlBuildSystem *>(
+ project->activeTarget()->buildSystem());
+
+ auto mainUiFile = qmlBuildSystem->mainUiFilePath();
+ if (mainUiFile.exists())
+ return mainUiFile;
+
+ const Utils::FilePaths uiFiles = project->files([&](const ProjectExplorer::Node *node) {
+ return node->filePath().completeSuffix() == "ui.qml";
+ });
+ if (!uiFiles.isEmpty())
+ return uiFiles.first();
+
+ return {};
+}
+
std::unique_ptr<QSettings> makeUserFeedbackSettings()
{
QStringList domain = QCoreApplication::organizationDomain().split(QLatin1Char('.'));
@@ -223,8 +253,15 @@ public:
m_blockOpenRecent = true;
const FilePath projectFile = FilePath::fromVariant(data(index(row, 0), ProjectModel::FilePathRole));
- if (projectFile.exists())
- ProjectExplorer::ProjectExplorerPlugin::openProjectWelcomePage(projectFile);
+ if (projectFile.exists()) {
+ const ProjectExplorerPlugin::OpenProjectResult result
+ = ProjectExplorer::ProjectExplorerPlugin::openProject(projectFile);
+ if (!result && !result.alreadyOpen().isEmpty()) {
+ const auto mainUiFile = getMainUiFileWithFallback();
+ if (mainUiFile.exists())
+ Core::EditorManager::openEditor(mainUiFile, Utils::Id());
+ };
+ }
resetProjects();
}
@@ -241,6 +278,7 @@ public:
const QString &formFile,
const QString &explicitQmlproject)
{
+ QTC_ASSERT(!exampleName.isEmpty(), return );
QmlDesigner::QmlDesignerPlugin::emitUsageStatistics("exampleOpened:"
+ exampleName);
@@ -525,6 +563,7 @@ void StudioWelcomePlugin::extensionsInitialized()
if (showSplashScreen()) {
connect(Core::ICore::instance(), &Core::ICore::coreOpened, this, [this] {
+ Core::ModeManager::setModeStyle(Core::ModeManager::Style::Hidden);
if (Utils::HostOsInfo::isMacHost()) {
s_viewWindow = new QQuickView(Core::ICore::mainWindow()->windowHandle());
@@ -563,11 +602,13 @@ void StudioWelcomePlugin::extensionsInitialized()
s_viewWindow->show();
s_viewWindow->requestActivate();
+ s_viewWindow->setObjectName(QmlDesigner::Constants::OBJECT_NAME_SPLASH_SCREEN);
} else {
s_viewWidget = new QQuickWidget(Core::ICore::dialogParent());
s_viewWidget->setWindowFlag(Qt::SplashScreen, true);
+ s_viewWidget->setObjectName(QmlDesigner::Constants::OBJECT_NAME_SPLASH_SCREEN);
s_viewWidget->setWindowModality(Qt::ApplicationModal);
s_viewWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
s_viewWidget->engine()->addImportPath("qrc:/studiofonts");
@@ -601,24 +642,36 @@ void StudioWelcomePlugin::extensionsInitialized()
bool StudioWelcomePlugin::delayedInitialize()
{
- return true;
-}
+ QTimer::singleShot(2000, this, []() {
+ auto modelManager = QmlJS::ModelManagerInterface::instance();
+ if (!modelManager)
+ return;
-Utils::FilePath StudioWelcomePlugin::defaultExamplesPath()
-{
- QStandardPaths::StandardLocation location = Utils::HostOsInfo::isMacHost()
- ? QStandardPaths::HomeLocation
- : QStandardPaths::DocumentsLocation;
+ QmlJS::PathsAndLanguages importPaths;
- return Utils::FilePath::fromString(QStandardPaths::writableLocation(location))
- .pathAppended("QtDesignStudio");
-}
+ const QList<Kit *> kits = Utils::filtered(KitManager::kits(), [](const Kit *k) {
+ const QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(k);
+ const bool isQt6 = version && version->qtVersion().majorVersion() == 6;
-QString StudioWelcomePlugin::examplesPathSetting()
-{
- return Core::ICore::settings()
- ->value(EXAMPLES_DOWNLOAD_PATH, defaultExamplesPath().toString())
- .toString();
+ return isQt6
+ && ProjectExplorer::DeviceTypeKitAspect::deviceTypeId(k)
+ == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE;
+ });
+
+ for (const Kit *kit : kits) {
+ const QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(kit);
+
+ const Utils::FilePath qmlPath = version->qmlPath();
+ importPaths.maybeInsert(qmlPath, QmlJS::Dialect::QmlQtQuick2);
+
+ QmlJS::ModelManagerInterface::importScan(QmlJS::ModelManagerInterface::workingCopy(),
+ importPaths,
+ modelManager,
+ false);
+ }
+ });
+
+ return true;
}
WelcomeMode::WelcomeMode()
@@ -706,36 +759,6 @@ WelcomeMode::WelcomeMode()
[](const QString &path) { return QFileInfo::exists(path); }));
}
-static bool hideBuildMenuSetting()
-{
- return Core::ICore::settings()
- ->value(ProjectExplorer::Constants::SETTINGS_MENU_HIDE_BUILD, false)
- .toBool();
-}
-
-static bool hideDebugMenuSetting()
-{
- return Core::ICore::settings()
- ->value(ProjectExplorer::Constants::SETTINGS_MENU_HIDE_DEBUG, false)
- .toBool();
-}
-
-static bool hideAnalyzeMenuSetting()
-{
- return Core::ICore::settings()
- ->value(ProjectExplorer::Constants::SETTINGS_MENU_HIDE_ANALYZE, false)
- .toBool();
-}
-
-void setSettingIfDifferent(const QString &key, bool value, bool &dirty)
-{
- QSettings *s = Core::ICore::settings();
- if (s->value(key, false).toBool() != value) {
- dirty = true;
- s->setValue(key, value);
- }
-}
-
WelcomeMode::~WelcomeMode()
{
delete m_modeWidget;
@@ -751,10 +774,12 @@ void WelcomeMode::setupQuickWidget(const QString &welcomePagePath)
m_quickWidget->setSource(
QUrl::fromLocalFile(QLatin1String(STUDIO_QML_PATH) + "welcomepage/main.qml"));
#else
+ m_quickWidget->rootContext()->setContextProperty("$dataModel", m_dataModelDownloader);
m_quickWidget->engine()->addImportPath("qrc:/qml/welcomepage/imports");
m_quickWidget->setSource(QUrl("qrc:/qml/welcomepage/main.qml"));
#endif
} else {
+ m_quickWidget->rootContext()->setContextProperty("$dataModel", m_dataModelDownloader);
m_quickWidget->engine()->addImportPath(Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources/imports").toString());
@@ -778,6 +803,7 @@ void WelcomeMode::createQuickWidget()
m_quickWidget = new QQuickWidget;
m_quickWidget->setMinimumSize(640, 480);
m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
+ m_quickWidget->setObjectName(QmlDesigner::Constants::OBJECT_NAME_WELCOME_PAGE);
QmlDesigner::Theme::setupTheme(m_quickWidget->engine());
m_quickWidget->engine()->addImportPath("qrc:/studiofonts");
@@ -786,104 +812,6 @@ void WelcomeMode::createQuickWidget()
m_quickWidget->engine()->setOutputWarningsToStandardError(false);
}
-StudioSettingsPage::StudioSettingsPage()
- : m_buildCheckBox(new QCheckBox(tr("Build")))
- , m_debugCheckBox(new QCheckBox(tr("Debug")))
- , m_analyzeCheckBox(new QCheckBox(tr("Analyze")))
- , m_pathChooser(new Utils::PathChooser())
-{
- const QString toolTip = tr(
- "Hide top-level menus with advanced functionality to simplify the UI. <b>Build</b> is "
- "generally not required in the context of Qt Design Studio. <b>Debug</b> and <b>Analyze</b> "
- "are only required for debugging and profiling.");
-
- QVBoxLayout *boxLayout = new QVBoxLayout();
- setLayout(boxLayout);
- auto groupBox = new QGroupBox(tr("Hide Menu"));
- groupBox->setToolTip(toolTip);
- boxLayout->addWidget(groupBox);
-
- auto verticalLayout = new QVBoxLayout();
- groupBox->setLayout(verticalLayout);
-
- m_buildCheckBox->setToolTip(toolTip);
- m_debugCheckBox->setToolTip(toolTip);
- m_analyzeCheckBox->setToolTip(toolTip);
-
- verticalLayout->addWidget(m_buildCheckBox);
- verticalLayout->addWidget(m_debugCheckBox);
- verticalLayout->addWidget(m_analyzeCheckBox);
- verticalLayout->addSpacerItem(
- new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum));
-
- m_buildCheckBox->setChecked(hideBuildMenuSetting());
- m_debugCheckBox->setChecked(hideDebugMenuSetting());
- m_analyzeCheckBox->setChecked(hideAnalyzeMenuSetting());
-
- auto examplesGroupBox = new QGroupBox(tr("Examples"));
- boxLayout->addWidget(examplesGroupBox);
-
- auto horizontalLayout = new QHBoxLayout();
- examplesGroupBox->setLayout(horizontalLayout);
-
- auto label = new QLabel(tr("Examples path:"));
- m_pathChooser->setFilePath(
- Utils::FilePath::fromString(StudioWelcomePlugin::examplesPathSetting()));
- auto resetButton = new QPushButton(tr("Reset Path"));
-
- connect(resetButton, &QPushButton::clicked, this, [this]() {
- m_pathChooser->setFilePath(StudioWelcomePlugin::defaultExamplesPath());
- });
-
- horizontalLayout->addWidget(label);
- horizontalLayout->addWidget(m_pathChooser);
- horizontalLayout->addWidget(resetButton);
-
-
- boxLayout->addSpacerItem(
- new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Expanding));
-}
-
-void StudioSettingsPage::apply()
-{
- bool dirty = false;
-
- setSettingIfDifferent(ProjectExplorer::Constants::SETTINGS_MENU_HIDE_BUILD,
- m_buildCheckBox->isChecked(),
- dirty);
-
- setSettingIfDifferent(ProjectExplorer::Constants::SETTINGS_MENU_HIDE_DEBUG,
- m_debugCheckBox->isChecked(),
- dirty);
-
- setSettingIfDifferent(ProjectExplorer::Constants::SETTINGS_MENU_HIDE_ANALYZE,
- m_analyzeCheckBox->isChecked(),
- dirty);
-
-
- if (dirty) {
- const QString restartText = tr("The menu visibility change will take effect after restart.");
- Core::RestartDialog restartDialog(Core::ICore::dialogParent(), restartText);
- restartDialog.exec();
- }
-
- QSettings *s = Core::ICore::settings();
- const QString value = m_pathChooser->filePath().toString();
-
- if (s->value(EXAMPLES_DOWNLOAD_PATH, false).toString() != value) {
- s->setValue(EXAMPLES_DOWNLOAD_PATH, value);
- emit s_pluginInstance->examplesDownloadPathChanged(value);
- }
-}
-
-StudioWelcomeSettingsPage::StudioWelcomeSettingsPage()
-{
- setId("Z.StudioWelcome.Settings");
- setDisplayName(tr("Qt Design Studio Configuration"));
- setCategory(Core::Constants::SETTINGS_CATEGORY_CORE);
- setWidgetCreator([] { return new StudioSettingsPage; });
-}
-
} // namespace Internal
} // namespace StudioWelcome