From aa069e23fa0e61fe876bbff5c95a9f26e8236f4d Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Mon, 4 Jul 2011 12:41:58 +0000 Subject: [PATCH] Add a listener hook to notify the parent when model nodes are marked hidden. This allows the variables view to request value/location resolution for those nodes as needed, since it's otherwise unaware of their existence. This is necessary in order to correctly handle nodes which require resolution to happen in order to publish their children, since their value would otherwise never be requested when they're hidden by virtue of being the child of an address node. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42369 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../gui/team_window/VariablesView.cpp | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) 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 e1d8f53f62..73a8dcd3cf 100644 --- a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp @@ -46,6 +46,12 @@ enum { VALUE_NODE_TYPE = 'valn' }; + +enum { + MSG_MODEL_NODE_HIDDEN = 'monh' +}; + + // maximum number of array elements to show by default static const uint64 kMaxArrayElementCount = 10; @@ -62,6 +68,8 @@ public: virtual void ValueNodeChildrenDeleted(ValueNode* node); virtual void ValueNodeValueChanged(ValueNode* node); + virtual void ModelNodeHidden(ModelNode* node); + private: BHandler* fIndirectTarget; VariableTableModel* fModel; @@ -356,6 +364,7 @@ public: void NodeExpanded(ModelNode* node); void NotifyNodeChanged(ModelNode* node); + void NotifyNodeHidden(ModelNode* node); private: struct NodeHashDefinition { @@ -666,6 +675,20 @@ VariablesView::ContainerListener::ValueNodeValueChanged(ValueNode* node) } +void +VariablesView::ContainerListener::ModelNodeHidden(ModelNode* node) +{ + BReference nodeReference(node); + + BMessage message(MSG_MODEL_NODE_HIDDEN); + if (message.AddPointer("node", node) == B_OK + && fIndirectTarget->Looper()->PostMessage(&message, fIndirectTarget) + == B_OK) { + nodeReference.Detach(); + } +} + + // #pragma mark - VariableTableModel @@ -1002,6 +1025,13 @@ VariablesView::VariableTableModel::NotifyNodeChanged(ModelNode* node) } +void +VariablesView::VariableTableModel::NotifyNodeHidden(ModelNode* node) +{ + fContainerListener->ModelNodeHidden(node); +} + + status_t VariablesView::VariableTableModel::_AddNode(Variable* variable, ModelNode* parent, ValueNodeChild* nodeChild, bool isPresentationNode, @@ -1047,6 +1077,7 @@ VariablesView::VariableTableModel::_AddNode(Variable* variable, == TYPE_ADDRESS && nodeChildRawType->Kind() == TYPE_COMPOUND) { node->SetHidden(true); + NotifyNodeHidden(node); } } @@ -1372,6 +1403,14 @@ VariablesView::MessageReceived(BMessage* message) break; } + case MSG_MODEL_NODE_HIDDEN: + { + ModelNode* node; + if (message->FindPointer("node", (void**)&node) == B_OK) + _RequestNodeValue(node); + + break; + } case MSG_VARIABLES_VIEW_CONTEXT_MENU_DONE: { _FinishContextMenu(false);