From 55715512617f711f9bbdf68fd1440f84545e4efc Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 19 Jul 2011 22:39:05 +0000 Subject: [PATCH] For value nodes with deferred child creation, value loading needs to be requested once the deferred load has been complete, otherwise their values would never be loaded if their parent node was already expanded while stepping through the debugger. There still remains an issue with saving/restoring view state for such nodes though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42457 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../gui/team_window/VariablesView.cpp | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp index 265f3b2368..d293e9059a 100644 --- a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp @@ -48,7 +48,8 @@ enum { enum { - MSG_MODEL_NODE_HIDDEN = 'monh' + MSG_MODEL_NODE_HIDDEN = 'monh', + MSG_VALUE_NODE_NEEDS_VALUE = 'mvnv' }; @@ -70,6 +71,8 @@ public: virtual void ModelNodeHidden(ModelNode* node); + virtual void ModelNodeValueRequested(ModelNode* node); + private: BHandler* fIndirectTarget; VariableTableModel* fModel; @@ -689,6 +692,20 @@ VariablesView::ContainerListener::ModelNodeHidden(ModelNode* node) } +void +VariablesView::ContainerListener::ModelNodeValueRequested(ModelNode* node) +{ + BReference nodeReference(node); + + BMessage message(MSG_VALUE_NODE_NEEDS_VALUE); + if (message.AddPointer("node", node) == B_OK + && fIndirectTarget->Looper()->PostMessage(&message, fIndirectTarget) + == B_OK) { + nodeReference.Detach(); + } +} + + // #pragma mark - VariableTableModel @@ -845,6 +862,13 @@ VariablesView::VariableTableModel::ValueNodeChildrenCreated( _AddNode(modelNode->GetVariable(), modelNode, child, child->IsInternal(), childCount == 1); } + + if (valueNode->ChildCreationNeedsValue()) { + ModelNode* childNode = fNodeTable.Lookup(child); + if (childNode != NULL) + fContainerListener->ModelNodeValueRequested(childNode); + } + } } @@ -882,6 +906,12 @@ VariablesView::VariableTableModel::ValueNodeValueChanged(ValueNode* valueNode) status_t error = valueNode->CreateChildren(); if (error != B_OK) return; + + for (int32 i = 0; i < valueNode->CountChildren(); i++) { + ValueNodeChild* child = valueNode->ChildAt(i); + _CreateValueNode(child); + _AddChildNodes(child); + } } // check whether the value actually changed @@ -1407,6 +1437,7 @@ VariablesView::MessageReceived(BMessage* message) break; } + case MSG_VALUE_NODE_NEEDS_VALUE: case MSG_MODEL_NODE_HIDDEN: { ModelNode* node;