From 89b686cd0af7d7a2615c80b42f1b9ca0a6fa022d Mon Sep 17 00:00:00 2001
From: Justin Swanson <justin.c.swanson@gmail.com>
Date: Fri, 11 Oct 2019 17:18:51 -0500
Subject: [PATCH] Added ReactiveUI and DynamicData.  ViewModel made
 ReactiveObject

---
 Wabbajack.Test/app.config      |  4 ++++
 Wabbajack/App.config           |  4 ++++
 Wabbajack/AppState.cs          |  9 +++++----
 Wabbajack/NexusApi/NexusApi.cs |  7 ++++---
 Wabbajack/ViewModel.cs         | 16 ++++++++++-----
 Wabbajack/Wabbajack.csproj     | 37 ++++++++++++++++++++++++++++++++++
 Wabbajack/packages.config      | 11 ++++++++++
 7 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/Wabbajack.Test/app.config b/Wabbajack.Test/app.config
index e936cc13..ec5c75f5 100644
--- a/Wabbajack.Test/app.config
+++ b/Wabbajack.Test/app.config
@@ -6,6 +6,10 @@
         <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reactive" publicKeyToken="94bc3704cddfc263" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
 </configuration>
\ No newline at end of file
diff --git a/Wabbajack/App.config b/Wabbajack/App.config
index b0634730..5905ef43 100644
--- a/Wabbajack/App.config
+++ b/Wabbajack/App.config
@@ -10,6 +10,10 @@
         <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reactive" publicKeyToken="94bc3704cddfc263" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
 
diff --git a/Wabbajack/AppState.cs b/Wabbajack/AppState.cs
index 6ecc34ab..1b781501 100644
--- a/Wabbajack/AppState.cs
+++ b/Wabbajack/AppState.cs
@@ -1,4 +1,5 @@
-using System;
+using ReactiveUI;
+using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
@@ -101,8 +102,8 @@ namespace Wabbajack
             set
             {
                 _htmlReport = value;
-                RaisePropertyChanged();
-                RaisePropertyChanged(nameof(ShowReportButton));
+                this.RaisePropertyChanged();
+                this.RaisePropertyChanged(nameof(ShowReportButton));
             }
         }
 
@@ -292,7 +293,7 @@ namespace Wabbajack
             set
             {
                 _splashScreenImage = value;
-                RaisePropertyChanged();
+                this.RaisePropertyChanged();
             }
         }
 
diff --git a/Wabbajack/NexusApi/NexusApi.cs b/Wabbajack/NexusApi/NexusApi.cs
index 08713a1c..ead13582 100644
--- a/Wabbajack/NexusApi/NexusApi.cs
+++ b/Wabbajack/NexusApi/NexusApi.cs
@@ -1,4 +1,5 @@
-using System;
+using ReactiveUI;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Diagnostics;
@@ -136,8 +137,8 @@ namespace Wabbajack.NexusApi
                 _dailyRemaining = Math.Min(dailyRemaining, hourlyRemaining);
                 _hourlyRemaining = Math.Min(dailyRemaining, hourlyRemaining);
             }
-            RaisePropertyChanged(nameof(DailyRemaining));
-            RaisePropertyChanged(nameof(HourlyRemaining));
+            this.RaisePropertyChanged(nameof(DailyRemaining));
+            this.RaisePropertyChanged(nameof(HourlyRemaining));
         }
 
         #endregion
