diff --git a/UMFTests/Properties/AssemblyInfo.cs b/UMFTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b3800af --- /dev/null +++ b/UMFTests/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("UMFTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UMFTests")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("b5e72137-b161-4517-a47b-9c191a1edca5")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/UMFTests/UMFS.cs b/UMFTests/UMFS.cs new file mode 100644 index 0000000..8c27d42 --- /dev/null +++ b/UMFTests/UMFS.cs @@ -0,0 +1,18 @@ +using System; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using UnityMultiFramework; + +namespace UMFTests +{ + [TestClass] + public class UMFS + { + [TestMethod] + public void TestFileLocations() + { + var a = Unity.Projects.ToList(); + + } + } +} diff --git a/UMFTests/UMFTests.csproj b/UMFTests/UMFTests.csproj new file mode 100644 index 0000000..b05c5f1 --- /dev/null +++ b/UMFTests/UMFTests.csproj @@ -0,0 +1,73 @@ + + + + + Debug + AnyCPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5} + Library + Properties + UMFTests + UMFTests + v4.7 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\MSTest.TestFramework.1.1.18\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\MSTest.TestFramework.1.1.18\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + + + + + + + + + + + + {dc81ac27-1181-4cde-be6d-af159ff912c1} + UnityMultiFramework + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/UMFTests/packages.config b/UMFTests/packages.config new file mode 100644 index 0000000..a4b6ae9 --- /dev/null +++ b/UMFTests/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/UnityMultiFramework/Accessors/ExecutableAccessor.cs b/UnityMultiFramework/Accessors/ExecutableAccessor.cs new file mode 100644 index 0000000..f496c44 --- /dev/null +++ b/UnityMultiFramework/Accessors/ExecutableAccessor.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace UnityMultiFramework +{ + public class ExecutableAccessor : IEnumerable + { + internal ExecutableAccessor() { } + + public List Locations = new List(); + + public void AddIn(Uri baseLocation) + => Locations.AddRange(FindIn(baseLocation)); + + private IEnumerable FindIn(Uri baseLocation) + => System.IO.Directory + .EnumerateFiles(baseLocation.LocalPath, "Unity.exe", System.IO.SearchOption.AllDirectories) + .Select(loc => new Executable(new Uri(loc))); + + public IEnumerable ClosestExecutables(IVersionable ver) + => Locations.Where(loc => loc.FuzzyEquals(ver)).OrderBy(exe => Math.Abs(exe.FuzzyCompareTo(ver))); + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)Locations).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)Locations).GetEnumerator(); + } + } + +} diff --git a/UnityMultiFramework/Accessors/ProjectAccessor.cs b/UnityMultiFramework/Accessors/ProjectAccessor.cs new file mode 100644 index 0000000..31feabb --- /dev/null +++ b/UnityMultiFramework/Accessors/ProjectAccessor.cs @@ -0,0 +1,58 @@ +using Microsoft.Win32; +using System; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections; + +namespace UnityMultiFramework +{ + + public class ProjectAccessor : IEnumerable + { + private const string UNITYREGKEY = @"SOFTWARE\Unity Technologies\Unity Editor 5.x\"; + + internal ProjectAccessor() { } + + private List ExtraLocations = new List(); + + public IEnumerable ProjectLocations + => ExistingLocations + .Select(uri => new Project(uri)); + + public IEnumerable ExistingLocations + => ExtraLocations + .Concat((RegKeyToUri() ?? Enumerable.Empty())) + .Distinct() + .Where(uri => + Directory.Exists(uri.LocalPath) && + Directory.Exists(Path.Combine(uri.LocalPath, "Assets")) + ); + + public void AddLocations(params Uri[] uris) + => ExtraLocations.AddRange(uris); + + public IEnumerable RegKeyToUri() + { + RegistryKey UnityRegKey = Registry + .CurrentUser + .OpenSubKey(UNITYREGKEY, false); + + return UnityRegKey? + .GetValueNames() + .Where(key => key.StartsWith("RecentlyUsedProjectPaths")) + .Select(key => + new Uri(Encoding.UTF8.GetString(UnityRegKey.GetValue(key) as byte[]).TrimEnd((char)0)) + ); + } + + #region IEnumerable + + public IEnumerator GetEnumerator() => ProjectLocations.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => ProjectLocations.GetEnumerator(); + + #endregion + } +} diff --git a/UnityMultiFramework/Executable.cs b/UnityMultiFramework/Executable.cs new file mode 100644 index 0000000..977b97f --- /dev/null +++ b/UnityMultiFramework/Executable.cs @@ -0,0 +1,52 @@ +using System; + +namespace UnityMultiFramework +{ + public class Executable : IVersionable, IEquatable, ILaunchable + { + private const string WILDCARD = "*"; + + private Executable() { } + + public Executable(Uri Location) + { + this.Location = Location; + VersionType = WILDCARD; + + var versionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(Location.LocalPath); + Version = new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, 0); + } + + public Uri Location { get; private set; } + + public Version Version { get; private set; } + + public string VersionType { get; set; } + + public int MinorVersion { set { Version = new Version(Version.Major, Version.Minor, Version.Build, value); } } + + public void Launch(params string[] args) + => System.Diagnostics.Process.Start(Location.LocalPath, string.Join(" ", args)); + + public int CompareTo(IVersionable other) + => Version.CompareTo(other); + + public bool Equals(IVersionable other) + => FuzzyEquals(other) && (VersionType == WILDCARD || other.VersionType == WILDCARD) ? true : (VersionType == other.VersionType); + + public bool FuzzyEquals(IVersionable other) + { + return (Version.Major == other.Version.Major) && (Version.Minor == other.Version.Minor) && (Version.Build == other.Version.Build); + } + + public int FuzzyCompareTo(IVersionable other) + { + if ( !FuzzyEquals(other) ) { return CompareTo(other); } + if( VersionType != other.VersionType ) { return VersionType.CompareTo(other.VersionType); } + return Version.Revision - other.Version.Revision; + } + + public bool Equals(Executable other) + => Location == other.Location; + } +} diff --git a/UnityMultiFramework/Interfaces/ILaunchable.cs b/UnityMultiFramework/Interfaces/ILaunchable.cs new file mode 100644 index 0000000..f2c0419 --- /dev/null +++ b/UnityMultiFramework/Interfaces/ILaunchable.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UnityMultiFramework +{ + public interface ILaunchable + { + void Launch(params string[] args); + } +} diff --git a/UnityMultiFramework/Interfaces/IVersionable.cs b/UnityMultiFramework/Interfaces/IVersionable.cs new file mode 100644 index 0000000..7e9aef5 --- /dev/null +++ b/UnityMultiFramework/Interfaces/IVersionable.cs @@ -0,0 +1,13 @@ +using System; + +namespace UnityMultiFramework +{ + public interface IVersionable : IComparable, IEquatable + { + Version Version { get; } + string VersionType { get; } + + //bool operator ==(IVersionable lhs, IVersionable rhs); + //bool operator !=(IVersionable lhs, IVersionable rhs); + } +} \ No newline at end of file diff --git a/UnityMultiFramework/Project.cs b/UnityMultiFramework/Project.cs new file mode 100644 index 0000000..0cfc446 --- /dev/null +++ b/UnityMultiFramework/Project.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Linq; +using System.Text; + +namespace UnityMultiFramework +{ + + [System.Diagnostics.DebuggerDisplay("Name = {Name}, Version = {ProjectVersionString}")] + public class Project : IVersionable, IEquatable, ILaunchable + { + //m_EditorVersion: 2017.1.0f3 + private static Regex versionExp = new Regex(@"^m_EditorVersion: (\d+\.\d+\.\d+([A-z]{1,4})\d+)", RegexOptions.Compiled); + + public Project(Uri location) + { + Location = location; + LoadVersionInfo(); + Name = Uri.UnescapeDataString(Location.Segments.Last()); + } + + public string Name { get; private set; } + + public Uri Location { get; private set; } + + public string ProjectVersionString { get; private set; } + + public Version Version { get; private set; } + + public string VersionType { get; private set; } + + private void LoadVersionInfo() + { + var filename = Path.Combine(Location.LocalPath, @"ProjectSettings\ProjectVersion.txt"); + if (File.Exists(filename)) + { + var filedata = File.ReadAllText(filename, Encoding.UTF8); + var matches = versionExp.Match(filedata); + try + { + ProjectVersionString = matches.Groups[1].Value; + VersionType = matches.Groups[2].Value; + Version = Version.Parse(ProjectVersionString.Replace(VersionType, ".")); + } + catch (Exception E) + { + E.Data["ProjectText"] = filedata.ToString(); + E.Data["Matches"] = matches.ToString(); + throw; + } + } + } + + public void Launch(params string[] args) + => Launch(Unity.Executables.ClosestExecutables(this).First(), args); + + public void Launch(Executable exe = null, params string[] args) + { + var argsList = args.ToList(); + argsList.Insert(0, $@"-projectpath ""{Location.LocalPath}"""); + + exe.Launch(argsList.ToArray()); + } + + #region Interfaces + + public int CompareTo(IVersionable other) + { + return this.Version.CompareTo(other.Version); + } + + public bool Equals(IVersionable other) + { + return Version == other.Version && VersionType == other.VersionType; + } + + public bool Equals(Project other) + { + return Location == other.Location; + } + + #endregion + } +} diff --git a/UnityMultiFramework/Properties/AssemblyInfo.cs b/UnityMultiFramework/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..126924d --- /dev/null +++ b/UnityMultiFramework/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UnityMultiFramework")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnityMultiFramework")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("dc81ac27-1181-4cde-be6d-af159ff912c1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/UnityMultiFramework/Settings.cs b/UnityMultiFramework/Settings.cs new file mode 100644 index 0000000..b9cae5e --- /dev/null +++ b/UnityMultiFramework/Settings.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace UnityMultiFramework +{ + public class Settings + { + public List Locations; + } +} diff --git a/UnityMultiFramework/Unity.cs b/UnityMultiFramework/Unity.cs new file mode 100644 index 0000000..0026767 --- /dev/null +++ b/UnityMultiFramework/Unity.cs @@ -0,0 +1,91 @@ +using System; +using System.Linq; + +namespace UnityMultiFramework +{ + public static partial class Unity + { + public static ExecutableAccessor Executables = new ExecutableAccessor(); + + public static ProjectAccessor Projects = new ProjectAccessor(); + + public static void LoadSettings(Settings settings) + { + if(settings == null) { return; } + Executables.Locations = settings.Locations; + } + + public static Settings GetSettings() + { + return new Settings() + { + Locations = Executables.ToList() + }; + } + } +} +// public static class Util +// { +// //private static Regex versionExp = new Regex(@"(\d+)\.(\d+)\.(\d+)([A-z]+)(\d+)", RegexOptions.Compiled); + + + +// public static string UnityProjectSettings(Uri project, string key) +// { +// var filename = System.IO.Path.Combine(project.LocalPath, @"ProjectSettings/ProjectSettings.asset"); +// var data = System.IO.File.ReadAllBytes(filename); +// var filestring = Encoding.UTF8.GetString(data); +// if (filestring.StartsWith(@"%YAML 1.1")) +// { +// // File is not binary +// //lines = Encoding.ASCII.GetString(data); +// } +// else +// { +// filestring = Encoding.ASCII.GetString(data); +// //File is binary +// } + +// //var compat = lines.Where(line => line.Trim(' ').StartsWith(key)).ToList(); +// //return compat.Count > 0? compat[0].Split(':')?[1] : ""; +// return ""; + +// } + + + +// public static Uri GetUnityExecutableFromVersion(Version version) +// { +// //return ProgramConfig.conf.ValidUnityExeLocations +// // .Select(loc => (loc, GetUnityVersionFromExecutable(loc))) +// // .Where(exe => version.Major == exe.Item2.Major && version.Minor == exe.Item2.Minor && version.Build == exe.Item2.Build) +// // .Aggregate((Uri null, Version null), (working, next) => working.Item2.Revision > next.Item2.Revision ? working : next).Item1; + +// foreach (var exe in ProgramConfig.conf.ValidUnityExeLocations) +// { +// var a = GetUnityVersionFromExecutable(exe); +// if (version.Major == a.Major && version.Minor == a.Minor && version.Build == a.Build) +// { +// return exe; +// } +// } +// return null; +// } + +// public static Version GetUnityVersionFromExecutable(Uri exec) +// { +// var versionInfo = FileVersionInfo.GetVersionInfo(exec.LocalPath); +// return new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, 0); +// } + +// public static void DumpUnityVersionInfo(Uri exec) +// { +// var versionInfo = FileVersionInfo.GetVersionInfo(exec.LocalPath); +// System.Threading.Tasks.Task.Run(() => Newtonsoft.Json.JsonConvert.SerializeObject(versionInfo)).ContinueWith((input) => { +// System.IO.File.WriteAllText(versionInfo.ProductName + "_" + versionInfo.ProductVersion + ".json", input.Result); + +// }) + +//; +// } +// } diff --git a/UnityMultiFramework/UnityMultiFramework.csproj b/UnityMultiFramework/UnityMultiFramework.csproj new file mode 100644 index 0000000..a0e5c09 --- /dev/null +++ b/UnityMultiFramework/UnityMultiFramework.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1} + Library + Properties + UnityMultiFramework + UnityMultiFramework + v4.7 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UnityMultiLauncher.sln b/UnityMultiLauncher.sln index d40c049..250ca78 100644 --- a/UnityMultiLauncher.sln +++ b/UnityMultiLauncher.sln @@ -1,25 +1,133 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2009 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityMultiLauncher", "UnityMultiLauncher\UnityMultiLauncher.csproj", "{5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFireUtil", "WPFireUtil\WPFireUtil.csproj", "{604B15C9-2391-4D76-B2ED-F4E427F288AE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityMultiFramework", "UnityMultiFramework\UnityMultiFramework.csproj", "{DC81AC27-1181-4CDE-BE6D-AF159FF912C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UMFTests", "UMFTests\UMFTests.csproj", "{B5E72137-B161-4517-A47B-9C191A1EDCA5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 ExampleDev|Any CPU = ExampleDev|Any CPU + ExampleDev|ARM = ExampleDev|ARM + ExampleDev|x64 = ExampleDev|x64 + ExampleDev|x86 = ExampleDev|x86 Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|ARM.ActiveCfg = Debug|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|ARM.Build.0 = Debug|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|x64.ActiveCfg = Debug|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|x64.Build.0 = Debug|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|x86.ActiveCfg = Debug|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Debug|x86.Build.0 = Debug|Any CPU {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|Any CPU.ActiveCfg = ExampleDev|Any CPU {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|Any CPU.Build.0 = ExampleDev|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|ARM.ActiveCfg = ExampleDev|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|ARM.Build.0 = ExampleDev|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|x64.ActiveCfg = ExampleDev|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|x64.Build.0 = ExampleDev|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|x86.ActiveCfg = ExampleDev|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.ExampleDev|x86.Build.0 = ExampleDev|Any CPU {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|Any CPU.Build.0 = Release|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|ARM.ActiveCfg = Release|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|ARM.Build.0 = Release|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|x64.ActiveCfg = Release|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|x64.Build.0 = Release|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|x86.ActiveCfg = Release|Any CPU + {5468AB5C-3920-47B5-8FB8-3E6B084DCCFB}.Release|x86.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|ARM.ActiveCfg = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|ARM.Build.0 = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|x64.ActiveCfg = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|x64.Build.0 = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Debug|x86.Build.0 = Debug|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|Any CPU.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|Any CPU.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|ARM.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|ARM.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|x64.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|x64.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|x86.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.ExampleDev|x86.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|Any CPU.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|ARM.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|ARM.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|x64.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|x64.Build.0 = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|x86.ActiveCfg = Release|Any CPU + {604B15C9-2391-4D76-B2ED-F4E427F288AE}.Release|x86.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|ARM.ActiveCfg = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|ARM.Build.0 = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|x64.Build.0 = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Debug|x86.Build.0 = Debug|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|Any CPU.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|Any CPU.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|ARM.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|ARM.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|x64.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|x64.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|x86.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.ExampleDev|x86.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|Any CPU.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|ARM.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|ARM.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|x64.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|x64.Build.0 = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|x86.ActiveCfg = Release|Any CPU + {DC81AC27-1181-4CDE-BE6D-AF159FF912C1}.Release|x86.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|ARM.Build.0 = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|x64.ActiveCfg = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|x64.Build.0 = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|x86.ActiveCfg = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Debug|x86.Build.0 = Debug|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|Any CPU.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|Any CPU.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|ARM.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|ARM.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|x64.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|x64.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|x86.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.ExampleDev|x86.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|Any CPU.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|ARM.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|ARM.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|x64.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|x64.Build.0 = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|x86.ActiveCfg = Release|Any CPU + {B5E72137-B161-4517-A47B-9C191A1EDCA5}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {07930745-B85E-474C-8135-AEAB4E2CF886} + EndGlobalSection EndGlobal diff --git a/UnityMultiLauncher/App.config b/UnityMultiLauncher/App.config index 88fa402..125a5a9 100644 --- a/UnityMultiLauncher/App.config +++ b/UnityMultiLauncher/App.config @@ -1,6 +1,14 @@ - + - + - \ No newline at end of file + + + + + + + + + diff --git a/UnityMultiLauncher/App.xaml b/UnityMultiLauncher/App.xaml index 1702956..68e0c15 100644 --- a/UnityMultiLauncher/App.xaml +++ b/UnityMultiLauncher/App.xaml @@ -2,24 +2,115 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:UnityMultiLauncher" - + xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" + xmlns:FireUtil="clr-namespace:WPFireUtil;assembly=WPFireUtil" + xmlns:Converter="clr-namespace:UnityMultiLauncher.Controls.Converters" + xmlns:VM="clr-namespace:UnityMultiLauncher.ViewModels" StartupUri="Views\MainWindow.xaml"> - - - - - - - + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + +