mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-23 09:01:08 +03:00
Merge pull request #64 from GravitLauncher/master
Слияние ветки master с 4.1
This commit is contained in:
commit
d4d4f78387
7 changed files with 218 additions and 45 deletions
|
@ -42,3 +42,16 @@ var serversConfig = {
|
||||||
return serversConfig[profile][property];
|
return serversConfig[profile][property];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var optModNames = {
|
||||||
|
optAutoModName: true,//Попытатся автоматически создать представляемое имя модификации
|
||||||
|
modInfo: {//"Путь до опц. модификации" : "Отображаемый клиенту контент"
|
||||||
|
/*"mods/ModName-1.1.jar": {
|
||||||
|
name: "ModName", //Наименование модификации (Отображаемое в лаунчере) [Можно не указывать]
|
||||||
|
description:"Лучший в своём роде ModName.", //Описание модификации [Можно не указывать]
|
||||||
|
subTreeLevel: 1, //Уровень вложенности модификации (Ядро - 1, Мод - 2, Аддон - 3 и т.д...) (будет произведён отступ от левого края для выделения) [Можно не указывать, по умолчанию: 1]
|
||||||
|
onlyOne: true, //Для выбора только одной из группы модификаций [Можно не указывать]
|
||||||
|
onlyOneGroup: 1 //Используется в совокупности с onlyOne. Определяет ту самую группу, из которой производится выбор.
|
||||||
|
},*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -182,7 +182,7 @@ function goOptions(event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show options overlay
|
// Show options overlay
|
||||||
updateOptional();
|
options.update();
|
||||||
overlay.show(options.overlay, null);
|
overlay.show(options.overlay, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,6 +198,7 @@ function verifyLauncher(e) {
|
||||||
}
|
}
|
||||||
overlay.swap(0, processing.overlay, function(event) makeProfilesRequest(function(result) {
|
overlay.swap(0, processing.overlay, function(event) makeProfilesRequest(function(result) {
|
||||||
settings.lastProfiles = result.profiles;
|
settings.lastProfiles = result.profiles;
|
||||||
|
options.load();
|
||||||
// Update profiles list and hide overlay
|
// Update profiles list and hide overlay
|
||||||
updateProfilesList(result.profiles);
|
updateProfilesList(result.profiles);
|
||||||
overlay.hide(0, function() {
|
overlay.hide(0, function() {
|
||||||
|
|
|
@ -61,10 +61,9 @@ .scroll-pane > .corner {
|
||||||
.check-box{
|
.check-box{
|
||||||
-fx-background-color: transparent;
|
-fx-background-color: transparent;
|
||||||
-fx-text-fill:#2c2c2c;
|
-fx-text-fill:#2c2c2c;
|
||||||
-fx-font-size: 13;
|
-fx-font-size: 13px;
|
||||||
-fx-background-image: url('../../images/icons/checkbox.png');
|
-fx-background-image: url('../../images/icons/checkbox.png');
|
||||||
-fx-background-repeat: no-repeat;
|
-fx-background-repeat: no-repeat;
|
||||||
-fx-padding: 0 0 10 0;
|
|
||||||
}
|
}
|
||||||
.check-box .mark {
|
.check-box .mark {
|
||||||
-fx-background-color: transparent;
|
-fx-background-color: transparent;
|
||||||
|
@ -83,3 +82,13 @@ .check-box:selected .mark {
|
||||||
.check-box:selected .box {
|
.check-box:selected .box {
|
||||||
-fx-background-color: transparent;
|
-fx-background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.description-text {
|
||||||
|
-fx-font-smoothing-type: lcd;
|
||||||
|
-fx-fill: #8c8c8c;
|
||||||
|
-fx-font-size: 12px;
|
||||||
|
}
|
||||||
|
.separator *.line {
|
||||||
|
-fx-border-color: transparent;
|
||||||
|
-fx-border-width: 0 0 10 0;
|
||||||
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ var options = {
|
||||||
file: DirBridge.dir.resolve("options.bin"), // options file
|
file: DirBridge.dir.resolve("options.bin"), // options file
|
||||||
|
|
||||||
/* options and overlay functions */
|
/* options and overlay functions */
|
||||||
load: function() {
|
load: function(profiles) {
|
||||||
LogHelper.debug("Loading options file");
|
LogHelper.debug("Loading options file");
|
||||||
try {
|
try {
|
||||||
tryWithResources(new HInput(IOHelper.newInput(options.file)), options.read);
|
tryWithResources(new HInput(IOHelper.newInput(options.file)), options.read);
|
||||||
|
@ -27,10 +27,51 @@ var options = {
|
||||||
if (magic != config.settingsMagic) {
|
if (magic != config.settingsMagic) {
|
||||||
throw new java.io.IOException("options magic mismatch: " + java.lang.Integer.toString(magic, 16));
|
throw new java.io.IOException("options magic mismatch: " + java.lang.Integer.toString(magic, 16));
|
||||||
}
|
}
|
||||||
|
var profilesCount = input.readInt();
|
||||||
|
LogHelper.debug("Load options. ProfilesCount %d",profilesCount);
|
||||||
|
for(var i = 0;i<profilesCount;i++)
|
||||||
|
{
|
||||||
|
var listSize = input.readInt();
|
||||||
|
var sortIndex = input.readInt();
|
||||||
|
var profile = null;
|
||||||
|
settings.lastProfiles.forEach(function(hprofile,i,arr) {
|
||||||
|
if(hprofile.object.getSortIndex() == sortIndex)
|
||||||
|
{
|
||||||
|
profile = hprofile.object;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for(var j = 0; j < listSize; j++)
|
||||||
|
{
|
||||||
|
var mark = input.readBoolean();
|
||||||
|
var modFile = input.readString(0);
|
||||||
|
if(mark)
|
||||||
|
{
|
||||||
|
profile.markOptional(modFile);
|
||||||
|
LogHelper.debug("Load options %s marked",modFile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
profile.unmarkOptional(modFile);
|
||||||
|
LogHelper.debug("Load options %s unmarked",modFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
write: function(output) {
|
write: function(output) {
|
||||||
output.writeInt(config.settingsMagic);
|
output.writeInt(config.settingsMagic);
|
||||||
|
output.writeInt(settings.lastProfiles.length);
|
||||||
|
settings.lastProfiles.forEach(function(hprofile,i,arr) {
|
||||||
|
var profile = hprofile.object;
|
||||||
|
LogHelper.debug("Save options %s",profile.getTitle());
|
||||||
|
var list = profile.getOptional();
|
||||||
|
output.writeInt(list.size());
|
||||||
|
output.writeInt(profile.getSortIndex());
|
||||||
|
list.forEach(function(modFile,j,arr2) {
|
||||||
|
output.writeBoolean(modFile.mark);
|
||||||
|
output.writeString(modFile.string, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/* ===================== OVERLAY ===================== */
|
/* ===================== OVERLAY ===================== */
|
||||||
|
@ -41,41 +82,151 @@ var options = {
|
||||||
var holder = options.overlay.lookup("#holder");
|
var holder = options.overlay.lookup("#holder");
|
||||||
holder.lookup("#apply").setOnAction(function(event) overlay.hide(0, null));
|
holder.lookup("#apply").setOnAction(function(event) overlay.hide(0, null));
|
||||||
},
|
},
|
||||||
|
update: function() {
|
||||||
|
var holder = options.overlay.lookup("#modlist").getContent();
|
||||||
|
var nodelist = new java.util.ArrayList;
|
||||||
|
|
||||||
|
holder.getChildren().forEach(function(node,i,arr) {
|
||||||
|
if(node instanceof javafx.scene.control.CheckBox)
|
||||||
|
nodelist.add(node);
|
||||||
|
});
|
||||||
|
nodelist.forEach(function(node,i,arr) {
|
||||||
|
holder.getChildren().remove(node);
|
||||||
|
});
|
||||||
|
var profile = profilesList[serverHolder.old].object;
|
||||||
|
var list = profile.getOptional();
|
||||||
|
var checkBoxList = new java.util.ArrayList;
|
||||||
|
var modConfigKeys = Object.keys(optModNames.modInfo);
|
||||||
|
var dModsIds = [];
|
||||||
|
|
||||||
|
modConfigKeys.forEach(function(key, id) {//По умолчанию индекс у ветви = 1. Выставляем его у всех неуказанных.
|
||||||
|
if(optModNames.modInfo[key].subTreeLevel == null)
|
||||||
|
optModNames.modInfo[key].subTreeLevel = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
var modName = modFile.string, modDescription = "", subLevel = 1;
|
||||||
|
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.subTreeLevel != null && optModN.subTreeLevel > 1)//Это суб-модификация?
|
||||||
|
subLevel = optModN.subTreeLevel;
|
||||||
|
} 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(subLevel > 1)
|
||||||
|
for(var i = 1; i < subLevel; i++)//Выделение субмодификаций сдвигом.
|
||||||
|
testMod.setTranslateX(25*i);
|
||||||
|
|
||||||
|
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);
|
||||||
|
options.treeToggle(true, modFile.string);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
profile.unmarkOptional(modFile.string);
|
||||||
|
LogHelper.debug("Unselected mod %s", modFile.string);
|
||||||
|
options.treeToggle(false, modFile.string);
|
||||||
|
}
|
||||||
|
options.update();
|
||||||
|
});
|
||||||
|
checkBoxList.add(testMod);
|
||||||
|
|
||||||
|
if(modDescription != "") { //Добавляем описание?
|
||||||
|
textDescr = new javafx.scene.text.Text(modDescription);
|
||||||
|
if(subLevel > 1) {
|
||||||
|
for(var i = 1; i < subLevel; i++){
|
||||||
|
textDescr.setWrappingWidth(370-(25*i));
|
||||||
|
textDescr.setTranslateX(25+(25*i));
|
||||||
|
}
|
||||||
|
} 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);
|
||||||
|
},
|
||||||
|
treeToggle: function(enable, ImodFile) {
|
||||||
|
var profile = profilesList[serverHolder.old].object;
|
||||||
|
if(optModNames.modInfo[ImodFile] != null) {
|
||||||
|
var modInfo = optModNames.modInfo[ImodFile];
|
||||||
|
var modList = optModNames.modInfo;
|
||||||
|
var modIDs = Object.keys(modList);
|
||||||
|
|
||||||
|
if(modInfo.subTreeLevel != null) {
|
||||||
|
|
||||||
|
if(modInfo.subTreeLevel >= 1){//Отключение core-модификации
|
||||||
|
var stop = false;
|
||||||
|
modIDs.forEach(function(key, id) {
|
||||||
|
if(modList[key] != null && modList[key].subTreeLevel != null) {
|
||||||
|
if( modList[key].subTreeLevel > modInfo.subTreeLevel && modIDs.indexOf(key) > modIDs.indexOf(ImodFile) && enable == false && stop == false) {
|
||||||
|
profile.unmarkOptional(key);
|
||||||
|
LogHelper.debug("Unselected subMod %s", key);
|
||||||
|
} else if(modIDs.indexOf(key) > modIDs.indexOf(ImodFile) && modList[key].subTreeLevel <= modInfo.subTreeLevel && stop == false) {
|
||||||
|
//LogHelper.debug("STOP disable!! " + key);
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(modInfo.onlyOne == true){//Включение onlyOne-модификации (Все onlyOne-модификации с той же группой будут отключены. К примеру 2 миникарты)
|
||||||
|
modIDs.forEach(function(key, id) {
|
||||||
|
if(modList[key] != null && modList[key].onlyOneGroup != null) {
|
||||||
|
if(modList[key].onlyOneGroup == modInfo.onlyOneGroup && modList[key].onlyOne == true && enable == true && key != ImodFile) {
|
||||||
|
profile.unmarkOptional(key);
|
||||||
|
LogHelper.debug("Unselected Mod (onlyOne toggle) %s", key);
|
||||||
|
options.treeToggle(false, key); //И все его подмодификации канут в Лету..
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(modInfo.subTreeLevel > 1){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) (Включаем всю ветку зависимости)
|
||||||
|
var reverseModList = Object.keys(modList).reverse();
|
||||||
|
var tsl = modInfo.subTreeLevel-1;
|
||||||
|
reverseModList.forEach(function(key, id) {
|
||||||
|
if(modList[key] != null && modList[key].subTreeLevel != null) {
|
||||||
|
if(modList[key].subTreeLevel == tsl && modIDs.indexOf(key) < modIDs.indexOf(ImodFile) && enable == true) {
|
||||||
|
profile.markOptional(key);
|
||||||
|
LogHelper.debug("Selected coreMod %s", key);
|
||||||
|
options.treeToggle(true, key); //Для срабатывания onlyOne-модификаций.
|
||||||
|
tsl--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
function updateOptional()
|
|
||||||
{
|
|
||||||
var holder = options.overlay.lookup("#modlist").getContent();
|
|
||||||
var nodelist = new java.util.ArrayList;
|
|
||||||
|
|
||||||
holder.getChildren().forEach(function(node,i,arr) {
|
|
||||||
if(node instanceof javafx.scene.control.CheckBox)
|
|
||||||
nodelist.add(node);
|
|
||||||
});
|
|
||||||
nodelist.forEach(function(node,i,arr) {
|
|
||||||
holder.getChildren().remove(node);
|
|
||||||
});
|
|
||||||
var profile = profilesList[serverHolder.old].object;
|
|
||||||
var list = profile.getOptional();
|
|
||||||
var checkboxlist = new java.util.ArrayList;
|
|
||||||
list.forEach(function(modfile,i,arr) {
|
|
||||||
var testMod = new javafx.scene.control.CheckBox(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);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
profile.unmarkOptional(modfile.string);
|
|
||||||
LogHelper.debug("Unselected mod %s", modfile.string);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
checkboxlist.add(testMod);
|
|
||||||
});
|
|
||||||
holder.getChildren().addAll(checkboxlist);
|
|
||||||
}
|
|
|
@ -93,7 +93,7 @@ var settingsOverlay = {
|
||||||
ramSlider.setValue(settings.ram);
|
ramSlider.setValue(settings.ram);
|
||||||
ramSlider.valueProperty()["addListener(javafx.beans.value.ChangeListener)"](function(o, ov, nv) {
|
ramSlider.valueProperty()["addListener(javafx.beans.value.ChangeListener)"](function(o, ov, nv) {
|
||||||
settings.setRAM(nv);
|
settings.setRAM(nv);
|
||||||
settings.updateRAMLabel();
|
settingsOverlay.updateRAMLabel();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Lookup delete dir button
|
// Lookup delete dir button
|
||||||
|
|
|
@ -7,7 +7,6 @@ var LauncherApp = Java.extend(JSApplication, {
|
||||||
app = JSApplication.getInstance();
|
app = JSApplication.getInstance();
|
||||||
cliParams.init(app.getParameters());
|
cliParams.init(app.getParameters());
|
||||||
settings.load();
|
settings.load();
|
||||||
options.load();
|
|
||||||
cliParams.applySettings();
|
cliParams.applySettings();
|
||||||
}, start: function(primaryStage) {
|
}, start: function(primaryStage) {
|
||||||
stage = primaryStage;
|
stage = primaryStage;
|
||||||
|
|
|
@ -66,9 +66,9 @@ static int readBuildNumber() {
|
||||||
private static final Pattern UUID_PATTERN = Pattern.compile("-", Pattern.LITERAL);
|
private static final Pattern UUID_PATTERN = Pattern.compile("-", Pattern.LITERAL);
|
||||||
public static int MAJOR = 4;
|
public static int MAJOR = 4;
|
||||||
public static int MINOR = 0;
|
public static int MINOR = 0;
|
||||||
public static int PATCH = 6;
|
public static int PATCH = 7;
|
||||||
public static int BUILD = readBuildNumber();
|
public static int BUILD = readBuildNumber();
|
||||||
public static Version.Type RELEASE = Version.Type.BETA;
|
public static Version.Type RELEASE = Version.Type.STABLE;
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static LauncherConfig getConfig() {
|
public static LauncherConfig getConfig() {
|
||||||
|
|
Loading…
Reference in a new issue