diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index a0bd7a23896..8dc52ad6303 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -129,11 +129,13 @@ void DesignerActionManager::polishActions() const Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR); Core::Context qmlDesignerEditor3DContext(Constants::C_QMLEDITOR3D); Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR); + Core::Context qmlDesignerMaterialBrowserContext(Constants::C_QMLMATERIALBROWSER); Core::Context qmlDesignerUIContext; qmlDesignerUIContext.add(qmlDesignerFormEditorContext); qmlDesignerUIContext.add(qmlDesignerEditor3DContext); qmlDesignerUIContext.add(qmlDesignerNavigatorContext); + qmlDesignerUIContext.add(qmlDesignerMaterialBrowserContext); for (auto *action : actions) { if (!action->menuId().isEmpty()) { diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp index 49f313534d1..af74c1489d9 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp @@ -201,6 +201,12 @@ void MaterialBrowserModel::removeMaterial(const ModelNode &material) } } +void MaterialBrowserModel::deleteSelectedMaterial() +{ + if (isValidIndex(m_selectedIndex)) + m_materialList[m_selectedIndex].destroy(); +} + void MaterialBrowserModel::updateSelectedMaterial() { selectMaterial(m_selectedIndex, true); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h index 73e6b2f99c6..eb258b1efef 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h @@ -61,6 +61,7 @@ public: QList materials() const; void setMaterials(const QList &materials, bool hasQuick3DImport); void removeMaterial(const ModelNode &material); + void deleteSelectedMaterial(); void updateMaterialName(const ModelNode &material); void updateSelectedMaterial(); int materialIndex(const ModelNode &material) const; diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index ae04c193ca9..ebb9671e501 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -53,7 +54,11 @@ bool MaterialBrowserView::hasWidget() const WidgetInfo MaterialBrowserView::widgetInfo() { if (m_widget.isNull()) { - m_widget = new MaterialBrowserWidget; + m_widget = new MaterialBrowserWidget(this); + + auto matEditorContext = new Internal::MaterialBrowserContext(m_widget.data()); + Core::ICore::addContextObject(matEditorContext); + MaterialBrowserModel *matBrowserModel = m_widget->materialBrowserModel().data(); // custom notifications below are sent to the MaterialEditor @@ -288,6 +293,8 @@ void MaterialBrowserView::customNotification(const AbstractView *view, const QSt QTimer::singleShot(0, this, [this]() { refreshModel(true); }); + } else if (identifier == "delete_selected_material") { + m_widget->materialBrowserModel()->deleteSelectedMaterial(); } } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 816ce4a3dce..71ddd1aca7f 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -25,6 +25,7 @@ #include "materialbrowserwidget.h" #include "materialbrowsermodel.h" +#include "materialbrowserview.h" #include @@ -130,14 +131,20 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event) return QObject::eventFilter(obj, event); } -MaterialBrowserWidget::MaterialBrowserWidget() - : m_materialBrowserModel(new MaterialBrowserModel(this)) +MaterialBrowserWidget::MaterialBrowserWidget(MaterialBrowserView *view) + : m_materialBrowserView(view) + , m_materialBrowserModel(new MaterialBrowserModel(this)) , m_quickWidget(new QQuickWidget(this)) , m_previewImageProvider(new PreviewImageProvider()) { setWindowTitle(tr("Material Browser", "Title of material browser widget")); setMinimumWidth(120); + Core::Context context(Constants::C_QMLMATERIALBROWSER); + m_context = new Core::IContext(this); + m_context->setContext(context); + m_context->setWidget(this); + m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); m_quickWidget->engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); m_quickWidget->setClearColor(Theme::getColor(Theme::Color::DSpanelBackground)); @@ -182,6 +189,14 @@ QList MaterialBrowserWidget::createToolBarWidgets() return {}; } +void MaterialBrowserWidget::contextHelp(const Core::IContext::HelpCallback &callback) const +{ + if (m_materialBrowserView) + m_materialBrowserView->contextHelp(callback); + else + callback({}); +} + void MaterialBrowserWidget::handleSearchfilterChanged(const QString &filterText) { if (filterText != m_filterText) { diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index 30f9d05b509..9c08f21f9af 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -25,20 +25,19 @@ #pragma once -#include "itemlibraryinfo.h" -#include "import.h" #include "modelnode.h" -#include +#include #include +#include -#include -#include #include -#include -#include -#include +#include #include +#include +#include +#include +#include #include @@ -49,6 +48,7 @@ QT_END_NAMESPACE namespace QmlDesigner { +class MaterialBrowserView; class MaterialBrowserModel; class PreviewImageProvider; @@ -57,10 +57,11 @@ class MaterialBrowserWidget : public QFrame Q_OBJECT public: - MaterialBrowserWidget(); + MaterialBrowserWidget(MaterialBrowserView *view); ~MaterialBrowserWidget() = default; QList createToolBarWidgets(); + void contextHelp(const Core::IContext::HelpCallback &callback) const; static QString qmlSourcesPath(); void clearSearchFilter(); @@ -80,11 +81,13 @@ private: void reloadQmlSource(); void updateSearch(); + QPointer m_materialBrowserView; QPointer m_materialBrowserModel; QScopedPointer m_quickWidget; QShortcut *m_qmlSourceUpdateShortcut = nullptr; PreviewImageProvider *m_previewImageProvider = nullptr; + Core::IContext *m_context = nullptr; QString m_filterText; diff --git a/src/plugins/qmldesigner/designmodecontext.cpp b/src/plugins/qmldesigner/designmodecontext.cpp index a0cb0cf4072..442b8b90536 100644 --- a/src/plugins/qmldesigner/designmodecontext.cpp +++ b/src/plugins/qmldesigner/designmodecontext.cpp @@ -28,6 +28,7 @@ #include "designmodewidget.h" #include "formeditorwidget.h" #include "edit3dwidget.h" +#include "materialbrowserwidget.h" #include "navigatorwidget.h" #include "texteditorwidget.h" @@ -70,6 +71,18 @@ void Editor3DContext::contextHelp(const HelpCallback &callback) const qobject_cast(m_widget)->contextHelp(callback); } +MaterialBrowserContext::MaterialBrowserContext(QWidget *widget) + : IContext(widget) +{ + setWidget(widget); + setContext(Core::Context(Constants::C_QMLMATERIALBROWSER, Constants::C_QT_QUICK_TOOLS_MENU)); +} + +void MaterialBrowserContext::contextHelp(const HelpCallback &callback) const +{ + qobject_cast(m_widget)->contextHelp(callback); +} + NavigatorContext::NavigatorContext(QWidget *widget) : IContext(widget) { diff --git a/src/plugins/qmldesigner/designmodecontext.h b/src/plugins/qmldesigner/designmodecontext.h index b30430b5eeb..fdf5beeecef 100644 --- a/src/plugins/qmldesigner/designmodecontext.h +++ b/src/plugins/qmldesigner/designmodecontext.h @@ -60,6 +60,15 @@ public: void contextHelp(const Core::IContext::HelpCallback &callback) const override; }; +class MaterialBrowserContext : public Core::IContext +{ + Q_OBJECT + +public: + MaterialBrowserContext(QWidget *widget); + void contextHelp(const Core::IContext::HelpCallback &callback) const override; +}; + class NavigatorContext : public Core::IContext { Q_OBJECT diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 3cc0c3b8ae6..ee5fa690dca 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -32,11 +32,12 @@ const char C_BACKSPACE[] = "QmlDesigner.Backspace"; const char C_DELETE[] = "QmlDesigner.Delete"; // Context -const char C_QMLDESIGNER[] = "QmlDesigner::QmlDesignerMain"; -const char C_QMLFORMEDITOR[] = "QmlDesigner::FormEditor"; -const char C_QMLEDITOR3D[] = "QmlDesigner::Editor3D"; -const char C_QMLNAVIGATOR[] = "QmlDesigner::Navigator"; -const char C_QMLTEXTEDITOR[] = "QmlDesigner::TextEditor"; +const char C_QMLDESIGNER[] = "QmlDesigner::QmlDesignerMain"; +const char C_QMLFORMEDITOR[] = "QmlDesigner::FormEditor"; +const char C_QMLEDITOR3D[] = "QmlDesigner::Editor3D"; +const char C_QMLNAVIGATOR[] = "QmlDesigner::Navigator"; +const char C_QMLTEXTEDITOR[] = "QmlDesigner::TextEditor"; +const char C_QMLMATERIALBROWSER[] = "QmlDesigner::MaterialBrowser"; // Special context for preview menu, shared b/w designer and text editor const char C_QT_QUICK_TOOLS_MENU[] = "QmlDesigner::ToolsMenu"; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 331c8e7852f..69d3db51c32 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -399,15 +399,18 @@ void QmlDesignerPlugin::integrateIntoQtCreator(QWidget *modeWidget) Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR); Core::Context qmlDesignerEditor3dContext(Constants::C_QMLEDITOR3D); Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR); + Core::Context qmlDesignerMaterialBrowserContext(Constants::C_QMLMATERIALBROWSER); context->context().add(qmlDesignerMainContext); context->context().add(qmlDesignerFormEditorContext); context->context().add(qmlDesignerEditor3dContext); context->context().add(qmlDesignerNavigatorContext); + context->context().add(qmlDesignerMaterialBrowserContext); context->context().add(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID); d->shortCutManager.registerActions(qmlDesignerMainContext, qmlDesignerFormEditorContext, - qmlDesignerEditor3dContext, qmlDesignerNavigatorContext); + qmlDesignerEditor3dContext, qmlDesignerNavigatorContext, + qmlDesignerMaterialBrowserContext); const QStringList mimeTypes = { QmlJSTools::Constants::QML_MIMETYPE, QmlJSTools::Constants::QMLUI_MIMETYPE }; diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index e82e7a04c01..4cda11748c6 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -77,8 +77,11 @@ ShortCutManager::ShortCutManager() void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContext, const Core::Context &qmlDesignerFormEditorContext, const Core::Context &qmlDesignerEditor3DContext, - const Core::Context &qmlDesignerNavigatorContext) + const Core::Context &qmlDesignerNavigatorContext, + const Core::Context &qmlDesignerMaterialBrowserContext) { + Q_UNUSED(qmlDesignerMaterialBrowserContext) + Core::ActionContainer *editMenu = Core::ActionManager::actionContainer(Core::Constants::M_EDIT); Core::ActionContainer *fileMenu = Core::ActionManager::actionContainer(Core::Constants::M_FILE); @@ -195,9 +198,12 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex m_pasteAction.setEnabled(true); }); - connect(Core::ICore::instance(), &Core::ICore::contextChanged, this, [&designerActionManager, this](const Core::Context &context){ - if (!context.contains(Constants::C_QMLFORMEDITOR) && !context.contains(Constants::C_QMLEDITOR3D) && !context.contains(Constants::C_QMLNAVIGATOR)) { - m_deleteAction.setEnabled(false); + connect(Core::ICore::instance(), &Core::ICore::contextChanged, this, [&](const Core::Context &context) { + isMatBrowserActive = context.contains(Constants::C_QMLMATERIALBROWSER); + + if (!context.contains(Constants::C_QMLFORMEDITOR) && !context.contains(Constants::C_QMLEDITOR3D) + && !context.contains(Constants::C_QMLNAVIGATOR)) { + m_deleteAction.setEnabled(isMatBrowserActive); m_cutAction.setEnabled(false); m_copyAction.setEnabled(false); m_pasteAction.setEnabled(false); @@ -249,8 +255,12 @@ void ShortCutManager::redo() void ShortCutManager::deleteSelected() { - if (currentDesignDocument()) + if (isMatBrowserActive) { + DesignerActionManager &designerActionManager = QmlDesignerPlugin::instance()->viewManager().designerActionManager(); + designerActionManager.view()->emitCustomNotification("delete_selected_material"); + } else if (currentDesignDocument()) { currentDesignDocument()->deleteSelected(); + } } void ShortCutManager::cutSelected() diff --git a/src/plugins/qmldesigner/shortcutmanager.h b/src/plugins/qmldesigner/shortcutmanager.h index 4bc4ae5f848..149bf566400 100644 --- a/src/plugins/qmldesigner/shortcutmanager.h +++ b/src/plugins/qmldesigner/shortcutmanager.h @@ -47,7 +47,8 @@ public: void registerActions(const Core::Context &qmlDesignerMainContext, const Core::Context &qmlDesignerFormEditorContext, const Core::Context &qmlDesignerEditor3DContext, - const Core::Context &qmlDesignerNavigatorContext); + const Core::Context &qmlDesignerNavigatorContext, + const Core::Context &qmlDesignerMaterialBrowserContext); void connectUndoActions(DesignDocument *designDocument); void disconnectUndoActions(DesignDocument *designDocument); @@ -84,6 +85,8 @@ private: QAction m_pasteAction; QAction m_selectAllAction; QAction m_escapeAction; + + bool isMatBrowserActive = false; }; } // namespace QmlDesigner