Files
webwindowconfigurator/WebWindowJWD/WebWindowJWDInput.razor.cs
2025-08-18 17:37:33 +02:00

251 lines
7.0 KiB
C#

using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using System.Collections.ObjectModel;
using System.Reflection.Metadata;
using System.Runtime.Intrinsics.X86;
using System.Text.Json.Serialization;
using WebWindowJWD.DTO;
using WebWindowJWD.Json;
using static WebWindowJWD.Json.WindowConst;
namespace WebWindowJWD
{
public partial class WebWindowJWDInput : IDisposable
{
#region Public Properties
[Parameter]
public string CssSvg { get; set; } = "responsive-svg";
[Parameter]
public string CurrJwd
{
get => m_CurrJwd;
set
{
if (m_CurrJwd != value)
{
m_CurrJwd = value;
JsonWindow WindowFromJson = JsonConvert.DeserializeObject<JsonWindow>(m_CurrJwd, new PolymorphicJsonConverter()) ?? new JsonWindow("");
if (m_CurrWindow != null)
{
m_CurrWindow.OnPreview -= M_CurrWindow_OnPreview;
m_CurrWindow = null;
}
m_CurrWindow = WindowFromJson.Deserialize();
m_CurrWindow.OnPreview += M_CurrWindow_OnPreview;
m_FillList = new List<Fill>();
m_SashList = new List<Sash>();
m_SplitList = new List<Split>();
SearchInAreaList(m_CurrWindow.AreaList[0]);
Dictionary<string,string> Args = new Dictionary<string,string>();
Args.Add("Jwd", m_CurrJwd);
Args.Add("Mode", 1.ToString());
EC_OnUpdate.InvokeAsync(Args);
}
if (m_CurrWindow != null)
{
m_FillList = new List<Fill>();
m_SashList = new List<Sash>();
m_SplitList = new List<Split>();
SearchInAreaList(m_CurrWindow.AreaList[0]);
}
}
}
[Parameter]
public EventCallback<bool> EC_OnClose { get; set; }
[Parameter]
public EventCallback<Dictionary<string,string>> EC_OnUpdate { get; set; }
public List<Fill> FillList
{
get => m_FillList;
}
[Parameter]
public string LiveSVG
{
get => m_SelSVG;
set => m_SelSVG = value;
}
#endregion Public Properties
#region Public Methods
public void Dispose()
{
if (m_CurrWindow != null)
{
m_CurrWindow.OnPreview -= M_CurrWindow_OnPreview;
m_CurrWindow = null;
}
}
#endregion Public Methods
#region Protected Enums
protected enum CompileStep
{
Frame = 0,
Split = 1,
Sash,
Fill
}
#endregion Protected Enums
#region Protected Properties
protected Frame Frame
{
get => m_Frame;
set => m_Frame = value;
}
protected string m_CurrJwd { get; set; }
protected string m_SelSVG { get; set; } = "";
/// <summary>
/// Componente SVG da mostrare
/// </summary>
protected MarkupString outSvg
{
get
{
// aggiunta gestione classe svg per posizionamento con costraints
var newSvg = LiveSVG.Replace("<svg", $"<svg class=\"{CssSvg}\"");
return (MarkupString)newSvg;
}
}
protected List<Sash> SashList
{
get => m_SashList;
}
protected List<Split> SplitList
{
get => m_SplitList;
}
#endregion Protected Properties
#region Protected Methods
protected async Task DoClose()
{
await EC_OnClose.InvokeAsync(true);
}
protected async Task DoPreviewSvg()
{
if(m_CurrWindow != null)
{
var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(), Formatting.Indented);
Dictionary<string, string> Args = new Dictionary<string, string>();
Args.Add("Jwd", CurrJwd);
Args.Add("Mode", 1.ToString());
await EC_OnUpdate.InvokeAsync(Args);
}
}
protected async Task DoSave()
{
//manca salvataggio JWD
await EC_OnClose.InvokeAsync(true);
}
protected async void DoSelectAndPreview(CompileStep newStep)
{
currStep = newStep;
await DoPreviewSvg();
}
protected void SearchInAreaList(Area node)
{
if (node != null)
{
switch (node.AreaType)
{
case AreaTypes.FRAME:
{
m_Frame = (Frame)node;
break;
}
case AreaTypes.SASH:
{
m_SashList.Add((Sash)node);
break;
}
case AreaTypes.FILL:
{
m_FillList.Add((Fill)node);
break;
}
case AreaTypes.SPLIT:
{
m_SplitList.Add((Split)node);
break;
}
}
foreach (var item in node.AreaList)
{
SearchInAreaList(item);
}
}
}
#endregion Protected Methods
#region Private Fields
private CompileStep currStep = CompileStep.Frame;
private List<Fill> m_FillList = new List<Fill>();
private Frame m_Frame;
private List<Sash> m_SashList = new List<Sash>();
private List<Split> m_SplitList = new List<Split>();
#endregion Private Fields
#region Private Properties
private Window? m_CurrWindow { get; set; } = null;
#endregion Private Properties
#region Private Methods
private void AdvStep(CompileStep newStep)
{
currStep = newStep;
}
private void M_CurrWindow_OnPreview(object? sender, OnPreviewEventArgs e)
{
Dictionary<string, string> Args = new Dictionary<string, string>();
Args.Add("Jwd", e.sJwd);
Args.Add("Mode", 1.ToString());
EC_OnUpdate.InvokeAsync(Args);
}
/// <summary>
/// Calcola il css del tab selezionato
/// </summary>
/// <param name="testStep"></param>
/// <returns></returns>
private string tabNavCss(CompileStep testStep)
{
return testStep.Equals(currStep) ? "nav-link active fw-bold" : "nav-link text-secondary";
}
#endregion Private Methods
}
}