Skip to content

Commit 0e94ec2

Browse files
Merge pull request #866 from mehrabiworkmail/added_sort_children_by_duration
Added "Sort children by duration" to tree nodes
2 parents 29269c0 + 550df47 commit 0e94ec2

File tree

3 files changed

+65
-13
lines changed

3 files changed

+65
-13
lines changed

src/StructuredLogViewer.Avalonia/Controls/BuildControl.xaml.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public partial class BuildControl : UserControl
3535

3636
private MenuItem copyItem;
3737
private MenuItem copySubtreeItem;
38-
private MenuItem sortChildrenItem;
38+
private MenuItem sortChildrenByNameItem;
39+
private MenuItem sortChildrenByDurationItem;
3940
private MenuItem copyNameItem;
4041
private MenuItem copyValueItem;
4142
private MenuItem viewSourceItem;
@@ -164,15 +165,17 @@ public BuildControl(Build build, string logFilePath)
164165
//contextMenu.Opened += ContextMenu_Opened;
165166
copyItem = new MenuItem() { Header = "Copy" };
166167
copySubtreeItem = new MenuItem() { Header = "Copy subtree" };
167-
sortChildrenItem = new MenuItem() { Header = "Sort children" };
168+
sortChildrenByNameItem = new MenuItem() { Header = "Sort children by name" };
169+
sortChildrenByDurationItem = new MenuItem() { Header = "Sort children by duration" };
168170
copyNameItem = new MenuItem() { Header = "Copy name" };
169171
copyValueItem = new MenuItem() { Header = "Copy value" };
170172
viewSourceItem = new MenuItem() { Header = "View source" };
171173
preprocessItem = new MenuItem() { Header = "Preprocess" };
172174
hideItem = new MenuItem() { Header = "Hide" };
173175
copyItem.Click += (s, a) => Copy();
174176
copySubtreeItem.Click += (s, a) => CopySubtree(treeView);
175-
sortChildrenItem.Click += (s, a) => SortChildren();
177+
sortChildrenByNameItem.Click += (s, a) => SortChildrenByName();
178+
sortChildrenByDurationItem.Click += (s, a) => SortChildrenByDuration();
176179
copyNameItem.Click += (s, a) => CopyName();
177180
copyValueItem.Click += (s, a) => CopyValue();
178181
viewSourceItem.Click += (s, a) => Invoke(treeView.SelectedItem as BaseNode);
@@ -182,7 +185,8 @@ public BuildControl(Build build, string logFilePath)
182185
contextMenu.AddItem(preprocessItem);
183186
contextMenu.AddItem(copyItem);
184187
contextMenu.AddItem(copySubtreeItem);
185-
contextMenu.AddItem(sortChildrenItem);
188+
contextMenu.AddItem(sortChildrenByNameItem);
189+
contextMenu.AddItem(sortChildrenByDurationItem);
186190
contextMenu.AddItem(copyNameItem);
187191
contextMenu.AddItem(copyValueItem);
188192
contextMenu.AddItem(hideItem);
@@ -475,7 +479,8 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
475479
viewSourceItem.IsVisible = CanView(node);
476480
var hasChildren = node is TreeNode t && t.HasChildren;
477481
copySubtreeItem.IsVisible = hasChildren;
478-
sortChildrenItem.IsVisible = hasChildren;
482+
sortChildrenByNameItem.IsVisible = hasChildren;
483+
sortChildrenByDurationItem.IsVisible = hasChildren;
479484
preprocessItem.IsVisible = node is IPreprocessable p && preprocessedFileManager.CanPreprocess(p);
480485
}
481486

@@ -1006,7 +1011,7 @@ public void CopySubtree(TreeView tree = null)
10061011
}
10071012
}
10081013

1009-
public void SortChildren()
1014+
public void SortChildrenByName()
10101015
{
10111016
var selectedItem = treeView.SelectedItem;
10121017
if (selectedItem is TreeNode treeNode)
@@ -1015,6 +1020,15 @@ public void SortChildren()
10151020
}
10161021
}
10171022

