Make it possible to set Value directly

This commit is contained in:
Oskar Klintrot 2021-02-25 11:19:28 +01:00 committed by Patrik Svensson
parent 3a42c0a119
commit c64884854f
3 changed files with 104 additions and 7 deletions

View File

@ -115,5 +115,74 @@ namespace Spectre.Console.Tests.Unit
task.MaxValue.ShouldBe(20); task.MaxValue.ShouldBe(20);
task.Value.ShouldBe(20); task.Value.ShouldBe(20);
} }
[Fact]
public void Setting_Value_Should_Override_Incremented_Value()
{
// Given
var task = default(ProgressTask);
var console = new FakeConsole();
var progress = new Progress(console)
.Columns(new[] { new ProgressBarColumn() })
.AutoRefresh(false)
.AutoClear(false);
// When
progress.Start(ctx =>
{
task = ctx.AddTask("foo");
task.Increment(50);
task.Value = 20;
});
// Then
task.MaxValue.ShouldBe(100);
task.Value.ShouldBe(20);
}
[Fact]
public void Setting_Value_To_MaxValue_Should_Finish_Task()
{
// Given
var task = default(ProgressTask);
var console = new FakeConsole();
var progress = new Progress(console)
.Columns(new[] { new ProgressBarColumn() })
.AutoRefresh(false)
.AutoClear(false);
// When
progress.Start(ctx =>
{
task = ctx.AddTask("foo");
task.Value = task.MaxValue;
});
// Then
task.IsFinished.ShouldBe(true);
}
[Fact]
public void Should_Increment_Manually_Set_Value()
{
// Given
var task = default(ProgressTask);
var console = new FakeConsole();
var progress = new Progress(console)
.Columns(new[] { new ProgressBarColumn() })
.AutoRefresh(false)
.AutoClear(false);
// When
progress.Start(ctx =>
{
task = ctx.AddTask("foo");
task.Value = 50;
task.Increment(10);
});
// Then
task.Value.ShouldBe(60);
}
} }
} }

View File

@ -40,5 +40,22 @@ namespace Spectre.Console
task.MaxValue = value; task.MaxValue = value;
return task; return task;
} }
/// <summary>
/// Sets the value of the task.
/// </summary>
/// <param name="task">The task.</param>
/// <param name="value">The value.</param>
/// <returns>The same instance so that multiple calls can be chained.</returns>
public static ProgressTask Value(this ProgressTask task, double value)
{
if (task is null)
{
throw new ArgumentNullException(nameof(task));
}
task.Value = value;
return task;
}
} }
} }

View File

@ -14,6 +14,7 @@ namespace Spectre.Console
private double _maxValue; private double _maxValue;
private string _description; private string _description;
private double _value;
/// <summary> /// <summary>
/// Gets the task ID. /// Gets the task ID.
@ -39,9 +40,13 @@ namespace Spectre.Console
} }
/// <summary> /// <summary>
/// Gets the value of the task. /// Gets or sets the value of the task.
/// </summary> /// </summary>
public double Value { get; private set; } public double Value
{
get => _value;
set => Update(value: value);
}
/// <summary> /// <summary>
/// Gets the start time of the task. /// Gets the start time of the task.
@ -100,6 +105,7 @@ namespace Spectre.Console
_samples = new List<ProgressSample>(); _samples = new List<ProgressSample>();
_lock = new object(); _lock = new object();
_maxValue = maxValue; _maxValue = maxValue;
_value = 0;
_description = description?.RemoveNewLines()?.Trim() ?? throw new ArgumentNullException(nameof(description)); _description = description?.RemoveNewLines()?.Trim() ?? throw new ArgumentNullException(nameof(description));
if (string.IsNullOrWhiteSpace(_description)) if (string.IsNullOrWhiteSpace(_description))
@ -109,7 +115,6 @@ namespace Spectre.Console
Id = id; Id = id;
State = new ProgressTaskState(); State = new ProgressTaskState();
Value = 0;
StartTime = autoStart ? DateTime.Now : null; StartTime = autoStart ? DateTime.Now : null;
} }
@ -151,7 +156,8 @@ namespace Spectre.Console
private void Update( private void Update(
string? description = null, string? description = null,
double? maxValue = null, double? maxValue = null,
double? increment = null) double? increment = null,
double? value = null)
{ {
lock (_lock) lock (_lock)
{ {
@ -175,13 +181,18 @@ namespace Spectre.Console
if (increment != null) if (increment != null)
{ {
Value += increment.Value; _value += increment.Value;
}
if (value != null)
{
_value = value.Value;
} }
// Need to cap the max value? // Need to cap the max value?
if (Value > _maxValue) if (_value > _maxValue)
{ {
Value = _maxValue; _value = _maxValue;
} }
var timestamp = DateTime.Now; var timestamp = DateTime.Now;