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
TestResults
Tests/temp
Tests/temp/
Tests/TestData/ExportedGcode/
StaticData/Translations/L10N/
@ -120,3 +121,4 @@ MatterControl.userprefs
# JetBrains Rider user configuration directory
/.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 DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<OutputType>Exe</OutputType>
<ProjectGuid>{3DF4CB3D-9A03-4256-9A81-70523AAD828B}</ProjectGuid>
<OutputPath>bin\Release\</OutputPath>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MatterHackers.MatterControl.Launcher</RootNamespace>
<AssemblyName>Launcher</AssemblyName>
<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>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<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>
<ItemGroup>
<Reference Include="System" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="Launcher.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</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">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
<Company>MatterHackers Inc.</Company>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ReleaseVersion>2.20.12</ReleaseVersion>

View file

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

View file

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

View file

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

View file

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

View file

@ -1,109 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<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')" />
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D6DC2669-7B1F-40FE-89BF-45D4C94473E3}</ProjectGuid>
<TargetFramework>net6.0-windows</TargetFramework>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MatterControl.Winforms</RootNamespace>
<AssemblyName>MatterControl.Winforms</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<BaseOutputPath>$(SolutionDir)bin</BaseOutputPath>
</PropertyGroup>
<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>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<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>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<ProjectReference Include="..\Community.CsharpSqlite\Community.CsharpSqlite.csproj" />
<ProjectReference Include="..\MatterControl.Common\MatterControl.Common.csproj" />
<ProjectReference Include="..\MatterControlLib\MatterControlLib.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\agg\Agg.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\DataConverters2D\DataConverters2D.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\DataConverters3D\DataConverters3D.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\Gui\Gui.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\PlatformWin32\PlatformWin32.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\RenderOpenGl\RenderOpenGl.csproj" />
<ProjectReference Include="..\Submodules\agg-sharp\VectorMath\VectorMath.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Include="DataStorage\SQLiteUnix.cs" />
<Compile Include="DataStorage\SQLiteWin32.cs" />
<Compile Include="InspectForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="InspectForm.Designer.cs">
<DependentUpon>InspectForm.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="WindowsPlatformsFeatures.cs" />
<Compile Include="WinformsSingleWindowProvider.cs" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</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>

View file

