Upgrading to .net 6

This commit is contained in:
Lars Brubaker 2022-07-15 17:28:39 -07:00
parent 738c6e20ea
commit 32a192c2b8
155 changed files with 2030 additions and 2536 deletions

4
.gitignore vendored
View file

@ -4,7 +4,8 @@
# mstest test results # mstest test results
TestResults TestResults
Tests/temp Tests/temp/
Tests/TestData/ExportedGcode/
StaticData/Translations/L10N/ StaticData/Translations/L10N/
@ -120,3 +121,4 @@ MatterControl.userprefs
# JetBrains Rider user configuration directory # JetBrains Rider user configuration directory
/.idea/ /.idea/
/MainOutputDirectory.cs

View file

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="11.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -1,6 +0,0 @@
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
</configuration>

View file

@ -1,54 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<ProjectGuid>{3DF4CB3D-9A03-4256-9A81-70523AAD828B}</ProjectGuid>
<OutputPath>bin\Release\</OutputPath>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MatterHackers.MatterControl.Launcher</RootNamespace> <RootNamespace>MatterHackers.MatterControl.Launcher</RootNamespace>
<AssemblyName>Launcher</AssemblyName> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>2.0</OldToolsVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks> <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="Launcher.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project> </Project>

View file

@ -0,0 +1,8 @@
{
"profiles": {
"Launcher": {
"commandName": "Project",
"commandLineArgs": "C:\\Windows\\notepad.exe 1000"
}
}
}

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
</configuration>

279
MainInstanceService.cs Normal file
View file

@ -0,0 +1,279 @@
// For communication with the main instance. Use ServiceWire or just pipes.
#define USE_SERVICEWIRE
using MatterHackers.MatterControl;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Security.AccessControl;
using System.Security.Principal;
#if USE_SERVICEWIRE
using ServiceWire;
#else
using System.IO.Pipes;
using System.Xml.Serialization;
#endif
namespace MatterHackers.MatterControl
{
public interface IMainService
{
void ShellOpenFile(string[] files);
}
[Serializable]
public class LocalService : IMainService
{
private const string ServicePipeName = "MatterControlMainInstance";
#if USE_SERVICEWIRE
private const string MainInstanceMutexName = "MatterControlMainInstanceMutex";
#pragma warning disable IDE0052 // Remove unread private members
// Don't let the GC clean this up.
private static Mutex MainInstanceMutex = null;
#pragma warning restore IDE0052 // Remove unread private members
#else
static string readPipeMessage(PipeStream pipe)
{
MemoryStream ms = new MemoryStream();
using var cancellation = new CancellationTokenSource();
byte[] buffer = new byte[1024];
do
{
var task = pipe.ReadAsync(buffer, 0, buffer.Length, cancellation.Token);
cancellation.CancelAfter(1000);
task.Wait();
ms.Write(buffer, 0, task.Result);
if (task.Result <= 0)
break;
} while (!pipe.IsMessageComplete);
return Encoding.Unicode.GetString(ms.ToArray());
}
#endif
private static readonly object locker = new();
public static bool TryStartServer()
{
#if USE_SERVICEWIRE
// ServiceWire will allow lots of pipes to exist under the same name, so a mutex is needed.
// Locking isn't needed. Windows should clean up when the main instance closes.
Mutex mutex = new(false, MainInstanceMutexName, out bool createdNew);
try
{
if (createdNew)
{
try
{
var host = new ServiceWire.NamedPipes.NpHost(ServicePipeName, new ServiceWireLogger());
host.AddService<IMainService>(new LocalService());
host.Open();
// Keep the mutex alive.
MainInstanceMutex = mutex;
mutex = null;
return true;
}
catch (Exception)
{
}
}
}
finally
{
// Not the main instance. Release the handle.
mutex?.Dispose();
}
return false;
#else
NamedPipeServerStream pipeServer = null;
try
{
pipeServer = new NamedPipeServerStream(ServicePipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.CurrentUserOnly);
}
catch (IOException)
{
return false;
}
new Task(() =>
{
try
{
var localService = new LocalService();
for (; ; )
{
pipeServer.WaitForConnection();
try
{
string str = readPipeMessage(pipeServer);
var serializer = new XmlSerializer(typeof(InstancePipeMessage));
var message = (InstancePipeMessage)serializer.Deserialize(new StringReader(str));
localService.ShellOpenFile(message.Paths);
using var cancellation = new CancellationTokenSource();
var task = pipeServer.WriteAsync(Encoding.Unicode.GetBytes("ok"), cancellation.Token).AsTask();
cancellation.CancelAfter(1000);
task.Wait();
}
catch (Exception)
{
}
// NamedPipeServerStream can only handle one client ever. Need a new server pipe. ServiceWire does the same thing.
// So here, there is a time where there is no server pipe. Another instance could become the main instance.
// NamedPipeClientStream.Connect should retry the connection.
pipeServer.Dispose();
pipeServer = new NamedPipeServerStream(ServicePipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.CurrentUserOnly);
}
}
catch (Exception ex) // TimeoutException or IOException
{
//System.Windows.Forms.MessageBox.Show(ex.ToString());
System.Diagnostics.Trace.WriteLine("Main instance pipe server died: " + ex.ToString());
}
pipeServer.Dispose();
pipeServer = null;
}).Start();
return true;
#endif
}
public static bool TrySendToServer(string[] shellFiles)
{
#if USE_SERVICEWIRE
try
{
using (var client = new ServiceWire.NamedPipes.NpClient<IMainService>(new ServiceWire.NamedPipes.NpEndPoint(ServicePipeName)))
{
if (client.IsConnected)
{
// notify the running instance of the event
client.Proxy.ShellOpenFile(shellFiles);
System.Threading.Thread.Sleep(1000);
// Finally, close the process spawned by Explorer.exe
return true;
}
}
}
catch (Exception)
{
}
#else
try
{
using var pipeClient = new NamedPipeClientStream(".", ServicePipeName, PipeDirection.InOut, PipeOptions.CurrentUserOnly);
pipeClient.Connect(1000);
pipeClient.ReadMode = PipeTransmissionMode.Message;
StringBuilder sb = new();
using (var writer = new StringWriter(sb))
new XmlSerializer(typeof(InstancePipeMessage)).Serialize(writer, new InstancePipeMessage { Paths = shellFiles.ToArray() });
using var cancellation = new CancellationTokenSource();
var task = pipeClient.WriteAsync(Encoding.Unicode.GetBytes(sb.ToString()), cancellation.Token).AsTask();
cancellation.CancelAfter(1000);
task.Wait();
if (task.IsCompletedSuccessfully && readPipeMessage(pipeClient).Trim() == "ok")
return true;
}
catch (Exception ex) // TimeoutException or IOException
{
//System.Windows.Forms.MessageBox.Show(ex.ToString());
System.Diagnostics.Trace.WriteLine("Instance pipe client died: " + ex.ToString());
}
#endif
return false;
}
public void ShellOpenFile(string[] files)
{
// If at least one argument is an acceptable shell file extension
var itemsToAdd = files.Where(f => File.Exists(f)
&& ApplicationController.ShellFileExtensions.Contains(Path.GetExtension(f).ToLower()));
if (itemsToAdd.Any())
{
lock (locker)
{
// Add each file
foreach (string file in itemsToAdd)
{
ApplicationController.Instance.ShellOpenFile(file);
}
}
}
}
#if USE_SERVICEWIRE
private class ServiceWireLogger : ServiceWire.ILog
{
static private void Log(ServiceWire.LogLevel level, string formattedMessage, params object[] args)
{
// Handled as in https://github.com/tylerjensen/ServiceWire/blob/master/src/ServiceWire/Logger.cs
if (null == formattedMessage)
return;
if (level <= LogLevel.Warn)
{
string msg = (null != args && args.Length > 0)
? string.Format(formattedMessage, args)
: formattedMessage;
System.Diagnostics.Trace.WriteLine(msg);
}
}
void ILog.Debug(string formattedMessage, params object[] args)
{
Log(LogLevel.Debug, formattedMessage, args);
}
void ILog.Error(string formattedMessage, params object[] args)
{
Log(LogLevel.Error, formattedMessage, args);
}
void ILog.Fatal(string formattedMessage, params object[] args)
{
Log(LogLevel.Fatal, formattedMessage, args);
}
void ILog.Info(string formattedMessage, params object[] args)
{
Log(LogLevel.Info, formattedMessage, args);
}
void ILog.Warn(string formattedMessage, params object[] args)
{
Log(LogLevel.Warn, formattedMessage, args);
}
}
#else
[Serializable]
public struct InstancePipeMessage
{
public string[] Paths;
}
#endif
}
}

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ReleaseVersion>2.20.12</ReleaseVersion> <ReleaseVersion>2.20.12</ReleaseVersion>

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ReleaseVersion>2.20.12</ReleaseVersion> <ReleaseVersion>2.20.12</ReleaseVersion>

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ReleaseVersion>2.20.12</ReleaseVersion> <ReleaseVersion>2.20.12</ReleaseVersion>

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ReleaseVersion>2.20.12</ReleaseVersion> <ReleaseVersion>2.20.12</ReleaseVersion>
@ -13,6 +13,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="System.IO.Ports" Version="7.0.0-preview.5.22301.12" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ReleaseVersion>2.20.12</ReleaseVersion> <ReleaseVersion>2.20.12</ReleaseVersion>

View file

@ -1,109 +1,35 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFramework>net6.0-windows</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<RootNamespace>MatterControl.Winforms</RootNamespace> <UseWindowsForms>true</UseWindowsForms>
<AssemblyName>MatterControl.Winforms</AssemblyName> <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <BaseOutputPath>$(SolutionDir)bin</BaseOutputPath>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;USE_OPENGL;IS_WINDOWS;IS_WINDOWS_FORMS</DefineConstants> <DefineConstants>TRACE;DEBUG;USE_OPENGL;IS_WINDOWS;IS_WINDOWS_FORMS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\bin\Release\</OutputPath>
<DefineConstants>TRACE;USE_OPENGL;IS_WINDOWS;IS_WINDOWS_FORMS</DefineConstants> <DefineConstants>TRACE;USE_OPENGL;IS_WINDOWS;IS_WINDOWS_FORMS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <ProjectReference Include="..\Community.CsharpSqlite\Community.CsharpSqlite.csproj" />
<Reference Include="System.Core" /> <ProjectReference Include="..\MatterControl.Common\MatterControl.Common.csproj" />
<Reference Include="System.Drawing" /> <ProjectReference Include="..\MatterControlLib\MatterControlLib.csproj" />
<Reference Include="System.Windows.Forms" /> <ProjectReference Include="..\Submodules\agg-sharp\agg\Agg.csproj" />
<Reference Include="System.Xml.Linq" /> <ProjectReference Include="..\Submodules\agg-sharp\DataConverters2D\DataConverters2D.csproj" />
<Reference Include="System.Data.DataSetExtensions" /> <ProjectReference Include="..\Submodules\agg-sharp\DataConverters3D\DataConverters3D.csproj" />
<Reference Include="Microsoft.CSharp" /> <ProjectReference Include="..\Submodules\agg-sharp\Gui\Gui.csproj" />
<Reference Include="System.Data" /> <ProjectReference Include="..\Submodules\agg-sharp\PlatformWin32\PlatformWin32.csproj" />
<Reference Include="System.Net.Http" /> <ProjectReference Include="..\Submodules\agg-sharp\RenderOpenGl\RenderOpenGl.csproj" />
<Reference Include="System.Xml" /> <ProjectReference Include="..\Submodules\agg-sharp\VectorMath\VectorMath.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="DataStorage\SQLiteUnix.cs" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<Compile Include="DataStorage\SQLiteWin32.cs" /> <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<Compile Include="InspectForm.cs"> <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<SubType>Form</SubType> <PrivateAssets>all</PrivateAssets>
</Compile> </PackageReference>
<Compile Include="InspectForm.Designer.cs">
<DependentUpon>InspectForm.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="WindowsPlatformsFeatures.cs" />
<Compile Include="WinformsSingleWindowProvider.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Community.CsharpSqlite\Community.CsharpSqlite.csproj">
<Project>{f1653f20-d47d-4f29-8c55-3c835542af5f}</Project>
<Name>Community.CsharpSqlite</Name>
</ProjectReference>
<ProjectReference Include="..\MatterControl.Common\MatterControl.Common.csproj">
<Project>{2af30557-fc50-4de3-ad1c-7eb57131a9c5}</Project>
<Name>MatterControl.Common</Name>
</ProjectReference>
<ProjectReference Include="..\MatterControlLib\MatterControlLib.csproj">
<Project>{D557B079-612F-467F-AE0D-3F77BCD627F7}</Project>
<Name>MatterControlLib</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\agg\Agg.csproj">
<Project>{657dbc6d-c3ea-4398-a3fa-ddb73c14f71b}</Project>
<Name>Agg</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\DataConverters2D\DataConverters2D.csproj">
<Project>{94838988-523c-4b11-ad82-8b9b76f23a31}</Project>
<Name>DataConverters2D</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\DataConverters3D\DataConverters3D.csproj">
<Project>{04667764-dc7b-4b95-aef6-b4e6c87a54e9}</Project>
<Name>DataConverters3D</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\Gui\Gui.csproj">
<Project>{74f6bb6c-9d02-4512-a59a-21940e35c532}</Project>
<Name>Gui</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\PlatformWin32\PlatformWin32.csproj">
<Project>{CD8A3D1A-24D5-4184-8CF3-7B2AD5CD7A71}</Project>
<Name>PlatformWin32</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\RenderOpenGl\RenderOpenGl.csproj">
<Project>{545b6912-77ff-4b34-ba76-6c3d6a32be6a}</Project>
<Name>RenderOpenGl</Name>
</ProjectReference>
<ProjectReference Include="..\Submodules\agg-sharp\VectorMath\VectorMath.csproj">
<Project>{d3e41b4e-bfbb-44ca-94c8-95c00f754fdd}</Project>
<Name>VectorMath</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="InspectForm.resx">
<DependentUpon>InspectForm.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>

View file

@ -34,3 +34,6 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
// https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416
[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]

View file

