using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class Preference : MonoBehaviour { // Conteneurs de boutons : chaque enfant porte un Toggle, on lit celui qui est coche. // Reference publique = branchement dans l'inspecteur (aucun autre script ne lit ces champs). public GameObject StyleContainer; public GameObject DoorContainer; public GameObject CounterTopContainer; public GameObject ColorRoomContainer; public GameObject FloorContainer; public GameObject WallsCabsdContainer;// ISLAND est lu par IslandKey(), plus par un champ de l'inspecteur public GameObject OptionContainer; public GameObject FinishApliancesContainer; // FINISHCOLORS/SELECTION APPLIANCES public GameObject FinishSinkFaucetContainer; // FINISHCOLORS/SELECTION SINKFAUCET public GameObject FinishKnobsContainer; // FINISHCOLORS/SELECTION KNOBS //Budget public Slider BudgetSlider; public TMP_Text Budget; //Colors public GameObject CounterTopColors; public GameObject FloorColor; public GameObject DoorColors;// DOORSTYLE/COLORS DOOR, retrouve tout seul s'il n'est pas branche //--------------------------PANNEAUX---------------------------------------- public void Style() { _G.Style.Clear(); AddTo_G(_G.Style,StyleContainer); } public void DoorModel() { _G.DoorModel.Clear(); AddTo_G(_G.DoorModel,DoorContainer); // Couleur retenue dans DOORSTYLE/COLORS DOOR : on ajoute son nom (Blanc, Brun...) au // modele. Sans bouton coche la teinte vient du slider, on retombe alors sur l'hexa. Transform ColorTog=SelectedToggle(DoorColorsContainer()); if(ColorTog!=null)_G.DoorModel.Add(Label(ColorTog.name)); else if(_G.PATH=="free")ColorAddTo_G(_G.DoorModel,DoorContainer); } // COLORS DOOR n'est affiche que pour certaines bannieres : on prend la reference de // l'inspecteur si elle est branchee, sinon on va la chercher dans le panneau ouvert. GameObject DoorColorsContainer() { return DoorColors!=null?DoorColors:Get.o2("Canvas/DOORSTYLE","COLORS DOOR"); } public void CounterTop() { Transform Model=SelectedToggle(CounterTopContainer); Transform ColorTog=SelectedToggle(CounterTopColors); string ModelName=Model!=null?Model.name:""; string ColorHex=BackgroundHEX(ColorTog); _G.CounterTop=ModelName+"?"+ColorHex+"?676666?676666?1-1?0?1?0.5?0.3?0";//"COUN.1?F6F6F6?F6F6F6?F6F6F6?1-1?0?1?0.5?0.3?0" _G.CounterTopName=CounterTopSummary(Model,ColorTog,ColorHex); print("_G.CounterTop===="+_G.CounterTop+" =="+_G.CounterTopName);//_G.CounterTop====T_COUNTERTOP5?F7FBFD?F6F6F6?F6F6F6?1-1?0?1?0.5?0.3?0 } // "CERA.8?F7FBFD?..." ne dit rien au cuisiniste : on garde en parallele le choix en clair // "Categorie / Couleur" (ex: "Ceramique rustique / Blanc") pour le sommaire du courriel. static string CounterTopSummary(Transform Model,Transform ColorTog,string ColorHex) { string Category=ButtonLabel(Model); string ColorName=ColorTog!=null?Label(ColorTog.name):"";// les boutons s'appellent T_White, T_Scotch... if(ColorName=="" && ColorHex!="")ColorName="#"+ColorHex;// couleur prise au nuancier, hors boutons if(Category=="")return ColorName; if(ColorName=="")return Category; return Category+" / "+ColorName; } // Le libelle lisible d'un bouton est porte par son enfant T_xxx / O_xxx, pas par son nom : // COUN.15 sert a T_COUNTERTOP3 (Marbre) et T_COUNTERTOP5 (Quartz), "Cabinet height" a O_WallCab36. static string ButtonLabel(Transform Select) { if(Select==null)return ""; foreach(Transform Child in Select) { if(Child.name.StartsWith("T_") || Child.name.StartsWith("O_"))return Label(Child.name); } return Select.name; } // TRANS.Safe : la cle peut manquer dans _T (le bouton T_Grey par exemple), // on retombe alors sur le nom du bouton prive de son prefixe. static string Label(string Key) => TRANS.Safe(Key); public void RoomColor() { _G.RoomColor.Clear(); AddTo_G(_G.RoomColor,ColorRoomContainer); string Hex=BackgroundHEX(SelectedToggle(ColorRoomContainer)); if(Hex!="")_G.Wallcolor=Hex; } public void FloorStyle() { _G.FloorStyle.Clear(); AddTo_G(_G.FloorStyle,FloorContainer); AddTo_G(_G.FloorStyle,FloorColor); // La couleur est relue dans son propre conteneur : plus de variable statique partagee entre les panneaux. string ColorName=SelectedName(FloorColor); if(ColorName==null || !_G.DictionaryColorList.TryGetValue(ColorName,out string FloorColorHex))FloorColorHex="FFFFFF"; string FloorName=SelectedName(FloorContainer); if(FloorName==null || !_G.DictionaryFloorList.TryGetValue(FloorName,out string FloortextureName))return; _G.FLCs = DOIT.ChangeCodeOnPos(_G.FLCs, 0, FloortextureName, ","); _G.FLCs = DOIT.ChangeCodeOnPos(_G.FLCs, 1, FloorColorHex, ","); } public void FinishColors() { AddSelectionToPreference("ApliancesColor",FinishApliancesContainer); AddSelectionToPreference("SinkFaucetColor",FinishSinkFaucetContainer); AddSelectionToPreference("KnobsColor",FinishKnobsContainer); } public void Island() { _G.Island=IslandKey() ?? ""; print("_G.Island=="+_G.Island); } // Combinaison choisie dans ISLAND : null (rien de coche), "None", "Island", "Island-Sink", // "PeninsuleL-Stool-Sink-Cooktop"... Sert a la fois de valeur du sommaire (_G.Island) // et de nom de l'image affichee dans ISLAND/Show. public static string IslandKey() { string Base=Get.TogSelectedName(Get.o2("ISLAND","Selection1")); if(Base==null)return null; if(Base=="None")return "None"; string Key=ImgName(Base); GameObject Options=Get.o2("ISLAND","Selection2"); if(Options!=null) { foreach(Transform Select in Options.transform) { if(Get.TogIsOn(Select))Key+="-"+ImgName(Select.name);// ordre des boutons dans Selection2 } } return Key; } // Nom de fichier attendu pour chaque bouton : les GameObjects s'appellent // None / Island / Peninsule / Peninsule L et STOOL / SINK / COOKTOP. static string ImgName(string ButtonName) { switch (ButtonName) { case "STOOL":return "Stool"; case "SINK":return "Sink"; case "COOKTOP":return "Cooktop"; } return ButtonName; } public void WallToAddCab() { _G.WallsCabs.Clear(); AddTo_G_WallNumber(_G.WallsCabs,WallsCabsdContainer); } public void Options() { // _G.Options garde les noms bruts des boutons (le logiciel les relit dans le XML), // _G.OptionsName la meme liste en clair pour le sommaire du courriel. _G.Options=[]; _G.OptionsName=[]; if(OptionContainer==null)return; foreach(Transform Select in OptionContainer.transform) { if(!IsOn(Select))continue; _G.Options.Add(Select.name); _G.OptionsName.Add(ButtonLabel(Select)); } } public void SetBudget() { Budget.text = (BudgetSlider.value*2500).ToString()+" $"; _G.addOBJ = Budget.text; } //--------------------------LECTURE DES BOUTONS---------------------------------------- // Un bouton compte s'il est coche ET affiche : activeSelf, pas activeInHierarchy, car // certains conteneurs (COLORS FLOOR, COLORS COUNTERTOP) sont desactives en entier. // L'implementation est dans Get, partagee avec Measure. static bool IsOn(Transform Select) => Get.TogIsOn(Select); static Transform SelectedToggle(GameObject Container) => Get.TogSelected(Container); static string SelectedName(GameObject Container) => Get.TogSelectedName(Container); // Couleur affichee par la vignette "Background" du bouton, en hexa. static string BackgroundHEX(Transform Select) { if(Select==null)return ""; Transform Bg=Select.Find("Background"); if(Bg==null || !Bg.TryGetComponent(out Image Img))return ""; return ColorUtility.ToHtmlStringRGB(Img.color); } //--------------------------REMPLISSAGE DE _G---------------------------------------- void AddSelectionToPreference(string KeyName,GameObject Container) { string Name=SelectedName(Container); if(Name==null)return; _G.PreferencesList[KeyName]=Name;// indexeur : Add() leverait si on repasse dans le panneau } // static string ColorHEX(string coloname) // { // switch (coloname.Replace("T_",""))// les boutons s'appellent T_Grey, T_Black, T_White, T_Gold, T_Coper // { // case "Grey":return "333333"; // case "Black":return "888888"; // case "White":return "ffffff"; // case "Gold":return "EAB972"; // case "Coper": // case "Copper":return "EAB972"; // } // return ""; // } void AddTo_G(List list,GameObject Container) { if(Container==null)return; foreach(Transform Select in Container.transform) { if(IsOn(Select))list.Add(TRANS.This(Select.name)); } } void ColorAddTo_G(List list,GameObject Container) { if(Container==null)return; foreach(Transform Select in Container.transform) { if(IsOn(Select))list.Add(BackgroundHEX(Select)); } } void AddTo_G_WallNumber(List list,GameObject Container) { // On regroupe les sections cochees par mur : mur 4 avec sections 1 et 2 => "4_1,2". if(Container==null)return; List wallOrder = []; // ordre d'apparition des murs Dictionary> sections = []; // mur -> liste des sections cochees foreach(Transform Select in Container.transform) { if(!IsOn(Select))continue; // Boutons nommes "w4" (mur sans obstacle) ou "w4-1" (section) : on retire le prefixe "w". string id = Select.name; if (id.Length > 0 && (id[0] == 'w' || id[0] == 'W')) id = id[1..]; int dash = id.IndexOf('-'); string wall = dash >= 0 ? id[..dash] : id; // "4" string sec = dash >= 0 ? id[(dash + 1)..] : null; // "1" ou null (mur sans obstacle) if (!sections.ContainsKey(wall)) { sections[wall] = new(); wallOrder.Add(wall); } if (sec != null && !sections[wall].Contains(sec)) sections[wall].Add(sec); } foreach(string wall in wallOrder) { List secs = sections[wall]; list.Add(secs.Count > 0 ? wall + "_" + string.Join(",", secs) : wall); } } }