Skip to content

Commit d88c168

Browse files
committed
refactor coverage colors
1 parent e9e6de9 commit d88c168

File tree

3 files changed

+40
-73
lines changed

3 files changed

+40
-73
lines changed

SharedProject/Impl/CoverageColorProvider.cs

Lines changed: 27 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.VisualStudio;
66
using Microsoft.VisualStudio.Shell;
77
using Microsoft.VisualStudio.Shell.Interop;
8+
using Task = System.Threading.Tasks.Task;
89

910
namespace FineCodeCoverage.Impl
1011
{
@@ -18,47 +19,13 @@ internal class CoverageColorProvider : ICoverageColoursProvider, ICoverageColour
1819
private System.Windows.Media.Color defaultCoverageTouchedArea = System.Windows.Media.Colors.Green;
1920
private System.Windows.Media.Color defaultCoverageNotTouchedArea = System.Windows.Media.Colors.Red;
2021
private System.Windows.Media.Color defaultCoveragePartiallyTouchedArea = System.Windows.Media.Color.FromRgb(255, 165, 0);
21-
private System.Windows.Media.Color coverageTouchedArea;
22-
private System.Windows.Media.Color coverageNotTouchedArea;
23-
private System.Windows.Media.Color coveragePartiallyTouchedArea;
24-
public System.Windows.Media.Color CoverageTouchedArea {
25-
get {
26-
UpdateFromFontsAndColorsIfNecessary();
27-
return coverageTouchedArea;
28-
}
29-
private set
30-
{
31-
coverageTouchedArea = value;
32-
}
33-
}
22+
public System.Windows.Media.Color CoverageTouchedArea { get; set; }
3423

35-
public System.Windows.Media.Color CoverageNotTouchedArea {
36-
get
37-
{
38-
UpdateFromFontsAndColorsIfNecessary();
39-
return coverageNotTouchedArea;
40-
}
41-
private set
42-
{
43-
coverageNotTouchedArea = value;
44-
}
45-
}
24+
public System.Windows.Media.Color CoverageNotTouchedArea { get; set; }
4625

47-
public System.Windows.Media.Color CoveragePartiallyTouchedArea {
48-
get
49-
{
50-
UpdateFromFontsAndColorsIfNecessary();
51-
return coveragePartiallyTouchedArea;
52-
}
53-
private set
54-
{
55-
coveragePartiallyTouchedArea = value;
56-
}
57-
58-
}
26+
public System.Windows.Media.Color CoveragePartiallyTouchedArea { get; set; }
5927

6028
private bool coverageColoursFromFontsAndColours;
61-
private bool requiresFromFontsAndColours;
6229

6330
[ImportingConstructor]
6431
public CoverageColorProvider([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider, IAppOptionsProvider appOptionsProvider)
@@ -87,48 +54,41 @@ private void UseDefaultColoursIfNotFontsAndColours()
8754
}
8855
}
8956

90-
public void UpdateRequired()
91-
{
92-
requiresFromFontsAndColours = true;
93-
}
94-
95-
private void UpdateFromFontsAndColorsIfNecessary()
57+
public async Task PrepareAsync()
9658
{
97-
if(coverageColoursFromFontsAndColours && requiresFromFontsAndColours)
59+
if (coverageColoursFromFontsAndColours)
9860
{
99-
UpdateColoursFromFontsAndColors();
61+
await UpdateColoursFromFontsAndColorsAsync();
10062
}
10163
}
10264

