mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 19:36:28 +00:00
Workshop - Simplify upload to a busy indicator, show images in profiles
This commit is contained in:
1 parent
e33ae8a066
commit
e304d67035
22 files changed
+125
-242
No files matched your search
@@ -30,6 +30,9 @@
|
||||
<ProjectReference Include="..\Artemis.Core\Artemis.Core.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="AsyncImageLoader.Avalonia">
|
||||
<HintPath>..\..\..\..\Users\Robert\.nuget\packages\asyncimageloader.avalonia\3.2.1\lib\netstandard2.1\AsyncImageLoader.Avalonia.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="RGB.NET.Layout">
|
||||
<HintPath>..\..\..\RGB.NET\bin\net7.0\RGB.NET.Layout.dll</HintPath>
|
||||
</Reference>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<StackPanel>
|
||||
<Border Classes="card" Margin="20">
|
||||
<TextBlock>I'm in a panel yo!</TextBlock>
|
||||
</Border>
|
||||
</Border>
|
||||
<Border Classes="card" Margin="20">
|
||||
<StackPanel>
|
||||
<TextBlock>I'm in a panel yo!</TextBlock>
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
// Heavily based on:
|
||||
// SkyClip
|
||||
// - ProgressableStreamContent.cs
|
||||
// --------------------------------------------------------------------
|
||||
// Author: Jeff Hansen <jeff@jeffijoe.com>
|
||||
// Copyright (C) Jeff Hansen 2015. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Artemis.UI.Shared.Utilities;
|
||||
|
||||
/// <summary>
|
||||
/// Provides HTTP content based on a stream with support for IProgress.
|
||||
/// </summary>
|
||||
public class ProgressableStreamContent : StreamContent
|
||||
{
|
||||
private const int DEFAULT_BUFFER_SIZE = 4096;
|
||||
|
||||
private readonly int _bufferSize;
|
||||
private readonly IProgress<StreamProgress> _progress;
|
||||
private readonly Stream _streamToWrite;
|
||||
private bool _contentConsumed;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ProgressableStreamContent" /> class.
|
||||
/// </summary>
|
||||
/// <param name="streamToWrite">The stream to write.</param>
|
||||
/// <param name="progress">The downloader.</param>
|
||||
public ProgressableStreamContent(Stream streamToWrite, IProgress<StreamProgress> progress) : this(streamToWrite, DEFAULT_BUFFER_SIZE, progress)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ProgressableStreamContent" /> class.
|
||||
/// </summary>
|
||||
/// <param name="streamToWrite">The stream to write.</param>
|
||||
/// <param name="bufferSize">The buffer size.</param>
|
||||
/// <param name="progress">The downloader.</param>
|
||||
public ProgressableStreamContent(Stream streamToWrite, int bufferSize, IProgress<StreamProgress> progress) : base(streamToWrite, bufferSize)
|
||||
{
|
||||
if (bufferSize <= 0)
|
||||
throw new ArgumentOutOfRangeException(nameof(bufferSize));
|
||||
|
||||
_streamToWrite = streamToWrite;
|
||||
_bufferSize = bufferSize;
|
||||
_progress = progress;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
_streamToWrite.Dispose();
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context)
|
||||
{
|
||||
await SerializeToStreamAsync(stream, context, CancellationToken.None);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context, CancellationToken cancellationToken)
|
||||
{
|
||||
PrepareContent();
|
||||
|
||||
byte[] buffer = new byte[_bufferSize];
|
||||
long size = _streamToWrite.Length;
|
||||
int uploaded = 0;
|
||||
|
||||
await using (_streamToWrite)
|
||||
{
|
||||
while (!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
int length = await _streamToWrite.ReadAsync(buffer, cancellationToken);
|
||||
if (length <= 0)
|
||||
break;
|
||||
|
||||
uploaded += length;
|
||||
_progress.Report(new StreamProgress(uploaded, size));
|
||||
await stream.WriteAsync(buffer, 0, length, cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override bool TryComputeLength(out long length)
|
||||
{
|
||||
length = _streamToWrite.Length;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prepares the content.
|
||||
/// </summary>
|
||||
/// <exception cref="System.InvalidOperationException">The stream has already been read.</exception>
|
||||
private void PrepareContent()
|
||||
{
|
||||
if (_contentConsumed)
|
||||
{
|
||||
// If the content needs to be written to a target stream a 2nd time, then the stream must support
|
||||
// seeking (e.g. a FileStream), otherwise the stream can't be copied a second time to a target
|
||||
// stream (e.g. a NetworkStream).
|
||||
if (_streamToWrite.CanSeek)
|
||||
_streamToWrite.Position = 0;
|
||||
else
|
||||
throw new InvalidOperationException("The stream has already been read.");
|
||||
}
|
||||
|
||||
_contentConsumed = true;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user