@@ -3361,8 +3361,13 @@ class TreeDelegate {
3361
3361
3362
3362
virtual void TreeDelegateDrawTreeItem (TreeItem &item, Window &window) = 0;
3363
3363
virtual void TreeDelegateGenerateChildren (TreeItem &item) = 0;
3364
+ virtual void TreeDelegateUpdateSelection (TreeItem &root, int &selection_index,
3365
+ TreeItem *&selected_item) {
3366
+ return ;
3367
+ }
3364
3368
virtual bool TreeDelegateItemSelected (
3365
3369
TreeItem &item) = 0; // Return true if we need to update views
3370
+ virtual bool TreeDelegateExpandRootByDefault () { return false ; }
3366
3371
};
3367
3372
3368
3373
typedef std::shared_ptr<TreeDelegate> TreeDelegateSP;
@@ -3372,7 +3377,10 @@ class TreeItem {
3372
3377
TreeItem (TreeItem *parent, TreeDelegate &delegate, bool might_have_children)
3373
3378
: m_parent(parent), m_delegate(delegate), m_user_data(nullptr ),
3374
3379
m_identifier (0 ), m_row_idx(-1 ), m_children(),
3375
- m_might_have_children(might_have_children), m_is_expanded(false ) {}
3380
+ m_might_have_children(might_have_children), m_is_expanded(false ) {
3381
+ if (m_parent == nullptr )
3382
+ m_is_expanded = m_delegate.TreeDelegateExpandRootByDefault ();
3383
+ }
3376
3384
3377
3385
TreeItem &operator =(const TreeItem &rhs) {
3378
3386
if (this != &rhs) {
@@ -3601,6 +3609,8 @@ class TreeWindowDelegate : public WindowDelegate {
3601
3609
const int num_visible_rows = NumVisibleRows ();
3602
3610
m_num_rows = 0 ;
3603
3611
m_root.CalculateRowIndexes (m_num_rows);
3612
+ m_delegate_sp->TreeDelegateUpdateSelection (m_root, m_selected_row_idx,
3613
+ m_selected_item);
3604
3614
3605
3615
// If we unexpanded while having something selected our total number of
3606
3616
// rows is less than the num visible rows, then make sure we show all the
@@ -3902,7 +3912,7 @@ class ThreadsTreeDelegate : public TreeDelegate {
3902
3912
public:
3903
3913
ThreadsTreeDelegate (Debugger &debugger)
3904
3914
: TreeDelegate(), m_thread_delegate_sp(), m_debugger(debugger),
3905
- m_stop_id (UINT32_MAX) {
3915
+ m_stop_id (UINT32_MAX), m_update_selection( false ) {
3906
3916
FormatEntity::Parse (" process ${process.id}{, name = ${process.name}}" ,
3907
3917
m_format);
3908
3918
}
@@ -3930,6 +3940,7 @@ class ThreadsTreeDelegate : public TreeDelegate {
3930
3940
3931
3941
void TreeDelegateGenerateChildren (TreeItem &item) override {
3932
3942
ProcessSP process_sp = GetProcess ();
3943
+ m_update_selection = false ;
3933
3944
if (process_sp && process_sp->IsAlive ()) {
3934
3945
StateType state = process_sp->GetState ();
3935
3946
if (StateIsStoppedState (state, true )) {
@@ -3938,6 +3949,7 @@ class ThreadsTreeDelegate : public TreeDelegate {
3938
3949
return ; // Children are already up to date
3939
3950
3940
3951
m_stop_id = stop_id;
3952
+ m_update_selection = true ;
3941
3953
3942
3954
if (!m_thread_delegate_sp) {
3943
3955
// Always expand the thread item the first time we show it
@@ -3949,24 +3961,58 @@ class ThreadsTreeDelegate : public TreeDelegate {
3949
3961
TreeItem t (&item, *m_thread_delegate_sp, false );
3950
3962
ThreadList &threads = process_sp->GetThreadList ();
3951
3963
std::lock_guard<std::recursive_mutex> guard (threads.GetMutex ());
3964
+ ThreadSP selected_thread = threads.GetSelectedThread ();
3952
3965
size_t num_threads = threads.GetSize ();
3953
3966
item.Resize (num_threads, t);
3954
3967
for (size_t i = 0 ; i < num_threads; ++i) {
3955
- item[i].SetIdentifier (threads.GetThreadAtIndex (i)->GetID ());
3968
+ ThreadSP thread = threads.GetThreadAtIndex (i);
3969
+ item[i].SetIdentifier (thread->GetID ());
3956
3970
item[i].SetMightHaveChildren (true );
3971
+ if (selected_thread->GetID () == thread->GetID ())
3972
+ item[i].Expand ();
3957
3973
}
3958
3974
return ;
3959
3975
}
3960
3976
}
3961
3977
item.ClearChildren ();
3962
3978
}
3963
3979
3980
+ void TreeDelegateUpdateSelection (TreeItem &root, int &selection_index,
3981
+ TreeItem *&selected_item) override {
3982
+ if (!m_update_selection)
3983
+ return ;
3984
+
3985
+ ProcessSP process_sp = GetProcess ();
3986
+ if (!(process_sp && process_sp->IsAlive ()))
3987
+ return ;
3988
+
3989
+ StateType state = process_sp->GetState ();
3990
+ if (!StateIsStoppedState (state, true ))
3991
+ return ;
3992
+
3993
+ ThreadList &threads = process_sp->GetThreadList ();
3994
+ std::lock_guard<std::recursive_mutex> guard (threads.GetMutex ());
3995
+ ThreadSP selected_thread = threads.GetSelectedThread ();
3996
+ size_t num_threads = threads.GetSize ();
3997
+ for (size_t i = 0 ; i < num_threads; ++i) {
3998
+ ThreadSP thread = threads.GetThreadAtIndex (i);
3999
+ if (selected_thread->GetID () == thread->GetID ()) {
4000
+ selected_item = &root[i][thread->GetSelectedFrameIndex ()];
4001
+ selection_index = selected_item->GetRowIndex ();
4002
+ return ;
4003
+ }
4004
+ }
4005
+ }
4006
+
3964
4007
bool TreeDelegateItemSelected (TreeItem &item) override { return false ; }
3965
4008
4009
+ bool TreeDelegateExpandRootByDefault () override { return true ; }
4010
+
3966
4011
protected:
3967
4012
std::shared_ptr<ThreadTreeDelegate> m_thread_delegate_sp;
3968
4013
Debugger &m_debugger;
3969
4014
uint32_t m_stop_id;
4015
+ bool m_update_selection;
3970
4016
FormatEntity::Entry m_format;
3971
4017
};
3972
4018
0 commit comments