forked from qt-creator/qt-creator
Handle the case when there is no 3D Nodes in the qml doc
When there is no 3D node in the qml doc, the view 3D will still be enabled and manipulate-able. Also few relevant tweaks. Task-number: QDS-1693 Change-Id: I758f783108b317a6971703bee8e3fb564400ed8b Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -62,14 +62,16 @@ Item {
|
|||||||
onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective)
|
onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective)
|
||||||
onShowEditLightChanged: _generalHelper.storeToolState(sceneId,"showEditLight", showEditLight)
|
onShowEditLightChanged: _generalHelper.storeToolState(sceneId,"showEditLight", showEditLight)
|
||||||
onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation)
|
onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation)
|
||||||
|
onActiveSceneChanged: updateActiveScene();
|
||||||
|
|
||||||
onActiveSceneChanged: {
|
function updateActiveScene()
|
||||||
|
{
|
||||||
if (editView) {
|
if (editView) {
|
||||||
// Destroy is async, so make sure we don't get any more updates for the old editView
|
// Destroy is async, so make sure we don't get any more updates for the old editView
|
||||||
_generalHelper.enableItemUpdate(editView, false);
|
_generalHelper.enableItemUpdate(editView, false);
|
||||||
editView.destroy();
|
editView.destroy();
|
||||||
}
|
}
|
||||||
if (activeScene) {
|
|
||||||
// importScene cannot be updated after initial set, so we need to reconstruct entire View3D
|
// importScene cannot be updated after initial set, so we need to reconstruct entire View3D
|
||||||
var component = Qt.createComponent("SceneView3D.qml");
|
var component = Qt.createComponent("SceneView3D.qml");
|
||||||
if (component.status === Component.Ready) {
|
if (component.status === Component.Ready) {
|
||||||
@@ -87,6 +89,13 @@ Item {
|
|||||||
updateToolStates(_generalHelper.getToolStates(sceneId), true);
|
updateToolStates(_generalHelper.getToolStates(sceneId), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function clearActiveScene()
|
||||||
|
{
|
||||||
|
activeScene = null;
|
||||||
|
sceneId = "";
|
||||||
|
|
||||||
|
updateActiveScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disables edit view update if scene doesn't match current activeScene.
|
// Disables edit view update if scene doesn't match current activeScene.
|
||||||
|
|||||||
@@ -420,14 +420,22 @@ void Qt5InformationNodeInstanceServer::updateActiveSceneToEditView3D()
|
|||||||
sceneIdVar = QVariant::fromValue(sceneId);
|
sceneIdVar = QVariant::fromValue(sceneId);
|
||||||
sceneIdProperty.write(sceneIdVar);
|
sceneIdProperty.write(sceneIdVar);
|
||||||
|
|
||||||
|
QVariantMap toolStates;
|
||||||
|
|
||||||
|
// if m_active3DScene is null, QQmlProperty::write() doesn't work so invoke the updateActiveScene
|
||||||
|
// qml method directly
|
||||||
|
if (!m_active3DScene) {
|
||||||
|
QMetaObject::invokeMethod(m_editView3DRootItem, "clearActiveScene", Qt::QueuedConnection);
|
||||||
|
toolStates.insert("sceneInstanceId", QVariant::fromValue(-1));
|
||||||
|
} else {
|
||||||
QQmlProperty sceneProperty(m_editView3DRootItem, "activeScene", context());
|
QQmlProperty sceneProperty(m_editView3DRootItem, "activeScene", context());
|
||||||
sceneProperty.write(activeSceneVar);
|
sceneProperty.write(activeSceneVar);
|
||||||
|
|
||||||
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
|
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
|
||||||
QVariantMap toolStates;
|
|
||||||
if (helper)
|
if (helper)
|
||||||
toolStates = helper->getToolStates(sceneId);
|
toolStates = helper->getToolStates(sceneId);
|
||||||
toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId()));
|
toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId()));
|
||||||
|
}
|
||||||
|
|
||||||
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ActiveSceneChanged,
|
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ActiveSceneChanged,
|
||||||
toolStates});
|
toolStates});
|
||||||
@@ -514,7 +522,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView()
|
|||||||
{
|
{
|
||||||
static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW");
|
static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW");
|
||||||
if (m_editView3DRootItem && !showEditView) {
|
if (m_editView3DRootItem && !showEditView) {
|
||||||
auto t = std::chrono::steady_clock::now();
|
|
||||||
if (!m_editView3DContentItem) {
|
if (!m_editView3DContentItem) {
|
||||||
m_editView3DContentItem = QQmlProperty::read(m_editView3DRootItem, "contentItem").value<QQuickItem *>();
|
m_editView3DContentItem = QQmlProperty::read(m_editView3DRootItem, "contentItem").value<QQuickItem *>();
|
||||||
if (m_editView3DContentItem) {
|
if (m_editView3DContentItem) {
|
||||||
@@ -544,10 +551,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView()
|
|||||||
// send the rendered image to creator process
|
// send the rendered image to creator process
|
||||||
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Render3DView,
|
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Render3DView,
|
||||||
QVariant::fromValue(imgContainer)});
|
QVariant::fromValue(imgContainer)});
|
||||||
qDebug() << "\x1b[42m \x1b[1m" << __FUNCTION__
|
|
||||||
<< ", t=" << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()-t).count()
|
|
||||||
<< "\x1b[m";
|
|
||||||
|
|
||||||
if (m_needRender) {
|
if (m_needRender) {
|
||||||
m_renderTimer.start(0);
|
m_renderTimer.start(0);
|
||||||
m_needRender = false;
|
m_needRender = false;
|
||||||
@@ -880,7 +883,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
|
|||||||
m_active3DScene = m_3DSceneMap.begin().key();
|
m_active3DScene = m_3DSceneMap.begin().key();
|
||||||
m_active3DView = findView3DForSceneRoot(m_active3DScene);
|
m_active3DView = findView3DForSceneRoot(m_active3DScene);
|
||||||
}
|
}
|
||||||
if (m_active3DScene) {
|
|
||||||
createEditView3D();
|
createEditView3D();
|
||||||
if (!m_editView3DRootItem) {
|
if (!m_editView3DRootItem) {
|
||||||
m_active3DScene = nullptr;
|
m_active3DScene = nullptr;
|
||||||
@@ -905,7 +908,6 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
|
|||||||
updateActiveSceneToEditView3D();
|
updateActiveSceneToEditView3D();
|
||||||
|
|
||||||
createCameraAndLightGizmos(instanceList);
|
createCameraAndLightGizmos(instanceList);
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
Q_UNUSED(instanceList)
|
Q_UNUSED(instanceList)
|
||||||
Q_UNUSED(toolStates)
|
Q_UNUSED(toolStates)
|
||||||
|
|||||||
@@ -117,9 +117,7 @@ void Edit3DCanvas::dropEvent(QDropEvent *e)
|
|||||||
{
|
{
|
||||||
Q_UNUSED(e)
|
Q_UNUSED(e)
|
||||||
|
|
||||||
QmlVisualNode::createQmlVisualNode(m_parent->view(), m_itemLibraryEntry, m_activeScene, {});
|
QmlVisualNode::createQml3DNode(m_parent->view(), m_itemLibraryEntry, m_activeScene);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
QPointer<Edit3DWidget> m_parent;
|
QPointer<Edit3DWidget> m_parent;
|
||||||
QImage m_image;
|
QImage m_image;
|
||||||
qint32 m_activeScene;
|
qint32 m_activeScene = -1;
|
||||||
ItemLibraryEntry m_itemLibraryEntry;
|
ItemLibraryEntry m_itemLibraryEntry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -102,9 +102,9 @@ public:
|
|||||||
const Position &position,
|
const Position &position,
|
||||||
NodeAbstractProperty parentproperty);
|
NodeAbstractProperty parentproperty);
|
||||||
|
|
||||||
static QmlVisualNode createQmlVisualNode(AbstractView *view,
|
static QmlVisualNode createQml3DNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
qint32 sceneRootId, const QVector3D &position);
|
qint32 sceneRootId = -1, const QVector3D &position = {});
|
||||||
|
|
||||||
static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId);
|
static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId);
|
||||||
|
|
||||||
|
|||||||
@@ -1452,7 +1452,7 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm
|
|||||||
QDataStream stream(command.itemData());
|
QDataStream stream(command.itemData());
|
||||||
ItemLibraryEntry itemLibraryEntry;
|
ItemLibraryEntry itemLibraryEntry;
|
||||||
stream >> itemLibraryEntry;
|
stream >> itemLibraryEntry;
|
||||||
QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, command.sceneRootId(), {});
|
QmlVisualNode::createQml3DNode(this, itemLibraryEntry, command.sceneRootId(), {});
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command)
|
void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command)
|
||||||
|
|||||||
@@ -294,15 +294,16 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
|||||||
return newQmlObjectNode;
|
return newQmlObjectNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view,
|
QmlVisualNode QmlVisualNode::createQml3DNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
qint32 sceneRootId, const QVector3D &position)
|
qint32 sceneRootId, const QVector3D &position)
|
||||||
{
|
{
|
||||||
NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view, sceneRootId);
|
NodeAbstractProperty sceneNodeProperty = sceneRootId != -1 ? findSceneNodeProperty(view, sceneRootId)
|
||||||
QTC_ASSERT(sceneNodeProperty.isValid(), return {});
|
: view->rootModelNode().defaultNodeAbstractProperty();
|
||||||
ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
|
|
||||||
|
|
||||||
return node;
|
QTC_ASSERT(sceneNodeProperty.isValid(), return {});
|
||||||
|
|
||||||
|
return createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId)
|
NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId)
|
||||||
@@ -318,8 +319,7 @@ NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32
|
|||||||
|
|
||||||
bool QmlVisualNode::isFlowTransition(const ModelNode &node)
|
bool QmlVisualNode::isFlowTransition(const ModelNode &node)
|
||||||
{
|
{
|
||||||
return node.metaInfo().isValid()
|
return node.metaInfo().isValid() && node.metaInfo().isSubclassOf("FlowView.FlowTransition");
|
||||||
&& node.metaInfo().isSubclassOf("FlowView.FlowTransition");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QmlVisualNode::isFlowTransition() const
|
bool QmlVisualNode::isFlowTransition() const
|
||||||
|
|||||||
Reference in New Issue
Block a user