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 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()) {

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()
{
selectMaterial(m_selectedIndex, true);

View File

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

View File

@@ -32,6 +32,7 @@
#include <coreplugin/icore.h>
#include <nodeinstanceview.h>
#include <qmldesignerconstants.h>
#include <designmodecontext.h>
#include <QQuickItem>
@@ -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();
}
}

View File

@@ -25,6 +25,7 @@
#include "materialbrowserwidget.h"
#include "materialbrowsermodel.h"
#include "materialbrowserview.h"
#include <theme.h>
@@ -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<QToolButton *> 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) {

View File

@@ -25,20 +25,19 @@
#pragma once
#include "itemlibraryinfo.h"
#include "import.h"
#include "modelnode.h"
#include <utils/fancylineedit.h>
#include <coreplugin/icontext.h>
#include <utils/dropsupport.h>
#include <utils/fancylineedit.h>
#include <QFrame>
#include <QToolButton>
#include <QFileIconProvider>
#include <QQuickWidget>
#include <QQmlPropertyMap>
#include <QTimer>
#include <QFrame>
#include <QPointF>
#include <QQmlPropertyMap>
#include <QQuickWidget>
#include <QTimer>
#include <QToolButton>
#include <memory>
@@ -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<QToolButton *> createToolBarWidgets();
void contextHelp(const Core::IContext::HelpCallback &callback) const;
static QString qmlSourcesPath();
void clearSearchFilter();
@@ -80,11 +81,13 @@ private:
void reloadQmlSource();
void updateSearch();
QPointer<MaterialBrowserView> m_materialBrowserView;
QPointer<MaterialBrowserModel> m_materialBrowserModel;
QScopedPointer<QQuickWidget> m_quickWidget;
QShortcut *m_qmlSourceUpdateShortcut = nullptr;
PreviewImageProvider *m_previewImageProvider = nullptr;
Core::IContext *m_context = nullptr;
QString m_filterText;

View File

@@ -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<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)
: IContext(widget)
{

View File

@@ -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

View File

@@ -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";

View File

@@ -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 };

View File

@@ -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()

View File

@@ -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