103-
private void UpdateColoursFromFontsAndColors()
65+
private async Task UpdateColoursFromFontsAndColorsAsync()
10466
{
105-
ThreadHelper.JoinableTaskFactory.Run(async () =>
67+
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
68+
var success = fontAndColorStorage.OpenCategory(ref categoryWithCoverage, storeFlags);
69+
if (success == VSConstants.S_OK)
10670
{
107-
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
108-
var success = fontAndColorStorage.OpenCategory(ref categoryWithCoverage, storeFlags);
109-
if (success == VSConstants.S_OK)
71+
// https://github.com/microsoft/vs-threading/issues/993
72+
System.Windows.Media.Color GetColor(string displayName)
11073
{
111-
// https://github.com/microsoft/vs-threading/issues/993
112-
System.Windows.Media.Color GetColor(string displayName)
74+
var touchAreaInfo = new ColorableItemInfo[1];
75+
var getItemSuccess = fontAndColorStorage.GetItem(displayName, touchAreaInfo);
76+
if (getItemSuccess == VSConstants.S_OK)
11377
{
114-
var touchAreaInfo = new ColorableItemInfo[1];
115-
var getItemSuccess = fontAndColorStorage.GetItem(displayName, touchAreaInfo);
116-
if (getItemSuccess == VSConstants.S_OK)
117-
{
118-
return ParseColor(touchAreaInfo[0].crBackground);
119-
}
120-
throw new Exception("Failed to get color");
78+
return ParseColor(touchAreaInfo[0].crBackground);
12179
}
122-
123-
CoverageTouchedArea = GetColor("Coverage Touched Area");
124-
CoverageNotTouchedArea = GetColor("Coverage Not Touched Area");
125-
CoveragePartiallyTouchedArea = GetColor("Coverage Partially Touched Area");
80+
throw new Exception("Failed to get color");
12681
}
127-
fontAndColorStorage.CloseCategory();
82+
83+
CoverageTouchedArea = GetColor("Coverage Touched Area");
84+
CoverageNotTouchedArea = GetColor("Coverage Not Touched Area");
85+
CoveragePartiallyTouchedArea = GetColor("Coverage Partially Touched Area");
86+
}
87+
else
88+
{
12889
//throw ?
129-
requiresFromFontsAndColours = false;
130-
});
131-
90+
}
91+
fontAndColorStorage.CloseCategory(); // only for success ?
13292
}
13393

13494
private System.Windows.Media.Color ParseColor(uint color)

SharedProject/Impl/CoverageLineGlyphTagger.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.VisualStudio.Text.Tagging;
66
using FineCodeCoverage.Engine.Model;
77
using System.Linq;
8+
using Microsoft.VisualStudio.Shell;
89

910
namespace FineCodeCoverage.Impl
1011
{
@@ -26,10 +27,14 @@ public CoverageLineGlyphTagger(ITextBuffer textBuffer, IFCCEngine fccEngine, ICo
2627

2728
private void FCCEngine_UpdateMarginTags(UpdateMarginTagsEventArgs e)
2829
{
29-
coverageColoursProvider.UpdateRequired();
30-
var span = new SnapshotSpan(_textBuffer.CurrentSnapshot, 0, _textBuffer.CurrentSnapshot.Length);
31-
var spanEventArgs = new SnapshotSpanEventArgs(span);
32-
TagsChanged?.Invoke(this, spanEventArgs);
30+
_ = ThreadHelper.JoinableTaskFactory.RunAsync(async () =>
31+
{
32+
await coverageColoursProvider.PrepareAsync();
33+
var span = new SnapshotSpan(_textBuffer.CurrentSnapshot, 0, _textBuffer.CurrentSnapshot.Length);
34+
var spanEventArgs = new SnapshotSpanEventArgs(span);
35+
TagsChanged?.Invoke(this, spanEventArgs);
36+
});
37+
3338
}
3439

3540
IEnumerable<ITagSpan<CoverageLineGlyphTag>> ITagger<CoverageLineGlyphTag>.GetTags(NormalizedSnapshotSpanCollection spans)

SharedProject/Impl/ICoverageColoursProvider.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
namespace FineCodeCoverage.Impl
1+
using System.Threading.Tasks;
2+
3+
namespace FineCodeCoverage.Impl
24
{
35
internal interface ICoverageColoursProvider
46
{
5-
void UpdateRequired();
7+
Task PrepareAsync();
68

79
}
810

0 commit comments

Comments
 (0)