diff --git a/Wabbajack/ViewModel.cs b/Wabbajack/ViewModel.cs
index 6f76989c..e7689f3e 100644
--- a/Wabbajack/ViewModel.cs
+++ b/Wabbajack/ViewModel.cs
@@ -1,20 +1,26 @@
-using System;
+using ReactiveUI;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Linq;
+using System.Reactive.Disposables;
 using System.Runtime.CompilerServices;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace Wabbajack
 {
-    public class ViewModel : INotifyPropertyChanged
+    public class ViewModel : ReactiveObject, IDisposable
     {
-        public event PropertyChangedEventHandler PropertyChanged;
+        private readonly Lazy<CompositeDisposable> _CompositeDisposable = new Lazy<CompositeDisposable>();
+        public CompositeDisposable CompositeDisposable => _CompositeDisposable.Value;
 
-        protected void RaisePropertyChanged([CallerMemberName] string name = null)
+        public virtual void Dispose()
         {
-            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+            if (_CompositeDisposable.IsValueCreated)
+            {
+                _CompositeDisposable.Value.Dispose();
+            }
         }
 
         protected void RaiseAndSetIfChanged<T>(
diff --git a/Wabbajack/Wabbajack.csproj b/Wabbajack/Wabbajack.csproj
index 4557dd5d..d8b2059e 100644
--- a/Wabbajack/Wabbajack.csproj
+++ b/Wabbajack/Wabbajack.csproj
@@ -105,6 +105,9 @@
     <Reference Include="Costura, Version=4.0.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
       <HintPath>..\packages\Costura.Fody.4.0.0\lib\net40\Costura.dll</HintPath>
     </Reference>
+    <Reference Include="DynamicData, Version=6.13.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\DynamicData.6.13.17\lib\net461\DynamicData.dll</HintPath>
+    </Reference>
     <Reference Include="ICSharpCode.SharpZipLib, Version=1.2.0.246, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
       <HintPath>..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll</HintPath>
     </Reference>
@@ -132,9 +135,28 @@
     <Reference Include="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
     </Reference>
+    <Reference Include="Pharmacist.Common, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Pharmacist.Common.1.2.2\lib\netstandard2.0\Pharmacist.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="PresentationFramework.Aero" />
+    <Reference Include="ReactiveUI, Version=10.4.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\ReactiveUI.10.4.1\lib\net461\ReactiveUI.dll</HintPath>
+    </Reference>
+    <Reference Include="ReactiveUI.Events.WPF, Version=10.4.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\ReactiveUI.Events.WPF.10.4.1\lib\net461\ReactiveUI.Events.WPF.dll</HintPath>
+    </Reference>
+    <Reference Include="ReactiveUI.WPF, Version=10.4.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\ReactiveUI.WPF.10.4.1\lib\net461\ReactiveUI.WPF.dll</HintPath>
+    </Reference>
     <Reference Include="SharpCompress, Version=0.23.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
       <HintPath>..\packages\SharpCompress.0.23.0\lib\net45\SharpCompress.dll</HintPath>
     </Reference>
+    <Reference Include="Splat, Version=9.1.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Splat.9.1.1\lib\net461\Splat.dll</HintPath>
+    </Reference>
+    <Reference Include="Splat.Drawing, Version=9.1.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Splat.Drawing.9.1.1\lib\net461\Splat.Drawing.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
@@ -143,6 +165,11 @@
     <Reference Include="System.Data" />
     <Reference Include="System.Design" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Drawing.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Drawing.Primitives.4.3.0\lib\net45\System.Drawing.Primitives.dll</HintPath>
+      <Private>True</Private>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.IO.Compression" />
     <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
@@ -151,14 +178,24 @@
     <Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
     </Reference>
+    <Reference Include="System.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Reactive.4.2.0\lib\net46\System.Reactive.dll</HintPath>
+    </Reference>
     <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
     </Reference>
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Security" />
     <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
     <Reference Include="System.Transactions" />
+    <Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
+    </Reference>
     <Reference Include="System.Web" />
+    <Reference Include="System.Windows" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
diff --git a/Wabbajack/packages.config b/Wabbajack/packages.config
index 48d6efbc..7dd622df 100644
--- a/Wabbajack/packages.config
+++ b/Wabbajack/packages.config
@@ -3,6 +3,7 @@
   <package id="AlphaFS" version="2.2.6" targetFramework="net472" />
   <package id="CommonMark.NET" version="0.15.1" targetFramework="net472" />
   <package id="Costura.Fody" version="4.0.0" targetFramework="net472" />
+  <package id="DynamicData" version="6.13.17" targetFramework="net472" />
   <package id="Fody" version="5.1.1" targetFramework="net472" developmentDependency="true" />
   <package id="GitInfo" version="2.0.20" targetFramework="net472" developmentDependency="true" />
   <package id="K4os.Compression.LZ4" version="1.1.11" targetFramework="net472" />
@@ -13,13 +14,23 @@
   <package id="Microsoft-WindowsAPICodePack-Shell" version="1.1.3.3" targetFramework="net472" />
   <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
   <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
+  <package id="Pharmacist.Common" version="1.2.2" targetFramework="net472" />
   <package id="protobuf-net" version="2.4.0" targetFramework="net472" />
+  <package id="ReactiveUI" version="10.4.1" targetFramework="net472" />
+  <package id="ReactiveUI.Events.WPF" version="10.4.1" targetFramework="net472" />
+  <package id="ReactiveUI.WPF" version="10.4.1" targetFramework="net472" />
   <package id="SharpCompress" version="0.23.0" targetFramework="net472" />
   <package id="SharpZipLib" version="1.2.0" targetFramework="net472" />
+  <package id="Splat" version="9.1.1" targetFramework="net472" />
+  <package id="Splat.Drawing" version="9.1.1" targetFramework="net472" />
   <package id="System.Buffers" version="4.4.0" targetFramework="net472" />
+  <package id="System.Drawing.Primitives" version="4.3.0" targetFramework="net472" />
   <package id="System.Memory" version="4.5.3" targetFramework="net472" />
   <package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net472" />
+  <package id="System.Reactive" version="4.2.0" targetFramework="net472" />
   <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" />
+  <package id="System.Threading.Tasks.Extensions" version="4.5.3" targetFramework="net472" />
+  <package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
   <package id="WebSocketSharpFork" version="1.0.4.0" targetFramework="net472" />
   <package id="WPFThemes.DarkBlend" version="1.0.8" targetFramework="net472" />
   <package id="YamlDotNet" version="7.0.0" targetFramework="net472" />