From f9c21253c0cecf788c45f39f5adcff6fc5ce17ec Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 13 Jan 2022 17:21:48 +0100 Subject: [PATCH 01/10] QmlDesigner: Use wildcard for all files and split image formats Having a large filter makes the dialog unresponsive, so all files filter is changed to *.* and image formats are split according to mime type. For unsuported suffixes we show an error message. Task-number: QDS-5921 Change-Id: Ia2dc912c7e7004da97da48753562173ed163436f Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../componentcore/designeractionmanager.cpp | 23 ++++++++++++++----- .../itemlibrary/itemlibrarywidget.cpp | 12 +++++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 08a6a048e89..f601ae39865 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1550,16 +1550,27 @@ void DesignerActionManager::createDefaultAddResourceHandler() registerAddResourceHandler(AddResourceHandler(category, ext, op)); }; + // Having a single image type category creates too large of a filter, so we split images into + // categories according to their mime types + const QList mimeTypes = QImageReader::supportedMimeTypes(); auto transformer = [](const QByteArray& format) -> QString { return QString("*.") + format; }; - auto imageFormats = Utils::transform(QImageReader::supportedImageFormats(), transformer); - imageFormats.push_back("*.hdr"); - imageFormats.push_back("*.ktx"); + QHash imageFormats; + for (const auto &mimeType : mimeTypes) + imageFormats.insert(mimeType, Utils::transform(QImageReader::imageFormatsForMimeType(mimeType), transformer)); + imageFormats.insert("image/vnd.radiance", {"*.hdr"}); + imageFormats.insert("image/ktx", {"*.ktx"}); // The filters will be displayed in reverse order to these lists in file dialog, // so declare most common types last - registerHandlers(imageFormats, - ModelNodeOperations::addImageToProject, - ComponentCoreConstants::addImagesDisplayString); + QHash::const_iterator i = imageFormats.constBegin(); + while (i != imageFormats.constEnd()) { + registerHandlers(i.value(), + ModelNodeOperations::addImageToProject, + QObject::tr("%1: %2") + .arg(ComponentCoreConstants::addImagesDisplayString) + .arg(QString::fromLatin1(i.key()))); + ++i; + } registerHandlers({"*.otf", "*.ttf"}, ModelNodeOperations::addFontToProject, ComponentCoreConstants::addFontsDisplayString); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 955f04a7ac3..75818fb42a4 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -619,7 +619,7 @@ void ItemLibraryWidget::addResources(const QStringList &files) return priorities.value(first) < priorities.value(second); }); - QStringList filters { tr("All Files (%1)").arg(map.values().join(' ')) }; + QStringList filters { tr("All Files (%1)").arg("*.*") }; QString filterTemplate = "%1 (%2)"; for (const QString &key : qAsConst(sortedKeys)) filters.append(filterTemplate.arg(key, map.values(key).join(' '))); @@ -660,11 +660,17 @@ void ItemLibraryWidget::addResources(const QStringList &files) AddResourceOperation operation = categoryToOperation.value(category); QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_RESOURCE_IMPORTED + category); if (operation) { - AddFilesResult result = operation(fileNames, document->fileName().parentDir().toString()); + AddFilesResult result = operation(fileNames, + document->fileName().parentDir().toString()); if (result == AddFilesResult::Failed) { Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"), - tr("Could not add %1 to project.").arg(fileNames.join(' '))); + tr("Could not add %1 to project.") + .arg(fileNames.join(' '))); } + } else { + Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"), + tr("Could not add %1 to project. Unsupported file format.") + .arg(fileNames.join(' '))); } } } From e1f45507c5f689a346ec67ebb4ec45f6fc886fbe Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 17 Jan 2022 10:36:59 +0100 Subject: [PATCH 02/10] LanguageClient: fix possible crash on shutdown Iterate on a copy of managerInstance->m_clients when calling shutdownClient() or deleteClient(), since both methods may potentially modify m_clients list and thus invalidate outer iterators. Surprisingly, this patch also fixes the leak of RunControl and RunWorker instances on shutdown. Task-number: QTCREATORBUG-25709 Fixes: QTCREATORBUG-26847 Change-Id: Ib34d913a6ae0b235631d3d619bddaf4e08b4aec2 Reviewed-by: David Schulz --- src/plugins/languageclient/languageclientmanager.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 0e5a80013b8..643e4f5cfc7 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -253,10 +253,12 @@ void LanguageClientManager::shutdown() return; qCDebug(Log) << "shutdown manager"; managerInstance->m_shuttingDown = true; - for (Client *client : qAsConst(managerInstance->m_clients)) + const auto clients = managerInstance->clients(); + for (Client *client : clients) shutdownClient(client); - QTimer::singleShot(3000, managerInstance, [](){ - for (Client *client : qAsConst(managerInstance->m_clients)) + QTimer::singleShot(3000, managerInstance, [] { + const auto clients = managerInstance->clients(); + for (Client *client : clients) deleteClient(client); emit managerInstance->shutdownFinished(); }); From fa53849b4a0959ab7bf7295b79fab251b90aec3f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 17 Jan 2022 07:02:40 +0100 Subject: [PATCH 03/10] Editor: prevent using function hint widget while it is deleted Task-number: QTCREATORBUG-26872 Change-Id: I634b488073670476ee3d5b53296e77b6779e5715 Reviewed-by: Reviewed-by: Allan Sandfeld Jensen --- .../texteditor/codeassist/functionhintproposalwidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp index 91a00386e14..926ebfde39b 100644 --- a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp @@ -154,7 +154,10 @@ FunctionHintProposalWidget::FunctionHintProposalWidget() connect(upArrow, &QAbstractButton::clicked, this, &FunctionHintProposalWidget::previousPage); connect(downArrow, &QAbstractButton::clicked, this, &FunctionHintProposalWidget::nextPage); - connect(d->m_popupFrame.data(), &QObject::destroyed, this, &FunctionHintProposalWidget::abort); + connect(d->m_popupFrame.data(), &QObject::destroyed, this, [this](){ + qApp->removeEventFilter(this); + deleteLater(); + }); setFocusPolicy(Qt::NoFocus); } From 9be03a826d5d7b45e3ce2f20a7641ec29dee07b6 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 17 Jan 2022 12:30:32 +0100 Subject: [PATCH 04/10] PE: Fix compile Amends c1c147a9dc9. Change-Id: I2f4e6e724f3226541c5de683d0ac6403538622be Reviewed-by: David Schulz --- src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 946d2d92ab1..844321f354d 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -311,7 +311,7 @@ std::pair JsonWizardFactory::screenSizeInfoFromPage(const QStr return {}; const QVariantMap screenFactorDataMap = screenFactorData.toMap(); - if (not screenFactorDataMap.contains("items")) + if (!screenFactorDataMap.contains("items")) return {}; bool ok = false; From 22f4e9497d63c68286f3b6fe5055da56c2d7e055 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 17 Jan 2022 13:17:42 +0100 Subject: [PATCH 05/10] CMake: Fix build dir scan filter Fixes: QTCREATORBUG-26846 Change-Id: I54f0249410cf0dd5cc6703767cea187a2d843868 Reviewed-by: hjk --- src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 601ed3a1e70..bb00d0b05d2 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -79,7 +79,7 @@ static QStringList scanDirectory(const FilePath &path, const QString &prefix) QStringList result; qCDebug(cmInputLog) << "Scanning for directories matching" << prefix << "in" << path; - foreach (const FilePath &entry, path.dirEntries({prefix + ".*"}, QDir::Dirs | QDir::NoDotAndDotDot)) { + foreach (const FilePath &entry, path.dirEntries({prefix + "*"}, QDir::Dirs | QDir::NoDotAndDotDot)) { QTC_ASSERT(entry.isDir(), continue); result.append(entry.toString()); } From e4bf7ce3a1a3e264c919f45b15899b5e132e9d64 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 17 Jan 2022 15:00:07 +0200 Subject: [PATCH 06/10] QmlDesigner: Remove docking widgets top right controls Fixes: QDS-5983 Change-Id: I3d7b7c33816de69351134c3ad3e4b65d89f6c0cf Reviewed-by: Samuel Ghinet Reviewed-by: Miikka Heikkinen --- src/plugins/qmldesigner/designmodewidget.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 20fee2e3e18..8c5dccd2034 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -231,6 +231,9 @@ void DesignModeWidget::setup() ADS::DockManager::setConfigFlags(ADS::DockManager::DefaultNonOpaqueConfig); ADS::DockManager::setConfigFlag(ADS::DockManager::FocusHighlighting, true); + ADS::DockManager::setConfigFlag(ADS::DockManager::DockAreaHasCloseButton, false); + ADS::DockManager::setConfigFlag(ADS::DockManager::DockAreaHasUndockButton, false); + ADS::DockManager::setConfigFlag(ADS::DockManager::DockAreaHasTabsMenuButton, false); ADS::DockManager::setConfigFlag(ADS::DockManager::OpaqueSplitterResize, true); ADS::DockManager::setConfigFlag(ADS::DockManager::AllTabsHaveCloseButton, true); m_dockManager = new ADS::DockManager(this); @@ -251,10 +254,6 @@ void DesignModeWidget::setup() const QString fontName = "qtds_propertyIconFont.ttf"; const QSize size = QSize(28, 28); - const QIcon closeIcon = Utils::StyleHelper::getIconFromIconFont(fontName, closeUnicode, 28, 28, iconColor); - const QIcon menuIcon = Utils::StyleHelper::getIconFromIconFont(fontName, menuUnicode, 28, 28, iconColor); - const QIcon undockIcon = Utils::StyleHelper::getIconFromIconFont(fontName, undockUnicode, 28, 28, iconColor); - auto tabCloseIconNormal = Utils::StyleHelper::IconFontHelper( closeUnicode, Theme::getColor(Theme::DStabInactiveIcon), size, QIcon::Normal, QIcon::Off); auto tabCloseIconActive = Utils::StyleHelper::IconFontHelper( @@ -268,10 +267,6 @@ void DesignModeWidget::setup() tabCloseIconFocus}); ADS::DockManager::iconProvider().registerCustomIcon(ADS::TabCloseIcon, tabsCloseIcon); - ADS::DockManager::iconProvider().registerCustomIcon(ADS::DockAreaMenuIcon, menuIcon); - ADS::DockManager::iconProvider().registerCustomIcon(ADS::DockAreaUndockIcon, undockIcon); - ADS::DockManager::iconProvider().registerCustomIcon(ADS::DockAreaCloseIcon, closeIcon); - ADS::DockManager::iconProvider().registerCustomIcon(ADS::FloatingWidgetCloseIcon, closeIcon); // Setup Actions and Menus Core::ActionContainer *mview = Core::ActionManager::actionContainer(Core::Constants::M_VIEW); From 4c21852ec66715bd56881eb482f5e0c94f81ef3a Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 17 Jan 2022 15:22:20 +0100 Subject: [PATCH 07/10] QmlDesigner: Fix compilation Amends c1c147a9dc9. Change-Id: Ib6d58e607a234424e77516dbb0fa07599a25f68e Reviewed-by: Christian Stenger --- tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp b/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp index 2e6a87617dc..9b692c7d0ba 100644 --- a/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp +++ b/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp @@ -104,7 +104,7 @@ protected: void configureFactory(MockWizardFactory &factory, IWizardFactory::WizardKind kind, bool requiresQtStudio = true, const QPair &availableOnPlatform = {}, - const QPair &sizes = {}) + const std::pair &sizes = {}) { if (kind == IWizardFactory::ProjectWizard) { QSet supported{Utils::Id{"QmlProjectManager.QmlProject"}}; From dab8caf6d98ce5a94309dfe01bbffdef00293d2e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 14 Jan 2022 17:47:39 +0100 Subject: [PATCH 08/10] StudioWelcome: Enable integrating download progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iad18c1a0bc49f87a98dcdff46542cf4c373de875 Reviewed-by: Henning Gründl Reviewed-by: Qt CI Bot --- src/plugins/studiowelcome/examplecheckout.cpp | 10 +++++++++- src/plugins/studiowelcome/examplecheckout.h | 5 ++++- src/plugins/studiowelcome/qml/downloaddialog/main.qml | 9 ++++++--- src/plugins/studiowelcome/studiowelcomeplugin.cpp | 7 +++++-- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/plugins/studiowelcome/examplecheckout.cpp b/src/plugins/studiowelcome/examplecheckout.cpp index 80e32d72639..39beb51c624 100644 --- a/src/plugins/studiowelcome/examplecheckout.cpp +++ b/src/plugins/studiowelcome/examplecheckout.cpp @@ -45,7 +45,7 @@ using namespace Utils; ExampleCheckout::ExampleCheckout(QObject *) {} -void ExampleCheckout::checkoutExample(const QUrl &url) +void ExampleCheckout::registerTypes() { FileDownloader::registerQmlType(); static bool once = []() { @@ -55,6 +55,11 @@ void ExampleCheckout::checkoutExample(const QUrl &url) }(); QTC_ASSERT(once, ;); +} + +void ExampleCheckout::checkoutExample(const QUrl &url, const QString &tempFile, const QString &completeBaseFileName) +{ + registerTypes(); m_dialog.reset(new QDialog(Core::ICore::dialogParent())); m_dialog->setModal(true); @@ -80,6 +85,8 @@ void ExampleCheckout::checkoutExample(const QUrl &url) QTC_ASSERT(rootObject, qWarning() << "QML error"; return ); rootObject->setProperty("url", url); + rootObject->setProperty("tempFile", tempFile); + rootObject->setProperty("completeBaseName", completeBaseFileName); m_dialog->show(); @@ -260,6 +267,7 @@ void FileExtractor::setSourceFile(QString &sourceFilePath) void FileExtractor::setArchiveName(QString &filePath) { m_archiveName = filePath; + emit targetFolderExistsChanged(); } const QString FileExtractor::detailedText() diff --git a/src/plugins/studiowelcome/examplecheckout.h b/src/plugins/studiowelcome/examplecheckout.h index 0038d7f2c0f..1f8cf00d84c 100644 --- a/src/plugins/studiowelcome/examplecheckout.h +++ b/src/plugins/studiowelcome/examplecheckout.h @@ -43,18 +43,21 @@ class ExampleCheckout : public QObject public: explicit ExampleCheckout(QObject *parent = nullptr); - Q_INVOKABLE void checkoutExample(const QUrl &url); + Q_INVOKABLE void checkoutExample(const QUrl &url, const QString &tempFile, const QString &completeBaseFileName); QString extractionFolder() const; ~ExampleCheckout(); + static void registerTypes(); + public slots: void handleCancel(); void handleAccepted(); signals: void finishedSucessfully(); + void progressChanged(int); private: std::unique_ptr m_dialog; diff --git a/src/plugins/studiowelcome/qml/downloaddialog/main.qml b/src/plugins/studiowelcome/qml/downloaddialog/main.qml index cb7f62a68c4..33acd7e3e4e 100644 --- a/src/plugins/studiowelcome/qml/downloaddialog/main.qml +++ b/src/plugins/studiowelcome/qml/downloaddialog/main.qml @@ -45,15 +45,18 @@ Rectangle { signal canceled signal accepted + property string tempFile + property string completeBaseName + StackLayout { id: stackLayout anchors.fill: parent - currentIndex: 0 + currentIndex: root.tempFile.length === 0 ? 0 : 1 FileExtractor { id: fileExtractor - sourceFile: downloader.tempFile - archiveName: downloader.completeBaseName + archiveName: root.completeBaseName.length === 0 ? downloader.completeBaseName : root.completeBaseName + sourceFile: root.tempFile.length === 0 ? downloader.tempFile : root.tempFile } FileDownloader { diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index d88dbf5072b..424374b8e72 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -231,11 +231,13 @@ public: Q_INVOKABLE void openExample(const QString &example, const QString &formFile, const QString &url, - const QString &explicitQmlproject) + const QString &explicitQmlproject, + const QString &tempFile, + const QString &completeBaseName) { if (!url.isEmpty()) { ExampleCheckout *checkout = new ExampleCheckout; - checkout->checkoutExample(QUrl::fromUserInput(url)); + checkout->checkoutExample(QUrl::fromUserInput(url), tempFile, completeBaseName); connect(checkout, &ExampleCheckout::finishedSucessfully, this, @@ -631,6 +633,7 @@ WelcomeMode::WelcomeMode() setContext(Core::Context(Core::Constants::C_WELCOME_MODE)); QFontDatabase::addApplicationFont(":/studiofonts/TitilliumWeb-Regular.ttf"); + ExampleCheckout::registerTypes(); m_modeWidget = new QQuickWidget; m_modeWidget->setMinimumSize(1024, 768); From b12b656588683b883287dc68e13506fb48d9edb9 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 17 Jan 2022 15:23:28 +0100 Subject: [PATCH 09/10] QmlDesigner: Fix UrlChooser not showing items Change-Id: Ie9cb697837e9a6a5be666a598dffdee52f90fd08 Reviewed-by: Thomas Hartmann Reviewed-by: --- .../imports/HelperWidgets/UrlChooser.qml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml index fbd2feb1432..dd4a11d9cff 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml @@ -263,11 +263,13 @@ Row { // Build the combobox model comboBox.items.clear() - for (var i = 0; i < urlChooser.defaultItems.length; ++i) { - comboBox.items.append({ - fullPath: urlChooser.defaultItems[i], - name: urlChooser.defaultItems[i] - }) + if (urlChooser.defaultItems !== undefined) { + for (var i = 0; i < urlChooser.defaultItems.length; ++i) { + comboBox.items.append({ + fullPath: urlChooser.defaultItems[i], + name: urlChooser.defaultItems[i] + }) + } } for (var j = 0; j < fileModel.fullPathModel.length; ++j) { From a87a500c7719726a20d3d3dddbf901f64ad7017c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 17 Jan 2022 10:50:34 +0100 Subject: [PATCH 10/10] QmlDesigner: Remove Goto implementation from Design Studio Task-number: QDS-5951 Change-Id: I5503f27508ec0e0f76506083baad3969730c651d Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../componentcore/designeractionmanager.cpp | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index f601ae39865..89fa1d39d19 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1471,16 +1471,20 @@ void DesignerActionManager::createDefaultDesignerActions() &singleSelection, &singleSelection)); - addDesignerAction(new ModelNodeContextMenuAction( - goToImplementationCommandId, - goToImplementationDisplayName, - {}, - rootCategory, - QKeySequence(), - 42, - &goImplementation, - &singleSelectedAndUiFile, - &singleSelectedAndUiFile)); + const bool standaloneMode + = Core::ICore::settings()->value(DesignerSettingsKey::STANDALONE_MODE).toBool(); + + if (!standaloneMode) { + addDesignerAction(new ModelNodeContextMenuAction(goToImplementationCommandId, + goToImplementationDisplayName, + {}, + rootCategory, + QKeySequence(), + 42, + &goImplementation, + &singleSelectedAndUiFile, + &singleSelectedAndUiFile)); + } addDesignerAction(new ModelNodeContextMenuAction( addSignalHandlerCommandId,