QmlDesigner: Allow deleting materials using the delete action

Fixes: QDS-7012
Change-Id: I5eb03971d33a997fc1463ec4ee70eb33a730a897
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Mahmoud Badri
2022-08-04 12:40:06 +03:00
parent 01bb84b808
commit ec565eea99
12 changed files with 97 additions and 24 deletions

View File

@@ -129,11 +129,13 @@ void DesignerActionManager::polishActions() const
Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR); Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR);
Core::Context qmlDesignerEditor3DContext(Constants::C_QMLEDITOR3D); Core::Context qmlDesignerEditor3DContext(Constants::C_QMLEDITOR3D);
Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR); Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR);
Core::Context qmlDesignerMaterialBrowserContext(Constants::C_QMLMATERIALBROWSER);
Core::Context qmlDesignerUIContext; Core::Context qmlDesignerUIContext;
qmlDesignerUIContext.add(qmlDesignerFormEditorContext); qmlDesignerUIContext.add(qmlDesignerFormEditorContext);
qmlDesignerUIContext.add(qmlDesignerEditor3DContext); qmlDesignerUIContext.add(qmlDesignerEditor3DContext);
qmlDesignerUIContext.add(qmlDesignerNavigatorContext); qmlDesignerUIContext.add(qmlDesignerNavigatorContext);
qmlDesignerUIContext.add(qmlDesignerMaterialBrowserContext);
for (auto *action : actions) { for (auto *action : actions) {
if (!action->menuId().isEmpty()) { if (!action->menuId().isEmpty()) {

View File

@@ -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() void MaterialBrowserModel::updateSelectedMaterial()
{ {
selectMaterial(m_selectedIndex, true); selectMaterial(m_selectedIndex, true);

View File

@@ -61,6 +61,7 @@ public:
QList<ModelNode> materials() const; QList<ModelNode> materials() const;
void setMaterials(const QList<ModelNode> &materials, bool hasQuick3DImport); void setMaterials(const QList<ModelNode> &materials, bool hasQuick3DImport);
void removeMaterial(const ModelNode &material); void removeMaterial(const ModelNode &material);
void deleteSelectedMaterial();
void updateMaterialName(const ModelNode &material); void updateMaterialName(const ModelNode &material);
void updateSelectedMaterial(); void updateSelectedMaterial();
int materialIndex(const ModelNode &material) const; int materialIndex(const ModelNode &material) const;

View File

@@ -32,6 +32,7 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <nodeinstanceview.h> #include <nodeinstanceview.h>
#include <qmldesignerconstants.h> #include <qmldesignerconstants.h>
#include <designmodecontext.h>
#include <QQuickItem> #include <QQuickItem>
@@ -53,7 +54,11 @@ bool MaterialBrowserView::hasWidget() const
WidgetInfo MaterialBrowserView::widgetInfo() WidgetInfo MaterialBrowserView::widgetInfo()
{ {
if (m_widget.isNull()) { 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(); MaterialBrowserModel *matBrowserModel = m_widget->materialBrowserModel().data();
// custom notifications below are sent to the MaterialEditor // 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]() { QTimer::singleShot(0, this, [this]() {
refreshModel(true); refreshModel(true);
}); });
} else if (identifier == "delete_selected_material") {
m_widget->materialBrowserModel()->deleteSelectedMaterial();
} }
} }

View File

@@ -25,6 +25,7 @@
#include "materialbrowserwidget.h" #include "materialbrowserwidget.h"
#include "materialbrowsermodel.h" #include "materialbrowsermodel.h"
#include "materialbrowserview.h"
#include <theme.h> #include <theme.h>
@@ -130,14 +131,20 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event)
return QObject::eventFilter(obj, event); return QObject::eventFilter(obj, event);
} }
MaterialBrowserWidget::MaterialBrowserWidget() MaterialBrowserWidget::MaterialBrowserWidget(MaterialBrowserView *view)
: m_materialBrowserModel(new MaterialBrowserModel(this)) : m_materialBrowserView(view)
, m_materialBrowserModel(new MaterialBrowserModel(this))
, m_quickWidget(new QQuickWidget(this)) , m_quickWidget(new QQuickWidget(this))
, m_previewImageProvider(new PreviewImageProvider()) , m_previewImageProvider(new PreviewImageProvider())
{ {
setWindowTitle(tr("Material Browser", "Title of material browser widget")); setWindowTitle(tr("Material Browser", "Title of material browser widget"));
setMinimumWidth(120); 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->setResizeMode(QQuickWidget::SizeRootObjectToView);
m_quickWidget->engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); m_quickWidget->engine()->addImportPath(propertyEditorResourcesPath() + "/imports");
m_quickWidget->setClearColor(Theme::getColor(Theme::Color::DSpanelBackground)); m_quickWidget->setClearColor(Theme::getColor(Theme::Color::DSpanelBackground));
@@ -182,6 +189,14 @@ QList<QToolButton *> MaterialBrowserWidget::createToolBarWidgets()
return {}; 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) void MaterialBrowserWidget::handleSearchfilterChanged(const QString &filterText)
{ {
if (filterText != m_filterText) { if (filterText != m_filterText) {

View File

@@ -25,20 +25,19 @@
#pragma once #pragma once
#include "itemlibraryinfo.h"
#include "import.h"
#include "modelnode.h" #include "modelnode.h"
#include <utils/fancylineedit.h> #include <coreplugin/icontext.h>
#include <utils/dropsupport.h> #include <utils/dropsupport.h>
#include <utils/fancylineedit.h>
#include <QFrame>
#include <QToolButton>
#include <QFileIconProvider> #include <QFileIconProvider>
#include <QQuickWidget> #include <QFrame>
#include <QQmlPropertyMap>
#include <QTimer>
#include <QPointF> #include <QPointF>
#include <QQmlPropertyMap>
#include <QQuickWidget>
#include <QTimer>
#include <QToolButton>
#include <memory> #include <memory>
@@ -49,6 +48,7 @@ QT_END_NAMESPACE
namespace QmlDesigner { namespace QmlDesigner {
class MaterialBrowserView;
class MaterialBrowserModel; class MaterialBrowserModel;
class PreviewImageProvider; class PreviewImageProvider;
@@ -57,10 +57,11 @@ class MaterialBrowserWidget : public QFrame
Q_OBJECT Q_OBJECT
public: public:
MaterialBrowserWidget(); MaterialBrowserWidget(MaterialBrowserView *view);
~MaterialBrowserWidget() = default; ~MaterialBrowserWidget() = default;
QList<QToolButton *> createToolBarWidgets(); QList<QToolButton *> createToolBarWidgets();
void contextHelp(const Core::IContext::HelpCallback &callback) const;
static QString qmlSourcesPath(); static QString qmlSourcesPath();
void clearSearchFilter(); void clearSearchFilter();
@@ -80,11 +81,13 @@ private:
void reloadQmlSource(); void reloadQmlSource();
void updateSearch(); void updateSearch();
QPointer<MaterialBrowserView> m_materialBrowserView;
QPointer<MaterialBrowserModel> m_materialBrowserModel; QPointer<MaterialBrowserModel> m_materialBrowserModel;
QScopedPointer<QQuickWidget> m_quickWidget; QScopedPointer<QQuickWidget> m_quickWidget;
QShortcut *m_qmlSourceUpdateShortcut = nullptr; QShortcut *m_qmlSourceUpdateShortcut = nullptr;
PreviewImageProvider *m_previewImageProvider = nullptr; PreviewImageProvider *m_previewImageProvider = nullptr;
Core::IContext *m_context = nullptr;
QString m_filterText; QString m_filterText;

View File

@@ -28,6 +28,7 @@
#include "designmodewidget.h" #include "designmodewidget.h"
#include "formeditorwidget.h" #include "formeditorwidget.h"
#include "edit3dwidget.h" #include "edit3dwidget.h"
#include "materialbrowserwidget.h"
#include "navigatorwidget.h" #include "navigatorwidget.h"
#include "texteditorwidget.h" #include "texteditorwidget.h"
@@ -70,6 +71,18 @@ void Editor3DContext::contextHelp(const HelpCallback &callback) const
qobject_cast<Edit3DWidget *>(m_widget)->contextHelp(callback); qobject_cast<Edit3DWidget *>(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<MaterialBrowserWidget *>(m_widget)->contextHelp(callback);
}
NavigatorContext::NavigatorContext(QWidget *widget) NavigatorContext::NavigatorContext(QWidget *widget)
: IContext(widget) : IContext(widget)
{ {

View File

@@ -60,6 +60,15 @@ public:
void contextHelp(const Core::IContext::HelpCallback &callback) const override; 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 class NavigatorContext : public Core::IContext
{ {
Q_OBJECT Q_OBJECT

View File

@@ -32,11 +32,12 @@ const char C_BACKSPACE[] = "QmlDesigner.Backspace";
const char C_DELETE[] = "QmlDesigner.Delete"; const char C_DELETE[] = "QmlDesigner.Delete";
// Context // Context
const char C_QMLDESIGNER[] = "QmlDesigner::QmlDesignerMain"; const char C_QMLDESIGNER[] = "QmlDesigner::QmlDesignerMain";
const char C_QMLFORMEDITOR[] = "QmlDesigner::FormEditor"; const char C_QMLFORMEDITOR[] = "QmlDesigner::FormEditor";
const char C_QMLEDITOR3D[] = "QmlDesigner::Editor3D"; const char C_QMLEDITOR3D[] = "QmlDesigner::Editor3D";
const char C_QMLNAVIGATOR[] = "QmlDesigner::Navigator"; const char C_QMLNAVIGATOR[] = "QmlDesigner::Navigator";
const char C_QMLTEXTEDITOR[] = "QmlDesigner::TextEditor"; const char C_QMLTEXTEDITOR[] = "QmlDesigner::TextEditor";
const char C_QMLMATERIALBROWSER[] = "QmlDesigner::MaterialBrowser";
// Special context for preview menu, shared b/w designer and text editor // Special context for preview menu, shared b/w designer and text editor
const char C_QT_QUICK_TOOLS_MENU[] = "QmlDesigner::ToolsMenu"; const char C_QT_QUICK_TOOLS_MENU[] = "QmlDesigner::ToolsMenu";

View File

@@ -399,15 +399,18 @@ void QmlDesignerPlugin::integrateIntoQtCreator(QWidget *modeWidget)
Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR); Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR);
Core::Context qmlDesignerEditor3dContext(Constants::C_QMLEDITOR3D); Core::Context qmlDesignerEditor3dContext(Constants::C_QMLEDITOR3D);
Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR); Core::Context qmlDesignerNavigatorContext(Constants::C_QMLNAVIGATOR);
Core::Context qmlDesignerMaterialBrowserContext(Constants::C_QMLMATERIALBROWSER);
context->context().add(qmlDesignerMainContext); context->context().add(qmlDesignerMainContext);
context->context().add(qmlDesignerFormEditorContext); context->context().add(qmlDesignerFormEditorContext);
context->context().add(qmlDesignerEditor3dContext); context->context().add(qmlDesignerEditor3dContext);
context->context().add(qmlDesignerNavigatorContext); context->context().add(qmlDesignerNavigatorContext);
context->context().add(qmlDesignerMaterialBrowserContext);
context->context().add(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID); context->context().add(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID);
d->shortCutManager.registerActions(qmlDesignerMainContext, qmlDesignerFormEditorContext, d->shortCutManager.registerActions(qmlDesignerMainContext, qmlDesignerFormEditorContext,
qmlDesignerEditor3dContext, qmlDesignerNavigatorContext); qmlDesignerEditor3dContext, qmlDesignerNavigatorContext,
qmlDesignerMaterialBrowserContext);
const QStringList mimeTypes = { QmlJSTools::Constants::QML_MIMETYPE, const QStringList mimeTypes = { QmlJSTools::Constants::QML_MIMETYPE,
QmlJSTools::Constants::QMLUI_MIMETYPE }; QmlJSTools::Constants::QMLUI_MIMETYPE };

View File

@@ -77,8 +77,11 @@ ShortCutManager::ShortCutManager()
void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContext, void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContext,
const Core::Context &qmlDesignerFormEditorContext, const Core::Context &qmlDesignerFormEditorContext,
const Core::Context &qmlDesignerEditor3DContext, 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 *editMenu = Core::ActionManager::actionContainer(Core::Constants::M_EDIT);
Core::ActionContainer *fileMenu = Core::ActionManager::actionContainer(Core::Constants::M_FILE); 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); m_pasteAction.setEnabled(true);
}); });
connect(Core::ICore::instance(), &Core::ICore::contextChanged, this, [&designerActionManager, this](const Core::Context &context){ connect(Core::ICore::instance(), &Core::ICore::contextChanged, this, [&](const Core::Context &context) {
if (!context.contains(Constants::C_QMLFORMEDITOR) && !context.contains(Constants::C_QMLEDITOR3D) && !context.contains(Constants::C_QMLNAVIGATOR)) { isMatBrowserActive = context.contains(Constants::C_QMLMATERIALBROWSER);
m_deleteAction.setEnabled(false);
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_cutAction.setEnabled(false);
m_copyAction.setEnabled(false); m_copyAction.setEnabled(false);
m_pasteAction.setEnabled(false); m_pasteAction.setEnabled(false);
@@ -249,8 +255,12 @@ void ShortCutManager::redo()
void ShortCutManager::deleteSelected() void ShortCutManager::deleteSelected()
{ {
if (currentDesignDocument()) if (isMatBrowserActive) {
DesignerActionManager &designerActionManager = QmlDesignerPlugin::instance()->viewManager().designerActionManager();
designerActionManager.view()->emitCustomNotification("delete_selected_material");
} else if (currentDesignDocument()) {
currentDesignDocument()->deleteSelected(); currentDesignDocument()->deleteSelected();
}
} }
void ShortCutManager::cutSelected() void ShortCutManager::cutSelected()

View File

@@ -47,7 +47,8 @@ public:
void registerActions(const Core::Context &qmlDesignerMainContext, void registerActions(const Core::Context &qmlDesignerMainContext,
const Core::Context &qmlDesignerFormEditorContext, const Core::Context &qmlDesignerFormEditorContext,
const Core::Context &qmlDesignerEditor3DContext, const Core::Context &qmlDesignerEditor3DContext,
const Core::Context &qmlDesignerNavigatorContext); const Core::Context &qmlDesignerNavigatorContext,
const Core::Context &qmlDesignerMaterialBrowserContext);
void connectUndoActions(DesignDocument *designDocument); void connectUndoActions(DesignDocument *designDocument);
void disconnectUndoActions(DesignDocument *designDocument); void disconnectUndoActions(DesignDocument *designDocument);
@@ -84,6 +85,8 @@ private:
QAction m_pasteAction; QAction m_pasteAction;
QAction m_selectAllAction; QAction m_selectAllAction;
QAction m_escapeAction; QAction m_escapeAction;
bool isMatBrowserActive = false;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner