mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-09 20:06:39 -04:00
* Fix #2799 * Remove codes in ConfigUpgrader. * delete collectDFU * update --------- Co-authored-by: Glavo <zjx001202@gmail.com>
This commit is contained in:
parent
d6ea2ef1f9
commit
76f11b6a6f
@ -393,8 +393,8 @@ public final class Config implements Cloneable, Observable {
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setX(double height) {
|
public void setX(double x) {
|
||||||
this.x.set(height);
|
this.x.set(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getY() {
|
public double getY() {
|
||||||
@ -405,8 +405,8 @@ public final class Config implements Cloneable, Observable {
|
|||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setY(double height) {
|
public void setY(double y) {
|
||||||
this.y.set(height);
|
this.y.set(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getWidth() {
|
public double getWidth() {
|
||||||
|
@ -18,16 +18,11 @@
|
|||||||
package org.jackhuang.hmcl.setting;
|
package org.jackhuang.hmcl.setting;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import org.jackhuang.hmcl.ui.Controllers;
|
|
||||||
import org.jackhuang.hmcl.util.Lang;
|
|
||||||
import org.jackhuang.hmcl.util.Pair;
|
|
||||||
import org.jackhuang.hmcl.util.StringUtils;
|
import org.jackhuang.hmcl.util.StringUtils;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import static org.jackhuang.hmcl.util.Lang.tryCast;
|
import static org.jackhuang.hmcl.util.Lang.tryCast;
|
||||||
@ -46,94 +41,66 @@ final class ConfigUpgrader {
|
|||||||
* @param rawContent raw json content of the config settings without modification
|
* @param rawContent raw json content of the config settings without modification
|
||||||
*/
|
*/
|
||||||
static void upgradeConfig(Config deserialized, String rawContent) {
|
static void upgradeConfig(Config deserialized, String rawContent) {
|
||||||
if (deserialized.getConfigVersion() == CURRENT_VERSION) {
|
int configVersion = deserialized.getConfigVersion();
|
||||||
|
|
||||||
|
if (configVersion == CURRENT_VERSION) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int configVersion = deserialized.getConfigVersion();
|
|
||||||
if (configVersion > CURRENT_VERSION) {
|
if (configVersion > CURRENT_VERSION) {
|
||||||
LOG.log(Level.WARNING, String.format("Current HMCL only support the configuration version up to %d. However, the version now is %d.", CURRENT_VERSION, configVersion));
|
LOG.log(Level.WARNING, String.format("Current HMCL only support the configuration version up to %d. However, the version now is %d.", CURRENT_VERSION, configVersion));
|
||||||
|
deserialized.setConfigVersion(CURRENT_VERSION);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG.log(Level.INFO, String.format("Updating configuration from %d to %d.", configVersion, CURRENT_VERSION));
|
LOG.log(Level.INFO, String.format("Updating configuration from %d to %d.", configVersion, CURRENT_VERSION));
|
||||||
Map<?, ?> unmodifiableRawJson = Collections.unmodifiableMap(new Gson().<Map<?, ?>>fromJson(rawContent, Map.class));
|
Map<?, ?> rawJson = Collections.unmodifiableMap(new Gson().<Map<?, ?>>fromJson(rawContent, Map.class));
|
||||||
for (Map.Entry<Integer, BiConsumer<Config, Map<?, ?>>> dfu : collectDFU()) {
|
|
||||||
if (configVersion < dfu.getKey()) {
|
if (configVersion < 1) {
|
||||||
dfu.getValue().accept(deserialized, unmodifiableRawJson);
|
// Upgrade configuration of HMCL 2.x: Convert OfflineAccounts whose stored uuid is important.
|
||||||
configVersion = dfu.getKey();
|
tryCast(rawJson.get("auth"), Map.class).ifPresent(auth -> {
|
||||||
|
tryCast(auth.get("offline"), Map.class).ifPresent(offline -> {
|
||||||
|
String selected = rawJson.containsKey("selectedAccount") ? null
|
||||||
|
: tryCast(offline.get("IAuthenticator_UserName"), String.class).orElse(null);
|
||||||
|
|
||||||
|
tryCast(offline.get("uuidMap"), Map.class).ifPresent(uuidMap -> {
|
||||||
|
((Map<?, ?>) uuidMap).forEach((key, value) -> {
|
||||||
|
Map<Object, Object> storage = new HashMap<>();
|
||||||
|
storage.put("type", "offline");
|
||||||
|
storage.put("username", key);
|
||||||
|
storage.put("uuid", value);
|
||||||
|
if (key.equals(selected)) {
|
||||||
|
storage.put("selected", true);
|
||||||
|
}
|
||||||
|
deserialized.getAccountStorages().add(storage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Upgrade configuration of HMCL earlier than 3.1.70
|
||||||
|
if (!rawJson.containsKey("commonDirType"))
|
||||||
|
deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM);
|
||||||
|
if (!rawJson.containsKey("backgroundType"))
|
||||||
|
deserialized.setBackgroundImageType(StringUtils.isNotBlank(deserialized.getBackgroundImage()) ? EnumBackgroundImage.CUSTOM : EnumBackgroundImage.DEFAULT);
|
||||||
|
if (!rawJson.containsKey("hasProxy"))
|
||||||
|
deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost()));
|
||||||
|
if (!rawJson.containsKey("hasProxyAuth"))
|
||||||
|
deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser()));
|
||||||
|
|
||||||
|
if (!rawJson.containsKey("downloadType")) {
|
||||||
|
tryCast(rawJson.get("downloadtype"), Number.class)
|
||||||
|
.map(Number::intValue)
|
||||||
|
.ifPresent(id -> {
|
||||||
|
if (id == 0) {
|
||||||
|
deserialized.setDownloadType("mojang");
|
||||||
|
} else if (id == 1) {
|
||||||
|
deserialized.setDownloadType("bmclapi");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deserialized.setConfigVersion(CURRENT_VERSION);
|
deserialized.setConfigVersion(CURRENT_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Initialize the dfu of HMCL. Feel free to use lambda as all the lambda here would not be initialized unless HMCL needs to update the configuration.
|
|
||||||
* For each item in this list, it should be a Map.Entry.</p>
|
|
||||||
*
|
|
||||||
* <p>The key should be a version number. All the configuration with a version number which is less than the specific one will be applied to this upgrader.</p>
|
|
||||||
* <p>The value should be the upgrader. The configuration which is waited to being processed, and the raw unmodifiable value of the json from the configuration file.</p>
|
|
||||||
* <p>The return value should a target version number of this item.</p>
|
|
||||||
*
|
|
||||||
* <p>The last item must return CURRENT_VERSION, as the config file should always being updated to the latest version.</p>
|
|
||||||
*/
|
|
||||||
private static List<Map.Entry<Integer, BiConsumer<Config, Map<?, ?>>>> collectDFU() {
|
|
||||||
List<Map.Entry<Integer, BiConsumer<Config, Map<?, ?>>>> dfu = Lang.immutableListOf(
|
|
||||||
Pair.pair(1, (deserialized, rawJson) -> {
|
|
||||||
// Upgrade configuration of HMCL 2.x: Convert OfflineAccounts whose stored uuid is important.
|
|
||||||
tryCast(rawJson.get("auth"), Map.class).ifPresent(auth -> {
|
|
||||||
tryCast(auth.get("offline"), Map.class).ifPresent(offline -> {
|
|
||||||
String selected = rawJson.containsKey("selectedAccount") ? null
|
|
||||||
: tryCast(offline.get("IAuthenticator_UserName"), String.class).orElse(null);
|
|
||||||
|
|
||||||
tryCast(offline.get("uuidMap"), Map.class).ifPresent(uuidMap -> {
|
|
||||||
((Map<?, ?>) uuidMap).forEach((key, value) -> {
|
|
||||||
Map<Object, Object> storage = new HashMap<>();
|
|
||||||
storage.put("type", "offline");
|
|
||||||
storage.put("username", key);
|
|
||||||
storage.put("uuid", value);
|
|
||||||
if (key.equals(selected)) {
|
|
||||||
storage.put("selected", true);
|
|
||||||
}
|
|
||||||
deserialized.getAccountStorages().add(storage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Upgrade configuration of HMCL earlier than 3.1.70
|
|
||||||
if (!rawJson.containsKey("commonDirType"))
|
|
||||||
deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM);
|
|
||||||
if (!rawJson.containsKey("backgroundType"))
|
|
||||||
deserialized.setBackgroundImageType(StringUtils.isNotBlank(deserialized.getBackgroundImage()) ? EnumBackgroundImage.CUSTOM : EnumBackgroundImage.DEFAULT);
|
|
||||||
if (!rawJson.containsKey("hasProxy"))
|
|
||||||
deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost()));
|
|
||||||
if (!rawJson.containsKey("hasProxyAuth"))
|
|
||||||
deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser()));
|
|
||||||
|
|
||||||
if (!rawJson.containsKey("downloadType")) {
|
|
||||||
tryCast(rawJson.get("downloadtype"), Number.class)
|
|
||||||
.map(Number::intValue)
|
|
||||||
.ifPresent(id -> {
|
|
||||||
if (id == 0) {
|
|
||||||
deserialized.setDownloadType("mojang");
|
|
||||||
} else if (id == 1) {
|
|
||||||
deserialized.setDownloadType("bmclapi");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
Pair.pair(2, (deserialized, rawJson) -> {
|
|
||||||
deserialized.setX(0.5D - deserialized.getWidth() / Controllers.SCREEN.getBounds().getWidth() / 2);
|
|
||||||
deserialized.setY(0.5D - deserialized.getHeight() / Controllers.SCREEN.getBounds().getHeight() / 2);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
if (dfu.get(dfu.size() - 1).getKey() != CURRENT_VERSION) {
|
|
||||||
throw new IllegalStateException("The last dfu must adapt all the config version below CURRENT_VERSION");
|
|
||||||
}
|
|
||||||
|
|
||||||
return dfu;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -37,10 +37,7 @@ import javafx.stage.StageStyle;
|
|||||||
import org.jackhuang.hmcl.Launcher;
|
import org.jackhuang.hmcl.Launcher;
|
||||||
import org.jackhuang.hmcl.Metadata;
|
import org.jackhuang.hmcl.Metadata;
|
||||||
import org.jackhuang.hmcl.game.ModpackHelper;
|
import org.jackhuang.hmcl.game.ModpackHelper;
|
||||||
import org.jackhuang.hmcl.setting.Accounts;
|
import org.jackhuang.hmcl.setting.*;
|
||||||
import org.jackhuang.hmcl.setting.EnumCommonDirectory;
|
|
||||||
import org.jackhuang.hmcl.setting.Profiles;
|
|
||||||
import org.jackhuang.hmcl.setting.Theme;
|
|
||||||
import org.jackhuang.hmcl.task.Task;
|
import org.jackhuang.hmcl.task.Task;
|
||||||
import org.jackhuang.hmcl.task.TaskExecutor;
|
import org.jackhuang.hmcl.task.TaskExecutor;
|
||||||
import org.jackhuang.hmcl.ui.account.AccountListPage;
|
import org.jackhuang.hmcl.ui.account.AccountListPage;
|
||||||
@ -68,6 +65,8 @@ import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage;
|
|||||||
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
|
|
||||||
public final class Controllers {
|
public final class Controllers {
|
||||||
|
public static final int MIN_WIDTH = 800 + 2 + 16; // bg width + border width*2 + shadow width*2
|
||||||
|
public static final int MIN_HEIGHT = 450 + 2 + 40 + 16; // bg height + border width*2 + toolbar height + shadow width*2
|
||||||
public static final Screen SCREEN = Screen.getPrimary();
|
public static final Screen SCREEN = Screen.getPrimary();
|
||||||
private static InvalidationListener stageSizeChangeListener;
|
private static InvalidationListener stageSizeChangeListener;
|
||||||
private static DoubleProperty stageX = new SimpleDoubleProperty();
|
private static DoubleProperty stageX = new SimpleDoubleProperty();
|
||||||
@ -205,35 +204,37 @@ public final class Controllers {
|
|||||||
|
|
||||||
WeakInvalidationListener weakListener = new WeakInvalidationListener(stageSizeChangeListener);
|
WeakInvalidationListener weakListener = new WeakInvalidationListener(stageSizeChangeListener);
|
||||||
|
|
||||||
double initHeight = config().getHeight();
|
double initWidth = Math.max(MIN_WIDTH, config().getWidth());
|
||||||
double initWidth = config().getWidth();
|
double initHeight = Math.max(MIN_HEIGHT, config().getHeight());
|
||||||
double initX = config().getX() * SCREEN.getBounds().getWidth();
|
|
||||||
double initY = config().getY() * SCREEN.getBounds().getHeight();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
double initX = config().getX() * SCREEN.getBounds().getWidth();
|
||||||
|
double initY = config().getY() * SCREEN.getBounds().getHeight();
|
||||||
|
|
||||||
boolean invalid = true;
|
boolean invalid = true;
|
||||||
double border = 20D;
|
double border = 20D;
|
||||||
for (Screen screen : Screen.getScreens()) {
|
for (Screen screen : Screen.getScreens()) {
|
||||||
Rectangle2D bound = screen.getBounds();
|
Rectangle2D bound = screen.getBounds();
|
||||||
|
|
||||||
if (bound.getMinX() + border <= initX + initWidth && initX <= bound.getMaxX() - border && bound.getMinY() + border <= initY + initHeight && initY <= bound.getMaxY() - border) {
|
if (bound.getMinX() + border <= initX + initWidth && initX <= bound.getMaxX() - border && bound.getMinY() + border <= initY && initY <= bound.getMaxY() - border) {
|
||||||
invalid = false;
|
invalid = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invalid) {
|
if (invalid) {
|
||||||
initX = (0.5D - initWidth / Controllers.SCREEN.getBounds().getWidth() / 2) * SCREEN.getBounds().getWidth();
|
initX = (0.5D - initWidth / SCREEN.getBounds().getWidth() / 2) * SCREEN.getBounds().getWidth();
|
||||||
initY = (0.5D - initHeight / Controllers.SCREEN.getBounds().getHeight() / 2) * SCREEN.getBounds().getHeight();
|
initY = (0.5D - initHeight / SCREEN.getBounds().getHeight() / 2) * SCREEN.getBounds().getHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage.setX(initX);
|
||||||
|
stage.setY(initY);
|
||||||
|
stageX.set(initX);
|
||||||
|
stageY.set(initY);
|
||||||
}
|
}
|
||||||
|
|
||||||
stage.setX(initX);
|
|
||||||
stage.setY(initY);
|
|
||||||
stage.setHeight(initHeight);
|
stage.setHeight(initHeight);
|
||||||
stage.setWidth(initWidth);
|
stage.setWidth(initWidth);
|
||||||
stageX.set(initX);
|
|
||||||
stageY.set(initY);
|
|
||||||
stageHeight.set(initHeight);
|
stageHeight.set(initHeight);
|
||||||
stageWidth.set(initWidth);
|
stageWidth.set(initWidth);
|
||||||
stage.xProperty().addListener(weakListener);
|
stage.xProperty().addListener(weakListener);
|
||||||
@ -255,8 +256,8 @@ public final class Controllers {
|
|||||||
|
|
||||||
scene = new Scene(decorator.getDecorator());
|
scene = new Scene(decorator.getDecorator());
|
||||||
scene.setFill(Color.TRANSPARENT);
|
scene.setFill(Color.TRANSPARENT);
|
||||||
stage.setMinHeight(450 + 2 + 40 + 16); // bg height + border width*2 + toolbar height + shadow width*2
|
stage.setMinWidth(MIN_WIDTH);
|
||||||
stage.setMinWidth(800 + 2 + 16); // bg width + border width*2 + shadow width*2
|
stage.setMinHeight(MIN_HEIGHT);
|
||||||
decorator.getDecorator().prefWidthProperty().bind(scene.widthProperty());
|
decorator.getDecorator().prefWidthProperty().bind(scene.widthProperty());
|
||||||
decorator.getDecorator().prefHeightProperty().bind(scene.heightProperty());
|
decorator.getDecorator().prefHeightProperty().bind(scene.heightProperty());
|
||||||
scene.getStylesheets().setAll(Theme.getTheme().getStylesheets(config().getLauncherFontFamily()));
|
scene.getStylesheets().setAll(Theme.getTheme().getStylesheets(config().getLauncherFontFamily()));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user