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; final static int MODULE_PRIORITY_HIGH = 75;
private boolean displayed;
public AbstractClientModule() { public AbstractClientModule() {
} }
@@ -38,5 +40,13 @@ public abstract class AbstractClientModule extends AbstractModule {
public void runUiPost() { 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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import de.extio.game_engine.renderer.work.RendererWorkingSet;
@AutoConfiguration @AutoConfiguration
@ConditionalOnProperty(name = "game-engine.module.enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnProperty(name = "game-engine.module.enabled", havingValue = "true", matchIfMissing = true)
public class ModuleManagerAutoConfiguration { public class ModuleManagerAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
ModuleManager moduleManager(final List<AbstractModule> initialModules) { ModuleManager moduleManager(final List<AbstractModule> initialModules, final RendererWorkingSet rendererWorkingSet) {
return new ModuleManagerImpl(initialModules); return new ModuleManagerImpl(initialModules, rendererWorkingSet);
} }
@Bean @Bean

View File

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

View File

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