From e30a916e19d97b6d4c889e1f7c9ee21434dd0dbd Mon Sep 17 00:00:00 2001 From: johnny-keker Date: Thu, 13 Apr 2023 03:36:23 +0200 Subject: [PATCH 1/3] building string representations for columns range modes --- VSRAD.Package/Utils/VisibleColumnsRange.cs | 41 +++++++++++++++++++ VSRAD.Package/VSRAD.Package.csproj | 1 + .../Utils/VisibleColumnsRangeTests.cs | 19 +++++++++ VSRAD.PackageTests/VSRAD.PackageTests.csproj | 1 + 4 files changed, 62 insertions(+) create mode 100644 VSRAD.Package/Utils/VisibleColumnsRange.cs create mode 100644 VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs diff --git a/VSRAD.Package/Utils/VisibleColumnsRange.cs b/VSRAD.Package/Utils/VisibleColumnsRange.cs new file mode 100644 index 000000000..f803d8c95 --- /dev/null +++ b/VSRAD.Package/Utils/VisibleColumnsRange.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VSRAD.Package.Utils +{ + public enum SelectorType + { + First, Last, Custom + } + + class VisibleColumnsRange + { + public SelectorType Type; + public int X; + public int Y; + public string Custom; + + public VisibleColumnsRange(SelectorType type, int x, int y) + { + Type = type; X = x; Y = y; + } + + public string GetRepresentation(uint groupSize, List range = null) + { + if (Type == SelectorType.Custom) return Custom; + + int cur = Type == SelectorType.First ? 0 : Y - X; + var sb = new StringBuilder(); + while (cur < groupSize) + { + sb.Append($"{cur}-{cur+X-1}:"); + if (range != null) range.AddRange(Enumerable.Range(cur, X)); + cur += Y; + } + return sb.ToString(); + } + } +} diff --git a/VSRAD.Package/VSRAD.Package.csproj b/VSRAD.Package/VSRAD.Package.csproj index 2a71f747d..c541d996a 100644 --- a/VSRAD.Package/VSRAD.Package.csproj +++ b/VSRAD.Package/VSRAD.Package.csproj @@ -249,6 +249,7 @@ + diff --git a/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs b/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs new file mode 100644 index 000000000..7f593f8ad --- /dev/null +++ b/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using VSRAD.Package.Utils; +using Xunit; + +namespace VSRAD.PackageTests.Utils +{ + public class VisibleColumnsRangeTests + { + [Fact] + public void TestString() + { + var range = new VisibleColumnsRange(SelectorType.First, 16, 64); + Assert.Equal("0-15:64-79:128-143:192-207:256-271:320-335:384-399:448-463:512-527:576-591:", range.GetRepresentation(640)); + + range = new VisibleColumnsRange(SelectorType.Last, 16, 64); + Assert.Equal("48-63:112-127:176-191:240-255:304-319:368-383:432-447:496-511:560-575:624-639:", range.GetRepresentation(640)); + } + } +} diff --git a/VSRAD.PackageTests/VSRAD.PackageTests.csproj b/VSRAD.PackageTests/VSRAD.PackageTests.csproj index 36cfc2f98..857092a8f 100644 --- a/VSRAD.PackageTests/VSRAD.PackageTests.csproj +++ b/VSRAD.PackageTests/VSRAD.PackageTests.csproj @@ -85,6 +85,7 @@ + From efac9235fd479ab3e19c1821680f5bf93846c6f6 Mon Sep 17 00:00:00 2001 From: johnny-keker Date: Thu, 13 Apr 2023 09:12:17 +0200 Subject: [PATCH 2/3] new selector logic --- .../DebugVisualizer/ColumnStylingOptions.cs | 3 +++ .../DebugVisualizer/ComputedColumnStyling.cs | 4 ++- .../ContextMenus/SubgroupContextMenu.cs | 13 +++++++--- VSRAD.Package/Utils/VisibleColumnsRange.cs | 26 ++++++++++++++++--- .../Utils/VisibleColumnsRangeTests.cs | 4 +-- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/VSRAD.Package/DebugVisualizer/ColumnStylingOptions.cs b/VSRAD.Package/DebugVisualizer/ColumnStylingOptions.cs index 564dd83e9..a3c44c142 100644 --- a/VSRAD.Package/DebugVisualizer/ColumnStylingOptions.cs +++ b/VSRAD.Package/DebugVisualizer/ColumnStylingOptions.cs @@ -7,6 +7,9 @@ public sealed class ColumnStylingOptions : DefaultNotifyPropertyChanged private string _visibleColumns = "0:1-8191"; public string VisibleColumns { get => _visibleColumns; set => SetField(ref _visibleColumns, value); } + private VisibleColumnsRange _range = new VisibleColumnsRange("0:1-8191"); + public VisibleColumnsRange Range { get => _range; set => SetField(ref _range, value); } + private string _backgroundColors; public string BackgroundColors { get => _backgroundColors; set => SetField(ref _backgroundColors, value); } diff --git a/VSRAD.Package/DebugVisualizer/ComputedColumnStyling.cs b/VSRAD.Package/DebugVisualizer/ComputedColumnStyling.cs index 3b99e72a0..f9db59b08 100644 --- a/VSRAD.Package/DebugVisualizer/ComputedColumnStyling.cs +++ b/VSRAD.Package/DebugVisualizer/ComputedColumnStyling.cs @@ -29,7 +29,9 @@ public void Recompute(VisualizerOptions options, VisualizerAppearance appearance Array.Resize(ref _columnState, (int)groupSize); Array.Clear(_columnState, 0, _columnState.Length); - foreach (int i in ColumnSelector.ToIndexes(styling.VisibleColumns, (int)groupSize)) + if (styling.Range == null) // TODO + styling.Range = new Utils.VisibleColumnsRange("0:1-8191"); + foreach (int i in styling.Range.GetRangeRepresentation(groupSize)) ColumnState[i] |= ColumnStates.Visible; ComputeInactiveLanes(options, system); diff --git a/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs b/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs index 54008ae4f..eb80f1d85 100644 --- a/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs +++ b/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs @@ -88,9 +88,12 @@ private void HideColumns(object sender, EventArgs e) private void SelectPartialSubgroups(uint subgroupSize, uint displayedCount, bool displayLast) { - string subgroupsSelector = ColumnSelector.PartialSubgroups(_getGroupSize(), subgroupSize, displayedCount, displayLast); - string newSelector = ColumnSelector.GetSelectorMultiplication(_stylingOptions.VisibleColumns, subgroupsSelector, _table.DataColumnCount); - SetColumnSelector(newSelector); + //string subgroupsSelector = ColumnSelector.PartialSubgroups(_getGroupSize(), subgroupSize, displayedCount, displayLast); + //string newSelector = ColumnSelector.GetSelectorMultiplication(_stylingOptions.VisibleColumns, subgroupsSelector, _table.DataColumnCount); + //SetColumnSelector(newSelector); + _stylingOptions.Range = new Utils.VisibleColumnsRange(displayLast ? Utils.SelectorType.Last : Utils.SelectorType.First, + (int)displayedCount, (int)subgroupSize); + _table.ClearSelection(); } private void SetBackgroundColor(DataHighlightColor color) @@ -109,7 +112,9 @@ private void SetForegroundColor(DataHighlightColor color) private void SetColumnSelector(string newSelector) { - _stylingOptions.VisibleColumns = newSelector; + //_stylingOptions.VisibleColumns = newSelector; + //_table.ClearSelection(); + _stylingOptions.Range = new Utils.VisibleColumnsRange(newSelector); _table.ClearSelection(); } diff --git a/VSRAD.Package/Utils/VisibleColumnsRange.cs b/VSRAD.Package/Utils/VisibleColumnsRange.cs index f803d8c95..79f39a7f8 100644 --- a/VSRAD.Package/Utils/VisibleColumnsRange.cs +++ b/VSRAD.Package/Utils/VisibleColumnsRange.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using VSRAD.Package.DebugVisualizer; namespace VSRAD.Package.Utils { @@ -11,7 +12,7 @@ public enum SelectorType First, Last, Custom } - class VisibleColumnsRange + public class VisibleColumnsRange { public SelectorType Type; public int X; @@ -23,7 +24,13 @@ public VisibleColumnsRange(SelectorType type, int x, int y) Type = type; X = x; Y = y; } - public string GetRepresentation(uint groupSize, List range = null) + public VisibleColumnsRange(string custom) + { + Type = SelectorType.Custom; + Custom = custom; + } + + public string GetStringRepresentation(uint groupSize) { if (Type == SelectorType.Custom) return Custom; @@ -32,10 +39,23 @@ public string GetRepresentation(uint groupSize, List range = null) while (cur < groupSize) { sb.Append($"{cur}-{cur+X-1}:"); - if (range != null) range.AddRange(Enumerable.Range(cur, X)); cur += Y; } return sb.ToString(); } + + public IEnumerable GetRangeRepresentation(uint groupSize) + { + if (Type == SelectorType.Custom) return ColumnSelector.ToIndexes(Custom, (int)groupSize); + + int cur = Type == SelectorType.First ? 0 : Y - X; + var res = new List(); + while (cur < groupSize) + { + res.AddRange(Enumerable.Range(cur, X)); + cur += Y; + } + return res; + } } } diff --git a/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs b/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs index 7f593f8ad..539c8b84d 100644 --- a/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs +++ b/VSRAD.PackageTests/Utils/VisibleColumnsRangeTests.cs @@ -10,10 +10,10 @@ public class VisibleColumnsRangeTests public void TestString() { var range = new VisibleColumnsRange(SelectorType.First, 16, 64); - Assert.Equal("0-15:64-79:128-143:192-207:256-271:320-335:384-399:448-463:512-527:576-591:", range.GetRepresentation(640)); + Assert.Equal("0-15:64-79:128-143:192-207:256-271:320-335:384-399:448-463:512-527:576-591:", range.GetStringRepresentation(640)); range = new VisibleColumnsRange(SelectorType.Last, 16, 64); - Assert.Equal("48-63:112-127:176-191:240-255:304-319:368-383:432-447:496-511:560-575:624-639:", range.GetRepresentation(640)); + Assert.Equal("48-63:112-127:176-191:240-255:304-319:368-383:432-447:496-511:560-575:624-639:", range.GetStringRepresentation(640)); } } } From 489059aded954dd37d0450f781390521f6bf6775 Mon Sep 17 00:00:00 2001 From: johnny-keker Date: Thu, 13 Apr 2023 09:35:02 +0200 Subject: [PATCH 3/3] reload gui on fly --- .../DebugVisualizer/ContextMenus/SubgroupContextMenu.cs | 1 + VSRAD.Package/DebugVisualizer/VisualizerControl.xaml.cs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs b/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs index eb80f1d85..d7986897d 100644 --- a/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs +++ b/VSRAD.Package/DebugVisualizer/ContextMenus/SubgroupContextMenu.cs @@ -93,6 +93,7 @@ private void SelectPartialSubgroups(uint subgroupSize, uint displayedCount, bool //SetColumnSelector(newSelector); _stylingOptions.Range = new Utils.VisibleColumnsRange(displayLast ? Utils.SelectorType.Last : Utils.SelectorType.First, (int)displayedCount, (int)subgroupSize); + _stylingOptions.VisibleColumns = _stylingOptions.Range.GetStringRepresentation(_getGroupSize()); _table.ClearSelection(); } diff --git a/VSRAD.Package/DebugVisualizer/VisualizerControl.xaml.cs b/VSRAD.Package/DebugVisualizer/VisualizerControl.xaml.cs index ac89a8564..71499e6d7 100644 --- a/VSRAD.Package/DebugVisualizer/VisualizerControl.xaml.cs +++ b/VSRAD.Package/DebugVisualizer/VisualizerControl.xaml.cs @@ -136,6 +136,10 @@ private void OptionsChanged(object sender, PropertyChangedEventArgs e) _table.SetScalingMode(_context.Options.VisualizerAppearance.ScalingMode); break; case nameof(Options.DebuggerOptions.GroupSize): + _context.Options.VisualizerColumnStyling.VisibleColumns + = _context.Options.VisualizerColumnStyling.Range.GetStringRepresentation(_context.Options.DebuggerOptions.GroupSize); + RefreshDataStyling(); + break; case nameof(Options.VisualizerOptions.MaskLanes): case nameof(Options.VisualizerOptions.CheckMagicNumber): case nameof(Options.VisualizerAppearance.LaneGrouping):