mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Offloaded ModlistGallery image downloading
This commit is contained in:
parent
14da5254c8
commit
5b33a74075
@ -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; }
|
||||
|
||||
|
@ -9,7 +9,6 @@ using DynamicData;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack.Test
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,6 @@ using System.Windows.Media.Imaging;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Common.StatusFeed;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -9,7 +9,6 @@ using System.Reactive.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -6,7 +6,6 @@ using Microsoft.WindowsAPICodePack.Dialogs;
|
||||
using ReactiveUI;
|
||||
using ReactiveUI.Fody.Helpers;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -11,7 +11,6 @@ using ReactiveUI.Fody.Helpers;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Common.StoreHandlers;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -21,7 +21,6 @@ using Wabbajack.Common.StatusFeed;
|
||||
using System.Reactive;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Input;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -11,7 +11,6 @@ using ReactiveUI;
|
||||
using ReactiveUI.Fody.Helpers;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
using Wabbajack.Util;
|
||||
|
||||
namespace Wabbajack
|
||||
|
@ -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()
|
||||
|
@ -8,7 +8,6 @@ using System.Reactive.Linq;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -6,7 +6,6 @@ using System.Reactive.Linq;
|
||||
using System.Windows.Input;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
|
@ -2,8 +2,6 @@
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using Wabbajack.Lib;
|
||||
using Wabbajack.UI;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user