Make old opaque theme colors translucent once

Configs saved before 0.1.3 hold the old default and preset background
and primary colors fully opaque, so glass didn't show for anyone
updating. On a config without Menu blur (new in 0.1.3), colors that are
an old default or preset get their translucent alpha; colors players
picked stay as they are.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-09-28 23:05:27 +02:00
co-authored by claude
parent 7d0bfd26c9
commit 69c830d466
3 changed files with 45 additions and 8 deletions
@@ -28,6 +28,9 @@ public class Config {
public static FloatProperty titleScale = guiScale();
public static FloatProperty menuScale = guiScale();
public static FloatProperty hudMenuScale = guiScale();
/** Added in 0.1.3, so a config without it was saved by an older version */
static final String MENU_BLUR = "Menu blur";
public static KeybindingProperty openEmoteWheel = Property.keybinding(GLFWProvider.GLFW_KEY_B);
private static FloatProperty guiScale() {
@@ -57,7 +60,7 @@ public class Config {
config.property("Cloak Physics", cloakPhysics, "Let cloaks swing as you move");
config.property("Stagger Animations", stagger, "Animate list items one after another");
config.property("World blur", backgroundBlur, "How much the world or panorama behind Saturn's screens is blurred");
config.property("Menu blur", menuBlur, "How much the game is blurred through translucent menus");
config.property(MENU_BLUR, menuBlur, "How much the game is blurred through translucent menus");
config.property("Widget blur", widgetBlur, "How much the game is blurred through translucent buttons and the dock");
config.property("Title screen scale", titleScale, "How big the title screen is, relative to Minecraft's GUI scale");
config.property("Menu scale", menuScale, "How big the mods, settings and cosmetics menus are, relative to Minecraft's GUI scale");
@@ -156,10 +156,25 @@ public class ConfigManager {
* Load only a single property immediately after creation
*/
private void loadSingleProperty(String name, Property prop) {
JsonNode element = getSaved(name);
if (element != null) {
prop.loadFromJson(element);
}
}
/**
* Whether the config file has a value for {@code name} in this namespace,
* which tells which version last saved it.
*/
public boolean isSaved(String name) {
return getSaved(name) != null;
}
private JsonNode getSaved(String name) {
JsonNode source = cachedJson != null ? cachedJson : loadAndCache();
if (source == null || !source.isObject())
return;
return null;
JsonNode currentScope = source;
@@ -170,16 +185,12 @@ public class ConfigManager {
if (next != null && next.isObject()) {
currentScope = next;
} else {
return;
return null;
}
}
JsonNode element = currentScope.get(name);
if (element != null) {
prop.loadFromJson(element);
}
return currentScope.get(name);
}
/**
@@ -81,6 +81,29 @@ public class Theme {
config.property("Widget Radius", WIDGET_RADIUS, "Corner rounding of buttons and cards");
config.property("Font", FONT, "Font of every Saturn screen");
if (!parent.isSaved(Config.MENU_BLUR)) {
upgradeOpaqueColors();
}
}
/**
* Before 0.1.3 panels and cards were made translucent in code, and the
* background and primary colors were saved fully opaque. Saved colors that
* are an old default or preset get the translucency the colors now carry
* themselves; colors the player picked are left as they are. Runs only on
* configs from older versions, so a preset color later set opaque on
* purpose stays opaque.
*/
private static void upgradeOpaqueColors() {
for (Preset preset : PRESETS) {
if (BACKGROUND.value == (preset.background() | 0xFF000000)) {
BACKGROUND.value = preset.background();
}
if (PRIMARY.value == (preset.primary() | 0xFF000000)) {
PRIMARY.value = preset.primary();
}
}
}
/**