QmlDesigner: Allow going into component from item library

Added "Go into Component" to item library context menu for items that
have customComponentSource available. Doubleclicking on the item also
does the same.

Fixes: QDS-5786
Change-Id: I954bfb4864d74fa04b5da5b961f9aa2035132022
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Samuel Ghinet <samuel.ghinet@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Miikka Heikkinen
2022-02-11 13:41:22 +02:00
parent b0589fb8fe
commit 6173b78860
9 changed files with 59 additions and 11 deletions

View File

@@ -91,6 +91,12 @@ Item {
if (mouse.button === Qt.LeftButton) if (mouse.button === Qt.LeftButton)
rootView.startDragAndDrop(itemLibraryEntry, mapToGlobal(mouse.x, mouse.y)) rootView.startDragAndDrop(itemLibraryEntry, mapToGlobal(mouse.x, mouse.y))
} }
onDoubleClicked: (mouse)=> {
if (mouse.button === Qt.LeftButton && itemComponentSource) {
hide()
rootView.goIntoComponent(itemComponentSource)
}
}
} }
} }
} }

View File

@@ -76,8 +76,9 @@ itemLibraryModel [
Item { Item {
id: itemsView id: itemsView
property string importToRemove: "" property string importToRemove
property string importToAdd: "" property string importToAdd
property string componentSource
property var currentCategory: null property var currentCategory: null
property var currentImport: null property var currentImport: null
property bool isHorizontalView: false property bool isHorizontalView: false
@@ -123,7 +124,7 @@ Item {
text: qsTr("Remove Module") text: qsTr("Remove Module")
visible: itemsView.currentCategory === null visible: itemsView.currentCategory === null
height: visible ? implicitHeight : 0 height: visible ? implicitHeight : 0
enabled: itemsView.importToRemove !== "" && !rootView.subCompEditMode enabled: itemsView.importToRemove && !rootView.subCompEditMode
onTriggered: rootView.removeImport(itemsView.importToRemove) onTriggered: rootView.removeImport(itemsView.importToRemove)
} }
@@ -184,14 +185,23 @@ Item {
StudioControls.Menu { StudioControls.Menu {
id: itemContextMenu id: itemContextMenu
// Workaround for menu item implicit width not properly propagating to menu // Workaround for menu item implicit width not properly propagating to menu
width: importMenuItem.implicitWidth width: Math.max(importMenuItem.implicitWidth, openSourceItem.implicitWidth)
StudioControls.MenuItem { StudioControls.MenuItem {
id: importMenuItem id: importMenuItem
text: qsTr("Add Module: ") + itemsView.importToAdd text: qsTr("Add Module: ") + itemsView.importToAdd
enabled: itemsView.importToAdd !== "" visible: itemsView.importToAdd
height: visible ? implicitHeight : 0
onTriggered: rootView.addImportForItem(itemsView.importToAdd) onTriggered: rootView.addImportForItem(itemsView.importToAdd)
} }
StudioControls.MenuItem {
id: openSourceItem
text: qsTr("Go into Component")
visible: itemsView.componentSource
height: visible ? implicitHeight : 0
onTriggered: rootView.goIntoComponent(itemsView.componentSource)
}
} }
} }
@@ -323,8 +333,9 @@ Item {
width: styleConstants.cellWidth width: styleConstants.cellWidth
height: styleConstants.cellHeight height: styleConstants.cellHeight
onShowContextMenu: { onShowContextMenu: {
if (!itemUsable) { if (!itemUsable || itemComponentSource) {
itemsView.importToAdd = itemRequiredImport itemsView.importToAdd = !itemUsable ? itemRequiredImport : ""
itemsView.componentSource = itemComponentSource
itemContextMenu.popup() itemContextMenu.popup()
} }
} }
@@ -480,8 +491,9 @@ Item {
width: styleConstants.cellWidth width: styleConstants.cellWidth
height: styleConstants.cellHeight height: styleConstants.cellHeight
onShowContextMenu: { onShowContextMenu: {
if (!itemUsable) { if (!itemUsable || itemComponentSource) {
itemsView.importToAdd = itemRequiredImport itemsView.importToAdd = !itemUsable ? itemRequiredImport : ""
itemsView.componentSource = itemComponentSource
itemContextMenu.popup() itemContextMenu.popup()
} }
} }

View File

@@ -32,6 +32,11 @@ MouseArea {
signal showContextMenu() signal showContextMenu()
function hide()
{
tooltipBackend.hideTooltip()
}
onExited: tooltipBackend.hideTooltip() onExited: tooltipBackend.hideTooltip()
onCanceled: tooltipBackend.hideTooltip() onCanceled: tooltipBackend.hideTooltip()
onPositionChanged: tooltipBackend.reposition() onPositionChanged: tooltipBackend.reposition()

View File

@@ -68,6 +68,11 @@ QString ItemLibraryItem::requiredImport() const
return m_itemLibraryEntry.requiredImport(); return m_itemLibraryEntry.requiredImport();
} }
QString ItemLibraryItem::componentSource() const
{
return m_itemLibraryEntry.customComponentSource();
}
bool ItemLibraryItem::setVisible(bool isVisible) bool ItemLibraryItem::setVisible(bool isVisible)
{ {
if (isVisible != m_isVisible) { if (isVisible != m_isVisible) {

View File

@@ -45,6 +45,7 @@ class ItemLibraryItem: public QObject
Q_PROPERTY(QString componentPath READ componentPath FINAL) Q_PROPERTY(QString componentPath READ componentPath FINAL)
Q_PROPERTY(bool itemUsable READ isUsable FINAL) Q_PROPERTY(bool itemUsable READ isUsable FINAL)
Q_PROPERTY(QString itemRequiredImport READ requiredImport FINAL) Q_PROPERTY(QString itemRequiredImport READ requiredImport FINAL)
Q_PROPERTY(QString itemComponentSource READ componentSource FINAL)
public: public:
ItemLibraryItem(const ItemLibraryEntry &itemLibraryEntry, bool isImported, QObject *parent); ItemLibraryItem(const ItemLibraryEntry &itemLibraryEntry, bool isImported, QObject *parent);
@@ -55,6 +56,7 @@ public:
QString itemLibraryIconPath() const; QString itemLibraryIconPath() const;
QString componentPath() const; QString componentPath() const;
QString requiredImport() const; QString requiredImport() const;
QString componentSource() const;
bool setVisible(bool isVisible); bool setVisible(bool isVisible);
bool isVisible() const; bool isVisible() const;

View File

@@ -32,6 +32,7 @@
#include <designeractionmanager.h> #include <designeractionmanager.h>
#include <designermcumanager.h> #include <designermcumanager.h>
#include <documentmanager.h>
#include <itemlibraryimageprovider.h> #include <itemlibraryimageprovider.h>
#include <itemlibraryinfo.h> #include <itemlibraryinfo.h>
#include <itemlibrarymodel.h> #include <itemlibrarymodel.h>
@@ -269,6 +270,11 @@ void ItemLibraryWidget::handleAddImport(int index)
updateSearch(); updateSearch();
} }
void ItemLibraryWidget::goIntoComponent(const QString &source)
{
DocumentManager::goIntoComponent(source);
}
void ItemLibraryWidget::delayedUpdateModel() void ItemLibraryWidget::delayedUpdateModel()
{ {
static bool disableTimer = DesignerSettings::getValue(DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER).toBool(); static bool disableTimer = DesignerSettings::getValue(DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER).toBool();

View File

@@ -95,6 +95,7 @@ public:
Q_INVOKABLE void addImportForItem(const QString &importUrl); Q_INVOKABLE void addImportForItem(const QString &importUrl);
Q_INVOKABLE void handleSearchfilterChanged(const QString &filterText); Q_INVOKABLE void handleSearchfilterChanged(const QString &filterText);
Q_INVOKABLE void handleAddImport(int index); Q_INVOKABLE void handleAddImport(int index);
Q_INVOKABLE void goIntoComponent(const QString &source);
signals: signals:
void itemActivated(const QString &itemName); void itemActivated(const QString &itemName);

View File

@@ -108,14 +108,19 @@ static inline void applyProperties(ModelNode &node, const QHash<PropertyName, QV
} }
} }
static void openFileComponent(const ModelNode &modelNode) static void openFileComponentForFile(const QString &fileName)
{ {
QmlDesignerPlugin::instance()->viewManager().nextFileIsCalledInternally(); QmlDesignerPlugin::instance()->viewManager().nextFileIsCalledInternally();
Core::EditorManager::openEditor(FilePath::fromString(modelNode.metaInfo().componentFileName()), Core::EditorManager::openEditor(FilePath::fromString(fileName),
Utils::Id(), Utils::Id(),
Core::EditorManager::DoNotMakeVisible); Core::EditorManager::DoNotMakeVisible);
} }
static void openFileComponent(const ModelNode &modelNode)
{
openFileComponentForFile(modelNode.metaInfo().componentFileName());
}
static void openFileComponentForDelegate(const ModelNode &modelNode) static void openFileComponentForDelegate(const ModelNode &modelNode)
{ {
openFileComponent(modelNode.nodeProperty("delegate").modelNode()); openFileComponent(modelNode.nodeProperty("delegate").modelNode());
@@ -305,6 +310,11 @@ bool DocumentManager::goIntoComponent(const ModelNode &modelNode)
return false; return false;
} }
void DocumentManager::goIntoComponent(const QString &fileName)
{
openFileComponentForFile(fileName);
}
bool DocumentManager::createFile(const QString &filePath, const QString &contents) bool DocumentManager::createFile(const QString &filePath, const QString &contents)
{ {
Utils::TextFileFormat textFileFormat; Utils::TextFileFormat textFileFormat;

View File

@@ -52,6 +52,7 @@ public:
void removeEditors(const QList<Core::IEditor *> &editors); void removeEditors(const QList<Core::IEditor *> &editors);
static bool goIntoComponent(const ModelNode &modelNode); static bool goIntoComponent(const ModelNode &modelNode);
static void goIntoComponent(const QString &fileName);
static bool createFile(const QString &filePath, const QString &contents); static bool createFile(const QString &filePath, const QString &contents);
static void addFileToVersionControl(const QString &directoryPath, const QString &newFilePath); static void addFileToVersionControl(const QString &directoryPath, const QString &newFilePath);