Enhance menu options configuration for improved modularity and flexibility

This commit is contained in:
extio-de
2026-06-13 19:09:22 +02:00
parent fbb1fb6ea6
commit b510b41698
5 changed files with 76 additions and 55 deletions

View File

@@ -31,7 +31,7 @@ public abstract class AbstractOptionsTab {
@Autowired
private RendererControl rendererControl;
@Autowired
@Autowired(required = false)
private AudioControl audioControl;
@Autowired
@@ -40,7 +40,7 @@ public abstract class AbstractOptionsTab {
@Autowired
private StorageService storageService;
@Autowired
@Autowired(required = false)
private KeycodeRegistry keycodeRegistry;
protected final ApplicationContext applicationContext() {

View File

@@ -1,5 +1,6 @@
package de.extio.game_engine.menu;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -12,6 +13,7 @@ import de.extio.game_engine.renderer.work.RenderingBoPool;
@AutoConfiguration
@ConditionalOnProperty(name = "game-engine.menu.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true)
public class MenuAutoConfiguration {
@Bean
@@ -24,34 +26,37 @@ public class MenuAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "game-engine.menu.options.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.menu.options.audio.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.audio.enabled", havingValue = "true", matchIfMissing = true)
OptionsAudioTab optionsAudioTab() {
return new OptionsAudioTab();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "game-engine.menu.options.enabled", havingValue = "true", matchIfMissing = true)
OptionsVideoTab optionsVideoTab() {
return new OptionsVideoTab();
@ConditionalOnProperty(name = "game-engine.menu.options.video.enabled", havingValue = "true", matchIfMissing = true)
OptionsVideoTab optionsVideoTab(@Value("${game-engine.menu.options.video.scaleFactor.enabled:true}") final boolean scaleFactorEnabled) {
return new OptionsVideoTab(scaleFactorEnabled);
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "game-engine.menu.options.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.menu.options.keyboard.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.keycode-registry.enabled", havingValue = "true", matchIfMissing = true)
OptionsKeyboardTab optionsKeyboardTab() {
return new OptionsKeyboardTab();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "game-engine.menu.options.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.menu.options.themes.enabled", havingValue = "true", matchIfMissing = true)
OptionsThemesTab optionsThemesTab() {
return new OptionsThemesTab();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "game-engine.menu.options.themes.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.menu.hsb-color-picker.enabled", havingValue = "true", matchIfMissing = true)
HsbColorPickerModule hsbColorPickerModule() {
return new HsbColorPickerModule();
@@ -59,6 +64,7 @@ public class MenuAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "game-engine.menu.options.themes.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.menu.theme-editor.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.menu.hsb-color-picker.enabled", havingValue = "true", matchIfMissing = true)
ThemeEditorModule themeEditorModule() {

View File

@@ -37,11 +37,6 @@ final class OptionsKeyboardTab extends AbstractOptionsTab implements OptionsTab
return 50;
}
@Override
public boolean visibleInNavigation() {
return false;
}
@Override
public void render(final OptionsModuleContext context) {
final var keycodeRegistrations = this.keycodeRegistry().getAll();

View File

@@ -22,6 +22,12 @@ final class OptionsVideoTab extends AbstractOptionsTab implements OptionsTab {
private final Map<String, Integer> screenSelectionByControlId = new HashMap<>();
private final Map<String, Double> scaleFactorSelectionByControlId = new HashMap<>();
private final boolean scaleFactorOptionEnabled;
public OptionsVideoTab(final boolean scaleFactorOptionEnabled) {
this.scaleFactorOptionEnabled = scaleFactorOptionEnabled;
}
@Override
public String tabId() {
return TAB_ID;
@@ -146,43 +152,45 @@ final class OptionsVideoTab extends AbstractOptionsTab implements OptionsTab {
yPos += 100;
bo = this.renderingBoPool().acquire("OptionsModule_Video_Label_ScaleFactor", ControlRenderingBo.class)
.setCaption(this.localizationService().translate("ecyoa-95", "Scale Factor:"))
.setFontSize(48)
.setType(LabelControl.class)
.setControlData(new LabelData(null, null, HorizontalAlignment.LEFT))
.setVisible(true)
.setEnabled(false)
.withDimensionAbsolute(800, 80)
.withPositionRelative(10, yPos);
this.contentScrollArea(context).putRenderingBo(bo);
yPos += 90;
final var currentScaleFactor = this.rendererControl().getVideoOptions().getScaleFactorModifier();
final var scaleFactors = List.of(0.75, 0.90, 1.00, 1.15, 1.25);
var scaleXPos = 10;
for (final var scaleFactor : scaleFactors) {
final var controlId = "OptionsModule_Video_ScaleFactor_" + (int) (scaleFactor * 100);
this.scaleFactorSelectionByControlId.put(controlId, scaleFactor);
bo = this.renderingBoPool().acquire(controlId, ControlRenderingBo.class)
.setCaption((int) (scaleFactor * 100) + "%")
.setFontSize(42)
.setType(ToggleButtonControl.class)
.setControlGroup("OptionsModule_ScaleFactorGroup")
.setControlData(new ToggleButtonData(Math.abs(currentScaleFactor - scaleFactor) < 0.01, false, null))
if (scaleFactorOptionEnabled) {
bo = this.renderingBoPool().acquire("OptionsModule_Video_Label_ScaleFactor", ControlRenderingBo.class)
.setCaption(this.localizationService().translate("ecyoa-95", "Scale Factor:"))
.setFontSize(48)
.setType(LabelControl.class)
.setControlData(new LabelData(null, null, HorizontalAlignment.LEFT))
.setVisible(true)
.setEnabled(true)
.withDimensionAbsolute(150, 60)
.withPositionRelative(scaleXPos, yPos);
.setEnabled(false)
.withDimensionAbsolute(800, 80)
.withPositionRelative(10, yPos);
this.contentScrollArea(context).putRenderingBo(bo);
scaleXPos += 160;
}
yPos += 90;
yPos += 100;
final var currentScaleFactor = this.rendererControl().getVideoOptions().getScaleFactorModifier();
final var scaleFactors = List.of(0.75, 0.90, 1.00, 1.15, 1.25);
var scaleXPos = 10;
for (final var scaleFactor : scaleFactors) {
final var controlId = "OptionsModule_Video_ScaleFactor_" + (int) (scaleFactor * 100);
this.scaleFactorSelectionByControlId.put(controlId, scaleFactor);
bo = this.renderingBoPool().acquire(controlId, ControlRenderingBo.class)
.setCaption((int) (scaleFactor * 100) + "%")
.setFontSize(42)
.setType(ToggleButtonControl.class)
.setControlGroup("OptionsModule_ScaleFactorGroup")
.setControlData(new ToggleButtonData(Math.abs(currentScaleFactor - scaleFactor) < 0.01, false, null))
.setVisible(true)
.setEnabled(true)
.withDimensionAbsolute(150, 60)
.withPositionRelative(scaleXPos, yPos);
this.contentScrollArea(context).putRenderingBo(bo);
scaleXPos += 160;
}
yPos += 100;
}
bo = this.renderingBoPool().acquire("OptionsModule_Video_Label_Framerate", ControlRenderingBo.class)
.setCaption(this.localizationService().translate("ecyoa-96", "Target Framerate:"))