@ -31,6 +31,7 @@ using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.Loader;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.Image; using MatterHackers.Agg.Image;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
@ -207,7 +208,9 @@ namespace MatterHackers.MatterControl
{ {
try try
{ {
PluginFinder.LoadTypesFromAssembly(Assembly.LoadFile(file)); // Be sure not to load a DLL more than once!
// https://github.com/dotnet/runtime/issues/39783
PluginFinder.LoadTypesFromAssembly(AssemblyLoadContext.Default.LoadFromAssemblyPath(file));
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -1,151 +1,145 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <TargetFramework>net6.0-windows</TargetFramework>
<PropertyGroup> <OutputType>WinExe</OutputType>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> </PropertyGroup>
<ProjectGuid>{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}</ProjectGuid> <PropertyGroup>
<OutputType>WinExe</OutputType> <StartupObject />
<RootNamespace>MatterControl</RootNamespace> </PropertyGroup>
<AssemblyName>MatterControl</AssemblyName> <PropertyGroup>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <ApplicationIcon>application.ico</ApplicationIcon>
<RuntimeIdentifier>win</RuntimeIdentifier> <BaseOutputPath></BaseOutputPath>
<FileAlignment>512</FileAlignment> </PropertyGroup>
<!--See the following for details on netstandard2 binding workround: https://github.com/dotnet/standard/issues/481--> <ItemGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <Compile Remove="Community.CsharpSqlite\**" />
<RestoreProjectStyle>PackageReference</RestoreProjectStyle> <Compile Remove="Launcher\**" />
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> <Compile Remove="MatterControl.Common\**" />
<TargetFrameworkProfile /> <Compile Remove="MatterControl.MeshOperations\**" />
</PropertyGroup> <Compile Remove="MatterControl.OpenGL\**" />
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <Compile Remove="MatterControl.Printing\**" />
<PlatformTarget>AnyCPU</PlatformTarget> <Compile Remove="MatterControl.SLA\**" />
<DebugSymbols>true</DebugSymbols> <Compile Remove="MatterControl.Winforms\**" />
<DebugType>full</DebugType> <Compile Remove="MatterControlLib\**" />
<Optimize>false</Optimize> <Compile Remove="MatterHackers.gsSlicer\**" />
<OutputPath>bin\Debug\</OutputPath> <Compile Remove="Plugins\**" />
<DefineConstants>DEBUG;TRACE</DefineConstants> <Compile Remove="PrinterDriverInstaller\**" />
<ErrorReport>prompt</ErrorReport> <Compile Remove="PrusaI3-MK3\**" />
<WarningLevel>4</WarningLevel> <Compile Remove="StaticData\**" />
<Prefer32Bit>false</Prefer32Bit> <Compile Remove="Submodules\**" />
</PropertyGroup> <Compile Remove="Tests\**" />
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <Compile Remove="Tools\**" />
<PlatformTarget>AnyCPU</PlatformTarget> <EmbeddedResource Remove="Community.CsharpSqlite\**" />
<DebugType>pdbonly</DebugType> <EmbeddedResource Remove="Launcher\**" />
<Optimize>true</Optimize> <EmbeddedResource Remove="MatterControl.Common\**" />
<OutputPath>bin\Release\</OutputPath> <EmbeddedResource Remove="MatterControl.MeshOperations\**" />
<DefineConstants>TRACE</DefineConstants> <EmbeddedResource Remove="MatterControl.OpenGL\**" />
<ErrorReport>prompt</ErrorReport> <EmbeddedResource Remove="MatterControl.Printing\**" />
<WarningLevel>4</WarningLevel> <EmbeddedResource Remove="MatterControl.SLA\**" />
<Prefer32Bit>false</Prefer32Bit> <EmbeddedResource Remove="MatterControl.Winforms\**" />
</PropertyGroup> <EmbeddedResource Remove="MatterControlLib\**" />
<PropertyGroup> <EmbeddedResource Remove="MatterHackers.gsSlicer\**" />
<StartupObject /> <EmbeddedResource Remove="Plugins\**" />
</PropertyGroup> <EmbeddedResource Remove="PrinterDriverInstaller\**" />
<PropertyGroup> <EmbeddedResource Remove="PrusaI3-MK3\**" />
<ApplicationIcon>application.ico</ApplicationIcon> <EmbeddedResource Remove="StaticData\**" />
</PropertyGroup> <EmbeddedResource Remove="Submodules\**" />
<ItemGroup> <EmbeddedResource Remove="Tests\**" />
<Reference Include="System" /> <EmbeddedResource Remove="Tools\**" />
<Reference Include="System.ServiceModel" /> <None Remove="Community.CsharpSqlite\**" />
<Reference Include="System.Xml.Linq" /> <None Remove="Launcher\**" />
<Reference Include="System.Data.DataSetExtensions" /> <None Remove="MatterControl.Common\**" />
<Reference Include="Microsoft.CSharp" /> <None Remove="MatterControl.MeshOperations\**" />
<Reference Include="System.Data" /> <None Remove="MatterControl.OpenGL\**" />
<Reference Include="System.Net.Http" /> <None Remove="MatterControl.Printing\**" />
<Reference Include="System.Xml" /> <None Remove="MatterControl.SLA\**" />
</ItemGroup> <None Remove="MatterControl.Winforms\**" />
<ItemGroup> <None Remove="MatterControlLib\**" />
<Compile Include="CSharpSerialPortWrapper.cs" /> <None Remove="MatterHackers.gsSlicer\**" />
<Compile Include="Program.cs" /> <None Remove="Plugins\**" />
<Compile Include="Properties\AssemblyInfo.cs" /> <None Remove="PrinterDriverInstaller\**" />
</ItemGroup> <None Remove="PrusaI3-MK3\**" />
<ItemGroup> <None Remove="StaticData\**" />
<None Include="App.config" /> <None Remove="Submodules\**" />
<None Include="appsettings.json" /> <None Remove="Tests\**" />
<None Include="StaticData\License\license.json" /> <None Remove="Tools\**" />
<None Include="StaticData\OEMSettings\OEMUrls.json" /> </ItemGroup>
<None Include="StaticData\OEMSettings\Printers.json" /> <ItemGroup>
<None Include="StaticData\OEMSettings\Settings.json" /> <ProjectReference Include="Community.CsharpSqlite\Community.CsharpSqlite.csproj" />
<None Include="KnownPlugins.json"> <ProjectReference Include="MatterControl.Printing\MatterControl.Printing.csproj" />
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <ProjectReference Include="MatterControl.SLA\MatterControl.SLA.csproj" />
</None> <ProjectReference Include="MatterControl.Winforms\MatterControl.Winforms.csproj" />
</ItemGroup> <ProjectReference Include="MatterControlLib\MatterControlLib.csproj" />
<ItemGroup> <ProjectReference Include="PrinterDriverInstaller\InfInstaller.csproj" />
<ProjectReference Include="Community.CsharpSqlite\Community.CsharpSqlite.csproj"> <ProjectReference Include="Submodules\agg-sharp\agg\Agg.csproj" />
<Project>{f1653f20-d47d-4f29-8c55-3c835542af5f}</Project> <ProjectReference Include="Submodules\agg-sharp\Glfw\GlfwProvider.csproj" />
<Name>Community.CsharpSqlite</Name> <ProjectReference Include="Submodules\agg-sharp\Gui\Gui.csproj" />
</ProjectReference> <ProjectReference Include="Submodules\agg-sharp\VectorMath\VectorMath.csproj" />
<ProjectReference Include="MatterControl.Printing\MatterControl.Printing.csproj"> <ProjectReference Include="Submodules\MatterSlice\MatterSlice.csproj" />
<Project>{97d5ade3-c1b4-4b46-8a3e-718a4f7f079f}</Project> <ProjectReference Include="MatterControl.Common\MatterControl.Common.csproj" />
<Name>MatterControl.Printing</Name> </ItemGroup>
</ProjectReference> <ItemGroup>
<ProjectReference Include="MatterControl.SLA\MatterControl.SLA.csproj"> <Content Include="application.ico">
<Project>{e2b1af22-4143-4b33-9781-fc5527e959f6}</Project> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Name>MatterControl.SLA</Name> </Content>
</ProjectReference> <None Include="StaticData\MatterControl EULA.txt" />
<ProjectReference Include="MatterControl.Winforms\MatterControl.Winforms.csproj"> <None Include="StaticData\BuildInfo.txt" />
<Project>{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}</Project> <None Include="StaticData\License\agg-sharp.txt" />
<Name>MatterControl.Winforms</Name> <None Include="StaticData\License\clipper.txt" />
</ProjectReference> <None Include="StaticData\License\markdig.txt" />
<ProjectReference Include="MatterControlLib\MatterControlLib.csproj"> <None Include="StaticData\License\matterslice.txt" />
<Project>{93bebfdf-b81a-4344-ab82-0dbf58b234cd}</Project> <None Include="StaticData\License\opentk.txt" />
<Name>MatterControlLib</Name> <None Include="StaticData\SliceSettings\Layouts.txt" />
</ProjectReference> </ItemGroup>
<ProjectReference Include="PrinterDriverInstaller\InfInstaller.csproj"> <ItemGroup>
<Project>{990a9ad3-b6a4-407b-9dfc-9c722af7c9b9}</Project> <PackageReference Include="CsvHelper">
<Name>InfInstaller</Name> <Version>27.2.1</Version>
</ProjectReference> </PackageReference>
<ProjectReference Include="Submodules\agg-sharp\agg\Agg.csproj"> <PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.9" />
<Project>{657dbc6d-c3ea-4398-a3fa-ddb73c14f71b}</Project> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<Name>Agg</Name> <PackageReference Include="Mindscape.Raygun4Net.NetCore" Version="6.4.3" />
</ProjectReference> <PackageReference Include="ServiceWire" Version="5.5.0" />
<ProjectReference Include="Submodules\agg-sharp\Glfw\GlfwProvider.csproj"> <PackageReference Include="SocketIoClientDotNet">
<Project>{4da97548-2588-4ac3-a21d-ba4fee6fe5e4}</Project> <Version>1.0.2-beta1</Version>
<Name>GlfwProvider</Name> </PackageReference>
</ProjectReference> <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<ProjectReference Include="Submodules\agg-sharp\Gui\Gui.csproj"> <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<Project>{74F6BB6C-9D02-4512-A59A-21940E35C532}</Project> <PrivateAssets>all</PrivateAssets>
<Name>Gui</Name> </PackageReference>
</ProjectReference> <PackageReference Include="System.IO.Ports" Version="7.0.0-preview.5.22301.12" />
<ProjectReference Include="Submodules\agg-sharp\VectorMath\VectorMath.csproj"> </ItemGroup>
<Project>{d3e41b4e-bfbb-44ca-94c8-95c00f754fdd}</Project> <ItemGroup>
<Name>VectorMath</Name> <Compile Remove="ConfigurationPage\ApplicationSettings\ThemeColorPanel.cs" />
</ProjectReference> </ItemGroup>
<ProjectReference Include="Submodules\MatterSlice\MatterSlice.csproj"> <ItemGroup>
<Project>{b0aed568-8796-42b9-baa9-ebc796134e78}</Project> <None Remove=".gitignore" />
<Name>MatterSlice</Name> <None Remove=".gitmodules" />
</ProjectReference> <None Remove=".travis.yml" />
<ProjectReference Include="MatterControl.Common\MatterControl.Common.csproj"> <None Remove="AnalysisReport.sarif" />
<Project>{50505F12-985B-4C5F-8DAB-D5BEA734CD51}</Project> <None Remove="application.ico" />
<Name>MatterControl.Common</Name> <None Remove="CONTRIBUTING.md" />
</ProjectReference> <None Remove="desktop.ini" />
</ItemGroup> <None Remove="LICENSE" />
<ItemGroup> <None Remove="main.cpp" />
<Content Include="application.ico"> <None Remove="ProductVersion.txt" />
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <None Remove="README.md" />
</Content> <None Remove="upgrade-assistant.clef" />
<None Include="StaticData\MatterControl EULA.txt" /> </ItemGroup>
<None Include="StaticData\BuildInfo.txt" /> <ItemGroup>
<None Include="StaticData\License\agg-sharp.txt" /> <None Update="KnownPlugins.json">
<None Include="StaticData\License\clipper.txt" /> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Include="StaticData\License\markdig.txt" /> </None>
<None Include="StaticData\License\matterslice.txt" /> </ItemGroup>
<None Include="StaticData\License\opentk.txt" /> <Target Name="WriteToFile" BeforeTargets="PreBuildEvent">
<None Include="StaticData\SliceSettings\Layouts.txt" /> <ItemGroup>
</ItemGroup> <AssemblyAttributes Include="MatterHackers.MatterControl.MainOutputDirectory">
<ItemGroup> <_Parameter1>$(OutputPath)</_Parameter1>
<PackageReference Include="CsvHelper"> <_Parameter2>$(SolutionDir)</_Parameter2>
<Version>27.2.1</Version> </AssemblyAttributes>
</PackageReference> </ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Client"> <WriteCodeFragment Language="C#" OutputFile="MainOutputDirectory.cs" AssemblyAttributes="@(AssemblyAttributes)">
<Version>5.2.9</Version> <Output TaskParameter="OutputFile" ItemName="Compile" />
</PackageReference> <Output TaskParameter="OutputFile" ItemName="FileWrites" />
<PackageReference Include="Mindscape.Raygun4Net"> </WriteCodeFragment>
<Version>5.13.0</Version> </Target>
</PackageReference>
<PackageReference Include="SocketIoClientDotNet">
<Version>1.0.2-beta1</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>

View file

@ -34,27 +34,27 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clipper_library", "Submodul
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarchingSquares", "Submodules\agg-sharp\MarchingSquares\MarchingSquares.csproj", "{DF6845CD-64C6-4263-8357-DA8066855739}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarchingSquares", "Submodules\agg-sharp\MarchingSquares\MarchingSquares.csproj", "{DF6845CD-64C6-4263-8357-DA8066855739}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher", "Launcher\Launcher.csproj", "{3DF4CB3D-9A03-4256-9A81-70523AAD828B}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Launcher", "Launcher\Launcher.csproj", "{3DF4CB3D-9A03-4256-9A81-70523AAD828B}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "agg-sharp", "agg-sharp", "{2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "agg-sharp", "agg-sharp", "{2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfInstaller", "PrinterDriverInstaller\InfInstaller.csproj", "{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfInstaller", "PrinterDriverInstaller\InfInstaller.csproj", "{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FBE6DF29-85A9-4A8B-B739-35BE4CA0A9B7}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FBE6DF29-85A9-4A8B-B739-35BE4CA0A9B7}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataConverters3D", "Submodules\agg-sharp\DataConverters3D\DataConverters3D.csproj", "{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataConverters3D", "Submodules\agg-sharp\DataConverters3D\DataConverters3D.csproj", "{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatterControl.Tests", "Tests\MatterControl.Tests\MatterControl.Tests.csproj", "{E1455E5C-127C-4282-8CC5-452C300E91D0}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Tests", "Tests\MatterControl.Tests\MatterControl.Tests.csproj", "{E1455E5C-127C-4282-8CC5-452C300E91D0}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agg.Tests", "Submodules\agg-sharp\Tests\Agg.Tests\Agg.Tests.csproj", "{195CBE56-E654-437B-AB05-3BE1B9452497}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Agg.Tests", "Submodules\agg-sharp\Tests\Agg.Tests\Agg.Tests.csproj", "{195CBE56-E654-437B-AB05-3BE1B9452497}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatterSlice.Tests", "Submodules\MatterSlice\Tests\MatterSlice.Tests\MatterSlice.Tests.csproj", "{8CD15B23-D30F-470E-99BA-9276FB7CABD4}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterSlice.Tests", "Submodules\MatterSlice\Tests\MatterSlice.Tests\MatterSlice.Tests.csproj", "{8CD15B23-D30F-470E-99BA-9276FB7CABD4}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GuiAutomation", "Submodules\agg-sharp\GuiAutomation\GuiAutomation.csproj", "{E9102310-0029-4D8F-B1E9-88FBA6147D45}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GuiAutomation", "Submodules\agg-sharp\GuiAutomation\GuiAutomation.csproj", "{E9102310-0029-4D8F-B1E9-88FBA6147D45}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataConverters2D", "Submodules\agg-sharp\DataConverters2D\DataConverters2D.csproj", "{94838988-523C-4B11-AD82-8B9B76F23A31}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataConverters2D", "Submodules\agg-sharp\DataConverters2D\DataConverters2D.csproj", "{94838988-523C-4B11-AD82-8B9B76F23A31}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatterControl.AutomationTests", "Tests\MatterControl.AutomationTests\MatterControl.AutomationTests.csproj", "{418E7058-92EE-4329-86BA-AC26B65AFB25}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.AutomationTests", "Tests\MatterControl.AutomationTests\MatterControl.AutomationTests.csproj", "{418E7058-92EE-4329-86BA-AC26B65AFB25}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{FED00F38-E911-45E1-A788-26980E84C3D6}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{FED00F38-E911-45E1-A788-26980E84C3D6}"
EndProject EndProject
@ -72,15 +72,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.OpenGL", "Mat
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Printing", "MatterControl.Printing\MatterControl.Printing.csproj", "{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Printing", "MatterControl.Printing\MatterControl.Printing.csproj", "{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatterControl.Winforms", "MatterControl.Winforms\MatterControl.Winforms.csproj", "{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Winforms", "MatterControl.Winforms\MatterControl.Winforms.csproj", "{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterSliceLib", "Submodules\MatterSlice\MatterSliceLib\MatterSliceLib.csproj", "{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterSliceLib", "Submodules\MatterSlice\MatterSliceLib\MatterSliceLib.csproj", "{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatterSlice", "Submodules\MatterSlice\MatterSlice.csproj", "{B0AED568-8796-42B9-BAA9-EBC796134E78}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterSlice", "Submodules\MatterSlice\MatterSlice.csproj", "{B0AED568-8796-42B9-BAA9-EBC796134E78}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControlLib", "MatterControlLib\MatterControlLib.csproj", "{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControlLib", "MatterControlLib\MatterControlLib.csproj", "{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatterControl", "MatterControl.csproj", "{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl", "MatterControl.csproj", "{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Common", "MatterControl.Common\MatterControl.Common.csproj", "{50505F12-985B-4C5F-8DAB-D5BEA734CD51}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Common", "MatterControl.Common\MatterControl.Common.csproj", "{50505F12-985B-4C5F-8DAB-D5BEA734CD51}"
EndProject EndProject
@ -104,6 +104,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.SLA", "Matter
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "geometry3Sharp", "Submodules\agg-sharp\geometry3Sharp\geometry3Sharp.csproj", "{3A25C796-F676-4422-8F30-01D4FDB240F1}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "geometry3Sharp", "Submodules\agg-sharp\geometry3Sharp\geometry3Sharp.csproj", "{3A25C796-F676-4422-8F30-01D4FDB240F1}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestInvoker", "Submodules\agg-sharp\Tests\TestInvoker\TestInvoker.csproj", "{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}"
EndProject
Global Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution GlobalSection(SharedMSBuildProjectFiles) = preSolution
Submodules\agg-sharp\Typography\Typography.OpenFont\Typography.OpenFont.projitems*{235a071b-8d06-40ae-a5c5-b1ce59715ee9}*SharedItemsImports = 13 Submodules\agg-sharp\Typography\Typography.OpenFont\Typography.OpenFont.projitems*{235a071b-8d06-40ae-a5c5-b1ce59715ee9}*SharedItemsImports = 13
@ -113,339 +115,177 @@ Global
EndGlobalSection EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Debug|Any CPU.Build.0 = Debug|Any CPU {AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Release|Any CPU.ActiveCfg = Release|Any CPU {AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Release|Any CPU.Build.0 = Release|Any CPU {AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Release|Any CPU.Build.0 = Release|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{AE37DE1F-22F7-49EE-8732-FC6BC8DC58D9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {670BDDFF-927B-425D-9DD1-22ACB14356EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {670BDDFF-927B-425D-9DD1-22ACB14356EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Release|Any CPU.ActiveCfg = Release|Any CPU {670BDDFF-927B-425D-9DD1-22ACB14356EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Release|Any CPU.Build.0 = Release|Any CPU {670BDDFF-927B-425D-9DD1-22ACB14356EB}.Release|Any CPU.Build.0 = Release|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{670BDDFF-927B-425D-9DD1-22ACB14356EB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU {D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Release|Any CPU.Build.0 = Release|Any CPU {D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Release|Any CPU.Build.0 = Release|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D3E41B4E-BFBB-44CA-94C8-95C00F754FDD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU {545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU {545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Release|Any CPU.Build.0 = Release|Any CPU {545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Release|Any CPU.Build.0 = Release|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{545B6912-77FF-4B34-BA76-6C3D6A32BE6A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {74F6BB6C-9D02-4512-A59A-21940E35C532}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Debug|Any CPU.Build.0 = Debug|Any CPU {74F6BB6C-9D02-4512-A59A-21940E35C532}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Release|Any CPU.ActiveCfg = Release|Any CPU {74F6BB6C-9D02-4512-A59A-21940E35C532}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Release|Any CPU.Build.0 = Release|Any CPU {74F6BB6C-9D02-4512-A59A-21940E35C532}.Release|Any CPU.Build.0 = Release|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{74F6BB6C-9D02-4512-A59A-21940E35C532}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Release|Any CPU.ActiveCfg = Release|Any CPU {7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Release|Any CPU.Build.0 = Release|Any CPU {7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Release|Any CPU.Build.0 = Release|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{7E61A5BD-E78F-4B80-88C9-3821B4FA062E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86F6AAF2-9B50-40B8-A427-1897D76471C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Debug|Any CPU.Build.0 = Debug|Any CPU {86F6AAF2-9B50-40B8-A427-1897D76471C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {86F6AAF2-9B50-40B8-A427-1897D76471C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Release|Any CPU.Build.0 = Release|Any CPU {86F6AAF2-9B50-40B8-A427-1897D76471C5}.Release|Any CPU.Build.0 = Release|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{86F6AAF2-9B50-40B8-A427-1897D76471C5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Debug|Any CPU.Build.0 = Debug|Any CPU {657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Release|Any CPU.ActiveCfg = Release|Any CPU {657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Release|Any CPU.Build.0 = Release|Any CPU {657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Release|Any CPU.Build.0 = Release|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{657DBC6D-C3EA-4398-A3FA-DDB73C14F71B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F1653F20-D47D-4F29-8C55-3C835542AF5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F1653F20-D47D-4F29-8C55-3C835542AF5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {F1653F20-D47D-4F29-8C55-3C835542AF5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Release|Any CPU.Build.0 = Release|Any CPU {F1653F20-D47D-4F29-8C55-3C835542AF5F}.Release|Any CPU.Build.0 = Release|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{F1653F20-D47D-4F29-8C55-3C835542AF5F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA96058C-1A37-465D-A357-D6D695B13D25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Debug|Any CPU.Build.0 = Debug|Any CPU {CA96058C-1A37-465D-A357-D6D695B13D25}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA96058C-1A37-465D-A357-D6D695B13D25}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Release|Any CPU.Build.0 = Release|Any CPU {CA96058C-1A37-465D-A357-D6D695B13D25}.Release|Any CPU.Build.0 = Release|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{CA96058C-1A37-465D-A357-D6D695B13D25}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {036BCCBA-52D8-457C-84AE-8821F209FE4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Debug|Any CPU.Build.0 = Debug|Any CPU {036BCCBA-52D8-457C-84AE-8821F209FE4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Release|Any CPU.ActiveCfg = Release|Any CPU {036BCCBA-52D8-457C-84AE-8821F209FE4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Release|Any CPU.Build.0 = Release|Any CPU {036BCCBA-52D8-457C-84AE-8821F209FE4A}.Release|Any CPU.Build.0 = Release|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{036BCCBA-52D8-457C-84AE-8821F209FE4A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Debug|Any CPU.Build.0 = Debug|Any CPU {9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Release|Any CPU.ActiveCfg = Release|Any CPU {9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Release|Any CPU.Build.0 = Release|Any CPU {9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Release|Any CPU.Build.0 = Release|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9B062971-A88E-4A3D-B3C9-12B78D15FA66}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DF6845CD-64C6-4263-8357-DA8066855739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Debug|Any CPU.Build.0 = Debug|Any CPU {DF6845CD-64C6-4263-8357-DA8066855739}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Release|Any CPU.ActiveCfg = Release|Any CPU {DF6845CD-64C6-4263-8357-DA8066855739}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Release|Any CPU.Build.0 = Release|Any CPU {DF6845CD-64C6-4263-8357-DA8066855739}.Release|Any CPU.Build.0 = Release|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{DF6845CD-64C6-4263-8357-DA8066855739}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Release|Any CPU.Build.0 = Release|Any CPU {3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Release|Any CPU.Build.0 = Release|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3DF4CB3D-9A03-4256-9A81-70523AAD828B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Debug|Any CPU.Build.0 = Debug|Any CPU {990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Release|Any CPU.ActiveCfg = Release|Any CPU {990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Release|Any CPU.Build.0 = Release|Any CPU {990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Release|Any CPU.Build.0 = Release|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Debug|Any CPU.Build.0 = Debug|Any CPU {04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Release|Any CPU.ActiveCfg = Release|Any CPU {04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Release|Any CPU.Build.0 = Release|Any CPU {04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Release|Any CPU.Build.0 = Release|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1455E5C-127C-4282-8CC5-452C300E91D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Debug|Any CPU.Build.0 = Debug|Any CPU {E1455E5C-127C-4282-8CC5-452C300E91D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1455E5C-127C-4282-8CC5-452C300E91D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Release|Any CPU.Build.0 = Release|Any CPU {E1455E5C-127C-4282-8CC5-452C300E91D0}.Release|Any CPU.Build.0 = Release|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{E1455E5C-127C-4282-8CC5-452C300E91D0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {195CBE56-E654-437B-AB05-3BE1B9452497}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Debug|Any CPU.Build.0 = Debug|Any CPU {195CBE56-E654-437B-AB05-3BE1B9452497}.Debug|Any CPU.Build.0 = Debug|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Release|Any CPU.ActiveCfg = Release|Any CPU {195CBE56-E654-437B-AB05-3BE1B9452497}.Release|Any CPU.ActiveCfg = Release|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Release|Any CPU.Build.0 = Release|Any CPU {195CBE56-E654-437B-AB05-3BE1B9452497}.Release|Any CPU.Build.0 = Release|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{195CBE56-E654-437B-AB05-3BE1B9452497}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Debug|Any CPU.Build.0 = Debug|Any CPU {8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Release|Any CPU.Build.0 = Release|Any CPU {8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Release|Any CPU.Build.0 = Release|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{8CD15B23-D30F-470E-99BA-9276FB7CABD4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Any CPU.Build.0 = Debug|Any CPU {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Any CPU.Build.0 = Release|Any CPU {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Any CPU.Build.0 = Release|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {94838988-523C-4B11-AD82-8B9B76F23A31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Debug|Any CPU.Build.0 = Debug|Any CPU {94838988-523C-4B11-AD82-8B9B76F23A31}.Debug|Any CPU.Build.0 = Debug|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Release|Any CPU.ActiveCfg = Release|Any CPU {94838988-523C-4B11-AD82-8B9B76F23A31}.Release|Any CPU.ActiveCfg = Release|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Release|Any CPU.Build.0 = Release|Any CPU {94838988-523C-4B11-AD82-8B9B76F23A31}.Release|Any CPU.Build.0 = Release|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{94838988-523C-4B11-AD82-8B9B76F23A31}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {418E7058-92EE-4329-86BA-AC26B65AFB25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Debug|Any CPU.Build.0 = Debug|Any CPU {418E7058-92EE-4329-86BA-AC26B65AFB25}.Debug|Any CPU.Build.0 = Debug|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Release|Any CPU.ActiveCfg = Release|Any CPU {418E7058-92EE-4329-86BA-AC26B65AFB25}.Release|Any CPU.ActiveCfg = Release|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Release|Any CPU.Build.0 = Release|Any CPU {418E7058-92EE-4329-86BA-AC26B65AFB25}.Release|Any CPU.Build.0 = Release|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{418E7058-92EE-4329-86BA-AC26B65AFB25}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Debug|Any CPU.Build.0 = Debug|Any CPU {8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Release|Any CPU.Build.0 = Release|Any CPU {8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Release|Any CPU.Build.0 = Release|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{8CB3464F-6130-4EDB-8DC6-CCD2697FAFBB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23EC3364-7C93-4169-9AB2-7181C66004C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {23EC3364-7C93-4169-9AB2-7181C66004C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Release|Any CPU.ActiveCfg = Release|Any CPU {23EC3364-7C93-4169-9AB2-7181C66004C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Release|Any CPU.Build.0 = Release|Any CPU {23EC3364-7C93-4169-9AB2-7181C66004C0}.Release|Any CPU.Build.0 = Release|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{23EC3364-7C93-4169-9AB2-7181C66004C0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2C564BE1-352D-4DDB-8226-F0981F983C60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Debug|Any CPU.Build.0 = Debug|Any CPU {2C564BE1-352D-4DDB-8226-F0981F983C60}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Release|Any CPU.ActiveCfg = Release|Any CPU {2C564BE1-352D-4DDB-8226-F0981F983C60}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Release|Any CPU.Build.0 = Release|Any CPU {2C564BE1-352D-4DDB-8226-F0981F983C60}.Release|Any CPU.Build.0 = Release|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{2C564BE1-352D-4DDB-8226-F0981F983C60}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A901129-C885-425F-8D4B-86698F98A2B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1A901129-C885-425F-8D4B-86698F98A2B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A901129-C885-425F-8D4B-86698F98A2B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Release|Any CPU.Build.0 = Release|Any CPU {1A901129-C885-425F-8D4B-86698F98A2B4}.Release|Any CPU.Build.0 = Release|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{1A901129-C885-425F-8D4B-86698F98A2B4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Debug|Any CPU.Build.0 = Debug|Any CPU {CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Release|Any CPU.ActiveCfg = Release|Any CPU {CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Release|Any CPU.Build.0 = Release|Any CPU {CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Release|Any CPU.Build.0 = Release|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{CBDEEC31-D688-417B-9BF2-F0DB2E4FB268}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Debug|Any CPU.Build.0 = Debug|Any CPU {97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Release|Any CPU.ActiveCfg = Release|Any CPU {97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Release|Any CPU.Build.0 = Release|Any CPU {97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Release|Any CPU.Build.0 = Release|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Debug|Any CPU.Build.0 = Debug|Any CPU {D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Release|Any CPU.Build.0 = Release|Any CPU {D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Release|Any CPU.Build.0 = Release|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Release|Any CPU.ActiveCfg = Release|Any CPU {7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Release|Any CPU.Build.0 = Release|Any CPU {7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Release|Any CPU.Build.0 = Release|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0AED568-8796-42B9-BAA9-EBC796134E78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Debug|Any CPU.Build.0 = Debug|Any CPU {B0AED568-8796-42B9-BAA9-EBC796134E78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0AED568-8796-42B9-BAA9-EBC796134E78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Release|Any CPU.Build.0 = Release|Any CPU {B0AED568-8796-42B9-BAA9-EBC796134E78}.Release|Any CPU.Build.0 = Release|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B0AED568-8796-42B9-BAA9-EBC796134E78}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Debug|Any CPU.Build.0 = Debug|Any CPU {93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Release|Any CPU.ActiveCfg = Release|Any CPU {93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Release|Any CPU.Build.0 = Release|Any CPU {93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Release|Any CPU.Build.0 = Release|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Debug|Any CPU.Build.0 = Debug|Any CPU {B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Release|Any CPU.Build.0 = Release|Any CPU {B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Release|Any CPU.Build.0 = Release|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B2B001EE-A142-4E20-ACF8-AE4A9CB984F8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Debug|Any CPU.Build.0 = Debug|Any CPU {50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Release|Any CPU.ActiveCfg = Release|Any CPU {50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Release|Any CPU.Build.0 = Release|Any CPU {50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Release|Any CPU.Build.0 = Release|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{50505F12-985B-4C5F-8DAB-D5BEA734CD51}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Debug|Any CPU.Build.0 = Debug|Any CPU {312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Release|Any CPU.Build.0 = Release|Any CPU {312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Release|Any CPU.Build.0 = Release|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{312CE0DD-0F8F-4366-96A4-44D0AAEF60AA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Debug|Any CPU.Build.0 = Debug|Any CPU {8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Release|Any CPU.Build.0 = Release|Any CPU {8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Release|Any CPU.Build.0 = Release|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{8A33EE41-BEFA-499F-9184-1B8D0C8A4600}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B112455B-E42E-4718-821F-862884B9C07C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Debug|Any CPU.Build.0 = Debug|Any CPU {B112455B-E42E-4718-821F-862884B9C07C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Release|Any CPU.ActiveCfg = Release|Any CPU {B112455B-E42E-4718-821F-862884B9C07C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Release|Any CPU.Build.0 = Release|Any CPU {B112455B-E42E-4718-821F-862884B9C07C}.Release|Any CPU.Build.0 = Release|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B112455B-E42E-4718-821F-862884B9C07C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Debug|Any CPU.Build.0 = Debug|Any CPU {5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Release|Any CPU.ActiveCfg = Release|Any CPU {5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Release|Any CPU.Build.0 = Release|Any CPU {5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Release|Any CPU.Build.0 = Release|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{5AC2F31C-BD33-4BD1-8A90-D6A23941A74F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7ECC040E-19FC-4E10-B314-412CF7AB2170}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Debug|Any CPU.Build.0 = Debug|Any CPU {7ECC040E-19FC-4E10-B314-412CF7AB2170}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Release|Any CPU.ActiveCfg = Release|Any CPU {7ECC040E-19FC-4E10-B314-412CF7AB2170}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Release|Any CPU.Build.0 = Release|Any CPU {7ECC040E-19FC-4E10-B314-412CF7AB2170}.Release|Any CPU.Build.0 = Release|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{7ECC040E-19FC-4E10-B314-412CF7AB2170}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {34383A75-1831-4816-A38A-AB06B969D7C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Debug|Any CPU.Build.0 = Debug|Any CPU {34383A75-1831-4816-A38A-AB06B969D7C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {34383A75-1831-4816-A38A-AB06B969D7C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Release|Any CPU.Build.0 = Release|Any CPU {34383A75-1831-4816-A38A-AB06B969D7C7}.Release|Any CPU.Build.0 = Release|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{34383A75-1831-4816-A38A-AB06B969D7C7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3A25C796-F676-4422-8F30-01D4FDB240F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Debug|Any CPU.Build.0 = Debug|Any CPU {3A25C796-F676-4422-8F30-01D4FDB240F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Any CPU.ActiveCfg = Release|Any CPU {3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Any CPU.Build.0 = Release|Any CPU {3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Any CPU.Build.0 = Release|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -493,6 +333,7 @@ Global
{7ECC040E-19FC-4E10-B314-412CF7AB2170} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB} {7ECC040E-19FC-4E10-B314-412CF7AB2170} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}
{34383A75-1831-4816-A38A-AB06B969D7C7} = {FED00F38-E911-45E1-A788-26980E84C3D6} {34383A75-1831-4816-A38A-AB06B969D7C7} = {FED00F38-E911-45E1-A788-26980E84C3D6}
{3A25C796-F676-4422-8F30-01D4FDB240F1} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB} {3A25C796-F676-4422-8F30-01D4FDB240F1} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}
{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F} = {FBE6DF29-85A9-4A8B-B739-35BE4CA0A9B7}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {42D74E06-00EA-43D2-A05B-9BEAD4A2C8A0} SolutionGuid = {42D74E06-00EA-43D2-A05B-9BEAD4A2C8A0}

View file

@ -307,7 +307,7 @@ namespace MatterHackers.MatterControl.ActionBar
graph.AddData(this.ActualTemperature); graph.AddData(this.ActualTemperature);
}, 1); }, 1);
var valueField = temperatureRow.Descendants<MHNumberEdit>().FirstOrDefault(); var valueField = temperatureRow.Descendants<ThemedNumberEdit>().FirstOrDefault();
valueField.Name = "Temperature Input"; valueField.Name = "Temperature Input";
valueField.ActuallNumberEdit.EditComplete += (s, e) => valueField.ActuallNumberEdit.EditComplete += (s, e) =>

View file

@ -107,9 +107,10 @@ namespace MatterHackers.MatterControl
{ {
_themeset = JsonConvert.DeserializeObject<ThemeSet>(File.ReadAllText(ProfileManager.Instance.ProfileThemeSetPath)); _themeset = JsonConvert.DeserializeObject<ThemeSet>(File.ReadAllText(ProfileManager.Instance.ProfileThemeSetPath));
ThemeSet.Theme.EnsureDefaults(); ThemeSet.Theme.EnsureDefaults();
MatterHackersThemeConfigExtensions.RebuildTheme(ThemeSet.Theme);
// If the serialized format is older than the current format, null and fall back to latest default below // If the serialized format is older than the current format, null and fall back to latest default below
if (ThemeSet.SchemeVersion != ThemeSet.LatestSchemeVersion) if (ThemeSet.SchemeVersion != ThemeSet.LatestSchemeVersion)
{ {
_themeset = null; _themeset = null;
} }
@ -163,6 +164,7 @@ namespace MatterHackers.MatterControl
var themeConfig = JsonConvert.DeserializeObject<ThemeConfig>(json); var themeConfig = JsonConvert.DeserializeObject<ThemeConfig>(json);
themeConfig.EnsureDefaults(); themeConfig.EnsureDefaults();
MatterHackersThemeConfigExtensions.RebuildTheme(ThemeSet.Theme);
return themeConfig; return themeConfig;
} }

View file

@ -788,7 +788,7 @@ namespace MatterHackers.MatterControl
await applicationController.Tasks.Execute(task.Title, null, task.Action); await applicationController.Tasks.Execute(task.Title, null, task.Action);
} }
// If we have not cancled the show welcome message and there is a window open // If we have not cancled the show welcome message and there is a window open
if (UserSettings.Instance.get(UserSettingsKey.ShownWelcomeMessage) != "false" if (UserSettings.Instance.get(UserSettingsKey.ShownWelcomeMessage) != "false"
&& ApplicationController.Instance.Workspaces.Count > 0) && ApplicationController.Instance.Workspaces.Count > 0)
@ -802,7 +802,7 @@ namespace MatterHackers.MatterControl
else else
{ {
} }
} }
catch catch
{ {

View file

@ -39,6 +39,7 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
@ -566,10 +567,39 @@ namespace MatterHackers.MatterControl
targetUri += internalLink; targetUri += internalLink;
} }
Process.Start(targetUri); ProcessStart(targetUri);
}); });
} }
public static void ProcessStart(string input)
{
try
{
Process.Start(input);
}
catch
{
// hack because of this: https://github.com/dotnet/corefx/issues/10361
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
input = input.Replace("&", "^&");
Process.Start(new ProcessStartInfo("cmd", $"/c start {input}") { CreateNoWindow = true });
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Process.Start("xdg-open", input);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Process.Start("open", input);
}
else
{
throw;
}
}
}
internal void MakeGrayscale(ImageBuffer sourceImage) internal void MakeGrayscale(ImageBuffer sourceImage)
{ {
var buffer = sourceImage.GetBuffer(); var buffer = sourceImage.GetBuffer();

View file

@ -27,56 +27,15 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project. either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using global::MatterControl.Printing;
using Markdig.Agg;
using Markdig.Renderers.Agg;
using MatterHackers.Agg;
using MatterHackers.Agg.Font;
using MatterHackers.Agg.Image;
using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.VertexSource;
using MatterHackers.DataConverters3D;
using MatterHackers.DataConverters3D.UndoCommands;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.CustomWidgets;
using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.DesignTools;
using MatterHackers.MatterControl.DesignTools.Operations;
using MatterHackers.MatterControl.Extensibility;
using MatterHackers.MatterControl.Library;
using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.MatterControl.PartPreviewWindow.View3D;
using MatterHackers.MatterControl.Plugins;
using MatterHackers.MatterControl.PrinterCommunication;
using MatterHackers.MatterControl.PrinterControls.PrinterConnections;
using MatterHackers.MatterControl.PrintQueue;
using MatterHackers.MatterControl.SettingsManagement;
using MatterHackers.MatterControl.SlicerConfiguration;
using MatterHackers.MatterControl.Tour;
using MatterHackers.PolygonMesh;
using MatterHackers.PolygonMesh.Processors;
using MatterHackers.VectorMath;
using MatterHackers.VectorMath.TrackBall;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
[assembly: InternalsVisibleTo("MatterControl.Tests")] [assembly: InternalsVisibleTo("MatterControl.Tests")]
[assembly: InternalsVisibleTo("MatterControl.AutomationTests")] [assembly: InternalsVisibleTo("MatterControl.AutomationTests")]
@ -84,7 +43,7 @@ using Newtonsoft.Json.Linq;
namespace MatterHackers.MatterControl namespace MatterHackers.MatterControl
{ {
public class RunningTasksConfig public class RunningTasksConfig
{ {
public event EventHandler TasksChanged; public event EventHandler TasksChanged;

View file

@ -33,9 +33,9 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MatterHackers.Agg;
using MatterHackers.Agg.Image; using MatterHackers.Agg.Image;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.ImageProcessing; using MatterHackers.ImageProcessing;
using MatterHackers.MatterControl.Library; using MatterHackers.MatterControl.Library;

View file

@ -42,11 +42,8 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl namespace MatterHackers.MatterControl
{ {
public class ThemeConfig public class ThemeConfig3
{ {
private ImageBuffer restoreNormal;
private ImageBuffer restoreHover;
public int FontSize7 { get; } = 7; public int FontSize7 { get; } = 7;
public int FontSize8 { get; } = 8; public int FontSize8 { get; } = 8;
@ -73,10 +70,6 @@ namespace MatterHackers.MatterControl
public double MenuGutterWidth => 35 * GuiWidget.DeviceScale; public double MenuGutterWidth => 35 * GuiWidget.DeviceScale;
public double MicroButtonHeight => 20 * GuiWidget.DeviceScale;
private double MicroButtonWidth => 30 * GuiWidget.DeviceScale;
private readonly int defaultScrollBarWidth = 120; private readonly int defaultScrollBarWidth = 120;
public void MakeRoundedButton(GuiWidget button, Color? boarderColor = null) public void MakeRoundedButton(GuiWidget button, Color? boarderColor = null)
@ -100,44 +93,6 @@ namespace MatterHackers.MatterControl
} }
} }
public void ApplyPrimaryActionStyle(GuiWidget guiWidget)
{
guiWidget.BackgroundColor = new Color(this.AccentMimimalOverlay, 50);
Color hoverColor = this.AccentMimimalOverlay;
switch (guiWidget)
{
case PopupMenuButton menuButton:
menuButton.HoverColor = hoverColor;
break;
case SimpleFlowButton flowButton:
flowButton.HoverColor = hoverColor;
break;
case SimpleButton button:
button.HoverColor = hoverColor;
break;
}
}
internal void RemovePrimaryActionStyle(GuiWidget guiWidget)
{
guiWidget.BackgroundColor = Color.Transparent;
// Buttons in toolbars should revert to ToolbarButtonHover when reset
bool parentIsToolbar = guiWidget.Parent?.Parent is Toolbar;
switch (guiWidget)
{
case SimpleFlowButton flowButton:
flowButton.HoverColor = parentIsToolbar ? this.ToolbarButtonHover : Color.Transparent;
break;
case SimpleButton button:
button.HoverColor = parentIsToolbar ? this.ToolbarButtonHover : Color.Transparent;
break;
}
}
public BorderDouble TextButtonPadding { get; } = new BorderDouble(14, 0); public BorderDouble TextButtonPadding { get; } = new BorderDouble(14, 0);
public BorderDouble ButtonSpacing { get; } = new BorderDouble(right: 3); public BorderDouble ButtonSpacing { get; } = new BorderDouble(right: 3);
@ -210,8 +165,6 @@ namespace MatterHackers.MatterControl
public BorderDouble SeparatorMargin { get; } public BorderDouble SeparatorMargin { get; }
public ImageBuffer GeneratingThumbnailIcon { get; private set; }
public class StateColor public class StateColor
{ {
public Color BackgroundColor { get; set; } public Color BackgroundColor { get; set; }
@ -249,12 +202,6 @@ namespace MatterHackers.MatterControl
public Color BorderColor20 { get; set; } public Color BorderColor20 { get; set; }
internal void EnsureDefaults()
{
// EnsureDefaults is called after deserialization and at a point when state should be fully loaded. Invoking RebuildTheme here ensures icons shaded correctly
this.RebuildTheme();
}
public Color RowBorder { get; set; } public Color RowBorder { get; set; }
public DropListStyle DropList { get; set; } = new DropListStyle(); public DropListStyle DropList { get; set; } = new DropListStyle();
@ -280,128 +227,12 @@ namespace MatterHackers.MatterControl
public GridColors BedGridColors { get; set; } = new GridColors(); public GridColors BedGridColors { get; set; } = new GridColors();
public double ButtonRadius { get; set; } = 3; public double ButtonRadius { get; set; } = 3;
public GuiWidget CreateSearchButton()
{
return new IconButton(StaticData.Instance.LoadIcon("icon_search_24x24.png", 16, 16).SetToColor(TextColor), this)
{
ToolTipText = "Search".Localize(),
};
}
public ThemeConfig()
{
this.SeparatorMargin = (this.ButtonSpacing * 2).Clone(left: this.ButtonSpacing.Right);
this.RebuildTheme();
}
public void SetDefaults() public void SetDefaults()
{ {
this.DisabledColor = new Color(this.LightTextColor, 50); this.DisabledColor = new Color(this.LightTextColor, 50);
this.SplashAccentColor = new Color(this.PrimaryAccentColor, 185).OverlayOn(Color.White).ToColor(); this.SplashAccentColor = new Color(this.PrimaryAccentColor, 185).OverlayOn(Color.White).ToColor();
} }
public void RebuildTheme()
{
int size = (int)(16 * GuiWidget.DeviceScale);
// On Android, use red icon as no hover events, otherwise transparent and red on hover
restoreNormal = ColorCircle(size, (AggContext.OperatingSystem == OSType.Android) ? new Color(200, 0, 0) : Color.Transparent);
restoreHover = ColorCircle(size, new Color("#DB4437"));
this.GeneratingThumbnailIcon = StaticData.Instance.LoadIcon("building_thumbnail_40x40.png", 40, 40).SetToColor(TextColor);
ScrollBar.DefaultBackgroundColor = this.TextColor.WithAlpha(30);
ScrollBar.DefaultThumbColor = this.TextColor.WithAlpha(130);
ScrollBar.DefaultThumbHoverColor = this.PrimaryAccentColor.WithAlpha(130);
}
public JogControls.MoveButton CreateMoveButton(PrinterConfig printer, string label, PrinterConnection.Axis axis, double movementFeedRate, bool levelingButtons = false)
{
return new JogControls.MoveButton(label, printer, axis, movementFeedRate, this)
{
BackgroundColor = this.MinimalShade,
BorderColor = this.BorderColor40,
BackgroundOutlineWidth = 1,
VAnchor = VAnchor.Absolute,
HAnchor = HAnchor.Absolute,
Margin = 0,
Padding = 0,
Height = (levelingButtons ? 45 : 40) * GuiWidget.DeviceScale,
Width = (levelingButtons ? 90 : 40) * GuiWidget.DeviceScale,
};
}
public JogControls.ExtrudeButton CreateExtrudeButton(PrinterConfig printer, string label, double movementFeedRate, int extruderNumber, bool levelingButtons = false)
{
return new JogControls.ExtrudeButton(printer, label, movementFeedRate, extruderNumber, this)
{
BackgroundColor = this.MinimalShade,
BorderColor = this.BorderColor40,
BackgroundOutlineWidth = 1,
VAnchor = VAnchor.Absolute,
HAnchor = HAnchor.Absolute,
Margin = 0,
Padding = 0,
Height = (levelingButtons ? 45 : 40) * GuiWidget.DeviceScale,
Width = (levelingButtons ? 90 : 40) * GuiWidget.DeviceScale,
};
}
public RadioTextButton CreateMicroRadioButton(string text, IList<GuiWidget> siblingRadioButtonList = null)
{
var radioButton = new RadioTextButton(text, this, this.FontSize8)
{
SiblingRadioButtonList = siblingRadioButtonList,
Padding = new BorderDouble(5, 0),
SelectedBackgroundColor = this.SlightShade,
UnselectedBackgroundColor = this.SlightShade,
HoverColor = this.AccentMimimalOverlay,
Margin = new BorderDouble(right: 1),
HAnchor = HAnchor.Absolute,
Height = this.MicroButtonHeight,
Width = this.MicroButtonWidth
};
// Add to sibling list if supplied
siblingRadioButtonList?.Add(radioButton);
return radioButton;
}
public TextButton CreateLightDialogButton(string text)
{
return CreateDialogButton(text, new Color(Color.White, 15), new Color(Color.White, 25));
}
public TextButton CreateDialogButton(string text)
{
return CreateDialogButton(text, this.SlightShade, this.SlightShade.WithAlpha(75));
}
public TextButton CreateDialogButton(string text, Color backgroundColor, Color hoverColor)
{
#if !__ANDROID__
return new TextButton(text, this)
{
BackgroundColor = backgroundColor,
HoverColor = hoverColor,
MinimumSize = new Vector2(75, 0),
Margin = this.ButtonSpacing
};
#else
var button = new TextButton(text, this, this.FontSize14)
{
BackgroundColor = backgroundColor,
HoverColor = hoverColor,
// Enlarge button height and margin on Android
Height = 34 * GuiWidget.DeviceScale,
};
button.Padding = button.Padding * 1.2;
return button;
#endif
}
public Color GetBorderColor(int alpha) public Color GetBorderColor(int alpha)
{ {
return new Color(this.BorderColor, alpha); return new Color(this.BorderColor, alpha);
@ -419,215 +250,6 @@ namespace MatterHackers.MatterControl
return new BlenderBGRA().Blend(background, overlay); return new BlenderBGRA().Blend(background, overlay);
} }
public FlowLayoutWidget CreateMenuItems(PopupMenu popupMenu, IEnumerable<NamedAction> menuActions)
{
// Create menu items in the DropList for each element in this.menuActions
foreach (var menuAction in menuActions)
{
if (menuAction is ActionSeparator)
{
popupMenu.CreateSeparator();
}
else
{
if (menuAction is NamedActionGroup namedActionButtons)
{
var content = new FlowLayoutWidget()
{
HAnchor = HAnchor.Fit | HAnchor.Stretch
};
var textWidget = new TextWidget(menuAction.Title, pointSize: this.DefaultFontSize, textColor: this.TextColor)
{
// Padding = MenuPadding,
VAnchor = VAnchor.Center
};
content.AddChild(textWidget);
content.AddChild(new HorizontalSpacer());
foreach (var actionButton in namedActionButtons.Group)
{
var button = new TextButton(actionButton.Title, this)
{
Border = new BorderDouble(1, 0, 0, 0),
BorderColor = this.MinimalShade,
HoverColor = this.AccentMimimalOverlay,
Enabled = actionButton.IsEnabled()
};
content.AddChild(button);
if (actionButton.IsEnabled())
{
button.Click += (s, e) =>
{
actionButton.Action();
popupMenu.Unfocus();
};
}
}
var menuItem = new PopupMenu.MenuItem(content, this)
{
HAnchor = HAnchor.Fit | HAnchor.Stretch,
VAnchor = VAnchor.Fit,
HoverColor = Color.Transparent,
};
popupMenu.AddChild(menuItem);
menuItem.Padding = new BorderDouble(menuItem.Padding.Left,
menuItem.Padding.Bottom,
0,
menuItem.Padding.Top);
}
else
{
PopupMenu.MenuItem menuItem;
if (menuAction is NamedBoolAction boolAction)
{
menuItem = popupMenu.CreateBoolMenuItem(menuAction.Title, boolAction.GetIsActive, boolAction.SetIsActive);
}
else
{
menuItem = popupMenu.CreateMenuItem(menuAction.Title, menuAction.Icon, menuAction.Shortcut);
}
menuItem.Name = $"{menuAction.Title} Menu Item";
menuItem.Enabled = menuAction is NamedActionGroup
|| (menuAction.Action != null && menuAction.IsEnabled?.Invoke() != false);
menuItem.ClearRemovedFlag();
if (menuItem.Enabled)
{
menuItem.Click += (s, e) =>
{
menuAction.Action();
};
}
}
}
}
return popupMenu;
}
public PopupMenuButton CreateSplitButton(SplitButtonParams buttonParams, OperationGroup operationGroup = null)
{
PopupMenuButton menuButton = null;
GuiWidget innerButton;
if (buttonParams.ButtonText == null)
{
innerButton = new IconButton(buttonParams.Icon, this)
{
Name = buttonParams.ButtonName + " Inner SplitButton",
Enabled = buttonParams.ButtonEnabled,
ToolTipText = buttonParams.ButtonTooltip,
};
// Remove right Padding for drop style
innerButton.Padding = innerButton.Padding.Clone(right: 0);
}
else
{
if (buttonParams.Icon == null)
{
innerButton = new TextButton(buttonParams.ButtonText, this)
{
Name = buttonParams.ButtonName,
Enabled = buttonParams.ButtonEnabled,
ToolTipText = buttonParams.ButtonTooltip,
};
}
else
{
innerButton = new TextIconButton(buttonParams.ButtonText, buttonParams.Icon, this)
{
Name = buttonParams.ButtonName,
Enabled = buttonParams.ButtonEnabled,
ToolTipText = buttonParams.ButtonTooltip,
Padding = new BorderDouble(5, 0, 5, 0)
};
}
}
innerButton.Click += (s, e) =>
{
buttonParams.ButtonAction.Invoke(menuButton);
};
if (operationGroup == null)
{
menuButton = new PopupMenuButton(innerButton, this);
}
else
{
menuButton = new OperationGroupButton(operationGroup, innerButton, this);
}
var theme = ApplicationController.Instance.MenuTheme;
menuButton.DynamicPopupContent = () =>
{
var popupMenu = new PopupMenu(theme);
buttonParams.ExtendPopupMenu?.Invoke(popupMenu);
return popupMenu;
};
menuButton.Name = buttonParams.ButtonName + " Menu SplitButton";
menuButton.BackgroundColor = buttonParams.BackgroundColor;
if (menuButton.BackgroundColor == Color.Transparent)
{
menuButton.BackgroundColor = this.ToolbarButtonBackground;
}
menuButton.HoverColor = this.ToolbarButtonHover;
menuButton.MouseDownColor = this.ToolbarButtonDown;
menuButton.DrawArrow = true;
menuButton.Margin = this.ButtonSpacing;
menuButton.DistinctPopupButton = true;
menuButton.BackgroundRadius = new RadiusCorners(theme.ButtonRadius * GuiWidget.DeviceScale, theme.ButtonRadius * GuiWidget.DeviceScale, 0, 0);
innerButton.Selectable = true;
return menuButton;
}
private static ImageBuffer ColorCircle(int size, Color color)
{
var imageBuffer = new ImageBuffer(size, size);
Graphics2D normalGraphics = imageBuffer.NewGraphics2D();
var center = new Vector2(size / 2.0, size / 2.0);
Color barColor;
if (color != Color.Transparent)
{
normalGraphics.Circle(center, size / 2.0, color);
barColor = Color.White;
}
else
{
barColor = new Color("#999");
}
normalGraphics.Line(center + new Vector2(-size / 4.0, -size / 4.0), center + new Vector2(size / 4.0, size / 4.0), barColor, 2 * GuiWidget.DeviceScale);
normalGraphics.Line(center + new Vector2(-size / 4.0, size / 4.0), center + new Vector2(size / 4.0, -size / 4.0), barColor, 2 * GuiWidget.DeviceScale);
return imageBuffer;
}
public GuiWidget CreateSmallResetButton()
{
return new HoverImageWidget(restoreNormal, restoreHover)
{
VAnchor = VAnchor.Center,
Margin = new BorderDouble(0, 0, 5, 0)
};
}
public SolidSlider CreateSolidSlider(GuiWidget wordOptionContainer, string header, ThemeConfig theme, double min = 0, double max = .5) public SolidSlider CreateSolidSlider(GuiWidget wordOptionContainer, string header, ThemeConfig theme, double min = 0, double max = .5)
{ {
double scrollBarWidth = 10; double scrollBarWidth = 10;
@ -678,55 +300,6 @@ namespace MatterHackers.MatterControl
widget.BorderColor = shadedBorder ? this.MinimalShade : this.BorderColor20; widget.BorderColor = shadedBorder ? this.MinimalShade : this.BorderColor20;
widget.Border = border; widget.Border = border;
} }
public SectionWidget ApplyBoxStyle(SectionWidget sectionWidget)
{
return ApplyBoxStyle(
sectionWidget,
this.SectionBackgroundColor,
margin: new BorderDouble(this.DefaultContainerPadding, 0, this.DefaultContainerPadding, this.DefaultContainerPadding));
}
public SolidSlider ApplySliderStyle(SolidSlider solidSlider)
{
solidSlider.View.TrackColor = this.SlightShade;
solidSlider.View.TrackRadius = 4;
return solidSlider;
}
public DoubleSolidSlider ApplySliderStyle(DoubleSolidSlider solidSlider)
{
solidSlider.View.TrackColor = this.SlightShade;
solidSlider.View.TrackRadius = 4;
return solidSlider;
}
// ApplySquareBoxStyle
public SectionWidget ApplyBoxStyle(SectionWidget sectionWidget, BorderDouble margin)
{
sectionWidget.BackgroundColor = this.SectionBackgroundColor;
sectionWidget.Margin = 0;
sectionWidget.Border = new BorderDouble(bottom: 1);
sectionWidget.BorderColor = this.RowBorder;
return sectionWidget;
}
public SectionWidget ApplyBoxStyle(SectionWidget sectionWidget, Color backgroundColor, BorderDouble margin)
{
// Enforce panel padding
// sectionWidget.ContentPanel.Padding = new BorderDouble(10, 0, 10, 2);
// sectionWidget.ContentPanel.Padding = 0;
sectionWidget.BorderColor = Color.Transparent;
sectionWidget.BorderRadius = 5;
sectionWidget.Margin = margin;
sectionWidget.BackgroundColor = backgroundColor;
return sectionWidget;
}
} }
public class PresetColors public class PresetColors
@ -771,4 +344,349 @@ namespace MatterHackers.MatterControl
public Color BackgroundColor { get; set; } public Color BackgroundColor { get; set; }
} }
public static class MatterHackersThemeConfigExtensions
{
public static JogControls.MoveButton CreateMoveButton(this ThemeConfig config, PrinterConfig printer, string label, PrinterConnection.Axis axis, double movementFeedRate, bool levelingButtons = false)
{
return new JogControls.MoveButton(label, printer, axis, movementFeedRate, config)
{
BackgroundColor = config.MinimalShade,
BorderColor = config.BorderColor40,
BackgroundOutlineWidth = 1,
VAnchor = VAnchor.Absolute,
HAnchor = HAnchor.Absolute,
Margin = 0,
Padding = 0,
Height = (levelingButtons ? 45 : 40) * GuiWidget.DeviceScale,
Width = (levelingButtons ? 90 : 40) * GuiWidget.DeviceScale,
};
}
public static JogControls.ExtrudeButton CreateExtrudeButton(this ThemeConfig config, PrinterConfig printer, string label, double movementFeedRate, int extruderNumber, bool levelingButtons = false)
{
return new JogControls.ExtrudeButton(printer, label, movementFeedRate, extruderNumber, config)
{
BackgroundColor = config.MinimalShade,
BorderColor = config.BorderColor40,
BackgroundOutlineWidth = 1,
VAnchor = VAnchor.Absolute,
HAnchor = HAnchor.Absolute,
Margin = 0,
Padding = 0,
Height = (levelingButtons ? 45 : 40) * GuiWidget.DeviceScale,
Width = (levelingButtons ? 90 : 40) * GuiWidget.DeviceScale,
};
}
public static PopupMenuButton CreateSplitButton(this ThemeConfig config, SplitButtonParams buttonParams, OperationGroup operationGroup = null)
{
PopupMenuButton menuButton = null;
GuiWidget innerButton;
if (buttonParams.ButtonText == null)
{
innerButton = new IconButton(buttonParams.Icon, config)
{
Name = buttonParams.ButtonName + " Inner SplitButton",
Enabled = buttonParams.ButtonEnabled,
ToolTipText = buttonParams.ButtonTooltip,
};
// Remove right Padding for drop style
innerButton.Padding = innerButton.Padding.Clone(right: 0);
}
else
{
if (buttonParams.Icon == null)
{
innerButton = new TextButton(buttonParams.ButtonText, config)
{
Name = buttonParams.ButtonName,
Enabled = buttonParams.ButtonEnabled,
ToolTipText = buttonParams.ButtonTooltip,
};
}
else
{
innerButton = new TextIconButton(buttonParams.ButtonText, buttonParams.Icon, config)
{
Name = buttonParams.ButtonName,
Enabled = buttonParams.ButtonEnabled,
ToolTipText = buttonParams.ButtonTooltip,
Padding = new BorderDouble(5, 0, 5, 0)
};
}
}
innerButton.Click += (s, e) =>
{
buttonParams.ButtonAction.Invoke(menuButton);
};
if (operationGroup == null)
{
menuButton = new PopupMenuButton(innerButton, config);
}
else
{
menuButton = new OperationGroupButton(operationGroup, innerButton, config);
}
var theme = ApplicationController.Instance.MenuTheme;
menuButton.DynamicPopupContent = () =>
{
var popupMenu = new PopupMenu(theme);
buttonParams.ExtendPopupMenu?.Invoke(popupMenu);
return popupMenu;
};
menuButton.Name = buttonParams.ButtonName + " Menu SplitButton";
menuButton.BackgroundColor = buttonParams.BackgroundColor;
if (menuButton.BackgroundColor == Color.Transparent)
{
menuButton.BackgroundColor = config.ToolbarButtonBackground;
}
menuButton.HoverColor = config.ToolbarButtonHover;
menuButton.MouseDownColor = config.ToolbarButtonDown;
menuButton.DrawArrow = true;
menuButton.Margin = config.ButtonSpacing;
menuButton.DistinctPopupButton = true;
menuButton.BackgroundRadius = new RadiusCorners(theme.ButtonRadius * GuiWidget.DeviceScale, theme.ButtonRadius * GuiWidget.DeviceScale, 0, 0);
innerButton.Selectable = true;
return menuButton;
}
public static GuiWidget CreateSearchButton(this ThemeConfig config)
{
return new IconButton(StaticData.Instance.LoadIcon("icon_search_24x24.png", 16, 16).SetToColor(config.TextColor), config)
{
ToolTipText = "Search".Localize(),
};
}
public static double MicroButtonHeight => 20 * GuiWidget.DeviceScale;
private static double MicroButtonWidth => 30 * GuiWidget.DeviceScale;
public static RadioTextButton CreateMicroRadioButton(this ThemeConfig config, string text, IList<GuiWidget> siblingRadioButtonList = null)
{
var radioButton = new RadioTextButton(text, config, config.FontSize8)
{
SiblingRadioButtonList = siblingRadioButtonList,
Padding = new BorderDouble(5, 0),
SelectedBackgroundColor = config.SlightShade,
UnselectedBackgroundColor = config.SlightShade,
HoverColor = config.AccentMimimalOverlay,
Margin = new BorderDouble(right: 1),
HAnchor = HAnchor.Absolute,
Height = config.MicroButtonHeight,
Width = MicroButtonWidth
};
// Add to sibling list if supplied
siblingRadioButtonList?.Add(radioButton);
return radioButton;
}
public static FlowLayoutWidget CreateMenuItems(this ThemeConfig config, PopupMenu popupMenu, IEnumerable<NamedAction> menuActions)
{
// Create menu items in the DropList for each element in this.menuActions
foreach (var menuAction in menuActions)
{
if (menuAction is ActionSeparator)
{
popupMenu.CreateSeparator();
}
else
{
if (menuAction is NamedActionGroup namedActionButtons)
{
var content = new FlowLayoutWidget()
{
HAnchor = HAnchor.Fit | HAnchor.Stretch
};
var textWidget = new TextWidget(menuAction.Title, pointSize: config.DefaultFontSize, textColor: config.TextColor)
{
// Padding = MenuPadding,
VAnchor = VAnchor.Center
};
content.AddChild(textWidget);
content.AddChild(new HorizontalSpacer());
foreach (var actionButton in namedActionButtons.Group)
{
var button = new TextButton(actionButton.Title, config)
{
Border = new BorderDouble(1, 0, 0, 0),
BorderColor = config.MinimalShade,
HoverColor = config.AccentMimimalOverlay,
Enabled = actionButton.IsEnabled()
};
content.AddChild(button);
if (actionButton.IsEnabled())
{
button.Click += (s, e) =>
{
actionButton.Action();
popupMenu.Unfocus();
};
}
}
var menuItem = new PopupMenu.MenuItem(content, config)
{
HAnchor = HAnchor.Fit | HAnchor.Stretch,
VAnchor = VAnchor.Fit,
HoverColor = Color.Transparent,
};
popupMenu.AddChild(menuItem);
menuItem.Padding = new BorderDouble(menuItem.Padding.Left,
menuItem.Padding.Bottom,
0,
menuItem.Padding.Top);
}
else
{
PopupMenu.MenuItem menuItem;
if (menuAction is NamedBoolAction boolAction)
{
menuItem = popupMenu.CreateBoolMenuItem(menuAction.Title, boolAction.GetIsActive, boolAction.SetIsActive);
}
else
{
menuItem = popupMenu.CreateMenuItem(menuAction.Title, menuAction.Icon, menuAction.Shortcut);
}
menuItem.Name = $"{menuAction.Title} Menu Item";
menuItem.Enabled = menuAction is NamedActionGroup
|| (menuAction.Action != null && menuAction.IsEnabled?.Invoke() != false);
menuItem.ClearRemovedFlag();
if (menuItem.Enabled)
{
menuItem.Click += (s, e) =>
{
menuAction.Action();
};
}
}
}
}
return popupMenu;
}
public static void ApplyPrimaryActionStyle(this ThemeConfig config, GuiWidget guiWidget)
{
guiWidget.BackgroundColor = new Color(config.AccentMimimalOverlay, 50);
Color hoverColor = config.AccentMimimalOverlay;
switch (guiWidget)
{
case PopupMenuButton menuButton:
menuButton.HoverColor = hoverColor;
break;
case SimpleFlowButton flowButton:
flowButton.HoverColor = hoverColor;
break;
case SimpleButton button:
button.HoverColor = hoverColor;
break;
}
}
public static void RemovePrimaryActionStyle(this ThemeConfig config, GuiWidget guiWidget)
{
guiWidget.BackgroundColor = Color.Transparent;
// Buttons in toolbars should revert to ToolbarButtonHover when reset
bool parentIsToolbar = guiWidget.Parent?.Parent is Toolbar;
switch (guiWidget)
{
case SimpleFlowButton flowButton:
flowButton.HoverColor = parentIsToolbar ? config.ToolbarButtonHover : Color.Transparent;
break;
case SimpleButton button:
button.HoverColor = parentIsToolbar ? config.ToolbarButtonHover : Color.Transparent;
break;
}
}
public static SolidSlider ApplySliderStyle(this ThemeConfig config, SolidSlider solidSlider)
{
solidSlider.View.TrackColor = config.SlightShade;
solidSlider.View.TrackRadius = 4;
return solidSlider;
}
public static DoubleSolidSlider ApplySliderStyle(this ThemeConfig config, DoubleSolidSlider solidSlider)
{
solidSlider.View.TrackColor = config.SlightShade;
solidSlider.View.TrackRadius = 4;
return solidSlider;
}
public static SectionWidget ApplyBoxStyle(this ThemeConfig config, SectionWidget sectionWidget)
{
return config.ApplyBoxStyle(
sectionWidget,
config.SectionBackgroundColor,
margin: new BorderDouble(config.DefaultContainerPadding, 0, config.DefaultContainerPadding, config.DefaultContainerPadding));
}
// ApplySquareBoxStyle
public static SectionWidget ApplyBoxStyle(this ThemeConfig config, SectionWidget sectionWidget, BorderDouble margin)
{
sectionWidget.BackgroundColor = config.SectionBackgroundColor;
sectionWidget.Margin = 0;
sectionWidget.Border = new BorderDouble(bottom: 1);
sectionWidget.BorderColor = config.RowBorder;
return sectionWidget;
}
public static SectionWidget ApplyBoxStyle(this ThemeConfig config, SectionWidget sectionWidget, Color backgroundColor, BorderDouble margin)
{
// Enforce panel padding
// sectionWidget.ContentPanel.Padding = new BorderDouble(10, 0, 10, 2);
// sectionWidget.ContentPanel.Padding = 0;
sectionWidget.BorderColor = Color.Transparent;
sectionWidget.BorderRadius = 5;
sectionWidget.Margin = margin;
sectionWidget.BackgroundColor = backgroundColor;
return sectionWidget;
}
public static GuiWidget CreateSmallResetButton(this ThemeConfig config)
{
return new HoverImageWidget(config.RestoreNormal, config.RestoreHover)
{
VAnchor = VAnchor.Center,
Margin = new BorderDouble(0, 0, 5, 0)
};
}
public static void RebuildTheme(this ThemeConfig config)
{
config.GeneratingThumbnailIcon = StaticData.Instance.LoadIcon("building_thumbnail_40x40.png", 40, 40).SetToColor(config.TextColor);
}
}
} }

View file

@ -29,6 +29,7 @@ either expressed or implied, of the FreeBSD Project.
using System.Collections.Generic; using System.Collections.Generic;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl namespace MatterHackers.MatterControl
{ {

View file

@ -39,7 +39,7 @@ namespace MatterHackers.MatterControl
{ {
public class WizardPage : DialogPage public class WizardPage : DialogPage
{ {
public TextButton NextButton { get; } public ThemedTextButton NextButton { get; }
protected PrinterConfig printer; protected PrinterConfig printer;
public Action<WizardPage> PageLoad { get; set; } public Action<WizardPage> PageLoad { get; set; }

View file

@ -1,184 +0,0 @@
/*
Copyright (c) 2018, Lars Brubaker, John Lewin
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl
{
public class MHNumberEdit : GuiWidget
{
private ThemeConfig theme;
public NumberEdit ActuallNumberEdit { get; }
public MHNumberEdit(double startingValue, ThemeConfig theme, char singleCharLabel = char.MaxValue, string unitsLabel = "", double pixelWidth = 0, double pixelHeight = 0, bool allowNegatives = false, bool allowDecimals = false, double minValue = int.MinValue, double maxValue = int.MaxValue, double increment = 1, int tabIndex = 0)
{
using (this.LayoutLock())
{
this.Padding = 3;
this.HAnchor = HAnchor.Fit;
this.VAnchor = VAnchor.Fit;
this.Border = 1;
this.theme = theme;
this.ActuallNumberEdit = new NumberEdit(startingValue, 0, 0, theme.DefaultFontSize, pixelWidth, pixelHeight, allowNegatives, allowDecimals, minValue, maxValue, increment, tabIndex)
{
VAnchor = VAnchor.Bottom,
};
TextWidget labelWidget = null;
if (singleCharLabel != char.MaxValue)
{
labelWidget = new TextWidget(singleCharLabel.ToString(), pointSize: theme.DefaultFontSize - 2, textColor: theme.PrimaryAccentColor)
{
Margin = new BorderDouble(left: 2),
HAnchor = HAnchor.Left,
VAnchor = VAnchor.Center,
Selectable = false
};
this.AddChild(labelWidget);
var labelWidth = labelWidget.Width + labelWidget.Margin.Left;
ActuallNumberEdit.Margin = ActuallNumberEdit.Margin.Clone(left: labelWidth + 2);
}
var internalWidget = this.ActuallNumberEdit.InternalTextEditWidget;
internalWidget.TextColor = theme.EditFieldColors.Inactive.TextColor;
internalWidget.FocusChanged += (s, e) =>
{
internalWidget.TextColor = (internalWidget.Focused) ? theme.EditFieldColors.Focused.TextColor : theme.EditFieldColors.Inactive.TextColor;
if (labelWidget != null)
{
var labelDetailsColor = theme.PrimaryAccentColor.WithContrast(theme.EditFieldColors.Focused.BackgroundColor, 3).ToColor();
labelWidget.TextColor = (internalWidget.Focused) ? labelDetailsColor : theme.PrimaryAccentColor;
}
};
this.ActuallNumberEdit.InternalNumberEdit.MaxDecimalsPlaces = 5;
this.AddChild(this.ActuallNumberEdit);
}
this.PerformLayout();
}
public override Color BackgroundColor
{
get
{
if (base.BackgroundColor != Color.Transparent)
{
return base.BackgroundColor;
}
else if (this.ContainsFocus)
{
return theme.EditFieldColors.Focused.BackgroundColor;
}
else if (this.mouseInBounds)
{
return theme.EditFieldColors.Hovered.BackgroundColor;
}
else
{
return theme.EditFieldColors.Inactive.BackgroundColor;
}
}
set => base.BackgroundColor = value;
}
public override Color BorderColor
{
get
{
if (base.BorderColor != Color.Transparent)
{
return base.BorderColor;
}
else if (this.ContainsFocus)
{
return theme.EditFieldColors.Focused.BorderColor;
}
else if (this.mouseInBounds && this.ContainsFirstUnderMouseRecursive())
{
return theme.EditFieldColors.Hovered.BorderColor;
}
else
{
return theme.EditFieldColors.Inactive.BorderColor;
}
}
set => base.BorderColor = value;
}
private bool mouseInBounds = false;
public override void OnMouseEnterBounds(MouseEventArgs mouseEvent)
{
mouseInBounds = true;
base.OnMouseEnterBounds(mouseEvent);
this.Invalidate();
}
public override void OnMouseLeaveBounds(MouseEventArgs mouseEvent)
{
mouseInBounds = false;
base.OnMouseLeaveBounds(mouseEvent);
this.Invalidate();
}
public override int TabIndex
{
// TODO: This looks invalid - setter and getter should use same context
get => base.TabIndex;
set => this.ActuallNumberEdit.TabIndex = value;
}
public double Value
{
get => this.ActuallNumberEdit.Value;
set => this.ActuallNumberEdit.Value = value;
}
public override string Text
{
get => this.ActuallNumberEdit.Text;
set => this.ActuallNumberEdit.Text = value;
}
public bool SelectAllOnFocus
{
get => this.ActuallNumberEdit.InternalNumberEdit.SelectAllOnFocus;
set => this.ActuallNumberEdit.InternalNumberEdit.SelectAllOnFocus = value;
}
}
}

View file

@ -1,100 +0,0 @@
/*
Copyright (c) 2017, Lars Brubaker, John Lewin
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class MHPasswordTextEditWidget : MHTextEditWidget
{
private TextEditWidget passwordCoverText;
private class TextEditOverlay : TextEditWidget
{
public TextEditOverlay(string text, int pointSize, double pixelWidth, double pixelHeight, bool multiLine)
: base(text, 0, 0, pointSize, pixelWidth, pixelHeight, multiLine)
{
}
public override Color BackgroundColor
{
get => this.Parent.BackgroundColor;
set
{
if (this.Parent != null)
{
this.Parent.BackgroundColor = value;
}
}
}
}
public MHPasswordTextEditWidget(string text, ThemeConfig theme, double pixelWidth = 0, double pixelHeight = 0, bool multiLine = false, int tabIndex = 0, string messageWhenEmptyAndNotSelected = "")
: base(text, theme, pixelWidth, pixelHeight, multiLine, tabIndex, messageWhenEmptyAndNotSelected)
{
// remove this so that we can have other content first (the hidden letters)
this.RemoveChild(noContentFieldDescription);
passwordCoverText = new TextEditOverlay(text, theme.DefaultFontSize, pixelWidth, pixelHeight, multiLine)
{
Selectable = false,
HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Bottom,
TextColor = theme.EditFieldColors.Inactive.TextColor
};
passwordCoverText.MinimumSize = new Vector2(Math.Max(passwordCoverText.MinimumSize.X, pixelWidth), Math.Max(passwordCoverText.MinimumSize.Y, pixelHeight));
var internalWidget = this.ActualTextEditWidget.InternalTextEditWidget;
internalWidget.FocusChanged += (s, e) =>
{
passwordCoverText.TextColor = (internalWidget.Focused) ? theme.EditFieldColors.Focused.TextColor : theme.EditFieldColors.Inactive.TextColor;
};
this.AddChild(passwordCoverText);
this.ActualTextEditWidget.TextChanged += (sender, e) =>
{
passwordCoverText.Text = new string('●', this.ActualTextEditWidget.Text.Length);
};
// put in back in after the hidden text
noContentFieldDescription.ClearRemovedFlag();
this.AddChild(noContentFieldDescription);
}
public bool Hidden
{
get => !passwordCoverText.Visible;
set => passwordCoverText.Visible = !value;
}
}
}

View file

@ -1,210 +0,0 @@
/*
Copyright (c) 2018, Lars Brubaker, John Lewin
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using MatterHackers.Agg;
using MatterHackers.Agg.Font;
using MatterHackers.Agg.UI;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class MHTextEditWidget : GuiWidget
{
protected TextWidget noContentFieldDescription = null;
private readonly ThemeConfig theme;
private bool mouseInBounds = false;
public MHTextEditWidget(string text, ThemeConfig theme, double pixelWidth = 0, double pixelHeight = 0, bool multiLine = false, int tabIndex = 0, string messageWhenEmptyAndNotSelected = "", TypeFace typeFace = null)
{
this.Padding = new BorderDouble(3);
this.HAnchor = HAnchor.Fit;
this.VAnchor = VAnchor.Fit;
this.Border = 1;
this.theme = theme;
this.ActualTextEditWidget = new TextEditWidget(text, 0, 0, theme.DefaultFontSize, pixelWidth, pixelHeight, multiLine, tabIndex: tabIndex, typeFace: typeFace)
{
VAnchor = VAnchor.Bottom,
BackgroundColor = Color.Transparent
};
TextWidget labelWidget = null;
var internalWidget = this.ActualTextEditWidget.InternalTextEditWidget;
internalWidget.TextColor = theme.EditFieldColors.Inactive.TextColor;
internalWidget.FocusChanged += (s, e) =>
{
internalWidget.TextColor = internalWidget.Focused ? theme.EditFieldColors.Focused.TextColor : theme.EditFieldColors.Inactive.TextColor;
noContentFieldDescription.TextColor = internalWidget.Focused ? theme.EditFieldColors.Focused.LightTextColor : theme.EditFieldColors.Inactive.LightTextColor;
if (labelWidget != null)
{
var labelDetailsColor = theme.PrimaryAccentColor.WithContrast(theme.EditFieldColors.Focused.BackgroundColor, 3).ToColor();
labelWidget.TextColor = (internalWidget.Focused) ? labelDetailsColor : theme.PrimaryAccentColor;
}
};
this.ActualTextEditWidget.InternalTextEditWidget.BackgroundColor = Color.Transparent;
this.ActualTextEditWidget.MinimumSize = new Vector2(Math.Max(ActualTextEditWidget.MinimumSize.X, pixelWidth), Math.Max(ActualTextEditWidget.MinimumSize.Y, pixelHeight));
this.AddChild(this.ActualTextEditWidget);
this.AddChild(noContentFieldDescription = new TextWidget(messageWhenEmptyAndNotSelected, pointSize: theme.DefaultFontSize, textColor: theme.EditFieldColors.Focused.LightTextColor)
{
VAnchor = VAnchor.Top,
AutoExpandBoundsToText = true
});
SetNoContentFieldDescriptionVisibility();
}
public TextEditWidget ActualTextEditWidget { get; }
public override Color BackgroundColor
{
get
{
if (base.BackgroundColor != Color.Transparent)
{
return base.BackgroundColor;
}
else if (this.ContainsFocus)
{
return theme.EditFieldColors.Focused.BackgroundColor;
}
else if (this.mouseInBounds)
{
return theme.EditFieldColors.Hovered.BackgroundColor;
}
else
{
return theme.EditFieldColors.Inactive.BackgroundColor;
}
}
set => base.BackgroundColor = value;
}
public override Color BorderColor
{
get
{
if (base.BorderColor != Color.Transparent)
{
return base.BackgroundColor;
}
else if (this.ContainsFocus)
{
return theme.EditFieldColors.Focused.BorderColor;
}
else if (this.mouseInBounds && this.ContainsFirstUnderMouseRecursive())
{
return theme.EditFieldColors.Hovered.BorderColor;
}
else
{
return theme.EditFieldColors.Inactive.BorderColor;
}
}
set => base.BorderColor = value;
}
public override void OnMouseEnterBounds(MouseEventArgs mouseEvent)
{
mouseInBounds = true;
base.OnMouseEnterBounds(mouseEvent);
this.Invalidate();
}
public override void OnMouseLeaveBounds(MouseEventArgs mouseEvent)
{
mouseInBounds = false;
base.OnMouseLeaveBounds(mouseEvent);
this.Invalidate();
}
public override HAnchor HAnchor
{
get => base.HAnchor;
set
{
base.HAnchor = value;
if (ActualTextEditWidget != null)
{
ActualTextEditWidget.HAnchor = value;
}
}
}
private void SetNoContentFieldDescriptionVisibility()
{
if (noContentFieldDescription != null)
{
noContentFieldDescription.Visible = string.IsNullOrEmpty(Text);
}
}
public override void OnDraw(Graphics2D graphics2D)
{
SetNoContentFieldDescriptionVisibility();
base.OnDraw(graphics2D);
}
public override string Text
{
get => ActualTextEditWidget.Text;
set => ActualTextEditWidget.Text = value;
}
public bool SelectAllOnFocus
{
get => ActualTextEditWidget.InternalTextEditWidget.SelectAllOnFocus;
set => ActualTextEditWidget.InternalTextEditWidget.SelectAllOnFocus = value;
}
public bool ReadOnly
{
get => ActualTextEditWidget.ReadOnly;
set => ActualTextEditWidget.ReadOnly = value;
}
public void DrawFromHintedCache()
{
ActualTextEditWidget.Printer.DrawFromHintedCache = true;
ActualTextEditWidget.DoubleBuffer = false;
}
public override void Focus()
{
ActualTextEditWidget.Focus();
}
}
}

View file

@ -52,7 +52,7 @@ namespace MatterHackers.MatterControl
private XyCalibrationWizard calibrationWizard; private XyCalibrationWizard calibrationWizard;
private ThemeConfig theme; private ThemeConfig theme;
public TextButton NextButton { get; } public ThemedTextButton NextButton { get; }
private Color tabBaseColor; private Color tabBaseColor;
private TextWidget xLabel; private TextWidget xLabel;
@ -60,7 +60,7 @@ namespace MatterHackers.MatterControl
private PrinterConnection.Axis _collectionMode = PrinterConnection.Axis.X; private PrinterConnection.Axis _collectionMode = PrinterConnection.Axis.X;
public CalibrationTabWidget(XyCalibrationWizard calibrationWizard, TextButton nextButton, ThemeConfig theme) public CalibrationTabWidget(XyCalibrationWizard calibrationWizard, ThemedTextButton nextButton, ThemeConfig theme)
{ {
this.calibrationWizard = calibrationWizard; this.calibrationWizard = calibrationWizard;
this.theme = theme; this.theme = theme;

View file

@ -38,7 +38,7 @@ namespace MatterHackers.MatterControl.CustomWidgets
public class InlineEditControl : GuiWidget public class InlineEditControl : GuiWidget
{ {
private TextWidget numberDisplay; private TextWidget numberDisplay;
private MHNumberEdit numberEdit; private ThemedNumberEdit numberEdit;
private Func<double, string> _getDisplayString = (value) => "{0:0.0}".FormatWith(value); private Func<double, string> _getDisplayString = (value) => "{0:0.0}".FormatWith(value);
private RunningInterval runningInterval; private RunningInterval runningInterval;
private ThemeConfig theme; private ThemeConfig theme;
@ -78,7 +78,7 @@ namespace MatterHackers.MatterControl.CustomWidgets
AddChild(numberDisplay); AddChild(numberDisplay);
numberEdit = new MHNumberEdit(0, theme, pixelWidth: numberDisplay.Width, allowNegatives: true, allowDecimals: true) numberEdit = new ThemedNumberEdit(0, theme, pixelWidth: numberDisplay.Width, allowNegatives: true, allowDecimals: true)
{ {
Visible = false, Visible = false,
VAnchor = VAnchor.Bottom, VAnchor = VAnchor.Bottom,

View file

@ -30,6 +30,7 @@ either expressed or implied, of the FreeBSD Project.
using System; using System;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.ImageProcessing; using MatterHackers.ImageProcessing;
using MatterHackers.Localizations; using MatterHackers.Localizations;

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using System; using System;
using MatterHackers.Agg.UI;
using MatterHackers.Localizations; using MatterHackers.Localizations;
namespace MatterHackers.MatterControl.CustomWidgets namespace MatterHackers.MatterControl.CustomWidgets

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using System; using System;
using MatterHackers.Agg.UI;
using MatterHackers.Localizations; using MatterHackers.Localizations;
namespace MatterHackers.MatterControl.CustomWidgets namespace MatterHackers.MatterControl.CustomWidgets

View file

@ -203,7 +203,7 @@ namespace MatterHackers.MatterControl.Library
double val; double val;
double.TryParse(latest, out val); double.TryParse(latest, out val);
var editor = new MHNumberEdit(val, theme, pixelWidth: 50 * GuiWidget.DeviceScale, allowDecimals: true, increment: .05) var editor = new ThemedNumberEdit(val, theme, pixelWidth: 50 * GuiWidget.DeviceScale, allowDecimals: true, increment: .05)
{ {
SelectAllOnFocus = true, SelectAllOnFocus = true,
VAnchor = VAnchor.Center VAnchor = VAnchor.Center

View file

@ -43,7 +43,6 @@ using MatterHackers.Localizations;
using MatterHackers.MatterControl.PartPreviewWindow; using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.RenderOpenGl; using MatterHackers.RenderOpenGl;
using MatterHackers.VectorMath; using MatterHackers.VectorMath;
using MatterHackers.RenderOpenGl;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace MatterHackers.MatterControl.DesignTools.Operations namespace MatterHackers.MatterControl.DesignTools.Operations

View file

@ -34,7 +34,7 @@ using MatterHackers.Localizations;
using MatterHackers.MatterControl.PartPreviewWindow; using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.PolygonMesh; using MatterHackers.PolygonMesh;
using MatterHackers.VectorMath; using MatterHackers.VectorMath;
using PolygonMesh.Solids; using MatterHackers.PolygonMesh.Solids;
namespace MatterHackers.MatterControl.DesignTools namespace MatterHackers.MatterControl.DesignTools
{ {

View file

@ -1248,7 +1248,7 @@ namespace MatterHackers.MatterControl.DesignTools
Margin = new BorderDouble(5, 0) Margin = new BorderDouble(5, 0)
}; };
var searchField = new MHTextEditWidget("", theme, messageWhenEmptyAndNotSelected: "Search Google for images") var searchField = new ThemedTextEditWidget("", theme, messageWhenEmptyAndNotSelected: "Search Google for images")
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Center VAnchor = VAnchor.Center

View file

@ -29,11 +29,14 @@ either expressed or implied, of the FreeBSD Project.
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using MatterHackers.Agg;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI; using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D; using MatterHackers.DataConverters3D;
@ -375,6 +378,59 @@ namespace MatterHackers.MatterControl.DesignTools
return stringWithConstants; return stringWithConstants;
} }
private static string GetDisplayName(PropertyInfo prop)
{
var nameAttribute = prop.GetCustomAttributes(true).OfType<DisplayNameAttribute>().FirstOrDefault();
return nameAttribute?.DisplayName ?? prop.Name.SplitCamelCase();
}
private static string SearchSiblingProperties(IObject3D owner, string inExpression)
{
var parent = owner.Parent;
if (parent != null)
{
var matches = ConstantFinder.Matches(inExpression);
for (int i = 0; i < matches.Count; i++)
{
var constant = matches[i].Value;
// split inExpression on .
var splitExpression = constant.Split('.');
if (splitExpression.Length == 2)
{
foreach (var child in parent.Children)
{
// skip if owner
if (child != owner)
{
var itemName = splitExpression[0];
var propertyName = splitExpression[1];
// if child has the same name as itemName
if (child.Name == itemName)
{
// enumerate public properties on child
foreach (var property in child.GetType().GetProperties())
{
var displayName = GetDisplayName(property);
// if property name matches propertyName
if (displayName == propertyName)
{
// return the value
var expression = child.GetType().GetProperty(property.Name).GetValue(child, null).ToString();
var value = SheetObject3D.EvaluateExpression<double>(child, expression).ToString();
inExpression = inExpression.Replace("[" + constant + "]", value);
}
}
}
}
}
}
}
}
return inExpression;
}
public static T EvaluateExpression<T>(IObject3D owner, string inExpression) public static T EvaluateExpression<T>(IObject3D owner, string inExpression)
{ {
var inputExpression = inExpression; var inputExpression = inExpression;
@ -384,6 +440,8 @@ namespace MatterHackers.MatterControl.DesignTools
inputExpression = printer.Settings.ReplaceSettingsNamesWithValues(inputExpression, false); inputExpression = printer.Settings.ReplaceSettingsNamesWithValues(inputExpression, false);
} }
inputExpression = SearchSiblingProperties(owner, inputExpression);
inputExpression = ReplaceConstantsWithValues(owner, inputExpression); inputExpression = ReplaceConstantsWithValues(owner, inputExpression);
// check if the expression is not an equation (does not start with "=") // check if the expression is not an equation (does not start with "=")

View file

@ -41,45 +41,45 @@ namespace MatterHackers.MatterControl.EeProm
{ {
private EePromMarlinSettings currentEePromSettings; private EePromMarlinSettings currentEePromSettings;
private MHNumberEdit stepsPerMmX; private ThemedNumberEdit stepsPerMmX;
private MHNumberEdit stepsPerMmY; private ThemedNumberEdit stepsPerMmY;
private MHNumberEdit stepsPerMmZ; private ThemedNumberEdit stepsPerMmZ;
private MHNumberEdit stepsPerMmE; private ThemedNumberEdit stepsPerMmE;
private MHNumberEdit maxFeedrateMmPerSX; private ThemedNumberEdit maxFeedrateMmPerSX;
private MHNumberEdit maxFeedrateMmPerSY; private ThemedNumberEdit maxFeedrateMmPerSY;
private MHNumberEdit maxFeedrateMmPerSZ; private ThemedNumberEdit maxFeedrateMmPerSZ;
private MHNumberEdit maxFeedrateMmPerSE; private ThemedNumberEdit maxFeedrateMmPerSE;
private MHNumberEdit maxAccelerationMmPerSSqrdX; private ThemedNumberEdit maxAccelerationMmPerSSqrdX;
private MHNumberEdit maxAccelerationMmPerSSqrdY; private ThemedNumberEdit maxAccelerationMmPerSSqrdY;
private MHNumberEdit maxAccelerationMmPerSSqrdZ; private ThemedNumberEdit maxAccelerationMmPerSSqrdZ;
private MHNumberEdit maxAccelerationMmPerSSqrdE; private ThemedNumberEdit maxAccelerationMmPerSSqrdE;
private MHNumberEdit accelerationPrintingMoves; private ThemedNumberEdit accelerationPrintingMoves;
private MHNumberEdit accelerationRetraction; private ThemedNumberEdit accelerationRetraction;
private MHNumberEdit accelerationTravelMoves; private ThemedNumberEdit accelerationTravelMoves;
private MHNumberEdit pidP; private ThemedNumberEdit pidP;
private MHNumberEdit pidI; private ThemedNumberEdit pidI;
private MHNumberEdit pidD; private ThemedNumberEdit pidD;
private MHNumberEdit bedPidP; private ThemedNumberEdit bedPidP;
private MHNumberEdit bedPidI; private ThemedNumberEdit bedPidI;
private MHNumberEdit bedPidD; private ThemedNumberEdit bedPidD;
private MHNumberEdit homingOffsetX; private ThemedNumberEdit homingOffsetX;
private MHNumberEdit homingOffsetY; private ThemedNumberEdit homingOffsetY;
private MHNumberEdit homingOffsetZ; private ThemedNumberEdit homingOffsetZ;
private MHNumberEdit minFeedrate; private ThemedNumberEdit minFeedrate;
private MHNumberEdit minTravelFeedrate; private ThemedNumberEdit minTravelFeedrate;
private MHNumberEdit minSegmentTime; private ThemedNumberEdit minSegmentTime;
private MHNumberEdit maxXYJerk; private ThemedNumberEdit maxXYJerk;
private MHNumberEdit maxZJerk; private ThemedNumberEdit maxZJerk;
private MHNumberEdit maxEJerk; private ThemedNumberEdit maxEJerk;
private MHNumberEdit maxDeviation; private ThemedNumberEdit maxDeviation;
private EventHandler unregisterEvents; private EventHandler unregisterEvents;
@ -254,9 +254,9 @@ namespace MatterHackers.MatterControl.EeProm
}); });
} }
private GuiWidget CreateMHNumEdit(ref MHNumberEdit numberEditToCreate) private GuiWidget CreateMHNumEdit(ref ThemedNumberEdit numberEditToCreate)
{ {
numberEditToCreate = new MHNumberEdit(0, theme, pixelWidth: 80 * GuiWidget.DeviceScale, allowNegatives: true, allowDecimals: true) numberEditToCreate = new ThemedNumberEdit(0, theme, pixelWidth: 80 * GuiWidget.DeviceScale, allowNegatives: true, allowDecimals: true)
{ {
SelectAllOnFocus = true, SelectAllOnFocus = true,
VAnchor = VAnchor.Center, VAnchor = VAnchor.Center,
@ -267,9 +267,9 @@ namespace MatterHackers.MatterControl.EeProm
return numberEditToCreate; return numberEditToCreate;
} }
private GuiWidget CreateField(string label, ref MHNumberEdit field1) private GuiWidget CreateField(string label, ref ThemedNumberEdit field1)
{ {
MHNumberEdit none = null; ThemedNumberEdit none = null;
return Create4FieldSet(label, return Create4FieldSet(label,
"", ref field1, "", ref field1,
@ -279,11 +279,11 @@ namespace MatterHackers.MatterControl.EeProm
} }
private GuiWidget Create3FieldSet(string label, private GuiWidget Create3FieldSet(string label,
string field1Label, ref MHNumberEdit field1, string field1Label, ref ThemedNumberEdit field1,
string field2Label, ref MHNumberEdit field2, string field2Label, ref ThemedNumberEdit field2,
string field3Label, ref MHNumberEdit field3) string field3Label, ref ThemedNumberEdit field3)
{ {
MHNumberEdit none = null; ThemedNumberEdit none = null;
return Create4FieldSet(label, return Create4FieldSet(label,
field1Label, ref field1, field1Label, ref field1,
@ -307,10 +307,10 @@ namespace MatterHackers.MatterControl.EeProm
} }
private GuiWidget Create4FieldSet(string label, private GuiWidget Create4FieldSet(string label,
string field1Label, ref MHNumberEdit field1, string field1Label, ref ThemedNumberEdit field1,
string field2Label, ref MHNumberEdit field2, string field2Label, ref ThemedNumberEdit field2,
string field3Label, ref MHNumberEdit field3, string field3Label, ref ThemedNumberEdit field3,
string field4Label, ref MHNumberEdit field4) string field4Label, ref ThemedNumberEdit field4)
{ {
var row = new FlowLayoutWidget var row = new FlowLayoutWidget
{ {

View file

@ -301,7 +301,7 @@ namespace MatterHackers.MatterControl.EeProm
CreateSpacer(row); CreateSpacer(row);
double.TryParse(newSetting.Value, out double currentValue); double.TryParse(newSetting.Value, out double currentValue);
var valueEdit = new MHNumberEdit(currentValue, theme, pixelWidth: 80 * GuiWidget.DeviceScale, allowNegatives: true, allowDecimals: true) var valueEdit = new ThemedNumberEdit(currentValue, theme, pixelWidth: 80 * GuiWidget.DeviceScale, allowNegatives: true, allowDecimals: true)
{ {
SelectAllOnFocus = true, SelectAllOnFocus = true,
TabIndex = currentTabIndex++, TabIndex = currentTabIndex++,

View file

@ -30,6 +30,7 @@ either expressed or implied, of the FreeBSD Project.
using System; using System;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.Transform; using MatterHackers.Agg.Transform;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.VertexSource; using MatterHackers.Agg.VertexSource;
using MatterHackers.VectorMath; using MatterHackers.VectorMath;

View file

@ -444,7 +444,7 @@ Support and tutorials:" + articles;
public class CollectPrintDetailsPage : DialogPage public class CollectPrintDetailsPage : DialogPage
{ {
private readonly MHTextEditWidget textEditWidget; private readonly ThemedTextEditWidget textEditWidget;
public override string Text { get => textEditWidget.Text; set => textEditWidget.Text = value; } public override string Text { get => textEditWidget.Text; set => textEditWidget.Text = value; }
@ -507,7 +507,7 @@ Support and tutorials:" + articles;
// Adds text box and check box to the above container // Adds text box and check box to the above container
var emptyText = "What went wrong?".Localize(); var emptyText = "What went wrong?".Localize();
var initialValue = printTask.Note ?? ""; var initialValue = printTask.Note ?? "";
textEditWidget = new MHTextEditWidget(initialValue, theme, pixelWidth: 300, messageWhenEmptyAndNotSelected: emptyText) textEditWidget = new ThemedTextEditWidget(initialValue, theme, pixelWidth: 300, messageWhenEmptyAndNotSelected: emptyText)
{ {
Name = "InputBoxPage TextEditWidget", Name = "InputBoxPage TextEditWidget",
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,

View file

@ -38,7 +38,8 @@ namespace MatterHackers.MatterControl
using System.Threading; using System.Threading;
using MatterHackers.Agg.Image; using MatterHackers.Agg.Image;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
using MatterHackers.DataConverters3D; using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
using MatterHackers.ImageProcessing; using MatterHackers.ImageProcessing;
using MatterHackers.MatterControl.DataStorage; using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.DesignTools.Operations; using MatterHackers.MatterControl.DesignTools.Operations;

View file

@ -40,7 +40,7 @@ namespace MatterHackers.MatterControl.Library.Widgets
{ {
private readonly RadioButton createPrinterRadioButton = null; private readonly RadioButton createPrinterRadioButton = null;
private readonly AddMaterialWidget materialPanel; private readonly AddMaterialWidget materialPanel;
private readonly TextButton nextButton; private readonly ThemedTextButton nextButton;
public AddMaterialDialog(Action<PrinterSettingsLayer> addedMaterial, Action defineNewClicked) public AddMaterialDialog(Action<PrinterSettingsLayer> addedMaterial, Action defineNewClicked)
{ {

View file

@ -45,7 +45,7 @@ namespace MatterHackers.MatterControl.Library.Widgets
public class AddPrinterWidget : SearchableTreePanel public class AddPrinterWidget : SearchableTreePanel
{ {
private SectionWidget nameSection; private SectionWidget nameSection;
private MHTextEditWidget printerNameInput; private ThemedTextEditWidget printerNameInput;
private bool usingDefaultName = true; private bool usingDefaultName = true;
private Action<bool> nextButtonEnabled; private Action<bool> nextButtonEnabled;
private FlowLayoutWidget printerInfo; private FlowLayoutWidget printerInfo;
@ -154,7 +154,7 @@ namespace MatterHackers.MatterControl.Library.Widgets
horizontalSplitter.Panel2.AddChild(panel2Column); horizontalSplitter.Panel2.AddChild(panel2Column);
printerNameInput = new MHTextEditWidget("", theme) printerNameInput = new ThemedTextEditWidget("", theme)
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
}; };

View file

@ -58,9 +58,9 @@ namespace MatterHackers.MatterControl.Library.Widgets
}; };
contentRow.AddChild(pathRow); contentRow.AddChild(pathRow);
TextButton importButton = null; ThemedTextButton importButton = null;
var textEditWidget = new MHTextEditWidget("", theme) var textEditWidget = new ThemedTextEditWidget("", theme)
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Center, VAnchor = VAnchor.Center,

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI;
using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.CustomWidgets;
namespace MatterHackers.MatterControl.Library.Widgets namespace MatterHackers.MatterControl.Library.Widgets

View file

@ -419,7 +419,7 @@ namespace MatterHackers.MatterControl.Library.Widgets
public class TextEditWithInlineCancel : GuiWidget public class TextEditWithInlineCancel : GuiWidget
{ {
public MHTextEditWidget TextEditWidget { get; } public ThemedTextEditWidget TextEditWidget { get; }
public GuiWidget ResetButton { get; } public GuiWidget ResetButton { get; }
@ -433,7 +433,7 @@ namespace MatterHackers.MatterControl.Library.Widgets
this.VAnchor = VAnchor.Center | VAnchor.Fit; this.VAnchor = VAnchor.Center | VAnchor.Fit;
this.HAnchor = HAnchor.Stretch; this.HAnchor = HAnchor.Stretch;
TextEditWidget = new MHTextEditWidget("", theme, messageWhenEmptyAndNotSelected: emptyText) TextEditWidget = new ThemedTextEditWidget("", theme, messageWhenEmptyAndNotSelected: emptyText)
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Center VAnchor = VAnchor.Center

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<ReleaseVersion>2.20.12</ReleaseVersion> <ReleaseVersion>2.20.12</ReleaseVersion>
</PropertyGroup> </PropertyGroup>
@ -84,6 +84,7 @@
<ProjectReference Include="..\Submodules\agg-sharp\PolygonMesh\PolygonMesh.csproj" /> <ProjectReference Include="..\Submodules\agg-sharp\PolygonMesh\PolygonMesh.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\Localizations\Localizations.csproj" /> <ProjectReference Include="..\Submodules\agg-sharp\Localizations\Localizations.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\agg\Agg.csproj" /> <ProjectReference Include="..\Submodules\agg-sharp\agg\Agg.csproj" />
<ProjectReference Include="..\Submodules\MatterSlice\MatterSlice.csproj" />
<ProjectReference Include="..\Submodules\MatterSlice\MatterSliceLib\MatterSliceLib.csproj" /> <ProjectReference Include="..\Submodules\MatterSlice\MatterSliceLib\MatterSliceLib.csproj" />
</ItemGroup> </ItemGroup>

View file

@ -29,6 +29,7 @@ either expressed or implied, of the FreeBSD Project.
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.CustomWidgets;
namespace MatterHackers.MatterControl.PartPreviewWindow namespace MatterHackers.MatterControl.PartPreviewWindow

View file

@ -41,7 +41,7 @@ namespace MatterHackers.MatterControl
public class LibraryBrowserPage : DialogPage public class LibraryBrowserPage : DialogPage
{ {
protected GuiWidget acceptButton = null; protected GuiWidget acceptButton = null;
protected MHTextEditWidget itemNameWidget; protected ThemedTextEditWidget itemNameWidget;
protected ILibraryContext libraryNavContext; protected ILibraryContext libraryNavContext;
protected LibraryListView librarySelectorWidget; protected LibraryListView librarySelectorWidget;
private FolderBreadCrumbWidget breadCrumbWidget = null; private FolderBreadCrumbWidget breadCrumbWidget = null;

View file

@ -39,7 +39,7 @@ namespace MatterHackers.MatterControl
{ {
public class MarkdownEditPage : DialogPage public class MarkdownEditPage : DialogPage
{ {
private MHTextEditWidget editWidget; private ThemedTextEditWidget editWidget;
private MarkdownWidget markdownWidget; private MarkdownWidget markdownWidget;
public MarkdownEditPage(UIField uiField) public MarkdownEditPage(UIField uiField)
@ -66,7 +66,7 @@ namespace MatterHackers.MatterControl
BackgroundColor = theme.BackgroundColor BackgroundColor = theme.BackgroundColor
}; };
editWidget = new MHTextEditWidget("", theme, multiLine: true, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono)) editWidget = new ThemedTextEditWidget("", theme, multiLine: true, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono))
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Stretch, VAnchor = VAnchor.Stretch,

View file

@ -108,7 +108,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
taskDetails.Options?.PauseText, taskDetails.Options?.PauseText,
taskDetails.Options?.PauseAction, taskDetails.Options?.PauseAction,
taskDetails.Options?.PauseToolTip ?? "Pause".Localize(), taskDetails.Options?.PauseToolTip ?? "Pause".Localize(),
"", "Pause Task Button",
theme, theme,
0); 0);

View file

@ -60,7 +60,7 @@ namespace MatterHackers.MatterControl
contentRow.AddChild(fileNameHeader); contentRow.AddChild(fileNameHeader);
// Adds text box and check box to the above container // Adds text box and check box to the above container
itemNameWidget = new MHTextEditWidget("", theme, pixelWidth: 300, messageWhenEmptyAndNotSelected: "Enter a Design Name Here".Localize()) itemNameWidget = new ThemedTextEditWidget("", theme, pixelWidth: 300, messageWhenEmptyAndNotSelected: "Enter a Design Name Here".Localize())
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
Margin = new BorderDouble(5), Margin = new BorderDouble(5),

View file

@ -47,8 +47,8 @@ namespace MatterHackers.MatterControl.DesignTools
public UndoBuffer UndoBuffer { get; } public UndoBuffer UndoBuffer { get; }
private ThemeConfig theme; private ThemeConfig theme;
private MHTextEditWidget editSelectedName; private ThemedTextEditWidget editSelectedName;
public MHTextEditWidget EditSelectedExpression { get; private set; } public ThemedTextEditWidget EditSelectedExpression { get; private set; }
private GridWidget gridWidget; private GridWidget gridWidget;
public SheetEditorWidget(SheetData sheetData, SheetObject3D sheetObject, UndoBuffer undoBuffer, ThemeConfig theme) public SheetEditorWidget(SheetData sheetData, SheetObject3D sheetObject, UndoBuffer undoBuffer, ThemeConfig theme)
@ -68,13 +68,13 @@ namespace MatterHackers.MatterControl.DesignTools
VAnchor = VAnchor.Fit, VAnchor = VAnchor.Fit,
}); });
editSelectedName = new MHTextEditWidget("", theme, cellEditNameWidth, messageWhenEmptyAndNotSelected: "Name".Localize()) editSelectedName = new ThemedTextEditWidget("", theme, cellEditNameWidth, messageWhenEmptyAndNotSelected: "Name".Localize())
{ {
HAnchor = HAnchor.Absolute, HAnchor = HAnchor.Absolute,
}; };
editSelectedName.ActualTextEditWidget.EditComplete += SelectedName_EditComplete; editSelectedName.ActualTextEditWidget.EditComplete += SelectedName_EditComplete;
editSelectionGroup.AddChild(editSelectedName); editSelectionGroup.AddChild(editSelectedName);
EditSelectedExpression = new MHTextEditWidget("", theme, messageWhenEmptyAndNotSelected: "Select cell to edit".Localize()) EditSelectedExpression = new ThemedTextEditWidget("", theme, messageWhenEmptyAndNotSelected: "Select cell to edit".Localize())
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
}; };

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D; using MatterHackers.DataConverters3D;
using MatterHackers.MeshVisualizer; using MatterHackers.MeshVisualizer;
using MatterHackers.PolygonMesh; using MatterHackers.PolygonMesh;

View file

@ -402,6 +402,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{ {
mouseDownObject3DControl.OnMouseDown(new Mouse3DEventArgs(mouseEvent, ray, info)); mouseDownObject3DControl.OnMouseDown(new Mouse3DEventArgs(mouseEvent, ray, info));
SelectedObject3DControl = mouseDownObject3DControl; SelectedObject3DControl = mouseDownObject3DControl;
// Needed for testing DimensionsWorkWhenNoSheet to work (more) reliably. Otherwise, OnMouseMove's defered update might not pick up the hover in time.
HoveredObject3DControl = mouseDownObject3DControl;
} }
else else
{ {

View file

@ -21,6 +21,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Semaphore implementation might stop the rare chance of a super slow print occuring in the ReSliceHasCorrectEPositions test.
#define USE_SEMAPHORE_FOR_RECEIVE_QUEUE
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
@ -410,8 +413,11 @@ ok
if (!shuttingDown) if (!shuttingDown)
{ {
shuttingDown = true; shuttingDown = true;
#if USE_SEMAPHORE_FOR_RECEIVE_QUEUE
receiveResetEvent.Release();
#endif
HeatedBed.Stop(); HeatedBed.Stop();
foreach (var extruder in Extruders) foreach (var extruder in Extruders)
{ {
extruder.Stop(); extruder.Stop();
@ -739,7 +745,12 @@ ok
private readonly object receiveLock = new object(); private readonly object receiveLock = new object();
private readonly Queue<string> receiveQueue = new Queue<string>(); private readonly Queue<string> receiveQueue = new Queue<string>();
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
private AutoResetEvent receiveResetEvent = new AutoResetEvent(false); private AutoResetEvent receiveResetEvent = new AutoResetEvent(false);
#else
private SemaphoreSlim receiveResetEvent = new(0);
#endif
private readonly object sendLock = new object(); private readonly object sendLock = new object();
private readonly Queue<string> sendQueue = new Queue<string>(new string[] { "Emulator v0.1\n" }); private readonly Queue<string> sendQueue = new Queue<string>(new string[] { "Emulator v0.1\n" });
@ -788,7 +799,11 @@ ok
{ {
this.IsOpen = true; this.IsOpen = true;
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
receiveResetEvent = new AutoResetEvent(false); receiveResetEvent = new AutoResetEvent(false);
#else
receiveResetEvent = new(0);
#endif
this.ReadTimeout = 500; this.ReadTimeout = 500;
this.WriteTimeout = 500; this.WriteTimeout = 500;
@ -814,6 +829,7 @@ ok
{ {
Thread.CurrentThread.Name = "EmulatorPipeline"; Thread.CurrentThread.Name = "EmulatorPipeline";
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
while (!shuttingDown || receiveQueue.Count > 0) while (!shuttingDown || receiveQueue.Count > 0)
{ {
if (receiveQueue.Count == 0) if (receiveQueue.Count == 0)
@ -856,10 +872,38 @@ ok
} }
} }
} }
#else
for (; ;)
{
receiveResetEvent.Wait();
this.IsOpen = false; string receivedLine;
lock (receiveLock)
{
if (receiveQueue.Count <= 0)
{
// End of queue. The only other thing the semaphore is signalled for is shutdown.
System.Diagnostics.Debug.Assert(shuttingDown);
break;
}
receivedLine = receiveQueue.Dequeue();
}
if (receivedLine?.Length > 0)
{
// Thread.Sleep(250);
string emulatedResponse = GetCorrectResponse(receivedLine);
lock (sendLock)
{
sendQueue.Enqueue(emulatedResponse);
}
}
}
#endif
this.Dispose();
}); });
} }
@ -886,7 +930,11 @@ ok
} }
// Release the main loop to process the received command // Release the main loop to process the received command
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
receiveResetEvent.Set(); receiveResetEvent.Set();
#else
receiveResetEvent.Release();
#endif
} }
public void Write(byte[] buffer, int offset, int count) => throw new NotImplementedException(); public void Write(byte[] buffer, int offset, int count) => throw new NotImplementedException();

View file

@ -41,8 +41,8 @@ namespace MatterHackers.MatterControl.PrinterControls
{ {
public class AdjustmentControls : FlowLayoutWidget public class AdjustmentControls : FlowLayoutWidget
{ {
private MHNumberEdit feedRateValue; private ThemedNumberEdit feedRateValue;
private MHNumberEdit extrusionValue; private ThemedNumberEdit extrusionValue;
private SolidSlider feedRateRatioSlider; private SolidSlider feedRateRatioSlider;
private SolidSlider extrusionRatioSlider; private SolidSlider extrusionRatioSlider;
@ -55,7 +55,7 @@ namespace MatterHackers.MatterControl.PrinterControls
private PrinterConfig printer; private PrinterConfig printer;
private AdjustmentControls(PrinterConfig printer, ThemeConfig theme) private AdjustmentControls(PrinterConfig printer, ThemeConfig theme)
: base (FlowDirection.TopToBottom) : base(FlowDirection.TopToBottom)
{ {
double sliderWidth = 300 * GuiWidget.DeviceScale; double sliderWidth = 300 * GuiWidget.DeviceScale;
double sliderThumbWidth = 10 * GuiWidget.DeviceScale; double sliderThumbWidth = 10 * GuiWidget.DeviceScale;
@ -99,7 +99,7 @@ namespace MatterHackers.MatterControl.PrinterControls
}; };
settingsRow.AddChild(feedRateRatioSlider); settingsRow.AddChild(feedRateRatioSlider);
feedRateValue = new MHNumberEdit(Math.Round(printer.Settings.GetValue<double>(SettingsKey.feedrate_ratio), 2), theme, allowDecimals: true, minValue: minFeedRateRatio, maxValue: maxFeedRateRatio, pixelWidth: 40 * GuiWidget.DeviceScale) feedRateValue = new ThemedNumberEdit(Math.Round(printer.Settings.GetValue<double>(SettingsKey.feedrate_ratio), 2), theme, allowDecimals: true, minValue: minFeedRateRatio, maxValue: maxFeedRateRatio, pixelWidth: 40 * GuiWidget.DeviceScale)
{ {
Name = "Feed Rate NumberEdit", Name = "Feed Rate NumberEdit",
SelectAllOnFocus = true, SelectAllOnFocus = true,
@ -157,7 +157,7 @@ namespace MatterHackers.MatterControl.PrinterControls
}; };
settingsRow.AddChild(extrusionRatioSlider); settingsRow.AddChild(extrusionRatioSlider);
extrusionValue = new MHNumberEdit(Math.Round(printer.Settings.GetValue<double>(SettingsKey.extrusion_ratio), 2), theme, allowDecimals: true, minValue: minExtrutionRatio, maxValue: maxExtrusionRatio, pixelWidth: 40 * GuiWidget.DeviceScale) extrusionValue = new ThemedNumberEdit(Math.Round(printer.Settings.GetValue<double>(SettingsKey.extrusion_ratio), 2), theme, allowDecimals: true, minValue: minExtrutionRatio, maxValue: maxExtrusionRatio, pixelWidth: 40 * GuiWidget.DeviceScale)
{ {
Name = "Extrusion Multiplier NumberEdit", Name = "Extrusion Multiplier NumberEdit",
SelectAllOnFocus = true, SelectAllOnFocus = true,

View file

@ -38,7 +38,7 @@ namespace MatterHackers.MatterControl.PrinterControls
{ {
public class FanControlsRow : SettingsRow public class FanControlsRow : SettingsRow
{ {
private MHNumberEdit fanSpeedDisplay; private ThemedNumberEdit fanSpeedDisplay;
private RoundedToggleSwitch toggleSwitch; private RoundedToggleSwitch toggleSwitch;
private PrinterConfig printer; private PrinterConfig printer;
@ -57,7 +57,7 @@ namespace MatterHackers.MatterControl.PrinterControls
this.AddChild(container); this.AddChild(container);
this.BorderColor = Color.Transparent; this.BorderColor = Color.Transparent;
fanSpeedDisplay = new MHNumberEdit(0, theme, minValue: 0, maxValue: 100, pixelWidth: 30 * GuiWidget.DeviceScale) fanSpeedDisplay = new ThemedNumberEdit(0, theme, minValue: 0, maxValue: 100, pixelWidth: 30 * GuiWidget.DeviceScale)
{ {
Value = printer.Connection.GetFanSpeed0To255(fanIndex) * 100 / 255, Value = printer.Connection.GetFanSpeed0To255(fanIndex) * 100 / 255,
VAnchor = VAnchor.Center | VAnchor.Fit, VAnchor = VAnchor.Center | VAnchor.Fit,

View file

@ -117,7 +117,7 @@ namespace MatterHackers.MatterControl
int linkCompatibleRow = row; int linkCompatibleRow = row;
int linkCompatibleAxis = axis; int linkCompatibleAxis = axis;
var valueEdit = new MHNumberEdit(positions[linkCompatibleRow][linkCompatibleAxis], theme, allowNegatives: true, allowDecimals: true, pixelWidth: 60 * GuiWidget.DeviceScale, tabIndex: tab_index++) var valueEdit = new ThemedNumberEdit(positions[linkCompatibleRow][linkCompatibleAxis], theme, allowNegatives: true, allowDecimals: true, pixelWidth: 60 * GuiWidget.DeviceScale, tabIndex: tab_index++)
{ {
Name = $"{axisName} Position {row}" Name = $"{axisName} Position {row}"
}; };

View file

@ -62,10 +62,10 @@ namespace MatterHackers.MatterControl
private List<ExtrudeButton> eMinusButtons = new List<ExtrudeButton>(); private List<ExtrudeButton> eMinusButtons = new List<ExtrudeButton>();
private List<ExtrudeButton> ePlusButtons = new List<ExtrudeButton>(); private List<ExtrudeButton> ePlusButtons = new List<ExtrudeButton>();
private RadioTextButton movePointZeroTwoMmButton; private ThemedRadioTextButton movePointZeroTwoMmButton;
private RadioTextButton moveOneMmButton; private ThemedRadioTextButton moveOneMmButton;
private RadioTextButton oneHundredButton; private ThemedRadioTextButton oneHundredButton;
private RadioTextButton tenButton; private ThemedRadioTextButton tenButton;
private GuiWidget disableableEButtons; private GuiWidget disableableEButtons;
private GuiWidget keyboardFocusBorder; private GuiWidget keyboardFocusBorder;
private GuiWidget keyboardImage; private GuiWidget keyboardImage;

View file

@ -45,8 +45,8 @@ namespace MatterHackers.MatterControl
public MacroDetailPage(GCodeMacro gcodeMacro, PrinterSettings printerSettings) public MacroDetailPage(GCodeMacro gcodeMacro, PrinterSettings printerSettings)
{ {
// Form validation fields // Form validation fields
MHTextEditWidget macroNameInput; ThemedTextEditWidget macroNameInput;
MHTextEditWidget macroCommandInput; ThemedTextEditWidget macroCommandInput;
WrappedTextWidget macroCommandError; WrappedTextWidget macroCommandError;
WrappedTextWidget macroNameError; WrappedTextWidget macroNameError;
@ -64,7 +64,7 @@ namespace MatterHackers.MatterControl
Margin = new BorderDouble(0, 0, 0, 1) Margin = new BorderDouble(0, 0, 0, 1)
}); });
contentRow.AddChild(macroNameInput = new MHTextEditWidget(GCodeMacro.FixMacroName(gcodeMacro.Name), theme) contentRow.AddChild(macroNameInput = new ThemedTextEditWidget(GCodeMacro.FixMacroName(gcodeMacro.Name), theme)
{ {
HAnchor = HAnchor.Stretch HAnchor = HAnchor.Stretch
}); });
@ -82,7 +82,7 @@ namespace MatterHackers.MatterControl
Margin = new BorderDouble(0, 0, 0, 1) Margin = new BorderDouble(0, 0, 0, 1)
}); });
macroCommandInput = new MHTextEditWidget(gcodeMacro.GCode, theme, pixelHeight: 120, multiLine: true, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono)) macroCommandInput = new ThemedTextEditWidget(gcodeMacro.GCode, theme, pixelHeight: 120, multiLine: true, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono))
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Stretch VAnchor = VAnchor.Stretch

View file

@ -105,7 +105,7 @@ namespace MatterHackers.MatterControl
movementSpeed = movementSpeed / 60.0; // Convert from mm/min to mm/s movementSpeed = movementSpeed / 60.0; // Convert from mm/min to mm/s
} }
var valueEdit = new MHNumberEdit(movementSpeed, theme, minValue: 0, pixelWidth: 60 * GuiWidget.DeviceScale, tabIndex: tab_index++, allowDecimals: true) var valueEdit = new ThemedNumberEdit(movementSpeed, theme, minValue: 0, pixelWidth: 60 * GuiWidget.DeviceScale, tabIndex: tab_index++, allowDecimals: true)
{ {
Margin = 3 Margin = 3
}; };

View file

@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections
private TextWidget printerBaudRateError; private TextWidget printerBaudRateError;
private GuiWidget baudRateWidget; private GuiWidget baudRateWidget;
private RadioButton otherBaudRateRadioButton; private RadioButton otherBaudRateRadioButton;
private MHTextEditWidget otherBaudRateInput; private ThemedTextEditWidget otherBaudRateInput;
private GuiWidget nextButton; private GuiWidget nextButton;
private GuiWidget printerBaudRateHelpLink; private GuiWidget printerBaudRateHelpLink;
private TextWidget printerBaudRateHelpMessage; private TextWidget printerBaudRateHelpMessage;
@ -159,7 +159,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections
//See if the baud rate of the current print is in the list of displayed rates, //See if the baud rate of the current print is in the list of displayed rates,
//flag the 'other' option if it is not and prefill the rate. //flag the 'other' option if it is not and prefill the rate.
otherBaudRateInput = new MHTextEditWidget("", theme); otherBaudRateInput = new ThemedTextEditWidget("", theme);
otherBaudRateInput.Visible = false; otherBaudRateInput.Visible = false;
otherBaudRateInput.HAnchor = HAnchor.Stretch; otherBaudRateInput.HAnchor = HAnchor.Stretch;

View file

@ -39,7 +39,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections
// Normally step one of the setup process // Normally step one of the setup process
public class SetupStepMakeModelName : DialogPage public class SetupStepMakeModelName : DialogPage
{ {
private readonly TextButton nextButton; private readonly ThemedTextButton nextButton;
private readonly AddPrinterWidget printerPanel; private readonly AddPrinterWidget printerPanel;
private readonly RadioButton createPrinterRadioButton = null; private readonly RadioButton createPrinterRadioButton = null;

View file

@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl
public class TerminalWidget : FlowLayoutWidget, ICloseableTab public class TerminalWidget : FlowLayoutWidget, ICloseableTab
{ {
private CheckBox autoUppercase; private CheckBox autoUppercase;
private MHTextEditWidget manualCommandTextEdit; private ThemedTextEditWidget manualCommandTextEdit;
private TextScrollWidget textScrollWidget; private TextScrollWidget textScrollWidget;
private PrinterConfig printer; private PrinterConfig printer;
@ -181,7 +181,7 @@ namespace MatterHackers.MatterControl
}; };
this.AddChild(inputRow); this.AddChild(inputRow);
manualCommandTextEdit = new MHTextEditWidget("", theme, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono)) manualCommandTextEdit = new ThemedTextEditWidget("", theme, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono))
{ {
Margin = new BorderDouble(right: 3), Margin = new BorderDouble(right: 3),
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,

View file

@ -412,7 +412,7 @@ namespace MatterHackers.MatterControl
{ {
gitHubPat = ""; gitHubPat = "";
} }
var accessToken = new MHTextEditWidget(gitHubPat, theme, pixelWidth: 350, messageWhenEmptyAndNotSelected: "Enter Person Access Token".Localize()) var accessToken = new ThemedTextEditWidget(gitHubPat, theme, pixelWidth: 350, messageWhenEmptyAndNotSelected: "Enter Person Access Token".Localize())
{ {
HAnchor = HAnchor.Absolute, HAnchor = HAnchor.Absolute,
Margin = new BorderDouble(5), Margin = new BorderDouble(5),

View file

@ -71,7 +71,7 @@ namespace MatterHackers.MatterControl
DialogWindow wizardWindow = GetWindow(typeof(PanelType)); DialogWindow wizardWindow = GetWindow(typeof(PanelType));
var newPanel = wizardWindow.ChangeToPage<PanelType>(); var newPanel = wizardWindow.ChangeToPage<PanelType>();
wizardWindow.Title = newPanel.WindowTitle; wizardWindow.Title = newPanel.WindowTitle;
SetSizeAndShow(wizardWindow, newPanel); SetSizeAndShow(wizardWindow, newPanel);
} }

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.CustomWidgets;
namespace MatterHackers.MatterControl namespace MatterHackers.MatterControl

View file

@ -36,7 +36,7 @@ namespace MatterHackers.MatterControl
{ {
public class InputBoxPage : DialogPage public class InputBoxPage : DialogPage
{ {
public MHTextEditWidget TextEditWidget { get; private set; } public ThemedTextEditWidget TextEditWidget { get; private set; }
public override string Text { get => TextEditWidget.Text; set => TextEditWidget.Text = value; } public override string Text { get => TextEditWidget.Text; set => TextEditWidget.Text = value; }
@ -56,7 +56,7 @@ namespace MatterHackers.MatterControl
}); });
// Adds text box and check box to the above container // Adds text box and check box to the above container
TextEditWidget = new MHTextEditWidget(initialValue, theme, pixelWidth: 300, messageWhenEmptyAndNotSelected: emptyText); TextEditWidget = new ThemedTextEditWidget(initialValue, theme, pixelWidth: 300, messageWhenEmptyAndNotSelected: emptyText);
TextEditWidget.Name = "InputBoxPage TextEditWidget"; TextEditWidget.Name = "InputBoxPage TextEditWidget";
TextEditWidget.HAnchor = HAnchor.Stretch; TextEditWidget.HAnchor = HAnchor.Stretch;
TextEditWidget.Margin = new BorderDouble(5); TextEditWidget.Margin = new BorderDouble(5);

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration
{ {

View file

@ -27,6 +27,8 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project. either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public class BoundsField : Vector4Field public class BoundsField : Vector4Field

View file

@ -34,7 +34,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public class CharField : UIField public class CharField : UIField
{ {
protected MHTextEditWidget textEditWidget; protected ThemedTextEditWidget textEditWidget;
private ThemeConfig theme; private ThemeConfig theme;
public CharField(ThemeConfig theme) public CharField(ThemeConfig theme)
@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public override void Initialize(int tabIndex) public override void Initialize(int tabIndex)
{ {
textEditWidget = new MHTextEditWidget("", theme, pixelWidth: ControlWidth, tabIndex: tabIndex) textEditWidget = new ThemedTextEditWidget("", theme, pixelWidth: ControlWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
SelectAllOnFocus = true, SelectAllOnFocus = true,

View file

@ -27,6 +27,7 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project. either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI;
using System; using System;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public class ExpressionField : UIField public class ExpressionField : UIField
{ {
protected MHTextEditWidget textEditWidget; protected ThemedTextEditWidget textEditWidget;
private ThemeConfig theme; private ThemeConfig theme;
public ExpressionField(ThemeConfig theme) public ExpressionField(ThemeConfig theme)
@ -61,7 +61,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
VAnchor = VAnchor.Fit VAnchor = VAnchor.Fit
}; };
aligner.AddChild(textEditWidget = new MHTextEditWidget("", theme, pixelWidth: ControlWidth, tabIndex: tabIndex) aligner.AddChild(textEditWidget = new ThemedTextEditWidget("", theme, pixelWidth: ControlWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
SelectAllOnFocus = true, SelectAllOnFocus = true,

View file

@ -110,6 +110,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
base.Initialize(tabIndex); base.Initialize(tabIndex);
} }
private static double StripZeroSign(double x)
{
return x == 0 ? 0 : x;
}
protected override string ConvertValue(string newValue) protected override string ConvertValue(string newValue)
{ {
var offsets = newValue?.Split(','); var offsets = newValue?.Split(',');
@ -126,7 +131,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
// Import deprecated z_offset data if missing // Import deprecated z_offset data if missing
var zOffset = printer.Settings.GetValue<double>(SettingsKey.z_offset); var zOffset = printer.Settings.GetValue<double>(SettingsKey.z_offset);
corrected += xyz[0] + "x" + xyz[1] + "x" + (-zOffset).ToString(); corrected += xyz[0] + "x" + xyz[1] + "x" + StripZeroSign(-zOffset).ToString();
} }
else else
{ {

View file

@ -27,6 +27,7 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project. either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI;
using System; using System;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration

View file

@ -34,7 +34,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public class MultilineStringField : UIField public class MultilineStringField : UIField
{ {
private MHTextEditWidget editWidget; private ThemedTextEditWidget editWidget;
private ThemeConfig theme; private ThemeConfig theme;
public MultilineStringField(ThemeConfig theme) public MultilineStringField(ThemeConfig theme)
@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public override void Initialize(int tabIndex) public override void Initialize(int tabIndex)
{ {
editWidget = new MHTextEditWidget("", theme, pixelWidth: 320, multiLine: true, tabIndex: tabIndex, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono)) editWidget = new ThemedTextEditWidget("", theme, pixelWidth: 320, multiLine: true, tabIndex: tabIndex, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono))
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Fit, VAnchor = VAnchor.Fit,

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public abstract class NumberField : UIField public abstract class NumberField : UIField
{ {
protected MHNumberEdit numberEdit; protected ThemedNumberEdit numberEdit;
private readonly ThemeConfig theme; private readonly ThemeConfig theme;
protected bool AllowNegatives { get; set; } = true; protected bool AllowNegatives { get; set; } = true;
@ -47,7 +47,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public override void Initialize(int tabIndex) public override void Initialize(int tabIndex)
{ {
numberEdit = new MHNumberEdit(0, theme, pixelWidth: ControlWidth, allowDecimals: this.AllowDecimals, allowNegatives: this.AllowNegatives, tabIndex: tabIndex) numberEdit = new ThemedNumberEdit(0, theme, pixelWidth: ControlWidth, allowDecimals: this.AllowDecimals, allowNegatives: this.AllowNegatives, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
SelectAllOnFocus = true, SelectAllOnFocus = true,

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI;
using System; using System;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration

View file

@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public event EventHandler ValueChanged; public event EventHandler ValueChanged;
private MHTextEditWidget editWidget; private ThemedTextEditWidget editWidget;
public SurfacedEditorPage(IObject3D selectedItem) public SurfacedEditorPage(IObject3D selectedItem)
{ {
@ -61,7 +61,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
BackgroundColor = theme.BackgroundColor BackgroundColor = theme.BackgroundColor
}; };
editWidget = new MHTextEditWidget("", theme) editWidget = new ThemedTextEditWidget("", theme)
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
Name = this.Name, Name = this.Name,

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public class TextField : UIField public class TextField : UIField
{ {
protected MHTextEditWidget textEditWidget; protected ThemedTextEditWidget textEditWidget;
private ThemeConfig theme; private ThemeConfig theme;
public TextField(ThemeConfig theme) public TextField(ThemeConfig theme)
@ -55,7 +55,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public override void Initialize(int tabIndex) public override void Initialize(int tabIndex)
{ {
textEditWidget = new MHTextEditWidget("", theme, pixelWidth: ControlWidth, tabIndex: tabIndex) textEditWidget = new ThemedTextEditWidget("", theme, pixelWidth: ControlWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
SelectAllOnFocus = true, SelectAllOnFocus = true,

View file

@ -82,12 +82,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public void ClearUndoHistory() public void ClearUndoHistory()
{ {
foreach (var widget in this.Content.DescendantsAndSelf<MHTextEditWidget>()) foreach (var widget in this.Content.DescendantsAndSelf<ThemedTextEditWidget>())
{ {
widget.ActualTextEditWidget.InternalTextEditWidget.ClearUndoHistory(); widget.ActualTextEditWidget.InternalTextEditWidget.ClearUndoHistory();
} }
foreach (var widget in this.Content.DescendantsAndSelf<MHNumberEdit>()) foreach (var widget in this.Content.DescendantsAndSelf<ThemedNumberEdit>())
{ {
widget.ActuallNumberEdit.InternalTextEditWidget.ClearUndoHistory(); widget.ActuallNumberEdit.InternalTextEditWidget.ClearUndoHistory();
} }

View file

@ -28,6 +28,8 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public abstract class ValueOrUnitsField : TextField public abstract class ValueOrUnitsField : TextField

View file

@ -38,9 +38,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public static readonly int VectorXYEditWidth = (int)(60 * GuiWidget.DeviceScale + .5); public static readonly int VectorXYEditWidth = (int)(60 * GuiWidget.DeviceScale + .5);
private MHNumberEdit yEditWidget; private ThemedNumberEdit yEditWidget;
private MHNumberEdit xEditWidget; private ThemedNumberEdit xEditWidget;
private ThemeConfig theme; private ThemeConfig theme;
public Vector2Field(ThemeConfig theme) public Vector2Field(ThemeConfig theme)
@ -71,7 +71,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyValueStrings[0], out double currentXValue); double.TryParse(xyValueStrings[0], out double currentXValue);
xEditWidget = new MHNumberEdit(currentXValue, theme, singleCharLabel: 'X', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth, tabIndex: tabIndex) xEditWidget = new ThemedNumberEdit(currentXValue, theme, singleCharLabel: 'X', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex, TabIndex = tabIndex,
@ -89,7 +89,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyValueStrings[1], out double currentYValue); double.TryParse(xyValueStrings[1], out double currentYValue);
yEditWidget = new MHNumberEdit(currentYValue, theme, 'Y', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth, tabIndex: tabIndex) yEditWidget = new ThemedNumberEdit(currentYValue, theme, 'Y', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex + 1, TabIndex = tabIndex + 1,

View file

@ -37,9 +37,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public static readonly int VectorXYZEditWidth = (int)(60 * GuiWidget.DeviceScale + .5); public static readonly int VectorXYZEditWidth = (int)(60 * GuiWidget.DeviceScale + .5);
private MHNumberEdit xEditWidget; private ThemedNumberEdit xEditWidget;
private MHNumberEdit yEditWidget; private ThemedNumberEdit yEditWidget;
private MHNumberEdit zEditWidget; private ThemedNumberEdit zEditWidget;
private ThemeConfig theme; private ThemeConfig theme;
public Vector3Field(ThemeConfig theme) public Vector3Field(ThemeConfig theme)
@ -71,7 +71,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzStrings[0], out double currentXValue); double.TryParse(xyzStrings[0], out double currentXValue);
xEditWidget = new MHNumberEdit(currentXValue, theme, 'X', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZEditWidth, tabIndex: tabIndex++) xEditWidget = new ThemedNumberEdit(currentXValue, theme, 'X', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZEditWidth, tabIndex: tabIndex++)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex, TabIndex = tabIndex,
@ -93,7 +93,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzStrings[1], out double currentYValue); double.TryParse(xyzStrings[1], out double currentYValue);
yEditWidget = new MHNumberEdit(currentYValue, theme, 'Y', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZEditWidth, tabIndex: tabIndex++) yEditWidget = new ThemedNumberEdit(currentYValue, theme, 'Y', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZEditWidth, tabIndex: tabIndex++)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex + 1, TabIndex = tabIndex + 1,
@ -115,7 +115,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzStrings[2], out double currentZValue); double.TryParse(xyzStrings[2], out double currentZValue);
zEditWidget = new MHNumberEdit(currentZValue, theme, 'Z', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZEditWidth, tabIndex: tabIndex++) zEditWidget = new ThemedNumberEdit(currentZValue, theme, 'Z', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZEditWidth, tabIndex: tabIndex++)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex + 1, TabIndex = tabIndex + 1,

View file

@ -37,10 +37,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{ {
public static int VectorXYZWEditWidth = (int)(45 * GuiWidget.DeviceScale + .5); public static int VectorXYZWEditWidth = (int)(45 * GuiWidget.DeviceScale + .5);
private MHNumberEdit xEditWidget; private ThemedNumberEdit xEditWidget;
private MHNumberEdit yEditWidget; private ThemedNumberEdit yEditWidget;
private MHNumberEdit zEditWidget; private ThemedNumberEdit zEditWidget;
private MHNumberEdit wEditWidget; private ThemedNumberEdit wEditWidget;
private ThemeConfig theme; private ThemeConfig theme;
@ -76,7 +76,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzValueStrings[0], out double currentXValue); double.TryParse(xyzValueStrings[0], out double currentXValue);
xEditWidget = new MHNumberEdit(currentXValue, theme, Labels[0] /* X */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex) xEditWidget = new ThemedNumberEdit(currentXValue, theme, Labels[0] /* X */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex, TabIndex = tabIndex,
@ -98,7 +98,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzValueStrings[1], out double currentYValue); double.TryParse(xyzValueStrings[1], out double currentYValue);
yEditWidget = new MHNumberEdit(currentYValue, theme, Labels[1] /* Y */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex) yEditWidget = new ThemedNumberEdit(currentYValue, theme, Labels[1] /* Y */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex + 1, TabIndex = tabIndex + 1,
@ -120,7 +120,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzValueStrings[2], out double currentZValue); double.TryParse(xyzValueStrings[2], out double currentZValue);
zEditWidget = new MHNumberEdit(currentZValue, theme, Labels[2] /* Z */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex) zEditWidget = new ThemedNumberEdit(currentZValue, theme, Labels[2] /* Z */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex + 1, TabIndex = tabIndex + 1,
@ -142,7 +142,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyzValueStrings[3], out double currentWValue); double.TryParse(xyzValueStrings[3], out double currentWValue);
wEditWidget = new MHNumberEdit(currentZValue, theme, Labels[3] /* W */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex) wEditWidget = new ThemedNumberEdit(currentZValue, theme, Labels[3] /* W */, allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYZWEditWidth, tabIndex: tabIndex)
{ {
ToolTipText = this.HelpText, ToolTipText = this.HelpText,
TabIndex = tabIndex + 1, TabIndex = tabIndex + 1,

View file

@ -122,13 +122,13 @@ namespace MatterHackers.MatterControl.FieldValidation
{ {
public delegate ValidationStatus ValidationHandler(string valueToValidate); public delegate ValidationStatus ValidationHandler(string valueToValidate);
public MHTextEditWidget FieldEditWidget { get; set; } public ThemedTextEditWidget FieldEditWidget { get; set; }
public WrappedTextWidget FieldErrorMessageWidget { get; set; } public WrappedTextWidget FieldErrorMessageWidget { get; set; }
private ValidationHandler[] FieldValidationHandlers { get; set; } private ValidationHandler[] FieldValidationHandlers { get; set; }
public FormField(MHTextEditWidget textEditWidget, WrappedTextWidget errorMessageWidget, ValidationHandler[] validationHandlers) public FormField(ThemedTextEditWidget textEditWidget, WrappedTextWidget errorMessageWidget, ValidationHandler[] validationHandlers)
{ {
this.FieldEditWidget = textEditWidget; this.FieldEditWidget = textEditWidget;
this.FieldErrorMessageWidget = errorMessageWidget; this.FieldErrorMessageWidget = errorMessageWidget;

View file

@ -57,7 +57,14 @@ namespace MatterHackers.MatterControl
get get
{ {
var queueDirectory = LegacyQueueFiles.QueueDirectory; var queueDirectory = LegacyQueueFiles.QueueDirectory;
return Directory.EnumerateFiles(queueDirectory).Count(); try
{
return Directory.EnumerateFiles(queueDirectory).Count();
}
catch (DirectoryNotFoundException)
{
return 0;
}
} }
} }

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using Markdig.Renderers.Agg.Inlines; using Markdig.Renderers.Agg.Inlines;
using MatterHackers.Agg.UI;
using MatterHackers.MatterControl; using MatterHackers.MatterControl;
namespace Markdig.Renderers.Agg namespace Markdig.Renderers.Agg

View file

@ -1,35 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<Company>MatterHackers Inc.</Company> <Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <BaseOutputPath>$(SolutionDir)bin</BaseOutputPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <ItemGroup>
<OutputPath>..\..\bin\Debug\</OutputPath> <PackageReference Include="PDFsharpNetStandard2" Version="1.51.4845" />
</PropertyGroup> <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
</ItemGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <ItemGroup>
<OutputPath>..\..\bin\Release\</OutputPath> <ProjectReference Include="..\..\MatterControl.Common\MatterControl.Common.csproj">
</PropertyGroup> <Project>{2af30557-fc50-4de3-ad1c-7eb57131a9c5}</Project>
<Name>MatterControl.Common</Name>
<ItemGroup> </ProjectReference>
<PackageReference Include="PDFsharpNetStandard2" Version="1.51.4845" /> <ProjectReference Include="..\..\MatterControlLib\MatterControlLib.csproj" />
</ItemGroup> <ProjectReference Include="..\..\Submodules\agg-sharp\agg\Agg.csproj">
</ProjectReference>
<ItemGroup> <ProjectReference Include="..\..\Submodules\agg-sharp\Localizations\Localizations.csproj" />
<ProjectReference Include="..\..\MatterControl.Common\MatterControl.Common.csproj"> <ProjectReference Include="..\..\Submodules\agg-sharp\VectorMath\VectorMath.csproj">
<Project>{2af30557-fc50-4de3-ad1c-7eb57131a9c5}</Project> </ProjectReference>
<Name>MatterControl.Common</Name> </ItemGroup>
</ProjectReference>
<ProjectReference Include="..\..\MatterControlLib\MatterControlLib.csproj" />
<ProjectReference Include="..\..\Submodules\agg-sharp\agg\Agg.csproj">
</ProjectReference>
<ProjectReference Include="..\..\Submodules\agg-sharp\Localizations\Localizations.csproj" />
<ProjectReference Include="..\..\Submodules\agg-sharp\VectorMath\VectorMath.csproj">
</ProjectReference>
</ItemGroup>
</Project> </Project>

View file

@ -23,6 +23,10 @@ namespace MatterHackers.MatterControl.Plugins
return; return;
} }
// Needed for PDFSharp on .NET core.
// https://stackoverflow.com/questions/50858209/system-notsupportedexception-no-data-is-available-for-encoding-1252
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
ApplicationController.Instance.Library.MenuExtensions.Add( ApplicationController.Instance.Library.MenuExtensions.Add(
new LibraryAction(ActionScope.ListItem) new LibraryAction(ActionScope.ListItem)
{ {

View file

@ -213,7 +213,7 @@ namespace MatterHackers.MatterControl.Plugins
// Now try and open the document. This will launch whatever PDF viewer is on the system and ask it // Now try and open the document. This will launch whatever PDF viewer is on the system and ask it
// to show the file (at least on Windows). // to show the file (at least on Windows).
Process.Start(pathAndFileToSaveTo); ApplicationController.ProcessStart(pathAndFileToSaveTo);
} }
catch (Exception) catch (Exception)
{ {

View file

@ -1,58 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFramework>net6.0</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}</ProjectGuid>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<OutputPath>bin\Release\</OutputPath>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MatterHackers.InfInstaller</RootNamespace> <RootNamespace>MatterHackers.InfInstaller</RootNamespace>
<AssemblyName>InfInstaller</AssemblyName> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>2.0</OldToolsVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks> <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.CSharp" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<Reference Include="System" /> <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<Reference Include="System.Data" /> <PrivateAssets>all</PrivateAssets>
<Reference Include="System.Drawing" /> </PackageReference>
<Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Compile Include="InfInstaller.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project> </Project>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
</configuration>

View file

@ -31,9 +31,8 @@ using System;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Threading; using System.Threading;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.Platform; using MatterHackers.Agg.Platform;
@ -64,17 +63,13 @@ namespace MatterHackers.MatterControl
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags); static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
private static EventWaitHandle waitHandle;
private const int RaygunMaxNotifications = 15; private const int RaygunMaxNotifications = 15;
private static int raygunNotificationCount = 0; private static int raygunNotificationCount = 0;
private static RaygunClient _raygunClient; private static RaygunClient _raygunClient;
private static string mainServiceName = "shell";
private const string ServiceBaseUri = "net.pipe://localhost/mattercontrol";
[DllImport("Shcore.dll")] [DllImport("Shcore.dll")]
static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS); static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS);
@ -141,6 +136,24 @@ namespace MatterHackers.MatterControl
} }
#endif #endif
// If StaticData is missing, use the StaticData at the relative project root if it exists.
if (!StaticData.Instance.DirectoryExists("."))
{
var mainOutputDirectoryAttribute = MainOutputDirectoryAttribute.GetFromProgramAssembly();
var executableDirectory = AppDomain.CurrentDomain.BaseDirectory;
var buildOutputDirectory = Path.Combine(mainOutputDirectoryAttribute.ProjectRoot, mainOutputDirectoryAttribute.MainOutputDirectory);
// In case the whole project moved, determine the relative path.
var buildAbsStaticDataPath = Path.Combine(mainOutputDirectoryAttribute.ProjectRoot, "StaticData");
var relStaticDataPath = Path.GetRelativePath(buildOutputDirectory, buildAbsStaticDataPath);
var workingAbsStaticDataPath = Path.GetFullPath(Path.Combine(executableDirectory, relStaticDataPath));
if (Directory.Exists(workingAbsStaticDataPath))
{
StaticData.OverrideRootPath(workingAbsStaticDataPath);
}
}
// Set the global culture for the app, current thread and all new threads // Set the global culture for the app, current thread and all new threads
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
@ -167,42 +180,22 @@ namespace MatterHackers.MatterControl
ApplicationVersion = VersionInfo.Instance.ReleaseVersion ApplicationVersion = VersionInfo.Instance.ReleaseVersion
}; };
// If MatterControl isn't running and valid files were shelled, schedule a StartupAction to open the files after load
var shellFiles = args.Where(f => File.Exists(f) && ApplicationController.ShellFileExtensions.Contains(Path.GetExtension(f).ToLower())).ToArray();
// Single instance handling.
#if !DEBUG #if !DEBUG
if (AggContext.OperatingSystem == OSType.Windows) if (!LocalService.TryStartServer())
{ {
waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, "MatterControl#Startup", out bool created); if (shellFiles.Any())
if (!created)
{ {
// If an instance is already running, create a service proxy and execute ShellOpenFile LocalService.TrySendToServer(shellFiles);
var proxy = new ServiceProxy();
// and at least one argument is an acceptable shell file extension
var itemsToAdd = args.Where(f => File.Exists(f) && ApplicationController.ShellFileExtensions.Contains(Path.GetExtension(f).ToLower()));
if (itemsToAdd.Any())
{
// notify the running instance of the event
proxy.ShellOpenFile(itemsToAdd.ToArray());
}
System.Threading.Thread.Sleep(1000);
// Finally, close the process spawned by Explorer.exe
return;
} }
var serviceHost = new ServiceHost(typeof(LocalService), new[] { new Uri(ServiceBaseUri) }); return;
serviceHost.AddServiceEndpoint(typeof(IMainService), new NetNamedPipeBinding(), mainServiceName);
serviceHost.Open();
Console.Write(
"Service started: {0};",
string.Join(", ", serviceHost.Description.Endpoints.Select(s => s.ListenUri.AbsoluteUri).ToArray()));
} }
#endif #endif
// If MatterControl isn't running and valid files were shelled, schedule a StartupAction to open the files after load
var shellFiles = args.Where(f => File.Exists(f) && ApplicationController.ShellFileExtensions.Contains(Path.GetExtension(f).ToLower()));
if (shellFiles.Any()) if (shellFiles.Any())
{ {
ApplicationController.StartupActions.Add(new ApplicationController.StartupAction() ApplicationController.StartupActions.Add(new ApplicationController.StartupAction()
@ -318,8 +311,6 @@ namespace MatterHackers.MatterControl
rootSystemWindow.ShowAsSystemWindow(); rootSystemWindow.ShowAsSystemWindow();
} }
private static readonly object locker = new object();
static void KeepAwake(bool keepAwake) static void KeepAwake(bool keepAwake)
{ {
if (keepAwake) if (keepAwake)
@ -332,51 +323,24 @@ namespace MatterHackers.MatterControl
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
} }
} }
public class LocalService : IMainService
{
public void ShellOpenFile(string[] files)
{
// If at least one argument is an acceptable shell file extension
var itemsToAdd = files.Where(f => File.Exists(f)
&& ApplicationController.ShellFileExtensions.Contains(Path.GetExtension(f).ToLower()));
if (itemsToAdd.Any())
{
lock (locker)
{
// Add each file
foreach (string file in itemsToAdd)
{
ApplicationController.Instance.ShellOpenFile(file);
}
}
}
}
}
public class ServiceProxy : ClientBase<IMainService>
{
public ServiceProxy()
: base(
new ServiceEndpoint(
ContractDescription.GetContract(typeof(IMainService)),
new NetNamedPipeBinding(),
new EndpointAddress($"{ServiceBaseUri}/{mainServiceName}")))
{
}
public void ShellOpenFile(string[] files)
{
Channel.ShellOpenFile(files);
}
}
} }
[ServiceContract]
public interface IMainService [AttributeUsage(AttributeTargets.Assembly)]
public class MainOutputDirectoryAttribute : Attribute
{ {
[OperationContract] public readonly string MainOutputDirectory; // Relative to ProjectRoot.
void ShellOpenFile(string[] files); public readonly string ProjectRoot; // Absolute
public MainOutputDirectoryAttribute(string path, string projectRoot)
{
MainOutputDirectory = path;
ProjectRoot = projectRoot;
}
public static MainOutputDirectoryAttribute GetFromProgramAssembly()
{
return typeof(MatterControl.Program).Assembly.GetCustomAttribute<MainOutputDirectoryAttribute>();
}
} }
} }

View file

@ -34,3 +34,6 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
// https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416
[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]

View file

@ -0,0 +1,9 @@
{
"profiles": {
"MatterControl": {
"commandName": "Project",
"hotReloadEnabled": false,
"nativeDebugging": false
}
}
}

Some files were not shown because too many files have changed in this diff Show more