Offloaded ModlistGallery image downloading

This commit is contained in:
Justin Swanson 2020-01-13 22:29:23 -06:00
parent 14da5254c8
commit 5b33a74075
17 changed files with 62 additions and 58 deletions

View File

@ -44,9 +44,6 @@ namespace Wabbajack.Lib.ModListRegistry
[JsonProperty("image")]
public string ImageUri { get; set; }
[JsonIgnore]
public Bitmap Image { get; set; }
[JsonProperty("readme")]
public string Readme { get; set; }

View File

@ -9,7 +9,6 @@ using DynamicData;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack.Test
{

View File

@ -1,4 +1,4 @@
using DynamicData;
using DynamicData;
using Microsoft.WindowsAPICodePack.Dialogs;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
@ -10,7 +10,7 @@ using System.Reactive.Linq;
using System.Windows.Input;
using Wabbajack.Lib;
namespace Wabbajack.UI
namespace Wabbajack
{
public class FilePickerVM : ViewModel
{

View File

@ -4,6 +4,7 @@ using Microsoft.WindowsAPICodePack.Dialogs;
using ReactiveUI;
using System;
using System.IO;
using System.Net.Http;
using System.Reactive.Linq;
using System.Reflection;
using System.Threading;
@ -12,7 +13,7 @@ using System.Windows.Forms;
using System.Windows.Media.Imaging;
using Wabbajack.Common;
namespace Wabbajack.UI
namespace Wabbajack
{
public static class UIUtils
{
@ -75,5 +76,49 @@ namespace Wabbajack.UI
.Bind(list)
.Subscribe();
}
public static IObservable<BitmapImage> DownloadBitmapImage(this IObservable<string> obs, Action<Exception> exceptionHandler)
{
return obs
.ObserveOn(RxApp.TaskpoolScheduler)
.SelectTask(async url =>
{
try
{
var ret = new MemoryStream();
using (var client = new HttpClient())
using (var stream = await client.GetStreamAsync(url))
{
stream.CopyTo(ret);
}
ret.Seek(0, SeekOrigin.Begin);
return ret;
}
catch (Exception ex)
{
exceptionHandler(ex);
return default;
}
})
.ObserveOnGuiThread()
.Select(memStream =>
{
if (memStream == null) return default;
try
{
return BitmapImageFromStream(memStream);
}
catch (Exception ex)
{
exceptionHandler(ex);
return default;
}
finally
{
memStream.Dispose();
}
});
}
}
}

View File

@ -15,7 +15,6 @@ using System.Windows.Media.Imaging;
using Wabbajack.Common;
using Wabbajack.Common.StatusFeed;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -9,7 +9,6 @@ using System.Reactive.Linq;
using System.Threading.Tasks;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -6,7 +6,6 @@ using Microsoft.WindowsAPICodePack.Dialogs;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -11,7 +11,6 @@ using ReactiveUI.Fody.Helpers;
using Wabbajack.Common;
using Wabbajack.Common.StoreHandlers;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -21,7 +21,6 @@ using Wabbajack.Common.StatusFeed;
using System.Reactive;
using System.Collections.Generic;
using System.Windows.Input;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -11,7 +11,6 @@ using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.UI;
using Wabbajack.Util;
namespace Wabbajack

View File

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
@ -9,6 +9,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using Alphaleonis.Win32.Filesystem;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
@ -38,6 +39,9 @@ namespace Wabbajack
[Reactive]
public bool IsBroken { get; private set; }
private readonly ObservableAsPropertyHelper<BitmapImage> _Image;
public BitmapImage Image => _Image.Value;
public ModListMetadataVM(ModListGalleryVM parent, ModlistMetadata metadata)
{
_parent = parent;
@ -104,6 +108,10 @@ namespace Wabbajack
}
})
.ToProperty(this, nameof(Exists));
_Image = Observable.Return(Metadata.Links.ImageUri)
.DownloadBitmapImage((ex) => Utils.Log($"Error downloading modlist image {Metadata.Title}"))
.ToProperty(this, nameof(Image));
}
private Task Download()

View File

@ -8,7 +8,6 @@ using System.Reactive.Linq;
using System.Windows.Media.Imaging;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -8,7 +8,6 @@ using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.Lib.Downloaders;
using Wabbajack.Lib.NexusApi;
using Wabbajack.UI;
namespace Wabbajack
{
@ -44,44 +43,7 @@ namespace Wabbajack
ImageURL = m.SlideShowPic;
ImageObservable = Observable.Return(ImageURL)
.ObserveOn(RxApp.TaskpoolScheduler)
.SelectTask(async url =>
{
try
{
var ret = new MemoryStream();
using (var client = new HttpClient())
using (var stream = await client.GetStreamAsync(url))
{
stream.CopyTo(ret);
}
ret.Seek(0, SeekOrigin.Begin);
return ret;
}
catch (Exception)
{
Utils.Log($"Skipping slide for mod {ModName} ({ModID})");
return default;
}
})
.ObserveOnGuiThread()
.Select(memStream =>
{
if (memStream == null) return default;
try
{
return UIUtils.BitmapImageFromStream(memStream);
}
catch (Exception)
{
Utils.Log($"Skipping slide for mod {ModName} ({ModID})");
return default;
}
finally
{
memStream.Dispose();
}
})
.DownloadBitmapImage((ex) => Utils.Log($"Skipping slide for mod {ModName} ({ModID})"))
.Replay(1)
.RefCount(TimeSpan.FromMilliseconds(5000));
}

View File

@ -6,7 +6,6 @@ using System.Reactive.Linq;
using System.Windows.Input;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{

View File

@ -2,8 +2,6 @@
using System.Windows.Controls;
using System.Windows.Data;
using Wabbajack.Lib;
using Wabbajack.UI;
namespace Wabbajack
{
/// <summary>

View File

@ -91,7 +91,7 @@
HorizontalAlignment="Center"
VerticalAlignment="Center"
Stretch="UniformToFill">
<Image x:Name="ModlistImage" Source="{Binding Metadata.Links.ImageUri}">
<Image x:Name="ModListImage" Source="{Binding Metadata.Links.ImageUri}">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>

View File

@ -51,6 +51,9 @@ namespace Wabbajack
this.WhenAny(x => x.ViewModel.ExecuteCommand)
.BindToStrict(this, x => x.ExecuteButton.Command)
.DisposeWith(dispose);
this.WhenAny(x => x.ViewModel.Image)
.BindToStrict(this, x => x.ModListImage.Source)
.DisposeWith(dispose);
});
}
}