using Egw.Window.Data; using Microsoft.AspNetCore.Components; using Newtonsoft.Json; using System.Threading.Tasks; using WebWindowTest.Compo; using WebWindowTest.DTO; using WebWindowTest.Json; using WebWindowTest.Models; using WebWindowTest; using static WebWindowTest.Json.WindowConst; using static WebWindowTest.LayoutConst; namespace WebWindowTest { public partial class Test : IDisposable { #region Public Enums public enum DataReq { /// /// Nessuna richiesta /// None = 0, /// /// Richiesta hardware opzioni /// ReqHwOpt, /// /// Richiesta svg /// ReqSvg, /// /// Richiesta shape sash group /// ReqShape } #endregion Public Enums #region Public Properties /// /// Classe override css x SVG (x rescale) /// [Parameter] public string CssSvg { get; set; } = "responsive-svg"; /// /// Preselezione valori /// [Parameter] public SelectPayload? CurrSelection { get; set; } = null; /// /// Richiesta azione al parent /// [Parameter] public EventCallback EC_ActionReq { get; set; } /// /// Richiesta update da JWD (SVG, calcoli vari...) /// [Parameter] public EventCallback> EC_DoUpdate { get; set; } /// /// Richiesta chiusura JWD (+ refresh) /// se torna true --> richiesta salvataggio /// se torna false --> richiesta revert /// [Parameter] public EventCallback EC_OnClose { get; set; } /// /// Sollevo evento errore validazione con una lista di errori rilevati /// [Parameter] public EventCallback> EC_ValidError { get; set; } /// /// Elenco anagrafiche di base /// [Parameter] public BaseListPayload ListPayload { get; set; } = null!; /// /// Dati live controllo (JWD, SVG, ...) /// [Parameter] public LivePayload LiveData { get; set; } = null!; #endregion Public Properties #region Public Methods public void Dispose() { if (m_CurrWindow != null) { m_CurrWindow = null; } } #endregion Public Methods #region Protected Fields protected List currLoading = new List(); /// /// Dati live precedenti x comparazione /// protected LivePayload? prevLiveData = null; #endregion Protected Fields #region Protected Properties protected List FillList { get => m_FillList; } protected Frame FrameWindow { get => m_Frame!; set => m_Frame = value; } protected List ItemTableList { get => m_ItemTableList; } /// /// Componente SVG da mostrare /// protected MarkupString outSvg { get { // aggiunta gestione classe svg per posizionamento con costraints var newSvg = LiveData.SvgPreview.Replace(" SashList { get => m_SashList; } protected List SplittedList { get => m_SplittedList; } protected string SelColorMaterial { get; set; } = ""; protected string SelFamilyHardware { get; set; } = ""; protected string SelGlass { get; set; } = ""; protected string SelMaterial { get; set; } = ""!; protected string SelProfile { get; set; } = ""; protected List SplitList { get => m_SplitList; } #endregion Protected Properties #region Protected Methods /// /// Metodo per riempire la lista ItemTable in modo da poter rappresentarla come tabella /// /// Area da classificare /// numero di riga /// numero di colonna /// numero di riga massimo /// numero di colonna massimo protected void CreateElementTable(Area node, int row, int col, int maxRow, int maxCol) { if (node != null) { switch (node.AreaType) { case AreaTypes.FRAME: { if (node.AreaList.Count >= 1) ItemTableList.Add(new ItemTable(AreaTypes.FRAME, "FR", row, col, -1, node.AreaList.Count)); else ItemTableList.Add(new ItemTable(AreaTypes.FRAME, "FR", row, col, -1, 0)); row++; col++; maxRow++; maxCol++; break; } case AreaTypes.SASH: { string nWIndow; // Se ha fratelli if ((node.ParentArea.ParentArea != null && node.ParentArea.ParentArea.AreaList.Count > 1) || (node.ParentArea != null && node.ParentArea.AreaList.Count > 1)) { for (int i = 0; i < SashList.Count; i++) { if (SashList[i].Equals(node)) { nWIndow = SashList.Count == 1 ? "" : $"{i + 1}"; // Se il nodo ha figli, salvo il numero nell'oggetto if (node.AreaList.Count >= 1) ItemTableList.Add(new ItemTable(AreaTypes.SASH, "SG" + nWIndow, maxRow, col, i, node.AreaList.Count)); else ItemTableList.Add(new ItemTable(AreaTypes.SASH, "SG" + nWIndow, maxRow, col, i, 0)); } } maxCol++; } else { // Se il nodo ha figli, salvo il numero nell'oggetto if (node.AreaList.Count >= 1) ItemTableList.Add(new ItemTable(AreaTypes.SASH, "SG", row, col, 0, node.AreaList.Count)); else ItemTableList.Add(new ItemTable(AreaTypes.SASH, "SG", row, col, 0, 0)); maxCol++; } row++; col++; maxRow++; break; } case AreaTypes.FILL: { if ((node.ParentArea.AreaList.Count > 1 && node.ParentArea.AreaList.First().Equals(node)) || (node.ParentArea.ParentArea != null && node.ParentArea.ParentArea.AreaList.Count > 1 && node.ParentArea.ParentArea.AreaList.First().AreaList.First().Equals(node))) maxCol++; string nFill; for (int i = 0; i < FillList.Count; i++) { if (FillList[i].Equals(node)) { nFill = FillList.Count == 1 ? "" : $"{i + 1}"; ItemTableList.Add(new ItemTable(AreaTypes.FILL, "FL" + nFill, maxRow, col, i, 0)); break; } } row++; col++; maxRow++; break; } case AreaTypes.SPLIT: { // Se il nodo ha fratelli o cugini if (node.ParentArea.AreaList.Count > 1 || (node.ParentArea.ParentArea != null && node.ParentArea.ParentArea.AreaList.Count > 1)) { if (node.ParentArea.AreaList.First().Equals(node) || node.ParentArea.ParentArea.AreaList.First().Equals(node)) maxCol++; for (int i = 0; i < SplitList.Count; i++) { if (SplitList[i].Equals(node)) { string nSplit = SplitList.Count == 1 ? "" : $"{i + 1}"; if (node.AreaList.Count >= 1) ItemTableList.Add(new ItemTable(AreaTypes.SPLIT, "SP" + nSplit, maxRow, col, i, node.AreaList.Count)); else ItemTableList.Add(new ItemTable(AreaTypes.SPLIT, "SP" + nSplit, maxRow, col, i, 0)); } } } else { for (int i = 0; i < SplitList.Count; i++) { if (SplitList[i].Equals(node)) { string nSplit = SplitList.Count == 1 ? "" : $"{i + 1}"; if (node.AreaList.Count >= 1) ItemTableList.Add(new ItemTable(AreaTypes.SPLIT, "SP" + nSplit, row, col, i, node.AreaList.Count)); else ItemTableList.Add(new ItemTable(AreaTypes.SPLIT, "SP" + nSplit, row, col, i, 0)); maxCol++; } } } row++; col++; maxRow++; break; } case AreaTypes.SPLITTED: { break; } } foreach (var item in node.AreaList) { if (maxRow < m_maxRow) CreateElementTable(item, row, col, m_maxRow, maxCol); else CreateElementTable(item, row, col, maxRow, maxCol); } } if (maxCol > m_maxCol) { m_maxCol = maxCol; } if (maxRow > m_maxRow) { m_maxRow = maxRow; } } /// /// Metodo per riempire le liste Sash, Split, Splitted e Fill /// /// Area da classificare /// Parametro per sapere se si è dentro un'anta protected void CreateWindowsList(Area node, bool IntoSash) { if (node != null) { if (node.ParentArea is Sash || IntoSash == true) IntoSash = true; switch (node.AreaType) { case AreaTypes.FRAME: { FrameWindow = (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; } case AreaTypes.SPLITTED: { if (node.ParentArea is Split && !IntoSash && node.AreaList.First() is Fill) { m_SplittedList.Add((Splitted)node); } break; } } foreach (var item in node.AreaList) { CreateWindowsList(item, IntoSash); } } } /// /// Calcola CSS warning /// /// /// protected string cssValid(string fKey) { return listWarnings.ContainsKey(fKey) ? "border border-danger" : ""; } /// /// Richiesta chiusura SENZA salvataggio (= restore prev) /// /// protected async Task DoClose() { editLock = false; await EC_OnClose.InvokeAsync(false); } /// /// Richiesta update anteprima SVG /// /// Forza richiesta anche con JWD invariato /// Nasconde hw (def. false) poiché senza è piu rapido /// protected async Task DoPreviewSvg(bool doForce = false, bool hideHw = false) { if (m_CurrWindow != null) { #if DEBUG var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(false), Formatting.Indented); var CalcJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(hideHw), Formatting.Indented); #else var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(false)); var CalcJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(hideHw)); #endif // verifico variazione JWD if (!prevJwd.Equals(CurrJwd) || doForce || prevReq != (int)DataReq.ReqSvg) { prevJwd = CurrJwd; prevReq = (int)DataReq.ReqSvg; Dictionary Args = new Dictionary(); Args.Add("Mode", $"{(int)Enums.QuestionModes.PREVIEW}"); Args.Add("SerializedData", CalcJwd); await EC_DoUpdate.InvokeAsync(Args); } } } /// /// Richiesta calcolo Options HW /// /// Lista degli ID numerici dei gruppi da valutare /// protected async Task DoReqOptHardware(List groupIdList, bool isFirst = false) { if (m_CurrWindow != null) { loadListAdd("LoadHwOpt"); #if DEBUG var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(), Formatting.Indented); #else var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize()); #endif // verifico variazione JWD if (!prevJwd.Equals(CurrJwd) || isFirst || prevReq != (int)DataReq.ReqHwOpt) { prevJwd = CurrJwd; prevReq = (int)DataReq.ReqHwOpt; Dictionary Args = new Dictionary(); Args.Add("Mode", $"{(int)Enums.QuestionModes.HARDWARE}"); Args.Add("SubMode", $"{(int)Enums.QuestionHwSubModes.HARDWAREOPTIONS}"); Args.Add("SerializedData", CurrJwd); string listGroupId = JsonConvert.SerializeObject(groupIdList); Args.Add("GroupId", listGroupId); await EC_DoUpdate.InvokeAsync(Args); } } } /// /// Richiesta Shape compatibile da JWD /// /// Lista degli ID numerici dei gruppi da valutare /// protected async Task DoReqShape(List groupIdList) { if (m_CurrWindow != null) { #if DEBUG var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(), Formatting.Indented); #else var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize()); #endif // verifico variazione JWD if (!prevJwd.Equals(CurrJwd) || prevReq != (int)DataReq.ReqShape) //if (!prevLiveData.CurrJwd.Equals(CurrJwd)) { prevJwd = CurrJwd; prevReq = (int)DataReq.ReqShape; Dictionary Args = new Dictionary(); Args.Add("Mode", $"{(int)Enums.QuestionModes.HARDWARE}"); Args.Add("SubMode", $"{(int)Enums.QuestionHwSubModes.SASHSHAPE}"); Args.Add("SerializedData", CurrJwd); string listGroupId = JsonConvert.SerializeObject(groupIdList); Args.Add("GroupId", listGroupId); await EC_DoUpdate.InvokeAsync(Args); } } } /// /// Metodo di reset /// protected Task DoReset() { return Task.CompletedTask; // Da fare } /// /// Richiesta chiusura con salvataggio /// /// protected async Task DoSave() { editLock = false; //manca salvataggio JWD await EC_OnClose.InvokeAsync(true); } protected override void OnAfterRender(bool firstRender) { isRendered = true; } /// /// Primo init componente /// protected override void OnInitialized() { // reset editLock... editLock = false; listErrPre = new Dictionary(); listErrLink = new Dictionary(); listWarnings = new Dictionary(); } /// /// Gestione update post ricezione parametri da controllo chiamante /// protected override async Task OnParametersSetAsync() { isLoading = true; // SOLO SE sono presenti... if (ListPayload.IsPopulated() && LiveData.IsValid()) { bool updRequested = false; listErrPre = new Dictionary(); listErrLink = new Dictionary(); listWarnings = new Dictionary(); // controllo elenchi BasePayload siano validi... if (ListPayload.IsValid()) { // SOLO SE modificato live data... if (prevLiveData == null || !prevLiveData.Equals(LiveData)) { bool needDeser = prevLiveData == null || !prevLiveData.JwdEqual(LiveData); updRequested = true; prevLiveData = new LivePayload() { CurrJwd = LiveData.CurrJwd, DictOptionsXml = LiveData.DictOptionsXml, DictShape = LiveData.DictShape, SvgPreview = LiveData.SvgPreview }; // Aggiornati parametri di ingresso selezionati UpdateSelParameter(); // provo a deserializzare SE necessario if (needDeser) { JsonWindow WindowFromJson = new JsonWindow("", "", "", ""); try { WindowFromJson = JsonConvert.DeserializeObject(LiveData.CurrJwd, new PolymorphicJsonConverter()) ?? new JsonWindow("", "", "", ""); setCurrWindow(WindowFromJson); //SOLO SE non sono in edit... if (!editLock) { currStep = CompileStep.Tree; } } // altrimenti errore! catch (Exception ex) { listErrLink.Add("Window", $"Deserializing Error:{Environment.NewLine}{ex}"); // uso un oggetto "basico" per non fermarmi //string jwd = "{\r\n \"ProfilePath\": \"Profilo78\",\r\n \"Material\": \"Pino\",\r\n \"ColorMaterial\": \"Black\",\r\n \"Glass\": \"Vetro BE 2S 4T/16/4T\",\r\n \"AreaList\": [\r\n {\r\n \"Shape\": \"RECTANGLE\",\r\n \"DimensionList\": [\r\n {\r\n \"Index\": 1,\r\n \"Name\": \"Width\",\r\n \"Value\": 800.0\r\n },\r\n {\r\n \"Index\": 2,\r\n \"Name\": \"Height\",\r\n \"Value\": 1200.0\r\n }\r\n ],\r\n \"JointList\": [\r\n {\r\n \"Index\": 1,\r\n \"JointType\": \"FULL_H\"\r\n },\r\n {\r\n \"Index\": 2,\r\n \"JointType\": \"FULL_H\"\r\n },\r\n {\r\n \"Index\": 3,\r\n \"JointType\": \"FULL_H\"\r\n },\r\n {\r\n \"Index\": 4,\r\n \"JointType\": \"FULL_H\"\r\n }\r\n ],\r\n \"BottomRail\": false,\r\n \"BottomRailQty\": 0,\r\n \"GroupId\": 1,\r\n \"AreaList\": [\r\n {\r\n \"FillType\": \"GLASS\",\r\n \"GroupId\": 7,\r\n \"AreaList\": [],\r\n \"AreaType\": \"FILL\"\r\n }\r\n ],\r\n \"AreaType\": \"FRAME\"\r\n }\r\n ]\r\n}"; //WindowFromJson = JsonConvert.DeserializeObject(jwd, new PolymorphicJsonConverter()) ?? new JsonWindow("", "", "", ""); //setCurrWindow(WindowFromJson); //await DoPreviewSvg(true); Window window = new Window(); Frame frame = new Frame(null, window); List DimensionList = new List { new FrameDimension(frame, 1, "Width", 800, false), new FrameDimension(frame, 1, "Height", 1200, true) }; List JointList = new List { new Joint(frame, 1, Joints.FULL_H), new Joint(frame, 2, Joints.FULL_H), new Joint(frame, 3, Joints.FULL_H), new Joint(frame, 4, Joints.FULL_H) }; //FrameArcElement ae = new FrameArcElement(frame, window, 10, true, true); JsonWindow jsonWindow = new JsonWindow("Profilo78", "Pino", "Black", "Vetro BE 2S 4T/16/4T"); JsonFrame jsonFrame = new JsonFrame(Shapes.RECTANGLE, null, false, 0, 1); jsonWindow.AreaList.Add(jsonFrame); //jsonFrame.ArcElement = ae.Serialize(); foreach (var Dimension in DimensionList) jsonFrame.DimensionList.Add(Dimension.Serialize()); foreach (var Joint in JointList) jsonFrame.JointList.Add(Joint.Serialize()); jsonFrame.AreaList.Add(Fill.CreateFill(frame, FillTypes.GLASS).Serialize(true)); string jwd = JsonConvert.SerializeObject(jsonWindow); WindowFromJson = JsonConvert.DeserializeObject(jwd, new PolymorphicJsonConverter()) ?? new JsonWindow("", "", "", ""); setCurrWindow(WindowFromJson); await DoPreviewSvg(true); } } else { // usando m_currWindow (preesistente) impostare i parametri... UpdateDict(); } } checkWarnings(); if (SashList.Count > 0) { currAntaIndex = 0; } if (updRequested) { // se mancasse dizionario forme chiamo quello if (LiveData.DictShape.Count == 0 && listErrLink.Count == 0) { if (firstDisplay && isRendered) { firstDisplay = false; // preview SVG senza HW await DoPreviewSvg(true, true); } List reqList = SashList.Select(x => x.GroupId).ToList(); if (reqList.Count > 0) { //prevReq = (int)DataReq.ReqShape; await DoReqShape(reqList); } } else { // chiedo SVG //prevReq = (int)DataReq.ReqSvg; if (prevReq != (int)DataReq.ReqSvg || !prevLiveData.JwdEqual(LiveData.CurrJwd)) { if (prevReq != (int)DataReq.ReqHwOpt) await DoPreviewSvg(true); else if (LiveData.DictOptionsXml.Count > 0) await DoPreviewSvg(true); } } } } else { checkErrorPre(); } isLoading = false; } } /// /// Metodo per costruire oggetti della Window /// /// protected void setCurrWindow(JsonWindow WindowFromJson) { if (m_CurrWindow != null) { m_CurrWindow = null; } m_CurrWindow = WindowFromJson.Deserialize(); FrameWindow = m_CurrWindow.AreaList[0]; if (m_PreviousWindow != null) { for (int i = 0; i < 2; i++) m_CurrWindow.AreaList.First().DimensionList[i].dDimension = m_PreviousWindow.AreaList.First().DimensionList[i].dDimension; if (m_CurrWindow.AreaList.First().Shape == Shapes.TRIANGLE) { for (int i = 0; i < 2; i++) m_CurrWindow.AreaList.First().JointList[i].SetSelJointType(m_PreviousWindow.AreaList.First().JointList[i].SelJointType); } else { for (int i = 0; i < 4; i++) m_CurrWindow.AreaList.First().JointList[i].SetSelJointType(m_PreviousWindow.AreaList.First().JointList[i].SelJointType); } } if (m_CurrWindow != null) { // Aggiornamento liste sash, split, splitted, fill e itemTable UpdateLists(); } if (SashList.Count > 0) currAntaIndex = 0; // Aggiorno window con dati shape e hw option UpdateDict(); } /// /// Aggiornamento dei dati con informazioni ricevute dai dizionari /// protected void UpdateDict() { // se ho i dizionari delle forme le aggiungo if (LiveData.DictShape.Count > 0) { // Inserisco le forme ricevuto nei sash group foreach (var item in LiveData.DictShape) { Sash sashFromGroupId = SashList.First(x => x.GroupId == item.Key); sashFromGroupId.SashShape = item.Value; sashFromGroupId.UpdateShape(item.Value); } if (prevReq == (int)DataReq.ReqShape) { if (reqHwOpt > 0) { List reqList = SashList.Select(x => x.GroupId).ToList(); _ = DoReqOptHardware(reqList); } } } // se ho le opzioni hw le aggiungo if (LiveData.DictOptionsXml.Count > 0) { loadListRem("LoadHwOpt"); foreach (var item in SashList) { if (LiveData.DictOptionsXml.ContainsKey(item.GroupId)) { item.SetHardwareOption(LiveData.DictOptionsXml[item.GroupId]); } } } } /// /// Metodo che resetta le liste (sash, split, splitted, fill e itemTable) e le crea nuovamente /// protected void UpdateLists() { m_maxCol = 0; m_maxRow = 0; m_FillList = new List(); m_SashList = new List(); m_SplitList = new List(); m_SplittedList = new List(); m_ItemTableList = new List(); CreateWindowsList((m_CurrWindow!).AreaList.First(), false); CreateElementTable(m_CurrWindow.AreaList.First(), 1, 1, 1, 1); } /// /// Metodo per settare i parmateri di ingresso selezionati /// protected void UpdateSelParameter() { Frame.m_AllThresholdList = ListPayload.Threshold; Sash.m_HardwareCompleteList = ListPayload.Hardware; Sash.s_FamilyHardwareList = ListPayload.FamilyHardware; if (CurrSelection != null && CurrSelection.IsValid()) { SelFamilyHardware = CurrSelection.FamilyHardware ?? ""; SelColorMaterial = CurrSelection.ColorMaterial ?? ""; SelMaterial = CurrSelection.Material ?? ""; SelGlass = CurrSelection.Glass ?? ""; SelProfile = CurrSelection.Profile ?? ""; } } #endregion Protected Methods #region Private Fields private int currAntaIndex = 0; private int currFillIndex = -1; private int currSashIndex = -1; private int currSplitIndex = -1; private CompileStep currStep; private bool editLock = false; private bool firstDisplay = true; /// /// Booleana fase loading /// private bool isLoading = false; private bool isRendered = false; /// /// ELenco errori di coerenza/link dati (vanno risolti per disegnare/procedere) /// private Dictionary listErrLink = new Dictionary(); /// /// Elenco errori preliminari (mancano elementi di base di validazione modello dati)) /// private Dictionary listErrPre = new Dictionary(); /// /// Elenco warnings non bloccanti /// private Dictionary listWarnings = new Dictionary(); private List m_FillList = new List(); private Frame? m_Frame; private List m_ItemTableList = new List(); private int m_maxCol = 0; private int m_maxRow = 0; private List m_SashList = new List(); private List m_SplitList = new List(); private List m_SplittedList = new List(); #endregion Private Fields #region Private Properties private Window? m_CurrWindow { get; set; } = null; private Window? m_PreviousWindow { get; set; } = null; /// /// Salvataggio JWD precedente x evitare loop su update (aggiornato dopo chiamate redis) /// private string prevJwd { get; set; } = ""; /// /// Salvataggio tipo di domanda precedente /// private int prevReq { get; set; } = 0; private int reqHwOpt { get; set; } = 0; #endregion Private Properties #region Private Methods /// /// Metodo per andare allo step successivo /// /// step successivo private void AdvStep(CompileStep newStep) { currStep = newStep; currSashIndex = -1; currFillIndex = -1; currSplitIndex = -1; } /// /// Verifica errori prelimionari per mostrare dove sia il problema /// private void checkErrorPre() { // verifico 1:1 le liste e indico cosa manca if (ListPayload.Hardware == null || ListPayload.Hardware.Count == 0) { listErrPre.Add("Hardware", "Missing Hardware List!"); } else { if (ListPayload.FamilyHardware == null || ListPayload.FamilyHardware.Count == 0) { listErrPre.Add("FamilyHardware", "Missing Family HW List!"); } } if (ListPayload.Glass == null || ListPayload.Glass.Count == 0) { listErrPre.Add("Glass", "Missing Glass List!"); } if (ListPayload.Material == null || ListPayload.Material.Count == 0) { listErrPre.Add("Material", "Missing Material List!"); } if (ListPayload.ColorMaterial == null || ListPayload.ColorMaterial.Count == 0) { listErrPre.Add("ColorMaterial", "Missing ColorMaterial List!"); } if (ListPayload.Profile == null || ListPayload.Profile.Count == 0) { listErrPre.Add("Profile", "Missing Profile List!"); } } /// /// Verifica warning minori (es coerenza colori...) /// private void checkWarnings() { // verifico 1:1 le liste e i valori siano coerenti... if (ListPayload.ColorMaterial != null && ListPayload.ColorMaterial.Count > 0) { // verifico colore attuale sia consistente... if (m_CurrWindow != null) { if (!ListPayload.ColorMaterial.Contains(m_CurrWindow.sColorMaterial)) { listWarnings.Add("ColorMaterial", $"Missing Color: {m_CurrWindow.sColorMaterial}"); } if (!ListPayload.Glass.Contains(m_CurrWindow.sGlass)) { listWarnings.Add("Glass", $"Missing Glass: {m_CurrWindow.sGlass}"); } if (!ListPayload.Material.Contains(m_CurrWindow.sMaterial)) { listWarnings.Add("Material", $"Missing Material: {m_CurrWindow.sMaterial}"); } if (!ListPayload.Profile.Contains(m_CurrWindow.sProfilePath)) { listWarnings.Add("Profile", $"Missing Profile: {m_CurrWindow.sProfilePath}"); } } } } /// /// Helper aggiunta elemento a lista caricamento /// /// private void loadListAdd(string loadCode) { if (!currLoading.Contains(loadCode)) { currLoading.Add(loadCode); } } /// /// Helper rimozione elemento a lista caricamento /// /// private void loadListRem(string loadCode) { if (currLoading.Contains(loadCode)) { currLoading.Remove(loadCode); } } /// /// Metodo per cambiare step /// /// step successivo private void NextStep(CompileStep newStep, int Index = 1) { editLock = true; currStep = newStep; switch (newStep) { case CompileStep.Sash: { currSashIndex = Index; currFillIndex = -1; currSplitIndex = -1; break; } case CompileStep.Fill: { currFillIndex = Index; currSashIndex = -1; currSplitIndex = -1; break; } case CompileStep.Split: { currSplitIndex = Index; currSashIndex = -1; currFillIndex = -1; break; } } } /// /// Metodo per cambiare step /// /// private void NextStepArgs(DataNextStep Args) { CompileStep newStep = Args.currCompileStep; int Index = Args.index; NextStep(newStep, Index); } /// /// Richiesta reset dizionario Shape con action /// /// private async Task ReqResetDict(DataUpdateRes args) { await EC_ActionReq.InvokeAsync(args.req); } /// /// Ritorno step Tree /// /// private void ReturnTree(bool args) { AdvStep(CompileStep.Tree); } private Area SearchArea(Area currentArea, int idSearch, Area itemSearch) { if (currentArea.GroupId == idSearch && currentArea.AreaType.Equals(itemSearch.AreaType)) { return currentArea; } foreach (Area child in currentArea.AreaList) { Area found = SearchArea(child, idSearch, itemSearch); if (found != null) { return found; } } return null; } /// /// Calcola il css del tab selezionato /// /// Step /// private string tabNavCss(CompileStep testStep, int Index = -1) { if (testStep == CompileStep.Sash) { if ((currSashIndex == 0 && Index == 0) || (currSashIndex == 1 && Index == 1)) return "nav-link active fw-bold"; else return "nav-link text-secondary"; } else if (testStep == CompileStep.Fill) { if ((currFillIndex == 0 && Index == 0) || (currFillIndex == 1 && Index == 1)) return "nav-link active fw-bold"; else return "nav-link text-secondary"; } else if (testStep == CompileStep.Split) { if ((currSplitIndex == 0 && Index == 0) || (currSplitIndex == 1 && Index == 1)) return "nav-link active fw-bold"; else return "nav-link text-secondary"; } return (testStep == currStep) ? "nav-link active fw-bold" : "nav-link text-secondary"; } /// /// Metodo per cambiare tutti i Fill e richiedere aggiornamento SVG /// /// tipo di fill richiesto /// protected async Task ChangeAllFill(FillTypes reqFillType) { updateAllFill(FrameWindow, reqFillType); await DoPreviewSvg(); } /// /// Metodo per aggiornare tutti i Fill al nuovo tipo /// /// area corrente /// tipo a cui aggiornare private void updateAllFill(Area area, FillTypes type) { if (area.AreaType.Equals(AreaTypes.FILL)) { Fill fill = (Fill)area; fill.SetSelFillType(type); return; } foreach (Area child in area.AreaList) { updateAllFill(child, type); } } /// /// Aggiornamento Fill /// /// Fill da aggiornare /// private async Task UpdatePreviewFill(Fill newFill) { if (newFill != null) { // cerco il record var currRec = (Fill)SearchArea(FrameWindow, newFill.GroupId, newFill); // lo aggiorno currRec = newFill; await DoPreviewSvg(); } } /// /// Aggiornamento Frame /// /// nuovo frame /// private async Task UpdatePreviewFrame(DataUpdateFrame args) { Frame newFrame = args.currFrame; bool forceSvgNoHw = args.svgNoHw; if (newFrame != null) { // cerco il record var currRec = m_CurrWindow.AreaList.FirstOrDefault(x => x.GroupId == newFrame.GroupId); // lo aggiorno currRec = newFrame; if (forceSvgNoHw) await DoPreviewSvg(true, true); else await DoPreviewSvg(); } } /// /// Aggiornamento opzioni dato nuovo frame /// /// nuovo frame /// private async Task UpdateHwOptionsFrame(Frame newFrame) { if (newFrame != null) { // cerco il record var currRec = m_CurrWindow.AreaList.FirstOrDefault(x => x.GroupId == newFrame.GroupId); // lo aggiorno currRec = newFrame; // resetto hw lst await EC_ActionReq.InvokeAsync(DataAction.ResetHwOpt); reqHwOpt++; if (prevReq == (int)DataReq.ReqShape) { // richiesta calcolo opzioni hardware per la singola sash group List reqList = SashList.Select(x => x.GroupId).ToList(); // chiamo con gruppo della nuova sash await DoReqOptHardware(reqList); } } } /// /// Aggiornamento opzioni data nuova sash group /// /// nuovo frame /// private async Task UpdateHwOptionsSash(Sash newSash) { if (newSash != null) { // cerco il record var currRec = SearchArea(FrameWindow, newSash.GroupId, newSash); // lo aggiorno currRec = newSash; // resetto hw lst await EC_ActionReq.InvokeAsync(DataAction.ResetHwOpt); //reqHwOpt++; //if(prevReq == (int)DataReq.ReqShape) //{ // richiesta calcolo opzioni hardware per la singola sash group List reqList = SashList.Select(x => x.GroupId).ToList(); // chiamo con gruppo della nuova sash await DoReqOptHardware(reqList); //} } } /// /// Richiesta opzioni hardware per la prima volta /// /// nuovo frame /// private async Task ReqFirstOptionHw(Sash newSash) { if (newSash != null) { // cerco il record var currRec = SearchArea(FrameWindow, newSash.GroupId, newSash); // lo aggiorno currRec = newSash; // resetto hw lst await EC_ActionReq.InvokeAsync(DataAction.ResetHwOpt); // richiesta calcolo opzioni hardware per la singola sash group List reqList = SashList.Select(x => x.GroupId).ToList(); // chiamo con gruppo della nuova sash await DoReqOptHardware(reqList); } } /// /// Aggiornamento Frame /// /// nuovo frame /// private async Task UpdatePreviewSplit(DataUpdateSplit args) { Split newSplit = args.currSplit; bool forceSvgNoHw = args.svgNoHw; bool noSvg = args.noSvg; if (newSplit != null) { // cerco il record var currRec = SearchArea(FrameWindow, newSplit.GroupId, newSplit); // lo aggiorno currRec = newSplit; if (!noSvg) { if (forceSvgNoHw) await DoPreviewSvg(true, true); else await DoPreviewSvg(); } } } /// /// Metodo per aggiornare Splitted /// /// Splitted da aggiornare /// private async Task UpdatePreviewSplitted(Splitted currSplitted) { if (currSplitted != null) { var item = SearchArea(FrameWindow, currSplitted.GroupId, currSplitted); item = currSplitted; // ricalcolo liste UpdateLists(); // richiedo update shape List reqList = SashList.Select(x => x.GroupId).ToList(); await DoPreviewSvg(); await DoReqShape(reqList); } } /// /// Aggiornamento opzioni dato update sash /// /// nuova sash /// private async Task UpdatePreviewSashGroup(DataUpdateSash args) { Sash newSash = args.currSash; bool svgNoHw = args.svgNoHw; bool noSvg = args.noSvg; if (svgNoHw) { Sash item = (Sash)SearchArea(FrameWindow, newSash.GroupId, newSash); if (newSash != null && item != null) { item = newSash; await DoPreviewSvg(true, true); } } else { Sash item = (Sash)SearchArea(FrameWindow, newSash.GroupId, newSash); if (newSash != null && item != null) { item = newSash; if (!noSvg) await DoPreviewSvg(); } } } /// /// Calcola bottone per tutti i Fill /// /// private string buttonFillCss(FillTypes reqFillTypes) { foreach (var fill in FillList) { if (!fill.FillType.Equals(reqFillTypes)) return "btn btn-outline-secondary btn-sm"; } return "btn btn-secondary btn-sm"; } #endregion Private Methods } }