diff options
author | Greg Munn <gregm@microsoft.com> | 2019-11-26 18:50:37 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-26 18:50:37 +0300 |
commit | 41d6410fe5e80283612d4ceac04d21dd71e1e7d6 (patch) | |
tree | 5cb98082e42abbab771e63df29c63c435753b937 | |
parent | 37234f136d079b42e5deef1ca8f1f24628c73314 (diff) | |
parent | 261a2adac99e0d8b8a98ff15452d8fb93916ec04 (diff) |
Merge pull request #9355 from mono/jstedfast-debugger-load-children-incrementally
[Debugger] Incrementally load new children rather than remove-all and…
4 files changed, 92 insertions, 47 deletions
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs index 00e893bf9e..97cf84202a 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs @@ -25,12 +25,36 @@ // // +using System; + using Mono.Debugging.Client; namespace MonoDevelop.Debugger { public class LocalsPad : ObjectValuePad { + static readonly bool EnableFakeNodes; + + static LocalsPad () + { + var env = Environment.GetEnvironmentVariable ("VSMAC_DEBUGGER_TESTING"); + + if (!string.IsNullOrEmpty (env)) { + var options = env.Split (new char [] { ',' }); + + for (int i = 0; i < options.Length; i++) { + var option = options[i].Trim (); + + if (option == "fake-locals") { + EnableFakeNodes = true; + return; + } + } + } + + EnableFakeNodes = false; + } + public LocalsPad () { if (UseNewTreeView) { @@ -41,7 +65,6 @@ namespace MonoDevelop.Debugger } } -#if ADD_FAKE_NODES void AddFakeNodes () { var xx = new System.Collections.Generic.List<ObjectValueNode> (); @@ -60,7 +83,6 @@ namespace MonoDevelop.Debugger controller.AddValues (xx); } -#endif void ReloadValues () { @@ -84,9 +106,10 @@ namespace MonoDevelop.Debugger } finally { _treeview.EndUpdates (); } -#if ADD_FAKE_NODES - AddFakeNodes (); -#endif + + + if (EnableFakeNodes) + AddFakeNodes (); } else { tree.ClearValues (); tree.AddValues (locals); diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs index defc2afe67..c3607d30e2 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs @@ -348,19 +348,13 @@ namespace MonoDevelop.Debugger public override void ExpandItem (NSObject item, bool expandChildren) { - NSAnimationContext.BeginGrouping (); - NSAnimationContext.CurrentContext.Duration = 0; base.ExpandItem (item, expandChildren); - NSAnimationContext.EndGrouping (); OptimizeColumnSizes (); } public override void ExpandItem (NSObject item) { - NSAnimationContext.BeginGrouping (); - NSAnimationContext.CurrentContext.Duration = 0; base.ExpandItem (item); - NSAnimationContext.EndGrouping (); OptimizeColumnSizes (); } @@ -376,19 +370,13 @@ namespace MonoDevelop.Debugger public override void CollapseItem (NSObject item, bool collapseChildren) { - NSAnimationContext.BeginGrouping (); - NSAnimationContext.CurrentContext.Duration = 0; base.CollapseItem (item, collapseChildren); - NSAnimationContext.EndGrouping (); OptimizeColumnSizes (); } public override void CollapseItem (NSObject item) { - NSAnimationContext.BeginGrouping (); - NSAnimationContext.CurrentContext.Duration = 0; base.CollapseItem (item); - NSAnimationContext.EndGrouping (); OptimizeColumnSizes (); } @@ -551,7 +539,7 @@ namespace MonoDevelop.Debugger if (disposed) return; - dataSource.ReloadChildren (node); + dataSource.LoadChildren (node, startIndex, count); OptimizeColumnSizes (); } diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs index 8a4c282cfe..f3d89fd23f 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs @@ -89,7 +89,10 @@ namespace MonoDevelop.Debugger var value = new MacObjectValueNode (parent, node); mapping[node] = value; - parent.Children.Insert (index, value); + if (index < parent.Children.Count) + parent.Children.Insert (index, value); + else + parent.Children.Add (value); if (treeView.AllowExpanding) { foreach (var child in node.Children) @@ -181,7 +184,7 @@ namespace MonoDevelop.Debugger removed[i].Dispose (); } - public void ReloadChildren (ObjectValueNode node) + public void LoadChildren (ObjectValueNode node, int startIndex, int count) { if (!TryGetValue (node, out var parent)) return; @@ -189,36 +192,66 @@ namespace MonoDevelop.Debugger treeView.BeginUpdates (); try { - NSIndexSet indexes; + int lastIndex = parent.Children.Count - 1; + bool needShowMore = !node.ChildrenLoaded; + bool haveShowMore = false; + NSIndexSet indexes = null; NSRange range; - if (parent.Children.Count > 0) { - range = new NSRange (0, parent.Children.Count); - indexes = NSIndexSet.FromNSRange (range); + if (lastIndex >= 0 && parent.Children[lastIndex].Target is ShowMoreValuesObjectValueNode) + haveShowMore = true; + if (startIndex < parent.Children.Count) { + // Note: This can only happen if we have either a "Loading..." node or a "Show More" node. var removed = new List<MacObjectValueNode> (); - foreach (var child in parent.Children) - Remove (child, removed); - - parent.Children.Clear (); - - if (parent.Target is RootObjectValueNode) - treeView.RemoveItems (indexes, null, NSTableViewAnimation.None); - else - treeView.RemoveItems (indexes, parent, NSTableViewAnimation.None); - - for (int i = 0; i < removed.Count; i++) - removed[i].Dispose (); + int extra = parent.Children.Count - startIndex; + + if (lastIndex == 0 && parent.Children[0].Target is LoadingObjectValueNode) { + // Remove the "Loading..." node + indexes = NSIndexSet.FromIndex (0); + Remove (parent.Children[0], removed); + parent.Children.Clear (); + } else if (haveShowMore && extra == 1) { + // Only remove the "Show More" node if we don't need it anymore... + if (!needShowMore) { + indexes = NSIndexSet.FromIndex (lastIndex); + Remove (parent.Children[lastIndex], removed); + parent.Children.RemoveAt (lastIndex); + } + } else { + // Unexpected, but let's try to deal with this... + range = new NSRange (startIndex, extra); + indexes = NSIndexSet.FromNSRange (range); + + for (int i = parent.Children.Count - 1; i >= startIndex; i--) { + Remove (parent.Children[i], removed); + parent.Children.RemoveAt (i); + } + + haveShowMore = false; + } + + if (indexes != null) { + if (parent.Target is RootObjectValueNode) + treeView.RemoveItems (indexes, null, NSTableViewAnimation.None); + else + treeView.RemoveItems (indexes, parent, NSTableViewAnimation.None); + + for (int i = 0; i < removed.Count; i++) + removed[i].Dispose (); + } } - for (int i = 0; i < node.Children.Count; i++) - Add (parent, node.Children[i]); + for (int i = startIndex; i < startIndex + count; i++) + Insert (parent, i, node.Children[i]); - // if we did not load all the children, add a Show More node - if (!node.ChildrenLoaded) + // Add a "Show More" node only if we need one and don't already have one. + if (needShowMore && !haveShowMore) { Add (parent, new ShowMoreValuesObjectValueNode (node)); + count++; + } - range = new NSRange (0, parent.Children.Count); + range = new NSRange (startIndex, count); indexes = NSIndexSet.FromNSRange (range); if (parent.Target is RootObjectValueNode) diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs index 0183375d4f..614204b8cc 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs @@ -670,21 +670,22 @@ namespace MonoDevelop.Debugger node.IsExpanded = true; - int loadedCount = 0; + int index = node.Children.Count; + int count = 0; + if (node.IsEnumerable) { // if we already have some loaded, don't load more - that is a specific user gesture - if (node.Children.Count == 0) { + if (index == 0) { // page the children in, instead of loading them all at once - loadedCount = await FetchChildrenAsync (node, MaxEnumerableChildrenToFetch, cancellationTokenSource.Token); + count = await FetchChildrenAsync (node, MaxEnumerableChildrenToFetch, cancellationTokenSource.Token); } } else { - loadedCount = await FetchChildrenAsync (node, 0, cancellationTokenSource.Token); + count = await FetchChildrenAsync (node, -1, cancellationTokenSource.Token); } await Runtime.RunInMainThread (() => { // tell the view about the children, even if there are, in fact, none - view.LoadNodeChildren (node, 0, node.Children.Count); - + view.LoadNodeChildren (node, index, count); view.OnNodeExpanded (node); }); } |