@@ -3768,8 +3768,13 @@ class TreeDelegate {
3768
3768
3769
3769
virtual void TreeDelegateDrawTreeItem (TreeItem &item, Window &window) = 0;
3770
3770
virtual void TreeDelegateGenerateChildren (TreeItem &item) = 0;
3771
+ virtual void TreeDelegateUpdateSelection (TreeItem &root, int &selection_index,
3772
+ TreeItem *&selected_item) {
3773
+ return ;
3774
+ }
3771
3775
virtual bool TreeDelegateItemSelected (
3772
3776
TreeItem &item) = 0; // Return true if we need to update views
3777
+ virtual bool TreeDelegateExpandRootByDefault () { return false ; }
3773
3778
};
3774
3779
3775
3780
typedef std::shared_ptr<TreeDelegate> TreeDelegateSP;
@@ -3779,7 +3784,10 @@ class TreeItem {
3779
3784
TreeItem (TreeItem *parent, TreeDelegate &delegate, bool might_have_children)
3780
3785
: m_parent(parent), m_delegate(delegate), m_user_data(nullptr ),
3781
3786
m_identifier (0 ), m_row_idx(-1 ), m_children(),
3782
- m_might_have_children(might_have_children), m_is_expanded(false ) {}
3787
+ m_might_have_children(might_have_children), m_is_expanded(false ) {
3788
+ if (m_parent == nullptr )
3789
+ m_is_expanded = m_delegate.TreeDelegateExpandRootByDefault ();
3790
+ }
3783
3791
3784
3792
TreeItem &operator =(const TreeItem &rhs) {
3785
3793
if (this != &rhs) {
@@ -4008,6 +4016,8 @@ class TreeWindowDelegate : public WindowDelegate {
4008
4016
const int num_visible_rows = NumVisibleRows ();
4009
4017
m_num_rows = 0 ;
4010
4018
m_root.CalculateRowIndexes (m_num_rows);
4019
+ m_delegate_sp->TreeDelegateUpdateSelection (m_root, m_selected_row_idx,
4020
+ m_selected_item);
4011
4021
4012
4022
// If we unexpanded while having something selected our total number of
4013
4023
// rows is less than the num visible rows, then make sure we show all the
@@ -4309,7 +4319,7 @@ class ThreadsTreeDelegate : public TreeDelegate {
4309
4319
public:
4310
4320
ThreadsTreeDelegate (Debugger &debugger)
4311
4321
: TreeDelegate(), m_thread_delegate_sp(), m_debugger(debugger),
4312
- m_stop_id (UINT32_MAX) {
4322
+ m_stop_id (UINT32_MAX), m_update_selection( false ) {
4313
4323
FormatEntity::Parse (" process ${process.id}{, name = ${process.name}}" ,
4314
4324
m_format);
4315
4325
}
@@ -4337,6 +4347,7 @@ class ThreadsTreeDelegate : public TreeDelegate {
4337
4347
4338
4348
void TreeDelegateGenerateChildren (TreeItem &item) override {
4339
4349
ProcessSP process_sp = GetProcess ();
4350
+ m_update_selection = false ;
4340
4351
if (process_sp && process_sp->IsAlive ()) {
4341
4352
StateType state = process_sp->GetState ();
4342
4353
if (StateIsStoppedState (state, true )) {
@@ -4345,6 +4356,7 @@ class ThreadsTreeDelegate : public TreeDelegate {
4345
4356
return ; // Children are already up to date
4346
4357
4347
4358
m_stop_id = stop_id;
4359
+ m_update_selection = true ;
4348
4360
4349
4361
if (!m_thread_delegate_sp) {
4350
4362
// Always expand the thread item the first time we show it
@@ -4356,24 +4368,58 @@ class ThreadsTreeDelegate : public TreeDelegate {
4356
4368
TreeItem t (&item, *m_thread_delegate_sp, false );
4357
4369
ThreadList &threads = process_sp->GetThreadList ();
4358
4370
std::lock_guard<std::recursive_mutex> guard (threads.GetMutex ());
4371
+ ThreadSP selected_thread = threads.GetSelectedThread ();
4359
4372
size_t num_threads = threads.GetSize ();
4360
4373
item.Resize (num_threads, t);
4361
4374
for (size_t i = 0 ; i < num_threads; ++i) {
4362
- item[i].SetIdentifier (threads.GetThreadAtIndex (i)->GetID ());
4375
+ ThreadSP thread = threads.GetThreadAtIndex (i);
4376
+ item[i].SetIdentifier (thread->GetID ());
4363
4377
item[i].SetMightHaveChildren (true );
4378
+ if (selected_thread->GetID () == thread->GetID ())
4379
+ item[i].Expand ();
4364
4380
}
4365
4381
return ;
4366
4382
}
4367
4383
}
4368
4384
item.ClearChildren ();
4369
4385
}
4370
4386
4387
+ void TreeDelegateUpdateSelection (TreeItem &root, int &selection_index,
4388
+ TreeItem *&selected_item) override {
4389
+ if (!m_update_selection)
4390
+ return ;
4391
+
4392
+ ProcessSP process_sp = GetProcess ();
4393
+ if (!(process_sp && process_sp->IsAlive ()))
4394
+ return ;
4395
+
4396
+ StateType state = process_sp->GetState ();
4397
+ if (!StateIsStoppedState (state, true ))
4398
+ return ;
4399
+
4400
+ ThreadList &threads = process_sp->GetThreadList ();
4401
+ std::lock_guard<std::recursive_mutex> guard (threads.GetMutex ());
4402
+ ThreadSP selected_thread = threads.GetSelectedThread ();
4403
+ size_t num_threads = threads.GetSize ();
4404
+ for (size_t i = 0 ; i < num_threads; ++i) {
4405
+ ThreadSP thread = threads.GetThreadAtIndex (i);
4406
+ if (selected_thread->GetID () == thread->GetID ()) {
4407
+ selected_item = &root[i][thread->GetSelectedFrameIndex ()];
4408
+ selection_index = selected_item->GetRowIndex ();
4409
+ return ;
4410
+ }
4411
+ }
4412
+ }
4413
+
4371
4414
bool TreeDelegateItemSelected (TreeItem &item) override { return false ; }
4372
4415
4416
+ bool TreeDelegateExpandRootByDefault () override { return true ; }
4417
+
4373
4418
protected:
4374
4419
std::shared_ptr<ThreadTreeDelegate> m_thread_delegate_sp;
4375
4420
Debugger &m_debugger;
4376
4421
uint32_t m_stop_id;
4422
+ bool m_update_selection;
4377
4423
FormatEntity::Entry m_format;
4378
4424
};
4379
4425
0 commit comments