✨ Display solution load and diagnostics progress
This commit is contained in:
@@ -13,6 +13,7 @@ using SharpIDE.Application.Features.Nuget;
|
|||||||
using SharpIDE.Application.Features.Run;
|
using SharpIDE.Application.Features.Run;
|
||||||
using SharpIDE.Application.Features.Search;
|
using SharpIDE.Application.Features.Search;
|
||||||
using SharpIDE.Application.Features.Testing;
|
using SharpIDE.Application.Features.Testing;
|
||||||
|
using SharpIDE.Godot.Features.ActivityListener;
|
||||||
|
|
||||||
namespace SharpIDE.Godot;
|
namespace SharpIDE.Godot;
|
||||||
|
|
||||||
@@ -48,6 +49,7 @@ public partial class DiAutoload : Node
|
|||||||
services.AddScoped<IdeFileOperationsService>();
|
services.AddScoped<IdeFileOperationsService>();
|
||||||
services.AddScoped<SharpIdeSolutionModificationService>();
|
services.AddScoped<SharpIdeSolutionModificationService>();
|
||||||
services.AddScoped<SharpIdeSolutionAccessor>();
|
services.AddScoped<SharpIdeSolutionAccessor>();
|
||||||
|
services.AddScoped<ActivityMonitor>();
|
||||||
|
|
||||||
services.AddHttpClient();
|
services.AddHttpClient();
|
||||||
services.AddLogging(builder =>
|
services.AddLogging(builder =>
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using SharpIDE.Application;
|
||||||
|
using SharpIDE.Application.Features.Events;
|
||||||
|
|
||||||
|
namespace SharpIDE.Godot.Features.ActivityListener;
|
||||||
|
|
||||||
|
public class ActivityMonitor
|
||||||
|
{
|
||||||
|
public EventWrapper<Activity, Task> ActivityStarted { get; } = new(_ => Task.CompletedTask);
|
||||||
|
public EventWrapper<Activity, Task> ActivityStopped { get; } = new(_ => Task.CompletedTask);
|
||||||
|
|
||||||
|
public ActivityMonitor()
|
||||||
|
{
|
||||||
|
var listener = new System.Diagnostics.ActivityListener
|
||||||
|
{
|
||||||
|
ShouldListenTo = source => source == SharpIdeOtel.Source,
|
||||||
|
Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.PropagationData,
|
||||||
|
ActivityStarted = activity => ActivityStarted.InvokeParallelFireAndForget(activity),
|
||||||
|
ActivityStopped = activity => ActivityStopped.InvokeParallelFireAndForget(activity),
|
||||||
|
};
|
||||||
|
|
||||||
|
ActivitySource.AddActivityListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://bj7cmmfhf41ry
|
||||||
79
src/SharpIDE.Godot/Features/BottomBar/RunningTasksDisplay.cs
Normal file
79
src/SharpIDE.Godot/Features/BottomBar/RunningTasksDisplay.cs
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using Godot;
|
||||||
|
using SharpIDE.Application.Features.Analysis;
|
||||||
|
using SharpIDE.Godot.Features.ActivityListener;
|
||||||
|
|
||||||
|
namespace SharpIDE.Godot.Features.BottomBar;
|
||||||
|
|
||||||
|
public partial class RunningTasksDisplay : HBoxContainer
|
||||||
|
{
|
||||||
|
[Inject] private readonly ActivityMonitor _activityMonitor = null!;
|
||||||
|
|
||||||
|
private bool _isSolutionLoading;
|
||||||
|
private bool _isSolutionDiagnosticsBeingRetrieved;
|
||||||
|
|
||||||
|
private Label _solutionLoadingLabel = null!;
|
||||||
|
private Label _solutionDiagnosticsLabel = null!;
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
_solutionLoadingLabel = GetNode<Label>("SolutionLoadingLabel");
|
||||||
|
_solutionDiagnosticsLabel = GetNode<Label>("SolutionDiagnosticsLabel");
|
||||||
|
Visible = false;
|
||||||
|
_activityMonitor.ActivityStarted.Subscribe(OnActivityStarted);
|
||||||
|
_activityMonitor.ActivityStopped.Subscribe(OnActivityStopped);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void _ExitTree()
|
||||||
|
{
|
||||||
|
_activityMonitor.ActivityStarted.Unsubscribe(OnActivityStarted);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnActivityStarted(Activity activity)
|
||||||
|
{
|
||||||
|
if (activity.DisplayName == $"{nameof(RoslynAnalysis)}.{nameof(RoslynAnalysis.UpdateSolutionDiagnostics)}")
|
||||||
|
{
|
||||||
|
_isSolutionDiagnosticsBeingRetrieved = true;
|
||||||
|
}
|
||||||
|
else if (activity.DisplayName == "OpenSolution")
|
||||||
|
{
|
||||||
|
_isSolutionLoading = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var visible = _isSolutionDiagnosticsBeingRetrieved || _isSolutionLoading;
|
||||||
|
await this.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
_solutionLoadingLabel.Visible = _isSolutionLoading;
|
||||||
|
_solutionDiagnosticsLabel.Visible = _isSolutionDiagnosticsBeingRetrieved;
|
||||||
|
Visible = visible;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnActivityStopped(Activity activity)
|
||||||
|
{
|
||||||
|
if (activity.DisplayName == $"{nameof(RoslynAnalysis)}.{nameof(RoslynAnalysis.UpdateSolutionDiagnostics)}")
|
||||||
|
{
|
||||||
|
_isSolutionDiagnosticsBeingRetrieved = false;
|
||||||
|
}
|
||||||
|
else if (activity.DisplayName == "OpenSolution")
|
||||||
|
{
|
||||||
|
_isSolutionLoading = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var visible = _isSolutionDiagnosticsBeingRetrieved || _isSolutionLoading;
|
||||||
|
await this.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
_solutionLoadingLabel.Visible = _isSolutionLoading;
|
||||||
|
_solutionDiagnosticsLabel.Visible = _isSolutionDiagnosticsBeingRetrieved;
|
||||||
|
Visible = visible;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://t26ae82ia2cj
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://cnla64hcar6dr"]
|
[gd_scene load_steps=4 format=3 uid="uid://cnla64hcar6dr"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://t26ae82ia2cj" path="res://Features/BottomBar/RunningTasksDisplay.cs" id="1_ytjpp"]
|
||||||
|
|
||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5swca"]
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5swca"]
|
||||||
content_margin_left = 2.0
|
content_margin_left = 2.0
|
||||||
@@ -34,14 +36,25 @@ offset_bottom = 11.5
|
|||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
grow_vertical = 2
|
grow_vertical = 2
|
||||||
size_flags_vertical = 4
|
size_flags_vertical = 4
|
||||||
|
script = ExtResource("1_ytjpp")
|
||||||
|
|
||||||
[node name="ProgressLabel" type="Label" parent="."]
|
[node name="SolutionLoadingLabel" type="Label" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme_override_colors/font_color = Color(0.67058825, 0.67058825, 0.67058825, 1)
|
theme_override_colors/font_color = Color(0.67058825, 0.67058825, 0.67058825, 1)
|
||||||
theme_override_font_sizes/font_size = 14
|
theme_override_font_sizes/font_size = 14
|
||||||
text = "Loading Solution"
|
text = "Loading Solution"
|
||||||
vertical_alignment = 1
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="SolutionDiagnosticsLabel" type="Label" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
visible = false
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_colors/font_color = Color(0.67058825, 0.67058825, 0.67058825, 1)
|
||||||
|
theme_override_font_sizes/font_size = 14
|
||||||
|
text = "Updating Solution Diagnostics"
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
[node name="ProgressBar" type="ProgressBar" parent="."]
|
[node name="ProgressBar" type="ProgressBar" parent="."]
|
||||||
custom_minimum_size = Vector2(150, 0)
|
custom_minimum_size = Vector2(150, 0)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
|
|||||||
Reference in New Issue
Block a user