From 78ecb7ff431175f61dcb9374e2868f0e4f9b0893 Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Tue, 13 Nov 2018 04:49:56 +0200 Subject: [PATCH] Sorting optional mods, triggering core-mods. (#60) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сортировка производится по механике: Сначала все моды по порядку как в config.js, а потом всё остальное. Триггер core-модификации работает так: Если 2 модификации имеют параметр submod: false и одинаковую группу - то они будут переключатся, при включении одного из них. То есть не возможно будет включить две модификации сразу. Полезно для тех же различных типов мини-карт. --- .../runtime/dialog/overlay/options/options.js | 142 ++++++++++-------- 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index e585d4a0..2c8987b4 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -84,7 +84,6 @@ var options = { }, }; -var upd = false; //Переменная обноеления интерфейса. function updateOptional() { var holder = options.overlay.lookup("#modlist").getContent(); @@ -100,70 +99,78 @@ function updateOptional() var profile = profilesList[serverHolder.old].object; var list = profile.getOptional(); var checkboxlist = new java.util.ArrayList; - list.forEach(function(modfile,i,arr) { - var modName = modfile.string, modDescription = "", subm = false; - if(optModNames.modInfo[modfile.string] != null){//Есть ли хоть какое ни будь представление описания модификации? - var optModN = optModNames.modInfo[modfile.string]; - if(optModN.name != null)//Есть ли у модификации имя? - modName = optModN.name; - if(optModN.description != null) //Есть ли описание? - modDescription = optModN.description; - if(optModN.submod != null && optModN.submod == true)//Это суб-модификация? - subm = true; - } else if(optModNames.optAutoModName) { - //Попытка автоматически создать представляемое имя модификации. - modName = modName.replace(new RegExp("(.*?(\/))",'g'),''); - modName = modName.replace(new RegExp("(-|_|[\\d]|\\+).*",'g'),''); - //Первая буква - заглавная - modName = modName[0].toUpperCase() + modName.slice(1); - } - var testMod = new javafx.scene.control.CheckBox(modName); - - if(subm)//Это суб-модификация? - testMod.setTranslateX(25); + var modConfigKeys = Object.keys(optModNames.modInfo); + var dModsIds = []; + + for (var ik = 0, l = modConfigKeys.length + 1; ik <= l; ik++) { + list.forEach(function(modfile) { + if((modConfigKeys[ik] === modfile.string) || (ik == modConfigKeys.length+1 && dModsIds.indexOf(modfile.string) == -1)) { + dModsIds.push(modfile.string); - testMod.setSelected(modfile.mark); - testMod.setOnAction(function(event) { - var isSelected = event.getSource().isSelected(); - if(isSelected) - { - profile.markOptional(modfile.string); - LogHelper.debug("Selected mod %s", modfile.string); - optionalModTreeToggle(true, modfile.string); - } - else - { - profile.unmarkOptional(modfile.string); - LogHelper.debug("Unselected mod %s", modfile.string); - optionalModTreeToggle(false, modfile.string); - } - upd = true; - updateOptional(); - }); - checkboxlist.add(testMod); - - if(modDescription != "") { //Добавляем оаисание - textDescr = new javafx.scene.text.Text(modDescription); - if(subm){//Это суб-модификация? - textDescr.setWrappingWidth(345); - textDescr.setTranslateX(50); - } else { - textDescr.setWrappingWidth(370); - textDescr.setTranslateX(25); - } - textDescr.setTextAlignment(javafx.scene.text.TextAlignment.JUSTIFY); - textDescr.getStyleClass().add("description-text"); - checkboxlist.add(textDescr); - } - sep = new javafx.scene.control.Separator(); - sep.getStyleClass().add("separator"); - checkboxlist.add(sep); - - }); - if(upd) holder.getChildren().clear(); + var modName = modfile.string, modDescription = "", subm = false; + if(optModNames.modInfo[modfile.string] != null){//Есть ли хоть какое-нибудь представление описания модификации? + var optModN = optModNames.modInfo[modfile.string]; + if(optModN.name != null)//Есть ли у модификации имя? + modName = optModN.name; + if(optModN.description != null) //Есть ли описание? + modDescription = optModN.description; + if(optModN.submod != null && optModN.submod == true)//Это суб-модификация? + subm = true; + } else if(optModNames.optAutoModName) { + //Попытка автоматически создать представляемое имя модификации. + modName = modName.replace(new RegExp("(.*?(\/))",'g'),''); + modName = modName.replace(new RegExp("(-|_|[\\d]|\\+).*",'g'),''); + //Первая буква - заглавная + modName = modName[0].toUpperCase() + modName.slice(1); + } + var testMod = new javafx.scene.control.CheckBox(modName); + + if(subm)//Это суб-модификация? + testMod.setTranslateX(25); + + testMod.setSelected(modfile.mark); + testMod.setOnAction(function(event) { + var isSelected = event.getSource().isSelected(); + if(isSelected) + { + profile.markOptional(modfile.string); + LogHelper.debug("Selected mod %s", modfile.string); + optionalModTreeToggle(true, modfile.string); + } + else + { + profile.unmarkOptional(modfile.string); + LogHelper.debug("Unselected mod %s", modfile.string); + optionalModTreeToggle(false, modfile.string); + } + updateOptional(); + }); + checkboxlist.add(testMod); + + if(modDescription != "") { //Добавляем описание? + textDescr = new javafx.scene.text.Text(modDescription); + if(subm){//Это суб-модификация? + textDescr.setWrappingWidth(345); + textDescr.setTranslateX(50); + } else { + textDescr.setWrappingWidth(370); + textDescr.setTranslateX(25); + } + textDescr.setTextAlignment(javafx.scene.text.TextAlignment.JUSTIFY); + textDescr.getStyleClass().add("description-text"); + checkboxlist.add(textDescr); + } + sep = new javafx.scene.control.Separator(); + sep.getStyleClass().add("separator"); + checkboxlist.add(sep); + } + }); + } + holder.getChildren().clear(); holder.getChildren().addAll(checkboxlist); }; -function optionalModTreeToggle(enable, Imodfile) { //Переключение ветки модов +function optionalModTreeToggle(enable, Imodfile) +{ //Переключение ветки модов var profile = profilesList[serverHolder.old].object; if(optModNames.modInfo[Imodfile] != null) { var modInfo = optModNames.modInfo[Imodfile]; @@ -182,6 +189,17 @@ function optionalModTreeToggle(enable, Imodfile) { //Переключение в }); } + if(modInfo.submod == false){//Включение core-модификации (Все core-модификации с той же группой будут отключены. К примеру 2 миникарты) + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null) { + if(modList[key].group == modInfo.group && modList[key].submod == false && enable == true && key != Imodfile) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected coreMod %s", key); + } + } + }); + } + if(modInfo.submod == true){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) Object.keys(modList).forEach(function(key, id) { if(modList[key] != null && modList[key].group != null && modList[key].submod != null) {