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);