wabbajack/Wabbajack/UI/UIUtils.cs

125 lines
4.2 KiB
C#
Raw Normal View History

2020-01-10 04:27:59 +00:00
using DynamicData;
using DynamicData.Binding;
using Microsoft.WindowsAPICodePack.Dialogs;
using ReactiveUI;
2019-10-07 17:33:34 +00:00
using System;
2019-10-16 03:17:27 +00:00
using System.IO;
using System.Net.Http;
2020-01-10 04:27:59 +00:00
using System.Reactive.Linq;
2019-09-18 21:37:32 +00:00
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
2019-09-27 04:07:54 +00:00
using System.Windows.Forms;
using System.Windows.Media.Imaging;
2019-10-16 03:17:27 +00:00
using Wabbajack.Common;
2019-09-18 21:37:32 +00:00
namespace Wabbajack
2019-09-18 21:37:32 +00:00
{
public static class UIUtils
{
2019-11-29 23:56:56 +00:00
public static BitmapImage BitmapImageFromResource(string name) => BitmapImageFromStream(System.Windows.Application.GetResourceStream(new Uri("pack://application:,,,/Wabbajack;component/" + name)).Stream);
public static BitmapImage BitmapImageFromStream(Stream stream)
2019-09-27 04:07:54 +00:00
{
var img = new BitmapImage();
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.StreamSource = stream;
2019-09-27 04:07:54 +00:00
img.EndInit();
img.Freeze();
2019-09-27 04:07:54 +00:00
return img;
}
public static bool TryGetBitmapImageFromFile(string path, out BitmapImage bitmapImage)
{
try
{
if (!File.Exists(path))
{
bitmapImage = default;
return false;
}
bitmapImage = new BitmapImage(new Uri(path, UriKind.RelativeOrAbsolute));
return true;
}
catch (Exception)
{
bitmapImage = default;
return false;
}
}
public static string OpenFileDialog(string filter, string initialDirectory = null)
2019-09-27 04:07:54 +00:00
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = filter;
ofd.InitialDirectory = initialDirectory;
2019-09-27 04:07:54 +00:00
if (ofd.ShowDialog() == DialogResult.OK)
return ofd.FileName;
return null;
}
2020-01-10 04:27:59 +00:00
public static IDisposable BindCpuStatus(IObservable<CPUStatus> status, ObservableCollectionExtended<CPUDisplayVM> list)
{
return status.ObserveOn(RxApp.TaskpoolScheduler)
.ToObservableChangeSet(x => x.ID)
.Batch(TimeSpan.FromMilliseconds(50), RxApp.TaskpoolScheduler)
.EnsureUniqueChanges()
.TransformAndCache(
onAdded: (key, cpu) => new CPUDisplayVM(cpu),
onUpdated: (change, vm) => vm.AbsorbStatus(change.Current))
.AutoRefresh(x => x.IsWorking)
.AutoRefresh(x => x.StartTime)
.Filter(i => i.IsWorking && i.ID != WorkQueue.UnassignedCpuId)
.Sort(SortExpressionComparer<CPUDisplayVM>.Ascending(s => s.StartTime))
.ObserveOnGuiThread()
.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();
}
});
}
2019-09-18 21:37:32 +00:00
}
}