1023+
public void SortChildrenByDuration()
1024+
{
1025+
var selectedItem = treeView.SelectedItem;
1026+
if (selectedItem is TreeNode treeNode)
1027+
{
1028+
treeNode.SortChildren(TreeNode.CompareByDuration);
1029+
}
1030+
}
1031+
10181032
private void CopyAll(TreeView tree = null)
10191033
{
10201034
tree = tree ?? ActiveTreeView;

src/StructuredLogViewer/Controls/BuildControl.xaml.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public partial class BuildControl : UserControl
5151
private MenuItem goToTimeLineItem;
5252
private MenuItem goToTracingItem;
5353
private MenuItem copyChildrenItem;
54-
private MenuItem sortChildrenItem;
54+
private MenuItem sortChildrenByNameItem;
55+
private MenuItem sortChildrenByDurationItem;
5556
private MenuItem filterChildrenItem;
5657
private MenuItem copyNameItem;
5758
private MenuItem copyValueItem;
@@ -217,7 +218,8 @@ public BuildControl(Build build, string logFilePath)
217218
goToTimeLineItem = new MenuItem() { Header = "Timeline" };
218219
goToTracingItem = new MenuItem() { Header = "Tracing" };
219220
copyChildrenItem = new MenuItem() { Header = "Copy children" };
220-
sortChildrenItem = new MenuItem() { Header = "Sort children" };
221+
sortChildrenByNameItem = new MenuItem() { Header = "Sort children by name" };
222+
sortChildrenByDurationItem = new MenuItem() { Header = "Sort children by duration" };
221223
filterChildrenItem = new MenuItem() { Header = "Filter children (Ctrl+F)" };
222224
copyNameItem = new MenuItem() { Header = "Copy name" };
223225
copyValueItem = new MenuItem() { Header = "Copy value" };
@@ -255,7 +257,8 @@ public BuildControl(Build build, string logFilePath)
255257
goToTimeLineItem.Click += (s, a) => GoToTimeLine();
256258
goToTracingItem.Click += (s, a) => GoToTracing();
257259
copyChildrenItem.Click += (s, a) => CopyChildren();
258-
sortChildrenItem.Click += (s, a) => SortChildren();
260+
sortChildrenByNameItem.Click += (s, a) => SortChildrenByName();
261+
sortChildrenByDurationItem.Click += (s, a) => SortChildrenByDuration();
259262
filterChildrenItem.Click += (s, a) => FilterChildren();
260263
copyNameItem.Click += (s, a) => CopyName();
261264
copyValueItem.Click += (s, a) => CopyValue();
@@ -313,7 +316,8 @@ public BuildControl(Build build, string logFilePath)
313316

314317
contextMenu.AddItem(separator1);
315318

316-
contextMenu.AddItem(sortChildrenItem);
319+
contextMenu.AddItem(sortChildrenByNameItem);
320+
contextMenu.AddItem(sortChildrenByDurationItem);
317321
contextMenu.AddItem(filterChildrenItem);
318322
contextMenu.AddItem(hideItem);
319323

@@ -460,7 +464,8 @@ public void Dispose()
460464
goToTimeLineItem = null;
461465
goToTracingItem = null;
462466
copyChildrenItem = null;
463-
sortChildrenItem = null;
467+
sortChildrenByNameItem = null;
468+
sortChildrenByDurationItem = null;
464469
filterChildrenItem = null;
465470
copyNameItem = null;
466471
copyValueItem = null;
@@ -939,7 +944,8 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
939944
copySubtreeItem.Visibility = hasChildrenVisibility;
940945
viewSubtreeTextItem.Visibility = hasChildrenVisibility;
941946
copyChildrenItem.Visibility = hasChildrenVisibility;
942-
sortChildrenItem.Visibility = hasChildrenVisibility;
947+
sortChildrenByNameItem.Visibility = hasChildrenVisibility;
948+
sortChildrenByDurationItem.Visibility = hasChildrenVisibility;
943949
filterChildrenItem.Visibility = hasChildrenVisibility;
944950
preprocessItem.Visibility = node is IPreprocessable p && preprocessedFileManager.CanPreprocess(p) ? Visibility.Visible : Visibility.Collapsed;
945951
searchNuGetItem.Visibility = node is IProjectOrEvaluation ? Visibility.Visible : Visibility.Collapsed;
@@ -2106,7 +2112,7 @@ public void CopyChildren()
21062112
}
21072113
}
21082114

2109-
public void SortChildren()
2115+
public void SortChildrenByName()
21102116
{
21112117
var selectedItem = treeView.SelectedItem;
21122118
if (selectedItem is TreeNode treeNode)
@@ -2115,6 +2121,15 @@ public void SortChildren()
21152121
}
21162122
}
21172123

2124+
public void SortChildrenByDuration()
2125+
{
2126+
var selectedItem = treeView.SelectedItem;
2127+
if (selectedItem is TreeNode treeNode)
2128+
{
2129+
treeNode.SortChildren(TreeNode.CompareByDuration);
2130+
}
2131+
}
2132+
21182133
public void FilterChildren()
21192134
{
21202135
IsFindVisible = !IsFindVisible;

src/StructuredLogger/ObjectModel/TreeNode.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,29 @@ public void EnsureChildrenCapacity(int capacity)
9898
private static int CompareByToString(BaseNode o1, BaseNode o2)
9999
=> string.Compare(o1.ToString(), o2.ToString(), StringComparison.OrdinalIgnoreCase);
100100

101+
public static int CompareByDuration(BaseNode o1, BaseNode o2)
102+
{
103+
TimedNode timedNode1 = o1 as TimedNode;
104+
TimedNode timedNode2 = o2 as TimedNode;
105+
106+
if (timedNode1 != null && timedNode2 != null)
107+
{
108+
return timedNode2.Duration.CompareTo(timedNode1.Duration);
109+
}
110+
else if (timedNode1 != null)
111+
{
112+
return -1;
113+
}
114+
else if (timedNode2 != null)
115+
{
116+
return 1;
117+
}
118+
else
119+
{
120+
return CompareByToString(o1, o2);
121+
}
122+
}
123+
101124
public void SortChildren(Comparison<BaseNode> comparison = null)
102125
{
103126
if (children == null || children.Count < 2)

0 commit comments

Comments
 (0)