@ -34,3 +34,6 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("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.Linq;
using System.Reflection;
using System.Runtime.Loader;
using MatterHackers.Agg;
using MatterHackers.Agg.Image;
using MatterHackers.Agg.Platform;
@ -207,7 +208,9 @@ namespace MatterHackers.MatterControl
{
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)
{

View file

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

View file

@ -34,27 +34,27 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clipper_library", "Submodul
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarchingSquares", "Submodules\agg-sharp\MarchingSquares\MarchingSquares.csproj", "{DF6845CD-64C6-4263-8357-DA8066855739}"
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
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "agg-sharp", "agg-sharp", "{2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}"
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
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FBE6DF29-85A9-4A8B-B739-35BE4CA0A9B7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataConverters3D", "Submodules\agg-sharp\DataConverters3D\DataConverters3D.csproj", "{04667764-DC7B-4B95-AEF6-B4E6C87A54E9}"
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
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
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
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GuiAutomation", "Submodules\agg-sharp\GuiAutomation\GuiAutomation.csproj", "{E9102310-0029-4D8F-B1E9-88FBA6147D45}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataConverters2D", "Submodules\agg-sharp\DataConverters2D\DataConverters2D.csproj", "{94838988-523C-4B11-AD82-8B9B76F23A31}"
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
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{FED00F38-E911-45E1-A788-26980E84C3D6}"
EndProject
@ -72,15 +72,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.OpenGL", "Mat
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Printing", "MatterControl.Printing\MatterControl.Printing.csproj", "{97D5ADE3-C1B4-4B46-8A3E-718A4F7F079F}"
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
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterSliceLib", "Submodules\MatterSlice\MatterSliceLib\MatterSliceLib.csproj", "{7F077116-2923-4A77-87CC-EC3BE7EB8BC3}"
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
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControlLib", "MatterControlLib\MatterControlLib.csproj", "{93BEBFDF-B81A-4344-AB82-0DBF58B234CD}"
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
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.Common", "MatterControl.Common\MatterControl.Common.csproj", "{50505F12-985B-4C5F-8DAB-D5BEA734CD51}"
EndProject
@ -104,6 +104,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MatterControl.SLA", "Matter
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "geometry3Sharp", "Submodules\agg-sharp\geometry3Sharp\geometry3Sharp.csproj", "{3A25C796-F676-4422-8F30-01D4FDB240F1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestInvoker", "Submodules\agg-sharp\Tests\TestInvoker\TestInvoker.csproj", "{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
Submodules\agg-sharp\Typography\Typography.OpenFont\Typography.OpenFont.projitems*{235a071b-8d06-40ae-a5c5-b1ce59715ee9}*SharedItemsImports = 13
@ -113,339 +115,177 @@ Global
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{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|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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.Build.0 = Release|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3A25C796-F676-4422-8F30-01D4FDB240F1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F}.Debug|Any CPU.ActiveCfg = Debug|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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -493,6 +333,7 @@ Global
{7ECC040E-19FC-4E10-B314-412CF7AB2170} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}
{34383A75-1831-4816-A38A-AB06B969D7C7} = {FED00F38-E911-45E1-A788-26980E84C3D6}
{3A25C796-F676-4422-8F30-01D4FDB240F1} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB}
{A1F2F1DA-2B86-461E-9602-EAB2BD899A8F} = {FBE6DF29-85A9-4A8B-B739-35BE4CA0A9B7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {42D74E06-00EA-43D2-A05B-9BEAD4A2C8A0}

View file

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

View file

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

View file

@ -788,7 +788,7 @@ namespace MatterHackers.MatterControl
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 (UserSettings.Instance.get(UserSettingsKey.ShownWelcomeMessage) != "false"
&& ApplicationController.Instance.Workspaces.Count > 0)
@ -802,7 +802,7 @@ namespace MatterHackers.MatterControl
else
{
}
}
}
catch
{

View file

@ -39,6 +39,7 @@ using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
@ -566,10 +567,39 @@ namespace MatterHackers.MatterControl
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)
{
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.
*/
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
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.AutomationTests")]
@ -84,7 +43,7 @@ using Newtonsoft.Json.Linq;
namespace MatterHackers.MatterControl
{
public class RunningTasksConfig
public class RunningTasksConfig
{
public event EventHandler TasksChanged;

View file

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

View file

@ -42,11 +42,8 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class ThemeConfig
public class ThemeConfig3
{
private ImageBuffer restoreNormal;
private ImageBuffer restoreHover;
public int FontSize7 { get; } = 7;
public int FontSize8 { get; } = 8;
@ -73,10 +70,6 @@ namespace MatterHackers.MatterControl
public double MenuGutterWidth => 35 * GuiWidget.DeviceScale;
public double MicroButtonHeight => 20 * GuiWidget.DeviceScale;
private double MicroButtonWidth => 30 * GuiWidget.DeviceScale;
private readonly int defaultScrollBarWidth = 120;
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 ButtonSpacing { get; } = new BorderDouble(right: 3);
@ -210,8 +165,6 @@ namespace MatterHackers.MatterControl
public BorderDouble SeparatorMargin { get; }
public ImageBuffer GeneratingThumbnailIcon { get; private set; }
public class StateColor
{
public Color BackgroundColor { get; set; }
@ -249,12 +202,6 @@ namespace MatterHackers.MatterControl
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 DropListStyle DropList { get; set; } = new DropListStyle();
@ -280,128 +227,12 @@ namespace MatterHackers.MatterControl
public GridColors BedGridColors { get; set; } = new GridColors();
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()
{
this.DisabledColor = new Color(this.LightTextColor, 50);
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)
{
return new Color(this.BorderColor, alpha);
@ -419,215 +250,6 @@ namespace MatterHackers.MatterControl
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)
{
double scrollBarWidth = 10;
@ -678,55 +300,6 @@ namespace MatterHackers.MatterControl
widget.BorderColor = shadedBorder ? this.MinimalShade : this.BorderColor20;
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
@ -771,4 +344,349 @@ namespace MatterHackers.MatterControl
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 MatterHackers.Agg;
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl
{

View file

@ -39,7 +39,7 @@ namespace MatterHackers.MatterControl
{
public class WizardPage : DialogPage
{
public TextButton NextButton { get; }
public ThemedTextButton NextButton { get; }
protected PrinterConfig printer;
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 ThemeConfig theme;
public TextButton NextButton { get; }
public ThemedTextButton NextButton { get; }
private Color tabBaseColor;
private TextWidget xLabel;
@ -60,7 +60,7 @@ namespace MatterHackers.MatterControl
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.theme = theme;

View file

@ -38,7 +38,7 @@ namespace MatterHackers.MatterControl.CustomWidgets
public class InlineEditControl : GuiWidget
{
private TextWidget numberDisplay;
private MHNumberEdit numberEdit;
private ThemedNumberEdit numberEdit;
private Func<double, string> _getDisplayString = (value) => "{0:0.0}".FormatWith(value);
private RunningInterval runningInterval;
private ThemeConfig theme;
@ -78,7 +78,7 @@ namespace MatterHackers.MatterControl.CustomWidgets
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,
VAnchor = VAnchor.Bottom,

View file

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

View file

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

View file

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

View file

@ -203,7 +203,7 @@ namespace MatterHackers.MatterControl.Library
double 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,
VAnchor = VAnchor.Center

View file

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

View file

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

View file

@ -1248,7 +1248,7 @@ namespace MatterHackers.MatterControl.DesignTools
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,
VAnchor = VAnchor.Center

View file

@ -29,11 +29,14 @@ either expressed or implied, of the FreeBSD Project.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using MatterHackers.Agg;
using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
@ -375,6 +378,59 @@ namespace MatterHackers.MatterControl.DesignTools
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)
{
var inputExpression = inExpression;
@ -384,6 +440,8 @@ namespace MatterHackers.MatterControl.DesignTools
inputExpression = printer.Settings.ReplaceSettingsNamesWithValues(inputExpression, false);
}
inputExpression = SearchSiblingProperties(owner, inputExpression);
inputExpression = ReplaceConstantsWithValues(owner, inputExpression);
// 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 MHNumberEdit stepsPerMmX;
private MHNumberEdit stepsPerMmY;
private MHNumberEdit stepsPerMmZ;
private MHNumberEdit stepsPerMmE;
private ThemedNumberEdit stepsPerMmX;
private ThemedNumberEdit stepsPerMmY;
private ThemedNumberEdit stepsPerMmZ;
private ThemedNumberEdit stepsPerMmE;
private MHNumberEdit maxFeedrateMmPerSX;
private MHNumberEdit maxFeedrateMmPerSY;
private MHNumberEdit maxFeedrateMmPerSZ;
private MHNumberEdit maxFeedrateMmPerSE;
private ThemedNumberEdit maxFeedrateMmPerSX;
private ThemedNumberEdit maxFeedrateMmPerSY;
private ThemedNumberEdit maxFeedrateMmPerSZ;
private ThemedNumberEdit maxFeedrateMmPerSE;
private MHNumberEdit maxAccelerationMmPerSSqrdX;
private MHNumberEdit maxAccelerationMmPerSSqrdY;
private MHNumberEdit maxAccelerationMmPerSSqrdZ;
private MHNumberEdit maxAccelerationMmPerSSqrdE;
private ThemedNumberEdit maxAccelerationMmPerSSqrdX;
private ThemedNumberEdit maxAccelerationMmPerSSqrdY;
private ThemedNumberEdit maxAccelerationMmPerSSqrdZ;
private ThemedNumberEdit maxAccelerationMmPerSSqrdE;
private MHNumberEdit accelerationPrintingMoves;
private MHNumberEdit accelerationRetraction;
private MHNumberEdit accelerationTravelMoves;
private ThemedNumberEdit accelerationPrintingMoves;
private ThemedNumberEdit accelerationRetraction;
private ThemedNumberEdit accelerationTravelMoves;
private MHNumberEdit pidP;
private MHNumberEdit pidI;
private MHNumberEdit pidD;
private ThemedNumberEdit pidP;
private ThemedNumberEdit pidI;
private ThemedNumberEdit pidD;
private MHNumberEdit bedPidP;
private MHNumberEdit bedPidI;
private MHNumberEdit bedPidD;
private ThemedNumberEdit bedPidP;
private ThemedNumberEdit bedPidI;
private ThemedNumberEdit bedPidD;
private MHNumberEdit homingOffsetX;
private MHNumberEdit homingOffsetY;
private MHNumberEdit homingOffsetZ;
private ThemedNumberEdit homingOffsetX;
private ThemedNumberEdit homingOffsetY;
private ThemedNumberEdit homingOffsetZ;
private MHNumberEdit minFeedrate;
private MHNumberEdit minTravelFeedrate;
private MHNumberEdit minSegmentTime;
private ThemedNumberEdit minFeedrate;
private ThemedNumberEdit minTravelFeedrate;
private ThemedNumberEdit minSegmentTime;
private MHNumberEdit maxXYJerk;
private MHNumberEdit maxZJerk;
private MHNumberEdit maxEJerk;
private MHNumberEdit maxDeviation;
private ThemedNumberEdit maxXYJerk;
private ThemedNumberEdit maxZJerk;
private ThemedNumberEdit maxEJerk;
private ThemedNumberEdit maxDeviation;
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,
VAnchor = VAnchor.Center,
@ -267,9 +267,9 @@ namespace MatterHackers.MatterControl.EeProm
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,
"", ref field1,
@ -279,11 +279,11 @@ namespace MatterHackers.MatterControl.EeProm
}
private GuiWidget Create3FieldSet(string label,
string field1Label, ref MHNumberEdit field1,
string field2Label, ref MHNumberEdit field2,
string field3Label, ref MHNumberEdit field3)
string field1Label, ref ThemedNumberEdit field1,
string field2Label, ref ThemedNumberEdit field2,
string field3Label, ref ThemedNumberEdit field3)
{
MHNumberEdit none = null;
ThemedNumberEdit none = null;
return Create4FieldSet(label,
field1Label, ref field1,
@ -307,10 +307,10 @@ namespace MatterHackers.MatterControl.EeProm
}
private GuiWidget Create4FieldSet(string label,
string field1Label, ref MHNumberEdit field1,
string field2Label, ref MHNumberEdit field2,
string field3Label, ref MHNumberEdit field3,
string field4Label, ref MHNumberEdit field4)
string field1Label, ref ThemedNumberEdit field1,
string field2Label, ref ThemedNumberEdit field2,
string field3Label, ref ThemedNumberEdit field3,
string field4Label, ref ThemedNumberEdit field4)
{
var row = new FlowLayoutWidget
{

View file

@ -301,7 +301,7 @@ namespace MatterHackers.MatterControl.EeProm
CreateSpacer(row);
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,
TabIndex = currentTabIndex++,

View file

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

View file

@ -444,7 +444,7 @@ Support and tutorials:" + articles;
public class CollectPrintDetailsPage : DialogPage
{
private readonly MHTextEditWidget textEditWidget;
private readonly ThemedTextEditWidget textEditWidget;
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
var emptyText = "What went wrong?".Localize();
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",
HAnchor = HAnchor.Stretch,

View file

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

View file

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

View file

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

View file

@ -58,9 +58,9 @@ namespace MatterHackers.MatterControl.Library.Widgets
};
contentRow.AddChild(pathRow);
TextButton importButton = null;
ThemedTextButton importButton = null;
var textEditWidget = new MHTextEditWidget("", theme)
var textEditWidget = new ThemedTextEditWidget("", theme)
{
HAnchor = HAnchor.Stretch,
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;
namespace MatterHackers.MatterControl.Library.Widgets

View file

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

View file

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

View file

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

View file

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

View file

@ -39,7 +39,7 @@ namespace MatterHackers.MatterControl
{
public class MarkdownEditPage : DialogPage
{
private MHTextEditWidget editWidget;
private ThemedTextEditWidget editWidget;
private MarkdownWidget markdownWidget;
public MarkdownEditPage(UIField uiField)
@ -66,7 +66,7 @@ namespace MatterHackers.MatterControl
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,
VAnchor = VAnchor.Stretch,

View file

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

View file

@ -60,7 +60,7 @@ namespace MatterHackers.MatterControl
contentRow.AddChild(fileNameHeader);
// 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,
Margin = new BorderDouble(5),

View file

@ -47,8 +47,8 @@ namespace MatterHackers.MatterControl.DesignTools
public UndoBuffer UndoBuffer { get; }
private ThemeConfig theme;
private MHTextEditWidget editSelectedName;
public MHTextEditWidget EditSelectedExpression { get; private set; }
private ThemedTextEditWidget editSelectedName;
public ThemedTextEditWidget EditSelectedExpression { get; private set; }
private GridWidget gridWidget;
public SheetEditorWidget(SheetData sheetData, SheetObject3D sheetObject, UndoBuffer undoBuffer, ThemeConfig theme)
@ -68,13 +68,13 @@ namespace MatterHackers.MatterControl.DesignTools
VAnchor = VAnchor.Fit,
});
editSelectedName = new MHTextEditWidget("", theme, cellEditNameWidth, messageWhenEmptyAndNotSelected: "Name".Localize())
editSelectedName = new ThemedTextEditWidget("", theme, cellEditNameWidth, messageWhenEmptyAndNotSelected: "Name".Localize())
{
HAnchor = HAnchor.Absolute,
};
editSelectedName.ActualTextEditWidget.EditComplete += SelectedName_EditComplete;
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,
};

View file

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

View file

@ -402,6 +402,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
mouseDownObject3DControl.OnMouseDown(new Mouse3DEventArgs(mouseEvent, ray, info));
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
{

View file

@ -21,6 +21,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// 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.Collections.Generic;
using System.Globalization;
@ -410,8 +413,11 @@ ok
if (!shuttingDown)
{
shuttingDown = true;
#if USE_SEMAPHORE_FOR_RECEIVE_QUEUE
receiveResetEvent.Release();
#endif
HeatedBed.Stop();
HeatedBed.Stop();
foreach (var extruder in Extruders)
{
extruder.Stop();
@ -739,7 +745,12 @@ ok
private readonly object receiveLock = new object();
private readonly Queue<string> receiveQueue = new Queue<string>();
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
private AutoResetEvent receiveResetEvent = new AutoResetEvent(false);
#else
private SemaphoreSlim receiveResetEvent = new(0);
#endif
private readonly object sendLock = new object();
private readonly Queue<string> sendQueue = new Queue<string>(new string[] { "Emulator v0.1\n" });
@ -788,7 +799,11 @@ ok
{
this.IsOpen = true;
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
receiveResetEvent = new AutoResetEvent(false);
#else
receiveResetEvent = new(0);
#endif
this.ReadTimeout = 500;
this.WriteTimeout = 500;
@ -814,6 +829,7 @@ ok
{
Thread.CurrentThread.Name = "EmulatorPipeline";
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
while (!shuttingDown || 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
#if !USE_SEMAPHORE_FOR_RECEIVE_QUEUE
receiveResetEvent.Set();
#else
receiveResetEvent.Release();
#endif
}
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
{
private MHNumberEdit feedRateValue;
private MHNumberEdit extrusionValue;
private ThemedNumberEdit feedRateValue;
private ThemedNumberEdit extrusionValue;
private SolidSlider feedRateRatioSlider;
private SolidSlider extrusionRatioSlider;
@ -55,7 +55,7 @@ namespace MatterHackers.MatterControl.PrinterControls
private PrinterConfig printer;
private AdjustmentControls(PrinterConfig printer, ThemeConfig theme)
: base (FlowDirection.TopToBottom)
: base(FlowDirection.TopToBottom)
{
double sliderWidth = 300 * GuiWidget.DeviceScale;
double sliderThumbWidth = 10 * GuiWidget.DeviceScale;
@ -99,7 +99,7 @@ namespace MatterHackers.MatterControl.PrinterControls
};
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",
SelectAllOnFocus = true,
@ -157,7 +157,7 @@ namespace MatterHackers.MatterControl.PrinterControls
};
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",
SelectAllOnFocus = true,

View file

@ -38,7 +38,7 @@ namespace MatterHackers.MatterControl.PrinterControls
{
public class FanControlsRow : SettingsRow
{
private MHNumberEdit fanSpeedDisplay;
private ThemedNumberEdit fanSpeedDisplay;
private RoundedToggleSwitch toggleSwitch;
private PrinterConfig printer;
@ -57,7 +57,7 @@ namespace MatterHackers.MatterControl.PrinterControls
this.AddChild(container);
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,
VAnchor = VAnchor.Center | VAnchor.Fit,

View file

@ -117,7 +117,7 @@ namespace MatterHackers.MatterControl
int linkCompatibleRow = row;
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}"
};

View file

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

View file

@ -45,8 +45,8 @@ namespace MatterHackers.MatterControl
public MacroDetailPage(GCodeMacro gcodeMacro, PrinterSettings printerSettings)
{
// Form validation fields
MHTextEditWidget macroNameInput;
MHTextEditWidget macroCommandInput;
ThemedTextEditWidget macroNameInput;
ThemedTextEditWidget macroCommandInput;
WrappedTextWidget macroCommandError;
WrappedTextWidget macroNameError;
@ -64,7 +64,7 @@ namespace MatterHackers.MatterControl
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
});
@ -82,7 +82,7 @@ namespace MatterHackers.MatterControl
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,
VAnchor = VAnchor.Stretch

View file

@ -105,7 +105,7 @@ namespace MatterHackers.MatterControl
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
};

View file

@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections
private TextWidget printerBaudRateError;
private GuiWidget baudRateWidget;
private RadioButton otherBaudRateRadioButton;
private MHTextEditWidget otherBaudRateInput;
private ThemedTextEditWidget otherBaudRateInput;
private GuiWidget nextButton;
private GuiWidget printerBaudRateHelpLink;
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,
//flag the 'other' option if it is not and prefill the rate.
otherBaudRateInput = new MHTextEditWidget("", theme);
otherBaudRateInput = new ThemedTextEditWidget("", theme);
otherBaudRateInput.Visible = false;
otherBaudRateInput.HAnchor = HAnchor.Stretch;

View file

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

View file

@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl
public class TerminalWidget : FlowLayoutWidget, ICloseableTab
{
private CheckBox autoUppercase;
private MHTextEditWidget manualCommandTextEdit;
private ThemedTextEditWidget manualCommandTextEdit;
private TextScrollWidget textScrollWidget;
private PrinterConfig printer;
@ -181,7 +181,7 @@ namespace MatterHackers.MatterControl
};
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),
HAnchor = HAnchor.Stretch,

View file

@ -412,7 +412,7 @@ namespace MatterHackers.MatterControl
{
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,
Margin = new BorderDouble(5),

View file

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

View file

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

View file

@ -36,7 +36,7 @@ namespace MatterHackers.MatterControl
{
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; }
@ -56,7 +56,7 @@ namespace MatterHackers.MatterControl
});
// 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.HAnchor = HAnchor.Stretch;
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.UI;
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.
*/
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class BoundsField : Vector4Field

View file

@ -34,7 +34,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class CharField : UIField
{
protected MHTextEditWidget textEditWidget;
protected ThemedTextEditWidget textEditWidget;
private ThemeConfig theme;
public CharField(ThemeConfig theme)
@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
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.
*/
using MatterHackers.Agg.UI;
using System;
namespace MatterHackers.MatterControl.SlicerConfiguration

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class ExpressionField : UIField
{
protected MHTextEditWidget textEditWidget;
protected ThemedTextEditWidget textEditWidget;
private ThemeConfig theme;
public ExpressionField(ThemeConfig theme)
@ -61,7 +61,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
SelectAllOnFocus = true,

View file

@ -110,6 +110,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
base.Initialize(tabIndex);
}
private static double StripZeroSign(double x)
{
return x == 0 ? 0 : x;
}
protected override string ConvertValue(string newValue)
{
var offsets = newValue?.Split(',');
@ -126,7 +131,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
// Import deprecated z_offset data if missing
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
{

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.
*/
using MatterHackers.Agg.UI;
using System;
namespace MatterHackers.MatterControl.SlicerConfiguration

View file

@ -34,7 +34,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class MultilineStringField : UIField
{
private MHTextEditWidget editWidget;
private ThemedTextEditWidget editWidget;
private ThemeConfig theme;
public MultilineStringField(ThemeConfig theme)
@ -44,7 +44,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
VAnchor = VAnchor.Fit,

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public abstract class NumberField : UIField
{
protected MHNumberEdit numberEdit;
protected ThemedNumberEdit numberEdit;
private readonly ThemeConfig theme;
protected bool AllowNegatives { get; set; } = true;
@ -47,7 +47,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
SelectAllOnFocus = true,

View file

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

View file

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

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class TextField : UIField
{
protected MHTextEditWidget textEditWidget;
protected ThemedTextEditWidget textEditWidget;
private ThemeConfig theme;
public TextField(ThemeConfig theme)
@ -55,7 +55,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
SelectAllOnFocus = true,

View file

@ -82,12 +82,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public void ClearUndoHistory()
{
foreach (var widget in this.Content.DescendantsAndSelf<MHTextEditWidget>())
foreach (var widget in this.Content.DescendantsAndSelf<ThemedTextEditWidget>())
{
widget.ActualTextEditWidget.InternalTextEditWidget.ClearUndoHistory();
}
foreach (var widget in this.Content.DescendantsAndSelf<MHNumberEdit>())
foreach (var widget in this.Content.DescendantsAndSelf<ThemedNumberEdit>())
{
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
{
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);
private MHNumberEdit yEditWidget;
private ThemedNumberEdit yEditWidget;
private MHNumberEdit xEditWidget;
private ThemedNumberEdit xEditWidget;
private ThemeConfig theme;
public Vector2Field(ThemeConfig theme)
@ -71,7 +71,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex,
@ -89,7 +89,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex + 1,

View file

@ -37,9 +37,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public static readonly int VectorXYZEditWidth = (int)(60 * GuiWidget.DeviceScale + .5);
private MHNumberEdit xEditWidget;
private MHNumberEdit yEditWidget;
private MHNumberEdit zEditWidget;
private ThemedNumberEdit xEditWidget;
private ThemedNumberEdit yEditWidget;
private ThemedNumberEdit zEditWidget;
private ThemeConfig theme;
public Vector3Field(ThemeConfig theme)
@ -71,7 +71,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex,
@ -93,7 +93,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex + 1,
@ -115,7 +115,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex + 1,

View file

@ -37,10 +37,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public static int VectorXYZWEditWidth = (int)(45 * GuiWidget.DeviceScale + .5);
private MHNumberEdit xEditWidget;
private MHNumberEdit yEditWidget;
private MHNumberEdit zEditWidget;
private MHNumberEdit wEditWidget;
private ThemedNumberEdit xEditWidget;
private ThemedNumberEdit yEditWidget;
private ThemedNumberEdit zEditWidget;
private ThemedNumberEdit wEditWidget;
private ThemeConfig theme;
@ -76,7 +76,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex,
@ -98,7 +98,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex + 1,
@ -120,7 +120,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex + 1,
@ -142,7 +142,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
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,
TabIndex = tabIndex + 1,

View file

@ -122,13 +122,13 @@ namespace MatterHackers.MatterControl.FieldValidation
{
public delegate ValidationStatus ValidationHandler(string valueToValidate);
public MHTextEditWidget FieldEditWidget { get; set; }
public ThemedTextEditWidget FieldEditWidget { get; set; }
public WrappedTextWidget FieldErrorMessageWidget { 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.FieldErrorMessageWidget = errorMessageWidget;

View file

@ -57,7 +57,14 @@ namespace MatterHackers.MatterControl
get
{
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 MatterHackers.Agg.UI;
using MatterHackers.MatterControl;
namespace Markdig.Renderers.Agg

View file

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

View file

@ -23,6 +23,10 @@ namespace MatterHackers.MatterControl.Plugins
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(
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
// to show the file (at least on Windows).
Process.Start(pathAndFileToSaveTo);
ApplicationController.ProcessStart(pathAndFileToSaveTo);
}
catch (Exception)
{

View file

@ -1,58 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9}</ProjectGuid>
<TargetFramework>net6.0</TargetFramework>
<OutputType>Exe</OutputType>
<OutputPath>bin\Release\</OutputPath>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MatterHackers.InfInstaller</RootNamespace>
<AssemblyName>InfInstaller</AssemblyName>
<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>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<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>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Xml" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.330701">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Compile Include="InfInstaller.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</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.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Threading;
using MatterHackers.Agg;
using MatterHackers.Agg.Platform;
@ -64,17 +63,13 @@ namespace MatterHackers.MatterControl
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
private static EventWaitHandle waitHandle;
private const int RaygunMaxNotifications = 15;
private static int raygunNotificationCount = 0;
private static RaygunClient _raygunClient;
private static string mainServiceName = "shell";
private const string ServiceBaseUri = "net.pipe://localhost/mattercontrol";
[DllImport("Shcore.dll")]
static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS);
@ -141,6 +136,24 @@ namespace MatterHackers.MatterControl
}
#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
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
@ -167,42 +180,22 @@ namespace MatterHackers.MatterControl
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 (AggContext.OperatingSystem == OSType.Windows)
if (!LocalService.TryStartServer())
{
waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, "MatterControl#Startup", out bool created);
if (!created)
if (shellFiles.Any())
{
// If an instance is already running, create a service proxy and execute ShellOpenFile
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;
LocalService.TrySendToServer(shellFiles);
}
var serviceHost = new ServiceHost(typeof(LocalService), new[] { new Uri(ServiceBaseUri) });
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()));
return;
}
#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())
{
ApplicationController.StartupActions.Add(new ApplicationController.StartupAction()
@ -318,8 +311,6 @@ namespace MatterHackers.MatterControl
rootSystemWindow.ShowAsSystemWindow();
}
private static readonly object locker = new object();
static void KeepAwake(bool keepAwake)
{
if (keepAwake)
@ -332,51 +323,24 @@ namespace MatterHackers.MatterControl
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]
void ShellOpenFile(string[] files);
public readonly string MainOutputDirectory; // Relative to ProjectRoot.
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.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