//*********************************************************************** public void Set_Element_Active(int id) { curElmID = id; string name = CreateNameByID(id); tmptxt_elm_preview.text = ""; if (goElements.transform.childCount > 0) { foreach (Transform gElm in goElements.transform) { Button btn = gElm.GetComponent <Button>(); ColorBlock cb = btn.colors; if (gElm.name == name) { cb.normalColor = selectedColor; btn.colors = cb; btn.tag = "btn_selected"; JsonSkillsTreeNode nodeElm = getElmNodeByID(id); tmptxt_elm_preview.text = nodeElm.full_desc; } else { cb.normalColor = normalColor; btn.colors = cb; btn.tag = "btn_not_selected"; }; } } }
//**************************************************************** //создание одной ноды типа JsonSkillsTreeNode public static JsonSkillsTreeNode create_one_node( int id = 0, //ид-ноды int parent_id = 0, //ид-родительской ноды int is_category = 1, //1=если категория string name = "имя", //название ноды string short_desc = "короткое описание", //короткое описание string full_desc = "полный текст", //подробное описание ноды (текст) int sort = 0, //индекс сортировки среди "собратьев" string image = "", //путь к спрайту в ресурсах string requirements = "" //json-строк требований ) { JsonSkillsTreeNode node = new JsonSkillsTreeNode(); node.id = id; node.parent_id = parent_id; node.is_category = is_category; node.name = name; node.short_desc = short_desc; node.full_desc = full_desc; node.sort = sort; node.image = image; node.requirements = requirements; return(node); }
//**************************************************************** //добавление/правка одного элемента public static int addEditElement(JsonSkillsTreeNode newNode) { int new_id = 0; if (newNode.id > 0) { new_id = newNode.id; int i = elmsList.IndexOf(elmsList.Find(n => n.id == newNode.id)); if (i > 0) { elmsList[i] = newNode; } else { throw new Exception("Елемент с данным id=" + newNode.id + " не найден"); } } else { new_id = newNode.id = getNextID(); elmsList.Add(newNode); } SortElements(); //Save(ListsToArray()); return(new_id); }
//**************************************************************** //добавление/правка одной категории public static int addEditCategory(JsonSkillsTreeNode newNode) { int new_id = 0; if (newNode.id > 0) { new_id = newNode.id; int i = catList.IndexOf(catList.Find(n => n.id == newNode.id)); if (i >= 0) { catList[i] = newNode; } else { throw new Exception("Категория с данным id=" + newNode.id + " не найдена"); } } else { new_id = newNode.id = getNextID(); catList.Add(newNode); } SortCategories(); //Save(ListsToArray()); return(new_id); }
//**************************************************************** //функция обратная ArrayToLists() заполнение массива из списков (категории и элементы) public static JsonSkillsTreeNode[] ListsToArray() { JsonSkillsTreeNode[] skillsArray = new JsonSkillsTreeNode[catList.Count + elmsList.Count]; int n = 0; foreach (JsonSkillsTreeNode cat in catList) { skillsArray[n] = cat; n++; } foreach (JsonSkillsTreeNode elm in elmsList) { skillsArray[n] = elm; n++; } return(skillsArray); }
//*********************************************************************** // TESTS //*********************************************************************** void test_save_json_skill_tre() { JsonSkillsTreeNode[] skills = new JsonSkillsTreeNode[10]; skills[0] = SkillsTreeFile.create_one_node(1, 0, 1, "Категория 1", "кор. описание к1", "полное описание к1"); skills[1] = SkillsTreeFile.create_one_node(2, 0, 1, "Категория 2", "кор. описание к2", "полное описание к2"); skills[2] = SkillsTreeFile.create_one_node(3, 1, 1, "Категория 1.1", "кор. описание к1.1", "полное описание к1.1"); skills[3] = SkillsTreeFile.create_one_node(4, 1, 1, "Категория 1.2", "кор. описание к1.2", "полное описание к1.2"); skills[4] = SkillsTreeFile.create_one_node(5, 3, 0, "Элемент 1.1.1", "кор. описание 1.1.1", "полное описание 1.1.1"); skills[5] = SkillsTreeFile.create_one_node(6, 3, 0, "Элемент 1.1.2", "кор. описание 1.1.2", "полное описание 1.1.2"); skills[6] = SkillsTreeFile.create_one_node(7, 2, 1, "Категория 2.1", "кор. описание к2.1", "полное описание к2.1"); skills[7] = SkillsTreeFile.create_one_node(8, 2, 1, "Категория 2.2", "кор. описание к2.2", "полное описание к2.2"); skills[8] = SkillsTreeFile.create_one_node(9, 7, 0, "Элемент 2.1.1", "кор. описание 2.1.1", "полное описание 2.1.1"); skills[9] = SkillsTreeFile.create_one_node(10, 7, 0, "Элемент 2.1.2", "кор. описание 2.1.2", "полное описание 2.1.2"); SkillsTreeFile.SaveOtherNodes(skills); }
//*********************************************************************** //кнопка сохранить public void btn_Save_FormCategory() { // 1 получение данных с формы в node JsonSkillsTreeNode formNode = new JsonSkillsTreeNode(); //поле родитель TMP_Dropdown popup_parent_dropdown = pnl_form.transform.Find("pnl_parent").GetComponentInChildren <TMP_Dropdown>(); string tmp = popup_parent_dropdown.captionText.text; formNode.parent_id = myUtils.SplitStringAndGetFromIndx(tmp, new char[] { ':' }, 0); //поле тип Toggle[] togls = pnl_form.transform.Find("pnl_type").GetComponentsInChildren <Toggle>(); formNode.is_category = togls[0].isOn ? 1 : 0; //поле: сортировка TMP_InputField tmptxt = pnl_form.transform.Find("pnl_sort").GetComponentInChildren <TMP_InputField>(); Int32.TryParse(tmptxt.text, out formNode.sort); //поле: название tmptxt = pnl_form.transform.Find("pnl_name").GetComponentInChildren <TMP_InputField>(); formNode.name = tmptxt.text; //поле: изображение tmptxt = pnl_form.transform.Find("pnl_image").GetComponentInChildren <TMP_InputField>(); formNode.image = tmptxt.text; //поле: короткое описание tmptxt = pnl_form.transform.Find("pnl_small_desc").GetComponentInChildren <TMP_InputField>(); formNode.short_desc = tmptxt.text; //поле: полное описание tmptxt = pnl_form.transform.Find("pnl_full_desc").GetComponentInChildren <TMP_InputField>(); formNode.full_desc = tmptxt.text; Debug.Log(formNode); List <String> Errors = new List <string>(); //2 проверка не пустые ли данные if (formNode.is_category != 1) { Errors.Add("Тип ноды должен быть категория."); } if (formNode.name.Length < 5) { Errors.Add("Название должно быть не меньше 5 символов."); } if (formNode.short_desc.Length < 10 || formNode.full_desc.Length < 10) { Errors.Add("Описание (короткое или полное) должно быть не меньше 10 символов."); } //Errors.Add("Тестовая ошибка какая-то еще какой-то текст плюс еще какой-то текст и еще текст."); if (Errors.Count > 0) { //найдены ошибки - показ сообщения об этом MessageBox.ShowMessage(() => { }, string.Join("\n", Errors.ToArray())); } else { //все ок сохранение данных и закрытие формы pnl_popups_backfon.SetActive(false); if (popup_is_new == 1) { formNode.id = 0; } else { formNode.id = curCatID; } curCatID = SkillsTreeFile.addEditCategory(formNode); //обновление списка и графа refresh_all(); } }
//*********************************************************************** //кнопка добавить/редактировать, is_new=1 если добавление, иначе редактирование текущей public void btn_AddEdit_Category(int is_new = 0) { popup_is_new = is_new; //открытие попапа pnl_popups_backfon.SetActive(true); JsonSkillsTreeNode curNode = get_CatNodeByID(curCatID); popup_caption.text = "Добавление новой категории"; if (is_new != 1) { popup_caption.text = "Редактирование категории [" + curCatID.ToString() + "]"; } //поле: родительская категория //заполнение дроп-списка в попапе, только корневыми категориями TMP_Dropdown popup_parent_dropdown = pnl_form.transform.Find("pnl_parent").GetComponentInChildren <TMP_Dropdown>(); List <string> opts = new List <string>(); opts.Add("0: корень"); int opt_indx = 0, //для выбора опции в drop-списке n = 1; //для исчисления родителей foreach (JsonSkillsTreeNode node in catList) { if (node.parent_id == 0) { opts.Add(node.id.ToString() + ": " + node.name); if (node.id == curNode.parent_id) { opt_indx = n; } n++; } } popup_parent_dropdown.ClearOptions(); popup_parent_dropdown.AddOptions(opts); //выбор в списке текущей выбранной категории popup_parent_dropdown.value = opt_indx; //поле: тип ноды (категория / элемент) Toggle [] popup_type_toggle = pnl_form.transform.Find("pnl_type").GetComponentsInChildren <Toggle>(); //if (curNode.is_category == 1) {} popup_type_toggle[0].isOn = true; popup_type_toggle[0].interactable = false; popup_type_toggle[1].isOn = false; popup_type_toggle[1].interactable = false; //поле: сортировка TMP_InputField tmptxt = pnl_form.transform.Find("pnl_sort").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.sort.ToString() : "10"; //поле: название tmptxt = pnl_form.transform.Find("pnl_name").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.name : ""; //поле: изображение tmptxt = pnl_form.transform.Find("pnl_image").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.image : ""; //поле: короткое описание tmptxt = pnl_form.transform.Find("pnl_small_desc").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.short_desc : ""; //поле: полное описание tmptxt = pnl_form.transform.Find("pnl_full_desc").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.full_desc : ""; //save var btn = pnl_popup_btm.transform.Find("btn_save").GetComponent <Button>(); btn.onClick.RemoveAllListeners(); btn.onClick.AddListener(delegate { btn_Save_FormCategory(); }); }
//*********************************************************************** //кнопка добавить/редактировать, is_new=1 если добавление, иначе редактирование текущей public void btn_AddEdit_Element(int is_new = 0) { //если попытка редактировать, а элемент не выбран if (is_new != 1 && curElmID <= 0) { //то добавление нового is_new = 1; } popup_is_new = is_new; //открытие попапа pnl_popups_backfon.SetActive(true); JsonSkillsTreeNode curNode = elmsCurCat.Find(x => x.id == curElmID); popup_caption.text = "Добавление нового элемента"; if (is_new != 1) { popup_caption.text = "Редактирование элемента [" + curElmID + "]"; } //поле: категория элемента //заполнение дроп-списка в попапе всеми категориями List <JsonSkillsTreeNode> catList = skillsCategories.getCatList(); TMP_Dropdown popup_parent_dropdown = pnl_form.transform.Find("pnl_parent").GetComponentInChildren <TMP_Dropdown>(); List <string> opts = new List <string>(); //opts.Add("0: корень"); нельзя прописать элемент к корню int opt_indx = 0, //для выбора опции в drop-списке n = 0; //для исчисления родителей foreach (JsonSkillsTreeNode node in catList) { if (node.parent_id == 0) { //корневая категория opts.Add(node.id.ToString() + ": " + node.name); } else { //подкатегория opts.Add(" " + node.id.ToString() + ": " + node.name); } if (node.id == curCatID) { opt_indx = n; } n++; } popup_parent_dropdown.ClearOptions(); popup_parent_dropdown.AddOptions(opts); //выбор в списке текущей выбранной категории popup_parent_dropdown.value = opt_indx; //поле: тип ноды (категория / элемент) Toggle[] popup_type_toggle = pnl_form.transform.Find("pnl_type").GetComponentsInChildren <Toggle>(); popup_type_toggle[0].isOn = false; popup_type_toggle[0].interactable = false; popup_type_toggle[1].isOn = true; popup_type_toggle[1].interactable = false; //поле: сортировка TMP_InputField tmptxt = pnl_form.transform.Find("pnl_sort").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.sort.ToString() : "10"; //поле: название tmptxt = pnl_form.transform.Find("pnl_name").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.name : ""; //поле: изображение tmptxt = pnl_form.transform.Find("pnl_image").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.image : ""; //поле: короткое описание tmptxt = pnl_form.transform.Find("pnl_small_desc").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.short_desc : ""; //поле: полное описание tmptxt = pnl_form.transform.Find("pnl_full_desc").GetComponentInChildren <TMP_InputField>(); tmptxt.text = (is_new != 1) ? curNode.full_desc : ""; //save var btn = pnl_popup_btm.transform.Find("btn_save").GetComponent <Button>(); btn.onClick.RemoveAllListeners(); btn.onClick.AddListener(delegate { btn_Save_FormElement(); }); }