using System.Collections.Generic; using TMPro; using UnityEngine; using System.Globalization; using System.Text; using Unity.VisualScripting; public class StoreSelection : MonoBehaviour { //private static TMP_Dropdown _TownSelection; //private static TMP_Dropdown _AddressSelection; public TMP_Dropdown _Town; public TMP_Dropdown _Address; public TMP_Text _StoreShow; public TMP_Text _MessageAbout; public TMP_InputField _TownFind; public static void SetPnl() { if(_P.ListSwitch["STORE_SELECTION"]){ Get.o2("HIDER","StoreSelection").SetActive(true); GameObject TownFieldSeach=Get.o2("HIDER/StoreSelection","TownFind"); GameObject PostalCodeSeach=Get.o2("HIDER/StoreSelection","POSTAL_CODE"); TownFieldSeach.GetComponent().text = null; //ShowAllTown(); //Hide language Set.alpha(Get.o2("Canvas","Language"),false); Get.o2("HIDER/StoreSelection/TownFind/Text Area","Placeholder").GetComponent().text = TRANS.This("F_Type town"); //Postal Code option PostalCodeSeach.SetActive(Get.PreferenceBool("SEARCH_BY_POSTALCODE")); //Set All off Get.o2("HIDER/StoreSelection","btnOK").SetActive(false); Get.o2("HIDER/StoreSelection","ShowStore").GetComponent().text=""; GameObject TownSelector = Get.o2("HIDER/StoreSelection/Dropdown","TownSelector"); TownSelector.GetComponent().options.Clear(); TownSelector.transform.Find("Label").GetComponent().text=""; GameObject AddressSelector = Get.o2("HIDER/StoreSelection/Dropdown","AddressSelector"); AddressSelector.GetComponent().options.Clear(); AddressSelector.transform.Find("Label").GetComponent().text=""; print("HIDE_TOWN_FIELD====="+Get.PreferenceBool("HIDE_TOWN_FIELD")); if (Get.PreferenceBool("HIDE_TOWN_FIELD")){ PostalCodeSeach.transform.localPosition = new Vector3(-198, 0,0); Set.alpha(TownFieldSeach,false); } } } public static void ShowAllTown(){ List TownList=new(); int indTown=UIT.Ind(Library.Store, Header.Town); foreach(string TownName in _G.UIT_LibraryStores){ if(!string.IsNullOrEmpty(TownName) && TownName!=_G.UIT_LibraryStores[0]){ string town=TownName.Split(',')[indTown]; if(!string.IsNullOrEmpty(town) && !TownList.Contains(town))TownList.Add(town); } } TownList.Sort(); TMP_Dropdown TownSelector=Get.o2("HIDER/StoreSelection/Dropdown","TownSelector").GetComponent(); TownSelector.options.Clear(); TownSelector.AddOptions(TownList); TownSelector.value=1; TownSelector.value=0; } public void TownSelect(){ Town_Select(_Town,_Address,_StoreShow,_MessageAbout); } // À brancher sur le OnValueChanged du TownSelector. // - Mode CODE POSTAL (StoreLocatorUI a des distances) -> adresses triées par distance. // - Mode RECHERCHE PAR NOM (sinon) -> adresses classiques (Town_Select). public void OnTownChanged(){ if (StoreLocatorUI.Instance != null && StoreLocatorUI.Instance.HasDistances) StoreLocatorUI.Instance.PopulateAddresses(); else TownSelect(); } public static void Town_Select(TMP_Dropdown Town,TMP_Dropdown Address,TMP_Text StoreShow,TMP_Text MessageAbout){ string TownName=Town.options[Town.value].text.Split(" ~ ")[0]; print("TownName===="+TownName);//TownName====RONA+ Québec List AddressList=new(); int indTown=UIT.Ind(Library.Store, Header.Town); int indStoreAdress=UIT.Ind(Library.Store, Header.Address); foreach(string StoreLine in _G.UIT_LibraryStores){ if(!string.IsNullOrEmpty(StoreLine) && StoreLine!=_G.UIT_LibraryStores[0]){ string[] StoreLineSplit=StoreLine.Split(','); string town=StoreLineSplit[indTown]; if(!string.IsNullOrEmpty(town) && town==TownName && !AddressList.Contains(StoreLineSplit[indStoreAdress]))AddressList.Add(StoreLineSplit[indStoreAdress]); } } AddressList.Sort(); Address.options.Clear(); Address.AddOptions(AddressList); Address.value=0; ShowStore_Selected(Town,Address,StoreShow,MessageAbout); Get.o2("HIDER/StoreSelection","btnOK").SetActive(Get.o2("HIDER/StoreSelection","ShowStore").GetComponent().text!=""); } public void ResetTownSearch() { _TownFind.text = null;//"";//_Town.itemText;//TRANS.This("F_Type town"); } public void ShowStoreSelected(){ ShowStore_Selected(_Town,_Address, _StoreShow,_MessageAbout); } public static void ShowStore_Selected(TMP_Dropdown Town,TMP_Dropdown Address,TMP_Text StoreShow,TMP_Text MessageAbout){ int indStoreName=UIT.Ind(Library.Store, Header.Store_Name); int indTown=UIT.Ind(Library.Store, Header.Town); int indStoreAdress=UIT.Ind(Library.Store, Header.Address); int indStoreZone=UIT.Ind(Library.Store, Header.Store_Zone); int indStoreCode=UIT.Ind(Library.Store, Header.Store_Code); //int indLongitude=UIT.Ind(Library.Store, Header.Longitude); //int indLatitude=UIT.Ind(Library.Store, Header.Latitude); foreach(string StoreLine in _G.UIT_LibraryStores){ if(!string.IsNullOrEmpty(StoreLine) && StoreLine!=_G.UIT_LibraryStores[0]){ string[] StoreLineSplit=StoreLine.Split(','); // L'adresse affichée peut porter un suffixe de distance ("123 rue X — 12.3 km"), // on ne compare donc que la partie brute avant " — ". if( StoreLineSplit[indTown]==Town.options[Town.value].text && StoreLineSplit[indStoreAdress]==StripDistance(Address.options[Address.value].text)) { StoreShow.text=StoreLineSplit[indStoreName]; _G.StoreSelect=StoreShow.text; _G.StoreCode=StoreLineSplit[indStoreCode]; string ZoneonList=StoreLineSplit[indStoreZone]; if(ZoneonList[..1]=="0")ZoneonList=ZoneonList.Replace("0",""); _G.StoreZone="_"+ZoneonList; MessageAbout.gameObject.SetActive(false); break; } } } } public void OK() { Get.o2("Panel_SCENE","TutorialVideo").SetActive(Get.PreferenceBool("START_TUTORIAL")); Set.GlobalColorAndTranslate(); if( _StoreShow.text!=""){ print("_StoreShow====1====="+_StoreShow.text); ShowStore_Selected(_Town,_Address,_StoreShow,_MessageAbout); print("_StoreShow====2====="+_StoreShow.text); Get.o2("HIDER","StoreSelection").SetActive(false); } //https://wwwppr.rona.ca/en/shared-cart?p=75396484:1&p=75396515:1&ronaStore=08660 //https://wwwppr.rona.ca/en/shared-cart?p=75396601:1&p=75396515:1&ronaStore=08660 //https://wwwppr.rona.ca/en/shared-cart?p=75396601:1&p=75396515:1&ronaStore=08660 //https://wwwppr.rona.ca/en/shared-cart?p=75396482:1&p=75396515:1&ronaStore=61320 } public void FindTown(){ // Recherche par NOM de ville : on oublie les distances issues du code postal // sinon PopulateAddresses (branché sur le TownSelector) réafficherait d'anciennes distances. if (StoreLocatorUI.Instance != null) StoreLocatorUI.Instance.ClearDistances(); if(_G.PATH=="bmr" || _TownFind.text.Length==1){ _TownFind.text = _TownFind.text.ToUpper(); } // Texte saisi par l'utilisateur string toSerchRaw = _TownFind.text; // On enlève les accents et on met en majuscules pour la comparaison string toSerch = RemoveDiacritics(toSerchRaw).ToUpper(); //print("_TownFind.text===1==="+_TownFind.text); //print("_TownFind letter=="+_TownFind.text+" length==="+_TownFind.text.Length); int NumberOfLetters = toSerch.Length; int indOfTown = UIT.Ind(Library.Store,Header.Town); //print("indOfTown=="+indOfTown); if(NumberOfLetters >= 1){ List TownSortlist = new(); foreach(string TownLine in _G.UIT_LibraryStores){ if(!string.IsNullOrEmpty(TownLine) && TownLine != _G.UIT_LibraryStores[0] ){ string TownName = TownLine.Split(',')[indOfTown]; if(!string.IsNullOrEmpty(TownName)) { // Clef de comparaison sans accents, en majuscules string townKey = RemoveDiacritics(TownName).ToUpper(); if(townKey.Length >= NumberOfLetters){ if(townKey[..NumberOfLetters] == toSerch && !TownSortlist.Contains(TownName)) TownSortlist.Add(TownName); // on garde le nom original avec accents } } } } TownSortlist.Sort(); _Town.options.Clear(); _Town.AddOptions(TownSortlist); // Remet la sélection sur la 1re ville et force l'affichage du libellé. ForceShowFirst(_Town); } _Address.options.Clear(); _Address.AddOptions(AdressList()); // Remet la sélection sur la 1re adresse et force l'affichage du libellé // (avec une seule option, le caption ne se rafraîchit pas tout seul). ForceShowFirst(_Address); if(_Address.options.Count != 0){ ShowStoreSelected(); _MessageAbout.text = TRANS.This("F_TownMessage"); } else { _MessageAbout.text = ""; _StoreShow.text = ""; } TMP_Dropdown TownSelector=Get.o2("HIDER/StoreSelection/Dropdown","TownSelector").GetComponent(); if(_TownFind.text.Length == 0){ TownSelector.options.Clear(); TownSelector.AddOptions(AdressList()); _Address.options.Clear(); _Address.AddOptions(AdressList()); _StoreShow.text=""; } Get.o2("HIDER/StoreSelection","btnOK").SetActive(_TownFind.text.Length != 0 && _StoreShow.text!=""); } public List AdressList(){ List AddressList=new(); if(_Town.options.Count != 0) { // Sécurité : _Town.value peut être resté hors limites après un refiltrage des villes. int townIndex = Mathf.Clamp(_Town.value, 0, _Town.options.Count - 1); string TownName=_Town.options[townIndex].text.Split(" ~ ")[0]; int indTown=UIT.Ind(Library.Store, Header.Town); int indStoreAddress=UIT.Ind(Library.Store, Header.Address); foreach(string StoreLine in _G.UIT_LibraryStores) { if(!string.IsNullOrEmpty(StoreLine) && StoreLine!=_G.UIT_LibraryStores[0]) { string[] StoreLineSplit=StoreLine.Split(','); if (StoreLineSplit.Length <= Mathf.Max(indTown, indStoreAddress)) continue; string town=StoreLineSplit[indTown]; if(!string.IsNullOrEmpty(town) && town==TownName && !AddressList.Contains(StoreLineSplit[indStoreAddress]))AddressList.Add(StoreLineSplit[indStoreAddress]); } } } return AddressList; } // Remet un dropdown sur sa 1re option ET force l'affichage du libellé. // Nécessaire car, dans ce projet, remettre value à la même valeur (ex. 1 seule option) // ne rafraîchit pas le caption tout seul (cf. l'astuce value=1;value=0 de ShowAllTown). private static void ForceShowFirst(TMP_Dropdown dd) { if (dd == null || dd.options.Count == 0) return; dd.SetValueWithoutNotify(0); dd.RefreshShownValue(); if (dd.captionText != null) dd.captionText.text = dd.options[0].text; } // Retire le suffixe de distance d'un libellé d'adresse : "123 rue X — 12.3 km" -> "123 rue X" private static string StripDistance(string text) { if (string.IsNullOrEmpty(text)) return text; int i = text.IndexOf(" — "); return i >= 0 ? text.Substring(0, i) : text; } // Enlève les accents / diacritiques : "Québec" -> "Quebec" private static string RemoveDiacritics(string text) { if (string.IsNullOrWhiteSpace(text)) return text; string normalized = text.Normalize(NormalizationForm.FormD); StringBuilder sb = new StringBuilder(); foreach (char c in normalized) { var uc = CharUnicodeInfo.GetUnicodeCategory(c); if (uc != UnicodeCategory.NonSpacingMark) sb.Append(c); } return sb.ToString().Normalize(NormalizationForm.FormC); } }