feat(module): Enhance ModuleManager to integrate RendererWorkingSet and manage module display state

This commit is contained in:
extio-de
2025-12-23 14:48:58 +01:00
parent 5282d1eb2f
commit d6335b6a9f
4 changed files with 34 additions and 6 deletions

View File

@@ -11,6 +11,8 @@ public abstract class AbstractClientModule extends AbstractModule {
final static int MODULE_PRIORITY_HIGH = 75;
private boolean displayed;
public AbstractClientModule() {
}
@@ -38,5 +40,13 @@ public abstract class AbstractClientModule extends AbstractModule {
public void runUiPost() {
}
public boolean isDisplayed() {
return this.displayed;
}
public void setDisplayed(final boolean displayed) {
this.displayed = displayed;
}
}

View File

@@ -7,14 +7,16 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import de.extio.game_engine.renderer.work.RendererWorkingSet;
@AutoConfiguration
@ConditionalOnProperty(name = "game-engine.module.enabled", havingValue = "true", matchIfMissing = true)
public class ModuleManagerAutoConfiguration {
@Bean
@ConditionalOnMissingBean
ModuleManager moduleManager(final List<AbstractModule> initialModules) {
return new ModuleManagerImpl(initialModules);
ModuleManager moduleManager(final List<AbstractModule> initialModules, final RendererWorkingSet rendererWorkingSet) {
return new ModuleManagerImpl(initialModules, rendererWorkingSet);
}
@Bean

View File

@@ -10,6 +10,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import de.extio.game_engine.renderer.work.RendererWorkingSet;
public class ModuleManagerImpl implements InitializingBean, ModuleManager {
private static final Logger LOGGER = LoggerFactory.getLogger(ModuleManagerImpl.class);
@@ -17,6 +19,8 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager {
private final List<AbstractModule> modulesInitial;
private final List<AbstractModule> modulesAll = new ArrayList<>();
private final RendererWorkingSet rendererWorkingSet;
private List<AbstractModule> modulesAllView = List.of();
@@ -32,8 +36,9 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager {
private final Deque<List<AbstractClientModule>> lastVisibleStates = new ArrayDeque<>();
public ModuleManagerImpl(final List<AbstractModule> initialModules) {
public ModuleManagerImpl(final List<AbstractModule> initialModules, final RendererWorkingSet rendererWorkingSet) {
this.modulesInitial = initialModules;
this.rendererWorkingSet = rendererWorkingSet;
}
@Override
@@ -105,6 +110,9 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager {
this.modulesAllView = List.copyOf(this.modulesAll);
this.invokeSafe(module, m -> m.onUnload());
if (module instanceof final AbstractClientModule clientModule) {
this.rendererWorkingSet.clear(clientModule.getClass());
}
LOGGER.debug("Unloaded module " + clazz.getName());
}
@@ -143,6 +151,9 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager {
.map(m -> (AbstractClientModule) m)
.toList();
this.modulesDisplayedClientModulesView = List.copyOf(this.modulesDisplayed);
if (module instanceof final AbstractClientModule clientModule) {
this.rendererWorkingSet.clear(clientModule.getClass());
}
LOGGER.debug("Deactivated " + clazz.getName());
}
@@ -199,9 +210,11 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager {
final boolean doDisplay = display || clientModule.isAlwaysDisplay();
if (doDisplay && !curDisplayed) {
this.modulesDisplayed.add(clientModule);
clientModule.setDisplayed(true);
this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onShow());
}
else if (!doDisplay && curDisplayed) {
clientModule.setDisplayed(false);
this.modulesDisplayed.removeIf(mod -> clazz.isAssignableFrom(mod.getClass()));
this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onHide());
}

View File

@@ -1,6 +1,7 @@
package de.extio.game_engine.module;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.mock;
import java.util.ArrayList;
import java.util.List;
@@ -8,6 +9,8 @@ import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import de.extio.game_engine.renderer.work.RendererWorkingSet;
public class ModuleManagerTest {
private ModuleManagerImpl moduleManager;
@@ -25,7 +28,7 @@ public class ModuleManagerTest {
initialModules.add(this.testModule);
initialModules.add(this.testClientModule);
this.moduleManager = new ModuleManagerImpl(initialModules);
this.moduleManager = new ModuleManagerImpl(initialModules, mock(RendererWorkingSet.class));
this.moduleManager.afterPropertiesSet();
}
@@ -38,7 +41,7 @@ public class ModuleManagerTest {
@Test
public void testAfterPropertiesSet_EmptyModules() throws Exception {
final ModuleManagerImpl emptyManager = new ModuleManagerImpl(List.of());
final ModuleManagerImpl emptyManager = new ModuleManagerImpl(List.of(), mock(RendererWorkingSet.class));
emptyManager.afterPropertiesSet();
assertTrue(emptyManager.getModulesAll().isEmpty());
@@ -46,7 +49,7 @@ public class ModuleManagerTest {
@Test
public void testAfterPropertiesSet_NullModules() throws Exception {
final ModuleManagerImpl nullManager = new ModuleManagerImpl(null);
final ModuleManagerImpl nullManager = new ModuleManagerImpl(null, mock(RendererWorkingSet.class));
nullManager.afterPropertiesSet();
assertTrue(nullManager.getModulesAll().isEmpty());