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;
|
2020-01-14 04:29:23 +00:00
|
|
|
|
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
|
|
|
|
|
2020-01-14 04:29:23 +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);
|
2019-10-25 04:26:29 +00:00
|
|
|
|
|
|
|
|
|
public static BitmapImage BitmapImageFromStream(Stream stream)
|
2019-09-27 04:07:54 +00:00
|
|
|
|
{
|
|
|
|
|
var img = new BitmapImage();
|
|
|
|
|
img.BeginInit();
|
2019-12-15 19:09:07 +00:00
|
|
|
|
img.CacheOption = BitmapCacheOption.OnLoad;
|
2019-10-25 04:26:29 +00:00
|
|
|
|
img.StreamSource = stream;
|
2019-09-27 04:07:54 +00:00
|
|
|
|
img.EndInit();
|
2019-12-15 19:09:07 +00:00
|
|
|
|
img.Freeze();
|
2019-09-27 04:07:54 +00:00
|
|
|
|
return img;
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-25 04:26:29 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-06 03:22:38 +00:00
|
|
|
|
public static string OpenFileDialog(string filter, string initialDirectory = null)
|
2019-09-27 04:07:54 +00:00
|
|
|
|
{
|
|
|
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
|
|
|
ofd.Filter = filter;
|
2019-11-06 03:22:38 +00:00
|
|
|
|
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();
|
|
|
|
|
}
|
2020-01-14 04:29:23 +00:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
}
|