From 4a21be173083f1a9f0c52f9b5ba3f285c5db6a82 Mon Sep 17 00:00:00 2001 From: extio-de Date: Sun, 1 Feb 2026 14:11:07 +0100 Subject: [PATCH] feat(renderer): extend ToggleButtonData and SwitchData to include allowNoneToggledInGroup flag --- .../game_engine/renderer/ThemeManager.java | 2 + .../G2DAbstractToggleButtonControlImpl.java | 5 ++- .../renderer/g2d/theme/G2DThemeManager.java | 40 ++++++++++++------- .../renderer/model/bo/ControlRenderingBo.java | 4 +- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/extio/game_engine/renderer/ThemeManager.java b/src/main/java/de/extio/game_engine/renderer/ThemeManager.java index 251edc7..be2365a 100644 --- a/src/main/java/de/extio/game_engine/renderer/ThemeManager.java +++ b/src/main/java/de/extio/game_engine/renderer/ThemeManager.java @@ -9,6 +9,8 @@ import de.extio.game_engine.renderer.g2d.theme.Theme; public interface ThemeManager { List getAvailableThemeNames(); + + List getPatternRendererNames(); Optional loadThemeFromStorage(String themeName); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/control/impl/G2DAbstractToggleButtonControlImpl.java b/src/main/java/de/extio/game_engine/renderer/g2d/control/impl/G2DAbstractToggleButtonControlImpl.java index 58cf526..2f67a59 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/control/impl/G2DAbstractToggleButtonControlImpl.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/control/impl/G2DAbstractToggleButtonControlImpl.java @@ -11,10 +11,13 @@ import de.extio.game_engine.renderer.model.event.UiControlEvent; public abstract class G2DAbstractToggleButtonControlImpl extends G2DButtonControlImpl implements ToggleButtonControl, SwitchControl { protected boolean drawBorder = true; + + protected boolean allowNoneToggledInGroup; protected void applyToggleButtonData(final ToggleButtonData data) { if (data != null) { if (this.lastControlDataUpdateTimeInternal < this.lastControlDataUpdateTime) { + this.allowNoneToggledInGroup = data.allowNoneToggledInGroup(); this.setToggled(data.toggled()); this.lastControlDataUpdateTimeInternal = this.lastControlDataUpdateTime; } @@ -70,7 +73,7 @@ public abstract class G2DAbstractToggleButtonControlImpl extends G2DButtonContro } } - if (!controlInGroupToggled) { + if (!controlInGroupToggled && !this.allowNoneToggledInGroup) { this.control.setToggled(true); } } diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/theme/G2DThemeManager.java b/src/main/java/de/extio/game_engine/renderer/g2d/theme/G2DThemeManager.java index 2cd52a8..adb4a7c 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/theme/G2DThemeManager.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/theme/G2DThemeManager.java @@ -23,16 +23,21 @@ public class G2DThemeManager implements ThemeManager { private static final Logger LOGGER = LoggerFactory.getLogger(G2DThemeManager.class); private static final List THEME_STORAGE_PATH = List.of("gameEngine"); + private static final String THEME_STORAGE_NAME = "lastTheme"; private G2DRenderer g2dRenderer; + private G2DRendererControl g2dRendererControl; - + private final StaticResourceService staticResourceService; + private final StorageService storageService; private final Map patternRenderers; + private final Map themes; + private final Theme defaultTheme; private Theme currentTheme; @@ -64,7 +69,7 @@ public class G2DThemeManager implements ThemeManager { .sorted() .toList(); } - + @Override public Optional loadThemeFromStorage(final String themeName) { if (themeName == null || themeName.isBlank()) { @@ -102,20 +107,20 @@ public class G2DThemeManager implements ThemeManager { loaded.ifPresent(this::registerTheme); return loaded; } - + @Override public void setCurrentTheme(final String themeName) { if (themeName == null || themeName.isBlank()) { this.applyLastUsedOrDefault(); return; } - + final var direct = this.themes.get(themeName); if (direct != null) { this.setCurrentTheme(direct); return; } - + final var byDisplayName = this.themes.values().stream() .filter(theme -> theme != null && theme.getName() != null && theme.getName().equalsIgnoreCase(themeName)) .findFirst() @@ -124,7 +129,7 @@ public class G2DThemeManager implements ThemeManager { this.setCurrentTheme(byDisplayName); return; } - + this.setCurrentTheme(this.loadTheme(themeName)); } @@ -161,7 +166,7 @@ public class G2DThemeManager implements ThemeManager { LOGGER.warn("Theme '{}' not found in storage. Using default theme.", themeName); return this.defaultTheme; } - + private void applyLastUsedOrDefault() { try { final Optional persistedTheme = this.storageService.loadByPath(Theme.class, THEME_STORAGE_PATH, THEME_STORAGE_NAME); @@ -171,7 +176,7 @@ public class G2DThemeManager implements ThemeManager { LOGGER.info("Loaded last used theme: {}", this.currentTheme.getName()); return; } - + this.applyTheme(this.defaultTheme); LOGGER.info("Loaded default theme: {}", this.currentTheme.getName()); } @@ -179,13 +184,13 @@ public class G2DThemeManager implements ThemeManager { LOGGER.warn("Could not load last used theme. Using default.", e); } } - + private void applyTheme(Theme theme) { this.currentTheme = theme; this.g2dRendererControl.getUiOptions().setFontResource(new StaticResource(List.of("renderer"), this.currentTheme.getFont())); this.g2dRenderer.reset(); } - + private void registerTheme(final Theme theme) { if (theme == null || theme.getName() == null || theme.getName().isBlank()) { return; @@ -204,20 +209,27 @@ public class G2DThemeManager implements ThemeManager { LOGGER.warn("Could not persist last used theme", e); } } - + public void setG2dRenderer(final G2DRenderer g2dRenderer) { this.g2dRenderer = g2dRenderer; } - + public void setG2dRendererControl(G2DRendererControl g2dRendererControl) { this.g2dRendererControl = g2dRendererControl; } - + public PatternRenderer getPatternRenderer(final String rendererName) { return this.patternRenderers.get(rendererName); } - + public PatternRenderer getCurrentPatternRenderer() { return this.patternRenderers.get(this.currentTheme.getPatternRendererName()); } + + @Override + public List getPatternRendererNames() { + return this.patternRenderers.keySet().stream() + .sorted() + .toList(); + } } diff --git a/src/main/java/de/extio/game_engine/renderer/model/bo/ControlRenderingBo.java b/src/main/java/de/extio/game_engine/renderer/model/bo/ControlRenderingBo.java index 153dc69..deff386 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/bo/ControlRenderingBo.java +++ b/src/main/java/de/extio/game_engine/renderer/model/bo/ControlRenderingBo.java @@ -16,9 +16,9 @@ public interface ControlRenderingBo extends RenderingBoHasDimension { record ButtonData(RgbaColor backgroundColor, StaticResource iconResource) {} - record ToggleButtonData(boolean toggled, StaticResource iconResource) {} + record ToggleButtonData(boolean toggled, boolean allowNoneToggledInGroup, StaticResource iconResource) {} - record SwitchData(boolean toggled, StaticResource iconResource, boolean drawBorder) {} + record SwitchData(boolean toggled, boolean allowNoneToggledInGroup, StaticResource iconResource, boolean drawBorder) {} record WindowCloseButtonData(boolean thickBorder) {}