web UI
This commit is contained in:
@@ -2,7 +2,8 @@
|
|||||||
"permissions": {
|
"permissions": {
|
||||||
"allow": [
|
"allow": [
|
||||||
"Bash(find:*)",
|
"Bash(find:*)",
|
||||||
"Bash(ls:*)"
|
"Bash(ls:*)",
|
||||||
|
"Bash(dotnet sln:*)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -484,3 +484,4 @@ $RECYCLE.BIN/
|
|||||||
*.swp
|
*.swp
|
||||||
|
|
||||||
*.exe
|
*.exe
|
||||||
|
/Data
|
||||||
|
|||||||
18
VisionBuilder.UI.Blazor.Uno/Components/App.razor
Normal file
18
VisionBuilder.UI.Blazor.Uno/Components/App.razor
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<base href="/" />
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
|
||||||
|
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
|
||||||
|
<link href="_content/VisionBuilder.UI.Blazor/css/visionbuilder.css" rel="stylesheet" />
|
||||||
|
<link href="css/app.css" rel="stylesheet" />
|
||||||
|
<HeadOutlet @rendermode="InteractiveServer" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<Routes @rendermode="InteractiveServer" />
|
||||||
|
<script src="_framework/blazor.web.js"></script>
|
||||||
|
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
@inherits LayoutComponentBase
|
||||||
|
@using MudBlazor
|
||||||
|
@using VisionBuilder.UI.Common.ViewModel
|
||||||
|
@using VisionBuilder.UI.Common.Services
|
||||||
|
@using VisionBuilder.UI.Common
|
||||||
|
@inject MainWindowVM MainWindowVm
|
||||||
|
@inject IPasswordInputService PasswordInputService
|
||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
<MudThemeProvider Theme="@_currentTheme" />
|
||||||
|
<MudPopoverProvider />
|
||||||
|
<MudDialogProvider />
|
||||||
|
<MudSnackbarProvider />
|
||||||
|
|
||||||
|
<div class="app-root @(_testMode ? "test-mode" : "")">
|
||||||
|
<div class="app-content">
|
||||||
|
@Body
|
||||||
|
</div>
|
||||||
|
<div class="app-divider"></div>
|
||||||
|
<div class="app-toolbar">
|
||||||
|
<div class="toolbar-buttons">
|
||||||
|
@if (_showTestModeButton)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Outlined" Color="Color.Primary" Class="toolbar-btn" OnClick="ToggleTestMode">Test Mode</MudButton>
|
||||||
|
}
|
||||||
|
<MudButton Variant="Variant.Outlined" Color="Color.Primary" Class="toolbar-btn" OnClick="OnSettings">Settings</MudButton>
|
||||||
|
</div>
|
||||||
|
<span class="toolbar-version">@_version</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using System.Reflection;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using MudBlazor;
|
||||||
|
using VisionBuilder.UI.Blazor.Services;
|
||||||
|
using VisionBuilder.UI.Common;
|
||||||
|
using VisionBuilder.UI.Common.Services;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel.Interfaces.UI;
|
||||||
|
using Ninject;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Uno.Components.Layout;
|
||||||
|
|
||||||
|
public partial class MainLayout : IDisposable
|
||||||
|
{
|
||||||
|
[Microsoft.AspNetCore.Components.Inject] private IDialogService DialogService { get; set; } = null!;
|
||||||
|
[Microsoft.AspNetCore.Components.Inject] private IKernel Kernel { get; set; } = null!;
|
||||||
|
|
||||||
|
private bool _testMode;
|
||||||
|
private bool _showTestModeButton;
|
||||||
|
private string _version = "";
|
||||||
|
|
||||||
|
private readonly MudTheme _inspectronTheme = new()
|
||||||
|
{
|
||||||
|
PaletteLight = new PaletteLight
|
||||||
|
{
|
||||||
|
Primary = "#d32f2f",
|
||||||
|
AppbarBackground = "#37474f"
|
||||||
|
},
|
||||||
|
LayoutProperties = new LayoutProperties
|
||||||
|
{
|
||||||
|
DefaultBorderRadius = "0px"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private readonly MudTheme _testModeTheme = new()
|
||||||
|
{
|
||||||
|
PaletteLight = new PaletteLight
|
||||||
|
{
|
||||||
|
Primary = "#2e7d32",
|
||||||
|
AppbarBackground = "#2e7d32"
|
||||||
|
},
|
||||||
|
LayoutProperties = new LayoutProperties
|
||||||
|
{
|
||||||
|
DefaultBorderRadius = "0px"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private MudTheme _currentTheme = null!;
|
||||||
|
|
||||||
|
protected override void OnInitialized()
|
||||||
|
{
|
||||||
|
_currentTheme = _inspectronTheme;
|
||||||
|
_version = $"v{Assembly.GetEntryAssembly()?.GetName().Version?.ToString(3) ?? "0.0.0"}";
|
||||||
|
|
||||||
|
var uiConfig = Kernel.Get<UIConfiguration>();
|
||||||
|
_showTestModeButton = uiConfig.ShowTestModeButton;
|
||||||
|
|
||||||
|
MainWindowVm.PropertyChanged += OnPropertyChanged;
|
||||||
|
|
||||||
|
// Wire up dialog services
|
||||||
|
if (Kernel.Get<IRecipeSelectionDialogService>() is BlazorRecipeSelectionDialogService recipeService)
|
||||||
|
recipeService.SetDialogService(DialogService);
|
||||||
|
if (Kernel.Get<IImagePreviewService>() is BlazorImagePreviewService imageService)
|
||||||
|
imageService.SetDialogService(DialogService);
|
||||||
|
if (Kernel.Get<IPasswordInputService>() is BlazorPasswordInputService passwordService)
|
||||||
|
passwordService.SetDialogService(DialogService);
|
||||||
|
if (Kernel.Get<ISettingsService>() is BlazorSettingsService settingsService)
|
||||||
|
settingsService.SetDialogService(DialogService);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.PropertyName == nameof(MainWindowVM.TestMode))
|
||||||
|
{
|
||||||
|
_testMode = MainWindowVm.TestMode;
|
||||||
|
_currentTheme = _testMode ? _testModeTheme : _inspectronTheme;
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleTestMode()
|
||||||
|
{
|
||||||
|
MainWindowVm.ToggleTestModeCommand.Execute(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnSettings()
|
||||||
|
{
|
||||||
|
var uiConfig = Kernel.Get<UIConfiguration>();
|
||||||
|
if (uiConfig.ProtectSettingsWithPassword)
|
||||||
|
{
|
||||||
|
var password = await PasswordInputService.GetPasswordAsync();
|
||||||
|
if (password != uiConfig.AdminPassword)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MainWindowVm.SettingsCommand.Execute(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
MainWindowVm.PropertyChanged -= OnPropertyChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
7
VisionBuilder.UI.Blazor.Uno/Components/Routes.razor
Normal file
7
VisionBuilder.UI.Blazor.Uno/Components/Routes.razor
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<Router AppAssembly="typeof(Program).Assembly"
|
||||||
|
AdditionalAssemblies="new[] { typeof(VisionBuilder.UI.Blazor.Components.SingleCameraControl).Assembly }">
|
||||||
|
<Found Context="routeData">
|
||||||
|
<RouteView RouteData="@routeData" DefaultLayout="typeof(Layout.MainLayout)" />
|
||||||
|
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
|
||||||
|
</Found>
|
||||||
|
</Router>
|
||||||
9
VisionBuilder.UI.Blazor.Uno/Pages/Home.razor
Normal file
9
VisionBuilder.UI.Blazor.Uno/Pages/Home.razor
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
@page "/"
|
||||||
|
@using VisionBuilder.UI.Blazor.Components
|
||||||
|
@using VisionBuilder.UI.Common
|
||||||
|
@using VisionBuilder.UI.Common.ViewModel
|
||||||
|
@inject MainWindowVM MainWindowVm
|
||||||
|
|
||||||
|
<PageTitle>VisionBuilder</PageTitle>
|
||||||
|
|
||||||
|
<SingleCameraControl ViewModel="@MainWindowVm.SingleCameraVms[0]" />
|
||||||
104
VisionBuilder.UI.Blazor.Uno/Program.cs
Normal file
104
VisionBuilder.UI.Blazor.Uno/Program.cs
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
using Inspectron.Settings;
|
||||||
|
using Lindt.Colorballs.Duo.Utils;
|
||||||
|
using MudBlazor.Services;
|
||||||
|
using Ninject;
|
||||||
|
using Ninject.Extensions.ChildKernel;
|
||||||
|
using VisionBuilder.UI.Blazor;
|
||||||
|
using VisionBuilder.UI.Common;
|
||||||
|
using VisionBuilder.UI.Common.Plugins;
|
||||||
|
using VisionBuilder.UI.Common.Processing;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
using VisionBuilder.UI.Console;
|
||||||
|
using VisionBuilder.UI.IOCommander;
|
||||||
|
using VisionBuilder.UI.Recipes.HawkeyeRecipe;
|
||||||
|
using VisionBuilder.UI.Ringbuffer;
|
||||||
|
using VisionBuilder.UI.Statistics;
|
||||||
|
|
||||||
|
const string CAMERA1 = "Camera 1";
|
||||||
|
|
||||||
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
builder.Services.AddRazorComponents()
|
||||||
|
.AddInteractiveServerComponents();
|
||||||
|
builder.Services.AddMudServices();
|
||||||
|
|
||||||
|
// Parse command line args
|
||||||
|
CommandLineParser commandLineParser = new CommandLineParser(args);
|
||||||
|
|
||||||
|
// Setup settings
|
||||||
|
InspectronSettings settings = new InspectronSettings("..\\Data\\Config");
|
||||||
|
|
||||||
|
var mainKernel = VisionBuilder.UI.Common.VisionBuilder.CreateMainKernel(settings);
|
||||||
|
|
||||||
|
var profile = commandLineParser.GetStringArgument("profile", 'p');
|
||||||
|
mainKernel.UsePlugins(profile);
|
||||||
|
|
||||||
|
mainKernel
|
||||||
|
.UseConsole()
|
||||||
|
.UseIOCommander([CAMERA1])
|
||||||
|
.UseBlazorServices()
|
||||||
|
.RegisterGlobalPlugins();
|
||||||
|
|
||||||
|
mainKernel.Get<ILoadingService>().StartLoading("Camera initialization");
|
||||||
|
|
||||||
|
// CAMERA 1 //
|
||||||
|
ChildKernel kernelCamera1 = new ChildKernel(mainKernel);
|
||||||
|
|
||||||
|
kernelCamera1
|
||||||
|
.RegisterCamera(CAMERA1)
|
||||||
|
.UseStatistics(CAMERA1)
|
||||||
|
.UseRingbuffer(CAMERA1)
|
||||||
|
.UseHawkeyeRecipes(CAMERA1)
|
||||||
|
.UseCameraIOCommander(CAMERA1)
|
||||||
|
.RegisterCameraPlugins(CAMERA1);
|
||||||
|
|
||||||
|
// LOAD SETTINGS //
|
||||||
|
mainKernel.RegisterSettings();
|
||||||
|
kernelCamera1.RegisterSettings();
|
||||||
|
settings.LoadSettings();
|
||||||
|
|
||||||
|
// Create camera and bind it (must be after settings are loaded)
|
||||||
|
kernelCamera1.UseCamera();
|
||||||
|
|
||||||
|
// Initialize modules
|
||||||
|
mainKernel.InitializeModules();
|
||||||
|
kernelCamera1.InitializeModules();
|
||||||
|
|
||||||
|
mainKernel.Get<ILoadingService>().StopLoading("Camera initialization");
|
||||||
|
|
||||||
|
var mainWindowVm = mainKernel.Get<MainWindowVM>();
|
||||||
|
mainWindowVm.SingleCameraVms =
|
||||||
|
[
|
||||||
|
kernelCamera1.Get<SingleCameraVM>()
|
||||||
|
];
|
||||||
|
|
||||||
|
settings.LoadSettings();
|
||||||
|
|
||||||
|
// Bridge Ninject → ASP.NET Core DI
|
||||||
|
builder.Services.AddSingleton(mainKernel);
|
||||||
|
builder.Services.AddSingleton(mainWindowVm);
|
||||||
|
builder.Services.AddSingleton(kernelCamera1.Get<SingleCameraVM>());
|
||||||
|
builder.Services.AddSingleton(mainKernel.Get<VisionBuilder.UI.Common.Services.IPasswordInputService>());
|
||||||
|
|
||||||
|
var app = builder.Build();
|
||||||
|
|
||||||
|
if (!app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseExceptionHandler("/Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseStaticFiles();
|
||||||
|
app.UseAntiforgery();
|
||||||
|
|
||||||
|
app.MapRazorComponents<VisionBuilder.UI.Blazor.Uno.Components.App>()
|
||||||
|
.AddInteractiveServerRenderMode()
|
||||||
|
.AddAdditionalAssemblies(typeof(VisionBuilder.UI.Blazor.Components.SingleCameraControl).Assembly);
|
||||||
|
|
||||||
|
mainWindowVm.OnProgramStarted();
|
||||||
|
|
||||||
|
app.Lifetime.ApplicationStopping.Register(() =>
|
||||||
|
{
|
||||||
|
mainWindowVm.OnProgramClosed();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.Run();
|
||||||
12
VisionBuilder.UI.Blazor.Uno/Properties/launchSettings.json
Normal file
12
VisionBuilder.UI.Blazor.Uno/Properties/launchSettings.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"profiles": {
|
||||||
|
"VisionBuilder.UI.Blazor.Uno": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"applicationUrl": "http://localhost:5000",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Data\**" />
|
||||||
|
<Content Remove="Data\**" />
|
||||||
|
<EmbeddedResource Remove="Data\**" />
|
||||||
|
<None Remove="Data\**" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MudBlazor" Version="8.0.0" />
|
||||||
|
<PackageReference Include="Ninject.Extensions.ChildKernel" Version="3.3.0" />
|
||||||
|
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.6.0.20220608" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\framework\Inspectron.Settings\Inspectron.Settings.csproj" />
|
||||||
|
<ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Emulation\Hawkeye.VisionBuilder.UI.Sources.Emulation.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Camera\VisionBuilder.UI.Camera.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Console\VisionBuilder.UI.Console.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.IOCommander\VisionBuilder.UI.IOCommander.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Recipes.HawkeyeRecipe\VisionBuilder.UI.Recipes.HawkeyeRecipe.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Ringbuffer\VisionBuilder.UI.Ringbuffer.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Statistics\VisionBuilder.UI.Statistics.csproj" />
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Blazor\VisionBuilder.UI.Blazor.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
10
VisionBuilder.UI.Blazor.Uno/_Imports.razor
Normal file
10
VisionBuilder.UI.Blazor.Uno/_Imports.razor
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
@using System.Net.Http
|
||||||
|
@using Microsoft.AspNetCore.Components.Forms
|
||||||
|
@using Microsoft.AspNetCore.Components.Routing
|
||||||
|
@using Microsoft.AspNetCore.Components.Web
|
||||||
|
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
||||||
|
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||||
|
@using Microsoft.JSInterop
|
||||||
|
@using MudBlazor
|
||||||
|
@using VisionBuilder.UI.Blazor.Uno
|
||||||
|
@using VisionBuilder.UI.Blazor.Uno.Components
|
||||||
8
VisionBuilder.UI.Blazor.Uno/appsettings.Development.json
Normal file
8
VisionBuilder.UI.Blazor.Uno/appsettings.Development.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
VisionBuilder.UI.Blazor.Uno/appsettings.json
Normal file
9
VisionBuilder.UI.Blazor.Uno/appsettings.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
||||||
65
VisionBuilder.UI.Blazor.Uno/wwwroot/css/app.css
Normal file
65
VisionBuilder.UI.Blazor.Uno/wwwroot/css/app.css
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Main app layout */
|
||||||
|
.app-root {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100vh;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-content {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-divider {
|
||||||
|
height: 1px;
|
||||||
|
background-color: #37474f;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-toolbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 8px 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
position: relative;
|
||||||
|
min-height: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar-buttons {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar-btn {
|
||||||
|
min-width: 140px !important;
|
||||||
|
height: 48px !important;
|
||||||
|
font-weight: 600 !important;
|
||||||
|
font-size: 0.85rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar-version {
|
||||||
|
position: absolute;
|
||||||
|
right: 16px;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test mode: green toolbar tint */
|
||||||
|
.app-root.test-mode .app-toolbar {
|
||||||
|
background-color: #e8f5e9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-root.test-mode .app-divider {
|
||||||
|
background-color: #2e7d32;
|
||||||
|
}
|
||||||
14
VisionBuilder.UI.Blazor/BlazorUISettings.cs
Normal file
14
VisionBuilder.UI.Blazor/BlazorUISettings.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using Inspectron.Settings;
|
||||||
|
using VisionBuilder.UI.Common;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor;
|
||||||
|
|
||||||
|
public class BlazorUISettings : ISettings
|
||||||
|
{
|
||||||
|
public bool FullScreen { get; set; } = false;
|
||||||
|
|
||||||
|
public void RegisterSettings(InspectronSettings settings)
|
||||||
|
{
|
||||||
|
settings.RegisterSimple(this, () => this.FullScreen, "System", nameof(FullScreen));
|
||||||
|
}
|
||||||
|
}
|
||||||
17
VisionBuilder.UI.Blazor/Components/ErrorPreview.razor
Normal file
17
VisionBuilder.UI.Blazor/Components/ErrorPreview.razor
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
<div class="error-preview-panel">
|
||||||
|
@foreach (var error in _errors)
|
||||||
|
{
|
||||||
|
<div class="error-card" @onclick="() => OnErrorClicked(error)">
|
||||||
|
@{
|
||||||
|
var uri = error.ImageAnalysis?.ToBase64DataUri(50);
|
||||||
|
}
|
||||||
|
@if (!string.IsNullOrEmpty(uri))
|
||||||
|
{
|
||||||
|
<img src="@uri" alt="Error" class="error-thumbnail" />
|
||||||
|
}
|
||||||
|
<span class="error-title">@error.Title</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
59
VisionBuilder.UI.Blazor/Components/ErrorPreview.razor.cs
Normal file
59
VisionBuilder.UI.Blazor/Components/ErrorPreview.razor.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel.Classes;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Components;
|
||||||
|
|
||||||
|
public partial class ErrorPreview : ComponentBase, IDisposable
|
||||||
|
{
|
||||||
|
[Parameter] public ErrorsVM? ViewModel { get; set; }
|
||||||
|
|
||||||
|
private List<ErrorData> _errors = new();
|
||||||
|
private ErrorsVM? _subscribedVm;
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != ViewModel)
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
Subscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Subscribe()
|
||||||
|
{
|
||||||
|
_subscribedVm = ViewModel;
|
||||||
|
if (ViewModel != null)
|
||||||
|
{
|
||||||
|
ViewModel.Errors.CollectionChanged += OnCollectionChanged;
|
||||||
|
_errors = new List<ErrorData>(ViewModel.Errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Unsubscribe()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != null)
|
||||||
|
_subscribedVm.Errors.CollectionChanged -= OnCollectionChanged;
|
||||||
|
_subscribedVm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (ViewModel != null)
|
||||||
|
_errors = new List<ErrorData>(ViewModel.Errors);
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnErrorClicked(ErrorData errorData)
|
||||||
|
{
|
||||||
|
if (ViewModel != null)
|
||||||
|
await ViewModel.ShowImage(errorData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
12
VisionBuilder.UI.Blazor/Components/PreviewWindow.razor
Normal file
12
VisionBuilder.UI.Blazor/Components/PreviewWindow.razor
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
<div class="preview-window @(_isError ? "preview-error" : "")">
|
||||||
|
@if (!string.IsNullOrEmpty(_dataUri))
|
||||||
|
{
|
||||||
|
<img src="@_dataUri" alt="Preview" class="preview-image" />
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="preview-placeholder">No image</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
94
VisionBuilder.UI.Blazor/Components/PreviewWindow.razor.cs
Normal file
94
VisionBuilder.UI.Blazor/Components/PreviewWindow.razor.cs
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using OpenCvSharp;
|
||||||
|
using VisionBuilder.UI.Blazor.Helpers;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Components;
|
||||||
|
|
||||||
|
public partial class PreviewWindow : ComponentBase, IDisposable
|
||||||
|
{
|
||||||
|
[Parameter] public PreviewVM? ViewModel { get; set; }
|
||||||
|
|
||||||
|
private string _dataUri = string.Empty;
|
||||||
|
private bool _isError;
|
||||||
|
private DateTime _lastRenderTime = DateTime.MinValue;
|
||||||
|
private Timer? _pendingTimer;
|
||||||
|
private PreviewVM? _subscribedVm;
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != ViewModel)
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
Subscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Subscribe()
|
||||||
|
{
|
||||||
|
_subscribedVm = ViewModel;
|
||||||
|
if (ViewModel != null)
|
||||||
|
ViewModel.PropertyChanged += OnPropertyChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Unsubscribe()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != null)
|
||||||
|
_subscribedVm.PropertyChanged -= OnPropertyChanged;
|
||||||
|
_subscribedVm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.PropertyName != nameof(PreviewVM.ImagePreview) && e.PropertyName != nameof(PreviewVM.IsError))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var now = DateTime.UtcNow;
|
||||||
|
var elapsed = (now - _lastRenderTime).TotalMilliseconds;
|
||||||
|
|
||||||
|
if (elapsed < 100)
|
||||||
|
{
|
||||||
|
// Schedule a render for when the throttle window expires,
|
||||||
|
// so we always show the latest frame.
|
||||||
|
_pendingTimer?.Dispose();
|
||||||
|
_pendingTimer = new Timer(_ => RenderLatest(), null,
|
||||||
|
(int)(100 - elapsed) + 1, Timeout.Infinite);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await RenderCurrentFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void RenderLatest()
|
||||||
|
{
|
||||||
|
_pendingTimer?.Dispose();
|
||||||
|
_pendingTimer = null;
|
||||||
|
await RenderCurrentFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task RenderCurrentFrame()
|
||||||
|
{
|
||||||
|
_lastRenderTime = DateTime.UtcNow;
|
||||||
|
|
||||||
|
var mat = ViewModel?.ImagePreview;
|
||||||
|
var isError = ViewModel?.IsError ?? false;
|
||||||
|
|
||||||
|
string dataUri = string.Empty;
|
||||||
|
if (mat != null && !mat.Empty())
|
||||||
|
{
|
||||||
|
dataUri = mat.ToBase64DataUri();
|
||||||
|
}
|
||||||
|
|
||||||
|
_dataUri = dataUri;
|
||||||
|
_isError = isError;
|
||||||
|
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_pendingTimer?.Dispose();
|
||||||
|
Unsubscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
75
VisionBuilder.UI.Blazor/Components/SingleCameraControl.razor
Normal file
75
VisionBuilder.UI.Blazor/Components/SingleCameraControl.razor
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
@using VisionBuilder.UI.Common
|
||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
<div class="single-camera-control">
|
||||||
|
<div class="camera-header">
|
||||||
|
<div class="camera-header-preview">
|
||||||
|
<span class="camera-label">@_cameraLabel</span>
|
||||||
|
</div>
|
||||||
|
<div class="camera-header-errors">
|
||||||
|
<span class="errors-label">Errors</span>
|
||||||
|
</div>
|
||||||
|
<div class="camera-header-stats"></div>
|
||||||
|
<div class="camera-header-buttons"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="camera-body">
|
||||||
|
<div class="camera-preview-area">
|
||||||
|
<PreviewWindow ViewModel="@ViewModel?.PreviewVm" />
|
||||||
|
</div>
|
||||||
|
<div class="camera-divider"></div>
|
||||||
|
<div class="camera-errors-area">
|
||||||
|
<ErrorPreview ViewModel="@ViewModel?.ErrorsVm" />
|
||||||
|
</div>
|
||||||
|
<div class="camera-divider"></div>
|
||||||
|
<div class="camera-stats-area">
|
||||||
|
<Stats ViewModel="@ViewModel?.StatisticsVm" />
|
||||||
|
</div>
|
||||||
|
<div class="camera-buttons-area">
|
||||||
|
<div class="camera-buttons-stack">
|
||||||
|
<MudButton Variant="Variant.Outlined" Color="Color.Primary" FullWidth="true"
|
||||||
|
Class="camera-btn"
|
||||||
|
Disabled="@(!_canSelectRecipe)"
|
||||||
|
OnClick="@OnSelectRecipe">
|
||||||
|
@_currentRecipeName
|
||||||
|
</MudButton>
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true"
|
||||||
|
Class="camera-btn"
|
||||||
|
Disabled="@(!_canStart)"
|
||||||
|
OnClick="@OnStart">
|
||||||
|
Start
|
||||||
|
</MudButton>
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true"
|
||||||
|
Class="camera-btn"
|
||||||
|
Disabled="@(!_canStop)"
|
||||||
|
OnClick="@OnStop">
|
||||||
|
Stop
|
||||||
|
</MudButton>
|
||||||
|
@if (_showPauseButton && _canPause)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Outlined" Color="Color.Primary" FullWidth="true"
|
||||||
|
Class="camera-btn"
|
||||||
|
OnClick="@OnPause">
|
||||||
|
Pause
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
@if (_showPauseButton && _canResume)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Outlined" Color="Color.Primary" FullWidth="true"
|
||||||
|
Class="camera-btn"
|
||||||
|
OnClick="@OnResume">
|
||||||
|
Resume
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
@if (_canHotReload)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Outlined" Color="Color.Primary" FullWidth="true"
|
||||||
|
Class="camera-btn"
|
||||||
|
OnClick="@OnHotReload">
|
||||||
|
Hot Reload
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
108
VisionBuilder.UI.Blazor/Components/SingleCameraControl.razor.cs
Normal file
108
VisionBuilder.UI.Blazor/Components/SingleCameraControl.razor.cs
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using VisionBuilder.UI.Common;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Components;
|
||||||
|
|
||||||
|
public partial class SingleCameraControl : ComponentBase, IDisposable
|
||||||
|
{
|
||||||
|
[Parameter] public SingleCameraVM? ViewModel { get; set; }
|
||||||
|
|
||||||
|
private string _cameraLabel = "";
|
||||||
|
private string _currentRecipeName = "Select recipe";
|
||||||
|
private bool _canSelectRecipe;
|
||||||
|
private bool _canStart;
|
||||||
|
private bool _canStop;
|
||||||
|
private bool _canPause;
|
||||||
|
private bool _canResume;
|
||||||
|
private bool _canHotReload;
|
||||||
|
private bool _showPauseButton;
|
||||||
|
private SingleCameraVM? _subscribedVm;
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != ViewModel)
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
Subscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Subscribe()
|
||||||
|
{
|
||||||
|
_subscribedVm = ViewModel;
|
||||||
|
if (ViewModel != null)
|
||||||
|
{
|
||||||
|
ViewModel.PropertyChanged += OnPropertyChanged;
|
||||||
|
UpdateState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Unsubscribe()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != null)
|
||||||
|
_subscribedVm.PropertyChanged -= OnPropertyChanged;
|
||||||
|
_subscribedVm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateState()
|
||||||
|
{
|
||||||
|
if (ViewModel == null) return;
|
||||||
|
_cameraLabel = ViewModel.CameraLabelAndStatus;
|
||||||
|
_currentRecipeName = ViewModel.CurrentRecipeName;
|
||||||
|
_canSelectRecipe = ViewModel.IsNotRunning;
|
||||||
|
_canStart = ViewModel.CanStart;
|
||||||
|
_canStop = ViewModel.CanStop;
|
||||||
|
_canPause = ViewModel.CanPause;
|
||||||
|
_canResume = ViewModel.CanResume;
|
||||||
|
_canHotReload = ViewModel.CanHotReload;
|
||||||
|
_showPauseButton = ViewModel.CanPause || ViewModel.CanResume;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
UpdateState();
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnSelectRecipe()
|
||||||
|
{
|
||||||
|
if (ViewModel?.SelectRecipeCommand.CanExecute(null) == true)
|
||||||
|
await ViewModel.SelectRecipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnStart()
|
||||||
|
{
|
||||||
|
if (ViewModel?.StartCommand.CanExecute(null) == true)
|
||||||
|
await ViewModel.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnStop()
|
||||||
|
{
|
||||||
|
if (ViewModel?.StopCommand.CanExecute(null) == true)
|
||||||
|
await ViewModel.Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPause()
|
||||||
|
{
|
||||||
|
if (ViewModel?.PauseCommand.CanExecute(null) == true)
|
||||||
|
ViewModel.PauseCommand.Execute(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnResume()
|
||||||
|
{
|
||||||
|
if (ViewModel?.ResumeCommand.CanExecute(null) == true)
|
||||||
|
ViewModel.ResumeCommand.Execute(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnHotReload()
|
||||||
|
{
|
||||||
|
if (ViewModel?.HotReloadCommand.CanExecute(null) == true)
|
||||||
|
ViewModel.HotReloadCommand.Execute(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
34
VisionBuilder.UI.Blazor/Components/Stats.razor
Normal file
34
VisionBuilder.UI.Blazor/Components/Stats.razor
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
<div class="stats-panel">
|
||||||
|
@if (!string.IsNullOrEmpty(_sessionStarted))
|
||||||
|
{
|
||||||
|
<div class="stats-field">
|
||||||
|
<span class="stats-field-label">Started at:</span>
|
||||||
|
<span class="stats-field-value stats-bold">@_sessionStarted</span>
|
||||||
|
</div>
|
||||||
|
<div class="stats-field">
|
||||||
|
<span class="stats-field-label">Processing Time:</span>
|
||||||
|
<span class="stats-field-value stats-bold">@_processingTime</span>
|
||||||
|
</div>
|
||||||
|
<div class="stats-field">
|
||||||
|
<span class="stats-field-label">Total:</span>
|
||||||
|
<span class="stats-field-value">@_total</span>
|
||||||
|
</div>
|
||||||
|
<div class="stats-field">
|
||||||
|
<span class="stats-field-label">Bad:</span>
|
||||||
|
<span class="stats-field-value">@_bad</span>
|
||||||
|
</div>
|
||||||
|
<div class="stats-field">
|
||||||
|
<span class="stats-field-label">Error rate:</span>
|
||||||
|
<span class="stats-field-value">@_errorRate</span>
|
||||||
|
</div>
|
||||||
|
@if (!string.IsNullOrEmpty(_statisticsDetails))
|
||||||
|
{
|
||||||
|
<div class="stats-field">
|
||||||
|
<span class="stats-field-label">Details:</span>
|
||||||
|
<pre class="stats-field-value stats-details-text">@_statisticsDetails</pre>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
62
VisionBuilder.UI.Blazor/Components/Stats.razor.cs
Normal file
62
VisionBuilder.UI.Blazor/Components/Stats.razor.cs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Components;
|
||||||
|
|
||||||
|
public partial class Stats : ComponentBase, IDisposable
|
||||||
|
{
|
||||||
|
[Parameter] public StatisticsVM? ViewModel { get; set; }
|
||||||
|
|
||||||
|
private string _sessionStarted = "";
|
||||||
|
private string _recipeName = "";
|
||||||
|
private string _processingTime = "";
|
||||||
|
private int _good;
|
||||||
|
private int _bad;
|
||||||
|
private int _total;
|
||||||
|
private string _errorRate = "";
|
||||||
|
private string _statisticsDetails = "";
|
||||||
|
private StatisticsVM? _subscribedVm;
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != ViewModel)
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
Subscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Subscribe()
|
||||||
|
{
|
||||||
|
_subscribedVm = ViewModel;
|
||||||
|
if (ViewModel != null)
|
||||||
|
ViewModel.PropertyChanged += OnPropertyChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Unsubscribe()
|
||||||
|
{
|
||||||
|
if (_subscribedVm != null)
|
||||||
|
_subscribedVm.PropertyChanged -= OnPropertyChanged;
|
||||||
|
_subscribedVm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
_sessionStarted = ViewModel?.SessionStarted ?? "";
|
||||||
|
_recipeName = ViewModel?.RecipeName ?? "";
|
||||||
|
_processingTime = ViewModel?.ProcessingTime ?? "";
|
||||||
|
_good = ViewModel?.Good ?? 0;
|
||||||
|
_bad = ViewModel?.Bad ?? 0;
|
||||||
|
_total = ViewModel?.Total ?? 0;
|
||||||
|
_errorRate = ViewModel?.ErrorRate ?? "";
|
||||||
|
_statisticsDetails = ViewModel?.StatisticsDetails ?? "";
|
||||||
|
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Unsubscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
71
VisionBuilder.UI.Blazor/Dialogs/ImagePreviewDialog.razor
Normal file
71
VisionBuilder.UI.Blazor/Dialogs/ImagePreviewDialog.razor
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
@using MudBlazor
|
||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
<MudDialog>
|
||||||
|
<DialogContent>
|
||||||
|
@if (ViewModel != null)
|
||||||
|
{
|
||||||
|
<div class="image-preview-dialog">
|
||||||
|
@{
|
||||||
|
var imageUri = ViewModel.ImageAnalysis?.ToBase64DataUri();
|
||||||
|
}
|
||||||
|
@if (!string.IsNullOrEmpty(imageUri))
|
||||||
|
{
|
||||||
|
<img src="@imageUri" alt="@ViewModel.ImageName" class="image-preview-img" />
|
||||||
|
}
|
||||||
|
<div class="image-preview-info">
|
||||||
|
<MudText Typo="Typo.subtitle1">@ViewModel.ImageName</MudText>
|
||||||
|
</div>
|
||||||
|
<div class="image-preview-actions">
|
||||||
|
<MudButton Variant="Variant.Outlined" Disabled="@(!ViewModel.IsPreviousImageEnabled)"
|
||||||
|
OnClick="OnPrevious">Previous</MudButton>
|
||||||
|
<MudButton Variant="Variant.Outlined"
|
||||||
|
OnClick="OnSwitchView">@(ViewModel.OriginalView ? "Analysis" : "Original")</MudButton>
|
||||||
|
<MudButton Variant="Variant.Outlined" Disabled="@(!ViewModel.IsNextImageEnabled)"
|
||||||
|
OnClick="OnNext">Next</MudButton>
|
||||||
|
@if (ViewModel.LearnButtonVisible)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Primary"
|
||||||
|
OnClick="OnLearn">Learn</MudButton>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="Close">Close</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!;
|
||||||
|
[Parameter] public ErrorPreviewVM? ViewModel { get; set; }
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (ViewModel != null)
|
||||||
|
ViewModel.PropertyChanged += OnPropertyChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPrevious() => ViewModel?.PreviousImageCommand.Execute(null);
|
||||||
|
private void OnNext() => ViewModel?.NextImageCommand.Execute(null);
|
||||||
|
private void OnSwitchView() => ViewModel?.SwitchViewCommand.Execute(null);
|
||||||
|
private async Task OnLearn()
|
||||||
|
{
|
||||||
|
if (ViewModel != null)
|
||||||
|
await ViewModel.Learn();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Close() => MudDialog.Close();
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (ViewModel != null)
|
||||||
|
ViewModel.PropertyChanged -= OnPropertyChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
VisionBuilder.UI.Blazor/Dialogs/PasswordInputDialog.razor
Normal file
27
VisionBuilder.UI.Blazor/Dialogs/PasswordInputDialog.razor
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
@using MudBlazor
|
||||||
|
|
||||||
|
<MudDialog>
|
||||||
|
<DialogContent>
|
||||||
|
<MudTextField @bind-Value="_password" Label="Password" InputType="InputType.Password"
|
||||||
|
Immediate="true" OnKeyDown="OnKeyDown" AutoFocus="true" />
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="Cancel">Cancel</MudButton>
|
||||||
|
<MudButton Color="Color.Primary" OnClick="Submit">OK</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!;
|
||||||
|
|
||||||
|
private string _password = "";
|
||||||
|
|
||||||
|
private void Submit() => MudDialog.Close(DialogResult.Ok(_password));
|
||||||
|
private void Cancel() => MudDialog.Cancel();
|
||||||
|
|
||||||
|
private void OnKeyDown(KeyboardEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Key == "Enter")
|
||||||
|
Submit();
|
||||||
|
}
|
||||||
|
}
|
||||||
44
VisionBuilder.UI.Blazor/Dialogs/RecipeSelectionDialog.razor
Normal file
44
VisionBuilder.UI.Blazor/Dialogs/RecipeSelectionDialog.razor
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
@using MudBlazor
|
||||||
|
|
||||||
|
<MudDialog>
|
||||||
|
<DialogContent>
|
||||||
|
@if (ViewModel != null)
|
||||||
|
{
|
||||||
|
<div class="recipe-grid">
|
||||||
|
@foreach (var recipe in ViewModel.Recipes)
|
||||||
|
{
|
||||||
|
var isSelected = recipe == ViewModel.SelectedRecipe;
|
||||||
|
<div class="recipe-item @(isSelected ? "recipe-selected" : "")"
|
||||||
|
@onclick="() => SelectRecipe(recipe)">
|
||||||
|
@if (recipe.Image != null && !recipe.Image.Empty())
|
||||||
|
{
|
||||||
|
<img src="@recipe.Image.ToBase64DataUri(60)" alt="@recipe.RecipeName" class="recipe-thumbnail" />
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="recipe-thumbnail recipe-no-image">No image</div>
|
||||||
|
}
|
||||||
|
<span class="recipe-name">@recipe.RecipeName</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="Cancel">Cancel</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!;
|
||||||
|
[Parameter] public RecipeSelectionVM? ViewModel { get; set; }
|
||||||
|
|
||||||
|
private void SelectRecipe(RecipeData recipe)
|
||||||
|
{
|
||||||
|
if (ViewModel != null)
|
||||||
|
ViewModel.SelectedRecipe = recipe;
|
||||||
|
MudDialog.Close(DialogResult.Ok(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Cancel() => MudDialog.Cancel();
|
||||||
|
}
|
||||||
226
VisionBuilder.UI.Blazor/Dialogs/SettingsDialog.razor
Normal file
226
VisionBuilder.UI.Blazor/Dialogs/SettingsDialog.razor
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
@using MudBlazor
|
||||||
|
@using System.ComponentModel
|
||||||
|
@using System.Reflection
|
||||||
|
@using Inspectron.Settings
|
||||||
|
|
||||||
|
<MudDialog>
|
||||||
|
<DialogContent>
|
||||||
|
<div class="settings-layout">
|
||||||
|
<div class="settings-tree">
|
||||||
|
<MudTreeView T="string" SelectedValueChanged="OnCategorySelected" Dense="true">
|
||||||
|
<SettingsTreeNode Nodes="_treeRoot" />
|
||||||
|
</MudTreeView>
|
||||||
|
</div>
|
||||||
|
<div class="settings-content">
|
||||||
|
@if (_selectedCategory != null && GetSettingsForCategory(_selectedCategory) is { Count: > 0 } settings)
|
||||||
|
{
|
||||||
|
@foreach (var setting in settings)
|
||||||
|
{
|
||||||
|
<div class="settings-field">
|
||||||
|
@if (setting.Property.PropertyType == typeof(bool))
|
||||||
|
{
|
||||||
|
var boolVal = (bool)(setting.Value ?? false);
|
||||||
|
<MudSwitch T="bool" Value="boolVal"
|
||||||
|
ValueChanged="@(v => setting.Value = v)"
|
||||||
|
Label="@setting.Description" Color="Color.Primary" />
|
||||||
|
}
|
||||||
|
else if (setting.Property.PropertyType == typeof(int))
|
||||||
|
{
|
||||||
|
var intVal = (int)(setting.Value ?? 0);
|
||||||
|
<MudNumericField T="int" Value="intVal"
|
||||||
|
ValueChanged="@(v => setting.Value = v)"
|
||||||
|
Label="@setting.Description" Variant="Variant.Outlined" />
|
||||||
|
}
|
||||||
|
else if (setting.Property.PropertyType == typeof(double))
|
||||||
|
{
|
||||||
|
var dblVal = (double)(setting.Value ?? 0.0);
|
||||||
|
<MudNumericField T="double" Value="dblVal"
|
||||||
|
ValueChanged="@(v => setting.Value = v)"
|
||||||
|
Label="@setting.Description" Variant="Variant.Outlined" />
|
||||||
|
}
|
||||||
|
else if (setting.Property.PropertyType.IsEnum)
|
||||||
|
{
|
||||||
|
<MudSelect T="object" Value="setting.Value"
|
||||||
|
ValueChanged="@(v => setting.Value = v)"
|
||||||
|
Label="@setting.Description" Variant="Variant.Outlined">
|
||||||
|
@foreach (var enumVal in Enum.GetValues(setting.Property.PropertyType))
|
||||||
|
{
|
||||||
|
<MudSelectItem T="object" Value="@enumVal">@enumVal.ToString()</MudSelectItem>
|
||||||
|
}
|
||||||
|
</MudSelect>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var strVal = setting.Value?.ToString() ?? "";
|
||||||
|
<MudTextField T="string" Value="strVal"
|
||||||
|
ValueChanged="@(v => setting.Value = v)"
|
||||||
|
Label="@setting.Description" Variant="Variant.Outlined" />
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudText Typo="Typo.body2" Class="pa-4">Select a category to view settings.</MudText>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="Cancel">Cancel</MudButton>
|
||||||
|
<MudButton Color="Color.Primary" OnClick="Save">Save</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!;
|
||||||
|
[Parameter] public InspectronSettings? Settings { get; set; }
|
||||||
|
|
||||||
|
private Dictionary<string, List<SettingEntry>> _categories = new();
|
||||||
|
private string? _selectedCategory;
|
||||||
|
private List<CategoryNode> _treeRoot = new();
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (Settings == null) return;
|
||||||
|
LoadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadSettings()
|
||||||
|
{
|
||||||
|
_categories.Clear();
|
||||||
|
_treeRoot = new List<CategoryNode>();
|
||||||
|
var treeView = Settings!.UserSettings;
|
||||||
|
var root = treeView.Root as Tree<object>;
|
||||||
|
if (root != null)
|
||||||
|
Traverse(root, "");
|
||||||
|
|
||||||
|
// Build the UI tree from category paths
|
||||||
|
foreach (var categoryPath in _categories.Keys)
|
||||||
|
{
|
||||||
|
var parts = categoryPath.Split('/');
|
||||||
|
var currentList = _treeRoot;
|
||||||
|
for (int i = 0; i < parts.Length; i++)
|
||||||
|
{
|
||||||
|
var existing = currentList.FirstOrDefault(n => n.Label == parts[i]);
|
||||||
|
if (existing == null)
|
||||||
|
{
|
||||||
|
existing = new CategoryNode
|
||||||
|
{
|
||||||
|
Label = parts[i],
|
||||||
|
FullPath = string.Join("/", parts.Take(i + 1))
|
||||||
|
};
|
||||||
|
currentList.Add(existing);
|
||||||
|
}
|
||||||
|
currentList = existing.ChildNodes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Traverse(Tree<object> node, string path)
|
||||||
|
{
|
||||||
|
object value = node.Value;
|
||||||
|
|
||||||
|
if (value is string folderName)
|
||||||
|
{
|
||||||
|
string newPath = string.IsNullOrEmpty(path) ? folderName : $"{path}/{folderName}";
|
||||||
|
foreach (Tree<object> child in node.Children)
|
||||||
|
Traverse(child, newPath);
|
||||||
|
}
|
||||||
|
else if (value is InspectronSettings.UserSettingsInfo info)
|
||||||
|
{
|
||||||
|
string groupName = info.Name;
|
||||||
|
string groupPath = string.IsNullOrEmpty(path) ? groupName : $"{path}/{groupName}";
|
||||||
|
foreach (PropertyDescriptor pd in info.Settings)
|
||||||
|
{
|
||||||
|
if (pd is BoundPropertyDescriptor bpd)
|
||||||
|
{
|
||||||
|
var owner = bpd.Owner;
|
||||||
|
var description = string.IsNullOrEmpty(pd.Description) ? bpd.DisplayName : pd.Description;
|
||||||
|
var entry = new SettingEntry
|
||||||
|
{
|
||||||
|
Owner = owner,
|
||||||
|
Property = bpd.PropertyInfo,
|
||||||
|
Description = description,
|
||||||
|
Value = bpd.PropertyInfo.GetValue(owner)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!_categories.TryGetValue(groupPath, out var list))
|
||||||
|
{
|
||||||
|
list = new List<SettingEntry>();
|
||||||
|
_categories[groupPath] = list;
|
||||||
|
}
|
||||||
|
list.Add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCategorySelected(string? category)
|
||||||
|
{
|
||||||
|
_selectedCategory = category;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<SettingEntry> GetSettingsForCategory(string category)
|
||||||
|
{
|
||||||
|
// Exact match first
|
||||||
|
if (_categories.TryGetValue(category, out var exact))
|
||||||
|
return exact;
|
||||||
|
|
||||||
|
// Otherwise aggregate all sub-categories
|
||||||
|
var prefix = category + "/";
|
||||||
|
return _categories
|
||||||
|
.Where(kvp => kvp.Key.StartsWith(prefix))
|
||||||
|
.SelectMany(kvp => kvp.Value)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Save()
|
||||||
|
{
|
||||||
|
foreach (var list in _categories.Values)
|
||||||
|
{
|
||||||
|
foreach (var setting in list)
|
||||||
|
{
|
||||||
|
var currentValue = setting.Property.GetValue(setting.Owner);
|
||||||
|
if (!Equals(currentValue, setting.Value))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (setting.Value != null && setting.Value.GetType() != setting.Property.PropertyType)
|
||||||
|
{
|
||||||
|
var converted = Convert.ChangeType(setting.Value, setting.Property.PropertyType);
|
||||||
|
setting.Property.SetValue(setting.Owner, converted);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setting.Property.SetValue(setting.Owner, setting.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Skip properties that fail to convert
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Settings?.SaveSettings();
|
||||||
|
MudDialog.Close(DialogResult.Ok(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Cancel() => MudDialog.Cancel();
|
||||||
|
|
||||||
|
private class SettingEntry
|
||||||
|
{
|
||||||
|
public object Owner { get; set; } = null!;
|
||||||
|
public PropertyInfo Property { get; set; } = null!;
|
||||||
|
public string Description { get; set; } = "";
|
||||||
|
public object? Value { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CategoryNode
|
||||||
|
{
|
||||||
|
public string Label { get; set; } = "";
|
||||||
|
public string FullPath { get; set; } = "";
|
||||||
|
public List<CategoryNode> ChildNodes { get; set; } = new();
|
||||||
|
}
|
||||||
|
}
|
||||||
19
VisionBuilder.UI.Blazor/Dialogs/SettingsTreeNode.razor
Normal file
19
VisionBuilder.UI.Blazor/Dialogs/SettingsTreeNode.razor
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
@using MudBlazor
|
||||||
|
|
||||||
|
@foreach (var node in Nodes.OrderBy(n => n.Label))
|
||||||
|
{
|
||||||
|
@if (node.ChildNodes.Count > 0)
|
||||||
|
{
|
||||||
|
<MudTreeViewItem T="string" Value="@node.FullPath" Text="@node.Label" Expanded="true">
|
||||||
|
<SettingsTreeNode Nodes="node.ChildNodes" />
|
||||||
|
</MudTreeViewItem>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudTreeViewItem T="string" Value="@node.FullPath" Text="@node.Label" />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[Parameter] public List<SettingsDialog.CategoryNode> Nodes { get; set; } = new();
|
||||||
|
}
|
||||||
16
VisionBuilder.UI.Blazor/Helpers/MatExtensions.cs
Normal file
16
VisionBuilder.UI.Blazor/Helpers/MatExtensions.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using OpenCvSharp;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Helpers;
|
||||||
|
|
||||||
|
public static class MatExtensions
|
||||||
|
{
|
||||||
|
public static string ToBase64DataUri(this Mat mat, int quality = 75)
|
||||||
|
{
|
||||||
|
if (mat == null || mat.Empty())
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
Cv2.ImEncode(".jpg", mat, out var buf,
|
||||||
|
new ImageEncodingParam(ImwriteFlags.JpegQuality, quality));
|
||||||
|
return $"data:image/jpeg;base64,{Convert.ToBase64String(buf)}";
|
||||||
|
}
|
||||||
|
}
|
||||||
24
VisionBuilder.UI.Blazor/ModuleExtensions.cs
Normal file
24
VisionBuilder.UI.Blazor/ModuleExtensions.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
using Inspectron.Settings;
|
||||||
|
using Ninject;
|
||||||
|
using VisionBuilder.UI.Blazor.Services;
|
||||||
|
using VisionBuilder.UI.Common;
|
||||||
|
using VisionBuilder.UI.Common.Processing;
|
||||||
|
using VisionBuilder.UI.Common.Services;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel.Interfaces.UI;
|
||||||
|
using ISettings = VisionBuilder.UI.Common.ISettings;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor;
|
||||||
|
|
||||||
|
public static class ModuleExtensions
|
||||||
|
{
|
||||||
|
public static IKernel UseBlazorServices(this IKernel self)
|
||||||
|
{
|
||||||
|
self.Bind<ISettingsService>().To<BlazorSettingsService>().InSingletonScope();
|
||||||
|
self.Bind<ILoadingService>().To<BlazorLoadingService>().InSingletonScope();
|
||||||
|
self.Bind<IRecipeSelectionDialogService>().To<BlazorRecipeSelectionDialogService>().InSingletonScope();
|
||||||
|
self.Bind<IImagePreviewService>().To<BlazorImagePreviewService>().InSingletonScope();
|
||||||
|
self.Bind<IPasswordInputService>().To<BlazorPasswordInputService>().InSingletonScope();
|
||||||
|
self.Bind<BlazorUISettings, ISettings>().To<BlazorUISettings>().InSingletonScope();
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using MudBlazor;
|
||||||
|
using VisionBuilder.UI.Blazor.Dialogs;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel.Interfaces.UI;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Services;
|
||||||
|
|
||||||
|
public class BlazorImagePreviewService : IImagePreviewService
|
||||||
|
{
|
||||||
|
private IDialogService? _dialogService;
|
||||||
|
|
||||||
|
public void SetDialogService(IDialogService dialogService)
|
||||||
|
{
|
||||||
|
_dialogService = dialogService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ShowImagePreviewAsync(ErrorPreviewVM errorPreviewVm)
|
||||||
|
{
|
||||||
|
if (_dialogService == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var parameters = new DialogParameters<ImagePreviewDialog>
|
||||||
|
{
|
||||||
|
{ x => x.ViewModel, errorPreviewVm }
|
||||||
|
};
|
||||||
|
var options = new DialogOptions
|
||||||
|
{
|
||||||
|
MaxWidth = MaxWidth.Large,
|
||||||
|
FullWidth = true
|
||||||
|
};
|
||||||
|
var dialog = await _dialogService.ShowAsync<ImagePreviewDialog>("Image Preview", parameters, options);
|
||||||
|
await dialog.Result;
|
||||||
|
}
|
||||||
|
}
|
||||||
16
VisionBuilder.UI.Blazor/Services/BlazorLoadingService.cs
Normal file
16
VisionBuilder.UI.Blazor/Services/BlazorLoadingService.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using VisionBuilder.UI.Common.Processing;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Services;
|
||||||
|
|
||||||
|
public class BlazorLoadingService : ILoadingService
|
||||||
|
{
|
||||||
|
public void StartLoading(string title)
|
||||||
|
{
|
||||||
|
// Loading indicator managed at the Blazor host level if needed.
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopLoading(string title)
|
||||||
|
{
|
||||||
|
// Loading indicator managed at the Blazor host level if needed.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using MudBlazor;
|
||||||
|
using VisionBuilder.UI.Blazor.Dialogs;
|
||||||
|
using VisionBuilder.UI.Common.Services;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Services;
|
||||||
|
|
||||||
|
public class BlazorPasswordInputService : IPasswordInputService
|
||||||
|
{
|
||||||
|
private IDialogService? _dialogService;
|
||||||
|
|
||||||
|
public void SetDialogService(IDialogService dialogService)
|
||||||
|
{
|
||||||
|
_dialogService = dialogService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string?> GetPasswordAsync()
|
||||||
|
{
|
||||||
|
if (_dialogService == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var dialog = await _dialogService.ShowAsync<PasswordInputDialog>("Password Required");
|
||||||
|
var result = await dialog.Result;
|
||||||
|
if (result != null && !result.Canceled)
|
||||||
|
return result.Data as string;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
using MudBlazor;
|
||||||
|
using VisionBuilder.UI.Blazor.Dialogs;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel.Interfaces.UI;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Services;
|
||||||
|
|
||||||
|
public class BlazorRecipeSelectionDialogService : IRecipeSelectionDialogService
|
||||||
|
{
|
||||||
|
private IDialogService? _dialogService;
|
||||||
|
|
||||||
|
public void SetDialogService(IDialogService dialogService)
|
||||||
|
{
|
||||||
|
_dialogService = dialogService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> SelectRecipeAsync(RecipeSelectionVM recipeSelectionVm)
|
||||||
|
{
|
||||||
|
if (_dialogService == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var parameters = new DialogParameters<RecipeSelectionDialog>
|
||||||
|
{
|
||||||
|
{ x => x.ViewModel, recipeSelectionVm }
|
||||||
|
};
|
||||||
|
var dialog = await _dialogService.ShowAsync<RecipeSelectionDialog>("Select Recipe", parameters);
|
||||||
|
var result = await dialog.Result;
|
||||||
|
return result != null && !result.Canceled;
|
||||||
|
}
|
||||||
|
}
|
||||||
40
VisionBuilder.UI.Blazor/Services/BlazorSettingsService.cs
Normal file
40
VisionBuilder.UI.Blazor/Services/BlazorSettingsService.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
using Inspectron.Settings;
|
||||||
|
using MudBlazor;
|
||||||
|
using VisionBuilder.UI.Blazor.Dialogs;
|
||||||
|
using VisionBuilder.UI.Common.ViewModel.Interfaces.UI;
|
||||||
|
|
||||||
|
namespace VisionBuilder.UI.Blazor.Services;
|
||||||
|
|
||||||
|
public class BlazorSettingsService : ISettingsService
|
||||||
|
{
|
||||||
|
private readonly InspectronSettings _settings;
|
||||||
|
private IDialogService? _dialogService;
|
||||||
|
|
||||||
|
public BlazorSettingsService(InspectronSettings settings)
|
||||||
|
{
|
||||||
|
_settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDialogService(IDialogService dialogService)
|
||||||
|
{
|
||||||
|
_dialogService = dialogService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ShowSettingsDialogAsync()
|
||||||
|
{
|
||||||
|
if (_dialogService == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var parameters = new DialogParameters<SettingsDialog>
|
||||||
|
{
|
||||||
|
{ x => x.Settings, _settings }
|
||||||
|
};
|
||||||
|
var options = new DialogOptions
|
||||||
|
{
|
||||||
|
MaxWidth = MaxWidth.Medium,
|
||||||
|
FullWidth = true
|
||||||
|
};
|
||||||
|
var dialog = await _dialogService.ShowAsync<SettingsDialog>("Settings", parameters, options);
|
||||||
|
await dialog.Result;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
VisionBuilder.UI.Blazor/VisionBuilder.UI.Blazor.csproj
Normal file
19
VisionBuilder.UI.Blazor/VisionBuilder.UI.Blazor.csproj
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MudBlazor" Version="8.0.0" />
|
||||||
|
<PackageReference Include="OpenCvSharp4" Version="4.6.0.20220608" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" />
|
||||||
|
<ProjectReference Include="..\framework\Inspectron.Settings\Inspectron.Settings.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
9
VisionBuilder.UI.Blazor/_Imports.razor
Normal file
9
VisionBuilder.UI.Blazor/_Imports.razor
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
@using Microsoft.AspNetCore.Components
|
||||||
|
@using Microsoft.AspNetCore.Components.Web
|
||||||
|
@using MudBlazor
|
||||||
|
@using VisionBuilder.UI.Common
|
||||||
|
@using VisionBuilder.UI.Common.ViewModel
|
||||||
|
@using VisionBuilder.UI.Common.ViewModel.Classes
|
||||||
|
@using VisionBuilder.UI.Blazor.Helpers
|
||||||
|
@using VisionBuilder.UI.Blazor.Components
|
||||||
|
@using VisionBuilder.UI.Blazor.Dialogs
|
||||||
293
VisionBuilder.UI.Blazor/wwwroot/css/visionbuilder.css
Normal file
293
VisionBuilder.UI.Blazor/wwwroot/css/visionbuilder.css
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
/* Preview Window */
|
||||||
|
.preview-window {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: #000;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border: 5px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-window.preview-error {
|
||||||
|
border-color: #f44336;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-image {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-placeholder {
|
||||||
|
color: #666;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stats Panel */
|
||||||
|
.stats-panel {
|
||||||
|
padding: 4px 8px;
|
||||||
|
font-family: 'Verdana', sans-serif;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-field {
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-field-label {
|
||||||
|
font-weight: 700;
|
||||||
|
display: block;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-field-value {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-bold {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-details-text {
|
||||||
|
margin: 0;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Error Preview Panel */
|
||||||
|
.error-preview-panel {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 4px;
|
||||||
|
padding: 4px;
|
||||||
|
overflow-y: auto;
|
||||||
|
height: 100%;
|
||||||
|
align-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-card {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 2px;
|
||||||
|
transition: background-color 0.2s;
|
||||||
|
width: 180px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-card:hover {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-thumbnail {
|
||||||
|
width: 170px;
|
||||||
|
height: 130px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-title {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 2px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Single Camera Control */
|
||||||
|
.single-camera-control {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header row */
|
||||||
|
.camera-header {
|
||||||
|
display: flex;
|
||||||
|
height: 28px;
|
||||||
|
align-items: center;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-header-preview {
|
||||||
|
flex: 45;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-header-errors {
|
||||||
|
flex: 25;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-header-stats {
|
||||||
|
flex: 14;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-header-buttons {
|
||||||
|
flex: 14;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-label {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.errors-label {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Body row */
|
||||||
|
.camera-body {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-preview-area {
|
||||||
|
flex: 45;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-divider {
|
||||||
|
width: 1px;
|
||||||
|
background-color: #37474f;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-errors-area {
|
||||||
|
flex: 25;
|
||||||
|
min-width: 0;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-stats-area {
|
||||||
|
flex: 14;
|
||||||
|
overflow-y: auto;
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-buttons-area {
|
||||||
|
flex: 14;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-buttons-stack {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.camera-btn {
|
||||||
|
height: 64px !important;
|
||||||
|
font-weight: 700 !important;
|
||||||
|
font-size: 0.85rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recipe Selection Dialog */
|
||||||
|
.recipe-grid {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 8px;
|
||||||
|
border: 2px solid #e0e0e0;
|
||||||
|
border-radius: 8px;
|
||||||
|
transition: border-color 0.2s;
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-item:hover {
|
||||||
|
border-color: #90caf9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-item.recipe-selected {
|
||||||
|
border-color: #1976d2;
|
||||||
|
background-color: #e3f2fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-thumbnail {
|
||||||
|
width: 130px;
|
||||||
|
height: 100px;
|
||||||
|
object-fit: cover;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-no-image {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: #eee;
|
||||||
|
color: #999;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-name {
|
||||||
|
margin-top: 6px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
text-align: center;
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Image Preview Dialog */
|
||||||
|
.image-preview-dialog {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-preview-img {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 60vh;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-preview-info {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-preview-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Settings Dialog */
|
||||||
|
.settings-layout {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
min-height: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-tree {
|
||||||
|
min-width: 200px;
|
||||||
|
border-right: 1px solid #e0e0e0;
|
||||||
|
padding-right: 8px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-content {
|
||||||
|
flex: 1;
|
||||||
|
padding: 0 8px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-field {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
@@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
public interface IPasswordInputService
|
public interface IPasswordInputService
|
||||||
{
|
{
|
||||||
string GetPassword();
|
Task<string?> GetPasswordAsync();
|
||||||
}
|
}
|
||||||
@@ -117,11 +117,11 @@ public partial class ErrorPreviewVM:ObservableObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
[RelayCommand(CanExecute = nameof(LearnButtonVisible))]
|
[RelayCommand(CanExecute = nameof(LearnButtonVisible))]
|
||||||
public void Learn()
|
public async Task Learn()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(_uiConfiguration.AdminPassword))
|
if (!string.IsNullOrEmpty(_uiConfiguration.AdminPassword))
|
||||||
{
|
{
|
||||||
var passwordOk= _passwordInputService.GetPassword()==_uiConfiguration.AdminPassword;
|
var passwordOk = await _passwordInputService.GetPasswordAsync() == _uiConfiguration.AdminPassword;
|
||||||
if (!passwordOk) return;
|
if (!passwordOk) return;
|
||||||
}
|
}
|
||||||
_learningTool.Learn(_errorData.RecipeName, _errorData.ImageOriginal);
|
_learningTool.Learn(_errorData.RecipeName, _errorData.ImageOriginal);
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ public class ErrorsVM:IEventHandler<ImageProcessedEvent>, IEventHandler<SessionS
|
|||||||
|
|
||||||
public ObservableCollection<ErrorData> Errors { get; set; } = new ObservableCollection<ErrorData>();
|
public ObservableCollection<ErrorData> Errors { get; set; } = new ObservableCollection<ErrorData>();
|
||||||
|
|
||||||
public void ShowImage(ErrorData errorData)
|
public async Task ShowImage(ErrorData errorData)
|
||||||
{
|
{
|
||||||
if (errorData == null) return;
|
if (errorData == null) return;
|
||||||
|
|
||||||
var vm = new ErrorPreviewVM(this, errorData, errorData.RecipeName, _uiConfiguration, _learningTool, _passwordInputService);
|
var vm = new ErrorPreviewVM(this, errorData, errorData.RecipeName, _uiConfiguration, _learningTool, _passwordInputService);
|
||||||
_imagePreviewService.ShowImagePreview(vm);
|
await _imagePreviewService.ShowImagePreviewAsync(vm);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ namespace VisionBuilder.UI.Common.ViewModel.Interfaces.UI;
|
|||||||
|
|
||||||
public interface IImagePreviewService
|
public interface IImagePreviewService
|
||||||
{
|
{
|
||||||
void ShowImagePreview(ErrorPreviewVM errorPreviewVm);
|
Task ShowImagePreviewAsync(ErrorPreviewVM errorPreviewVm);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
public interface IRecipeSelectionDialogService
|
public interface IRecipeSelectionDialogService
|
||||||
{
|
{
|
||||||
bool SelectRecipe(RecipeSelectionVM recipeSelectionVm);
|
Task<bool> SelectRecipeAsync(RecipeSelectionVM recipeSelectionVm);
|
||||||
}
|
}
|
||||||
@@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
public interface ISettingsService
|
public interface ISettingsService
|
||||||
{
|
{
|
||||||
void ShowSettingsDialog();
|
Task ShowSettingsDialogAsync();
|
||||||
}
|
}
|
||||||
@@ -27,9 +27,9 @@ public partial class MainWindowVM:ObservableObject
|
|||||||
|
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
public void Settings()
|
public async Task Settings()
|
||||||
{
|
{
|
||||||
_settingsService.ShowSettingsDialog();
|
await _settingsService.ShowSettingsDialogAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
|
|||||||
@@ -118,10 +118,10 @@ namespace VisionBuilder.UI.Common
|
|||||||
|
|
||||||
|
|
||||||
[RelayCommand(CanExecute = nameof(IsNotRunning))]
|
[RelayCommand(CanExecute = nameof(IsNotRunning))]
|
||||||
public void SelectRecipe()
|
public async Task SelectRecipe()
|
||||||
{
|
{
|
||||||
var vm = GetRecipeSelectionVm();
|
var vm = GetRecipeSelectionVm();
|
||||||
if (!_recipeSelectionDialogService.SelectRecipe(vm))return;
|
if (!await _recipeSelectionDialogService.SelectRecipeAsync(vm))return;
|
||||||
ProcessRecipeSelectionVm(vm);
|
ProcessRecipeSelectionVm(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,11 +85,11 @@ namespace VisionBuilder.UI.Windows.Duo
|
|||||||
WindowState = FormWindowState.Minimized;
|
WindowState = FormWindowState.Minimized;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnSettings_Click(object sender, EventArgs e)
|
private async void btnSettings_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (_uiConfiguration.ProtectSettingsWithPassword)
|
if (_uiConfiguration.ProtectSettingsWithPassword)
|
||||||
{
|
{
|
||||||
var passwordOk = _passwordInputService.GetPassword() == _uiConfiguration.AdminPassword;
|
var passwordOk = await _passwordInputService.GetPasswordAsync() == _uiConfiguration.AdminPassword;
|
||||||
if (!passwordOk)
|
if (!passwordOk)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,11 +87,11 @@ namespace VisionBuilder.UI.Windows.Test
|
|||||||
WindowState = FormWindowState.Minimized;
|
WindowState = FormWindowState.Minimized;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnSettings_Click(object sender, EventArgs e)
|
private async void btnSettings_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (_uiConfiguration.ProtectSettingsWithPassword)
|
if (_uiConfiguration.ProtectSettingsWithPassword)
|
||||||
{
|
{
|
||||||
var passwordOk = _passwordInputService.GetPassword() == _uiConfiguration.AdminPassword;
|
var passwordOk = await _passwordInputService.GetPasswordAsync() == _uiConfiguration.AdminPassword;
|
||||||
if (!passwordOk)
|
if (!passwordOk)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,13 @@ public class WindowsImagePreviewService: IImagePreviewService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ImagePreview? CurrentWindow { get; private set; }
|
public ImagePreview? CurrentWindow { get; private set; }
|
||||||
public void ShowImagePreview(ErrorPreviewVM errorPreviewVm)
|
public Task ShowImagePreviewAsync(ErrorPreviewVM errorPreviewVm)
|
||||||
{
|
{
|
||||||
var window = new ImagePreview();
|
var window = new ImagePreview();
|
||||||
window.SetViewModel(errorPreviewVm);
|
window.SetViewModel(errorPreviewVm);
|
||||||
CurrentWindow = window;
|
CurrentWindow = window;
|
||||||
window.ShowDialog();
|
window.ShowDialog();
|
||||||
CurrentWindow = null;
|
CurrentWindow = null;
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,15 +5,15 @@ namespace VisionBuilder.UI.Windows.Settings;
|
|||||||
|
|
||||||
public class WindowsPasswordInputService: IPasswordInputService
|
public class WindowsPasswordInputService: IPasswordInputService
|
||||||
{
|
{
|
||||||
public string GetPassword()
|
public Task<string?> GetPasswordAsync()
|
||||||
{
|
{
|
||||||
if (MaterialInputBox.Prompt("Password required", "", out var password, true) == DialogResult.OK)
|
if (MaterialInputBox.Prompt("Password required", "", out var password, true) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
return password;
|
return Task.FromResult<string?>(password);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return null;
|
return Task.FromResult<string?>(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,13 +13,9 @@ public class WindowsRecipeSelectionDialogService: IRecipeSelectionDialogService
|
|||||||
_recipeCreationTool = recipeCreationTool;
|
_recipeCreationTool = recipeCreationTool;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SelectRecipe(RecipeSelectionVM recipeSelectionVm)
|
public Task<bool> SelectRecipeAsync(RecipeSelectionVM recipeSelectionVm)
|
||||||
{
|
{
|
||||||
RecipeSelectionDialog dialog = new RecipeSelectionDialog(recipeSelectionVm, _recipeCreationTool);
|
RecipeSelectionDialog dialog = new RecipeSelectionDialog(recipeSelectionVm, _recipeCreationTool);
|
||||||
if(dialog.ShowDialog() == DialogResult.OK)
|
return Task.FromResult(dialog.ShowDialog() == DialogResult.OK);
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@ public class WindowsSettingsService: ISettingsService
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ShowSettingsDialog()
|
public Task ShowSettingsDialogAsync()
|
||||||
{
|
{
|
||||||
Thread th = new Thread(() =>
|
Thread th = new Thread(() =>
|
||||||
{
|
{
|
||||||
@@ -30,5 +30,6 @@ public class WindowsSettingsService: ISettingsService
|
|||||||
});
|
});
|
||||||
th.SetApartmentState(ApartmentState.STA);
|
th.SetApartmentState(ApartmentState.STA);
|
||||||
th.Start();
|
th.Start();
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,154 +100,476 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandyboxPlugin", "Plugins\C
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Windows.Duo", "VisionBuilder.UI.Windows.Duo\VisionBuilder.UI.Windows.Duo.csproj", "{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Windows.Duo", "VisionBuilder.UI.Windows.Duo\VisionBuilder.UI.Windows.Duo.csproj", "{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{FA674B5A-3394-926C-2B1E-70E5B00E4A5C}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Blazor", "VisionBuilder.UI.Blazor\VisionBuilder.UI.Blazor.csproj", "{0C14CF80-D743-4809-9B9C-2A096FEA2E06}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Blazor.Uno", "VisionBuilder.UI.Blazor.Uno\VisionBuilder.UI.Blazor.Uno.csproj", "{9AE35B63-607E-4009-9FE6-3DF2CD98071F}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|Any CPU.Build.0 = Release|Any CPU
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|Any CPU.Build.0 = Release|Any CPU
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{98781EAC-F3B2-4DEF-AFED-B0FEB8297025}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{B62D435C-3572-4B5B-A381-992345D343B0}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{D5FD2E9D-DA4F-1343-47E0-FBC473A149BC}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|Any CPU.Build.0 = Release|Any CPU
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{7697A266-A721-4D74-9C5C-0D4F2F6BBF68}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|Any CPU.Build.0 = Release|Any CPU
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{E286CE4C-B68A-94B6-F477-0DBF42358009}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|Any CPU.Build.0 = Release|Any CPU
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{E8868ABD-E4D0-1B7E-494E-06FB1F7D1AF5}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|Any CPU.Build.0 = Release|Any CPU
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{8B7FAFEE-4066-483C-9C9C-10D2D596206D}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|Any CPU.Build.0 = Release|Any CPU
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{C3EFD7A4-2CAD-7610-FEDE-D2E7484ED417}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|Any CPU.Build.0 = Release|Any CPU
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{FC4698F6-C653-427F-9A42-22D07D466A14}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|Any CPU.Build.0 = Release|Any CPU
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{8F6BA34A-D070-372B-DD72-B74905460744}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{4F937F88-70B7-A9E4-834A-D60B104686E0}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|Any CPU.Build.0 = Release|Any CPU
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{0DAFEB64-E123-0974-B77C-3518AFD28D87}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|Any CPU.Build.0 = Release|Any CPU
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{7AACFEF4-794A-42A3-9A05-9B6B4ECD5B82}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|Any CPU.Build.0 = Release|Any CPU
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{97AF69DC-5061-2643-3CC1-99B51976B05B}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|Any CPU.Build.0 = Release|Any CPU
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{376797BE-145E-4C48-BD7D-8BF8822A6BC5}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|Any CPU.Build.0 = Release|Any CPU
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{DBAE2469-ADC5-49CB-B6F5-4F440AF2E32B}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|Any CPU.Build.0 = Release|Any CPU
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{51C2BC65-5E5D-E72A-988D-215E192DE889}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|Any CPU.Build.0 = Release|Any CPU
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{1F9BB3BD-65C3-4B96-A880-4908CF6D9754}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{0A23E56A-DF4C-5174-18DF-18A771957AF4}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{4B1817EF-A3D1-48CC-BE22-4138740E450F}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|Any CPU.Build.0 = Release|Any CPU
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{FBDCC120-B6B3-4A28-8845-DF1690F619C1}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|Any CPU.Build.0 = Release|Any CPU
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{E0F75E78-F7FA-4B7D-BA5F-A8A91C0A9AD9}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|Any CPU.Build.0 = Release|Any CPU
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{254841AD-0706-4C92-A364-7E5DC17AF4AD}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|Any CPU.Build.0 = Release|Any CPU
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{86511F06-AABC-4F1D-AB4E-9763AE4A0EF2}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|Any CPU.Build.0 = Release|Any CPU
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{AD1A176C-B19F-4E60-9935-728722BAE3C1}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|Any CPU.Build.0 = Release|Any CPU
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{DB20082B-60E8-D623-3F3A-04612A929CD6}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|Any CPU.Build.0 = Release|Any CPU
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{52D6A9AE-D0F1-4C52-B688-E0219169E179}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|Any CPU.Build.0 = Release|Any CPU
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{F7D39916-489A-3583-09A0-175AE82D08B7}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|Any CPU.Build.0 = Release|Any CPU
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{C55BE2DA-C60B-491C-8668-9517C7F6FF2F}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|Any CPU.Build.0 = Release|Any CPU
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{44D1BA17-FB52-40A2-9D99-E49DA56C10C2}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{B4949493-C2CD-4786-860D-DAACD39A662D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Debug|x86.Build.0 = Debug|x86
|
||||||
{B4949493-C2CD-4786-860D-DAACD39A662D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Release|x64.Build.0 = Release|x64
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{B4949493-C2CD-4786-860D-DAACD39A662D}.Release|x86.Build.0 = Release|x86
|
||||||
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|Any CPU.Build.0 = Release|Any CPU
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{19E9B1A2-FBC6-2668-EDDF-1B3A6828184A}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|Any CPU.Build.0 = Release|Any CPU
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{31C47198-DEC2-4073-A0C2-220549502CD1}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|Any CPU.Build.0 = Release|Any CPU
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -284,6 +606,8 @@ Global
|
|||||||
{B20D7E75-1C19-632D-21D2-2663B0329C5E} = {583A77DF-A293-4F3E-AB96-7310BC495822}
|
{B20D7E75-1C19-632D-21D2-2663B0329C5E} = {583A77DF-A293-4F3E-AB96-7310BC495822}
|
||||||
{31C47198-DEC2-4073-A0C2-220549502CD1} = {583A77DF-A293-4F3E-AB96-7310BC495822}
|
{31C47198-DEC2-4073-A0C2-220549502CD1} = {583A77DF-A293-4F3E-AB96-7310BC495822}
|
||||||
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291} = {F3414823-B70E-435E-B4EA-80ABF4371449}
|
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291} = {F3414823-B70E-435E-B4EA-80ABF4371449}
|
||||||
|
{0C14CF80-D743-4809-9B9C-2A096FEA2E06} = {FA674B5A-3394-926C-2B1E-70E5B00E4A5C}
|
||||||
|
{9AE35B63-607E-4009-9FE6-3DF2CD98071F} = {F3414823-B70E-435E-B4EA-80ABF4371449}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {3CE42AE5-D79F-4E97-A246-AA8FD228B677}
|
SolutionGuid = {3CE42AE5-D79F-4E97-A246-AA8FD228B677}
|
||||||
|
|||||||
Reference in New Issue
Block a user