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,33 +62,42 @@ Item {
|
||||
onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective)
|
||||
onShowEditLightChanged: _generalHelper.storeToolState(sceneId,"showEditLight", showEditLight)
|
||||
onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation)
|
||||
onActiveSceneChanged: updateActiveScene();
|
||||
|
||||
onActiveSceneChanged: {
|
||||
function updateActiveScene()
|
||||
{
|
||||
if (editView) {
|
||||
// Destroy is async, so make sure we don't get any more updates for the old editView
|
||||
_generalHelper.enableItemUpdate(editView, false);
|
||||
editView.destroy();
|
||||
}
|
||||
if (activeScene) {
|
||||
// importScene cannot be updated after initial set, so we need to reconstruct entire View3D
|
||||
var component = Qt.createComponent("SceneView3D.qml");
|
||||
if (component.status === Component.Ready) {
|
||||
editView = component.createObject(viewRect,
|
||||
{"usePerspective": usePerspective,
|
||||
"showSceneLight": showEditLight,
|
||||
"importScene": activeScene,
|
||||
"cameraZoomFactor": cameraControl._zoomFactor,
|
||||
"z": 1});
|
||||
editView.usePerspective = Qt.binding(function() {return usePerspective;});
|
||||
editView.showSceneLight = Qt.binding(function() {return showEditLight;});
|
||||
editView.cameraZoomFactor = Qt.binding(function() {return cameraControl._zoomFactor;});
|
||||
|
||||
selectionBoxes.length = 0;
|
||||
updateToolStates(_generalHelper.getToolStates(sceneId), true);
|
||||
}
|
||||
// importScene cannot be updated after initial set, so we need to reconstruct entire View3D
|
||||
var component = Qt.createComponent("SceneView3D.qml");
|
||||
if (component.status === Component.Ready) {
|
||||
editView = component.createObject(viewRect,
|
||||
{"usePerspective": usePerspective,
|
||||
"showSceneLight": showEditLight,
|
||||
"importScene": activeScene,
|
||||
"cameraZoomFactor": cameraControl._zoomFactor,
|
||||
"z": 1});
|
||||
editView.usePerspective = Qt.binding(function() {return usePerspective;});
|
||||
editView.showSceneLight = Qt.binding(function() {return showEditLight;});
|
||||
editView.cameraZoomFactor = Qt.binding(function() {return cameraControl._zoomFactor;});
|
||||
|
||||
selectionBoxes.length = 0;
|
||||
updateToolStates(_generalHelper.getToolStates(sceneId), true);
|
||||
}
|
||||
}
|
||||
|
||||
function clearActiveScene()
|
||||
{
|
||||
activeScene = null;
|
||||
sceneId = "";
|
||||
|
||||
updateActiveScene();
|
||||
}
|
||||
|
||||
// Disables edit view update if scene doesn't match current activeScene.
|
||||
// If it matches, updates are enabled.
|
||||
function enableEditViewUpdate(scene)
|
||||
|
||||
@@ -420,14 +420,22 @@ void Qt5InformationNodeInstanceServer::updateActiveSceneToEditView3D()
|
||||
sceneIdVar = QVariant::fromValue(sceneId);
|
||||
sceneIdProperty.write(sceneIdVar);
|
||||
|
||||
QQmlProperty sceneProperty(m_editView3DRootItem, "activeScene", context());
|
||||
sceneProperty.write(activeSceneVar);
|
||||
|
||||
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
|
||||
QVariantMap toolStates;
|
||||
if (helper)
|
||||
toolStates = helper->getToolStates(sceneId);
|
||||
toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId()));
|
||||
|
||||
// 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());
|
||||
sceneProperty.write(activeSceneVar);
|
||||
|
||||
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
|
||||
if (helper)
|
||||
toolStates = helper->getToolStates(sceneId);
|
||||
toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId()));
|
||||
}
|
||||
|
||||
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ActiveSceneChanged,
|
||||
toolStates});
|
||||
@@ -514,7 +522,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView()
|
||||
{
|
||||
static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW");
|
||||
if (m_editView3DRootItem && !showEditView) {
|
||||
auto t = std::chrono::steady_clock::now();
|
||||
if (!m_editView3DContentItem) {
|
||||
m_editView3DContentItem = QQmlProperty::read(m_editView3DRootItem, "contentItem").value<QQuickItem *>();
|
||||
if (m_editView3DContentItem) {
|
||||
@@ -544,10 +551,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView()
|
||||
// send the rendered image to creator process
|
||||
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Render3DView,
|
||||
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) {
|
||||
m_renderTimer.start(0);
|
||||
m_needRender = false;
|
||||
@@ -880,32 +883,31 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
|
||||
m_active3DScene = m_3DSceneMap.begin().key();
|
||||
m_active3DView = findView3DForSceneRoot(m_active3DScene);
|
||||
}
|
||||
if (m_active3DScene) {
|
||||
createEditView3D();
|
||||
if (!m_editView3DRootItem) {
|
||||
m_active3DScene = nullptr;
|
||||
m_active3DView = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
|
||||
if (helper) {
|
||||
auto it = toolStates.constBegin();
|
||||
while (it != toolStates.constEnd()) {
|
||||
helper->initToolStates(it.key(), it.value());
|
||||
++it;
|
||||
}
|
||||
helper->restoreWindowState();
|
||||
if (toolStates.contains(helper->globalStateId())
|
||||
&& toolStates[helper->globalStateId()].contains("rootSize")) {
|
||||
m_editView3DRootItem->setSize(toolStates[helper->globalStateId()]["rootSize"].value<QSize>());
|
||||
}
|
||||
}
|
||||
|
||||
updateActiveSceneToEditView3D();
|
||||
|
||||
createCameraAndLightGizmos(instanceList);
|
||||
createEditView3D();
|
||||
if (!m_editView3DRootItem) {
|
||||
m_active3DScene = nullptr;
|
||||
m_active3DView = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
|
||||
if (helper) {
|
||||
auto it = toolStates.constBegin();
|
||||
while (it != toolStates.constEnd()) {
|
||||
helper->initToolStates(it.key(), it.value());
|
||||
++it;
|
||||
}
|
||||
helper->restoreWindowState();
|
||||
if (toolStates.contains(helper->globalStateId())
|
||||
&& toolStates[helper->globalStateId()].contains("rootSize")) {
|
||||
m_editView3DRootItem->setSize(toolStates[helper->globalStateId()]["rootSize"].value<QSize>());
|
||||
}
|
||||
}
|
||||
|
||||
updateActiveSceneToEditView3D();
|
||||
|
||||
createCameraAndLightGizmos(instanceList);
|
||||
#else
|
||||
Q_UNUSED(instanceList)
|
||||
Q_UNUSED(toolStates)
|
||||
|
||||
@@ -117,9 +117,7 @@ void Edit3DCanvas::dropEvent(QDropEvent *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:
|
||||
QPointer<Edit3DWidget> m_parent;
|
||||
QImage m_image;
|
||||
qint32 m_activeScene;
|
||||
qint32 m_activeScene = -1;
|
||||
ItemLibraryEntry m_itemLibraryEntry;
|
||||
};
|
||||
|
||||
|
||||
@@ -102,9 +102,9 @@ public:
|
||||
const Position &position,
|
||||
NodeAbstractProperty parentproperty);
|
||||
|
||||
static QmlVisualNode createQmlVisualNode(AbstractView *view,
|
||||
static QmlVisualNode createQml3DNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
qint32 sceneRootId, const QVector3D &position);
|
||||
qint32 sceneRootId = -1, const QVector3D &position = {});
|
||||
|
||||
static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId);
|
||||
|
||||
|
||||
@@ -1452,7 +1452,7 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm
|
||||
QDataStream stream(command.itemData());
|
||||
ItemLibraryEntry itemLibraryEntry;
|
||||
stream >> itemLibraryEntry;
|
||||
QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, command.sceneRootId(), {});
|
||||
QmlVisualNode::createQml3DNode(this, itemLibraryEntry, command.sceneRootId(), {});
|
||||
}
|
||||
|
||||
void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command)
|
||||
|
||||
@@ -294,15 +294,16 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||
return newQmlObjectNode;
|
||||
}
|
||||
|
||||
QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
qint32 sceneRootId, const QVector3D &position)
|
||||
QmlVisualNode QmlVisualNode::createQml3DNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
qint32 sceneRootId, const QVector3D &position)
|
||||
{
|
||||
NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view, sceneRootId);
|
||||
QTC_ASSERT(sceneNodeProperty.isValid(), return {});
|
||||
ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
|
||||
NodeAbstractProperty sceneNodeProperty = sceneRootId != -1 ? findSceneNodeProperty(view, sceneRootId)
|
||||
: view->rootModelNode().defaultNodeAbstractProperty();
|
||||
|
||||
return node;
|
||||
QTC_ASSERT(sceneNodeProperty.isValid(), return {});
|
||||
|
||||
return createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
|
||||
}
|
||||
|
||||
NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId)
|
||||
@@ -318,8 +319,7 @@ NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32
|
||||
|
||||
bool QmlVisualNode::isFlowTransition(const ModelNode &node)
|
||||
{
|
||||
return node.metaInfo().isValid()
|
||||
&& node.metaInfo().isSubclassOf("FlowView.FlowTransition");
|
||||
return node.metaInfo().isValid() && node.metaInfo().isSubclassOf("FlowView.FlowTransition");
|
||||
}
|
||||
|
||||
bool QmlVisualNode::isFlowTransition() const
|
||||
|
||||
Reference in New Issue
Block a user