From 0acd660040947cf73215427ac46538e77ac9e67c Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Fri, 24 Nov 2023 19:21:35 +0100 Subject: [PATCH] Implement providers and listeners for GUI --- .../serverwrecker/ServerWreckerLoader.java | 2 +- .../serverwrecker/gui/GUIManager.java | 2 +- .../gui/navigation/CardsContainer.java | 7 ++- .../gui/navigation/GeneratedPanel.java | 43 ++++++++++++++----- .../settings/lib/SettingsManager.java | 7 ++- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java index 9989f8dcd..9edd832e4 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java +++ b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java @@ -66,7 +66,7 @@ public static void runGUI(int port) { var serverWrecker = new ServerWreckerServer(OperationMode.GUI, host, port); var rpcClient = new RPCClient(host, port, serverWrecker.generateAdminJWT()); - var guiManager = new GUIManager(serverWrecker, rpcClient); + var guiManager = new GUIManager(rpcClient); guiManager.initGUI(); } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java b/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java index c6c483002..760a76009 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java @@ -60,7 +60,7 @@ public class GUIManager { private final ProxyRegistry proxyRegistry = new ProxyRegistry(); private final SettingsManager settingsManager = new SettingsManager(List.of()); - public GUIManager(ServerWreckerServer serverWreckerServer, RPCClient rpcClient) { + public GUIManager(RPCClient rpcClient) { this.rpcClient = rpcClient; injector.register(GUIManager.class, this); } diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java index ffd02cc9f..ce0bca8d0 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java @@ -23,6 +23,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.pistonmaster.serverwrecker.grpc.generated.ClientPluginSettingsPage; +import net.pistonmaster.serverwrecker.gui.GUIManager; import javax.inject.Inject; import javax.swing.*; @@ -36,6 +37,7 @@ public class CardsContainer extends JPanel { @Getter private final List panels = new ArrayList<>(); private final Injector injector; + private final GUIManager guiManager; @Getter private final List pluginPages = new ArrayList<>(); @@ -43,7 +45,7 @@ public void create() { setLayout(new CardLayout()); // Add bot settings - panels.add(new GeneratedPanel(getByNamespace("bot"))); + panels.add(new GeneratedPanel(guiManager.getSettingsManager(), getByNamespace("bot"))); var pluginPanel = injector.getSingleton(PluginListPanel.class); panels.add(pluginPanel); panels.add(injector.getSingleton(AccountPanel.class)); @@ -60,7 +62,8 @@ public void create() { // Add the plugin page cards for (var item : pluginPages) { - add(NavigationWrapper.createBackWrapper(this, pluginPanel.getNavigationId(), new GeneratedPanel(item)), item.getNamespace()); + add(NavigationWrapper.createBackWrapper(this, pluginPanel.getNavigationId(), + new GeneratedPanel(guiManager.getSettingsManager(), item)), item.getNamespace()); } setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 10)); diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/GeneratedPanel.java b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/GeneratedPanel.java index 2bb2eeaf0..4c0853e4e 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/GeneratedPanel.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/GeneratedPanel.java @@ -19,51 +19,68 @@ */ package net.pistonmaster.serverwrecker.gui.navigation; +import com.google.gson.JsonPrimitive; import net.pistonmaster.serverwrecker.grpc.generated.ClientPluginSettingsPage; import net.pistonmaster.serverwrecker.grpc.generated.ComboOption; import net.pistonmaster.serverwrecker.grpc.generated.IntSetting; import net.pistonmaster.serverwrecker.gui.libs.JMinMaxHelper; import net.pistonmaster.serverwrecker.gui.libs.PresetJCheckBox; +import net.pistonmaster.serverwrecker.settings.lib.SettingsManager; +import net.pistonmaster.serverwrecker.settings.lib.property.PropertyKey; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxRenderer; import java.awt.*; +import java.util.Objects; public class GeneratedPanel extends NavigationItem { private final ClientPluginSettingsPage settingsPage; - public GeneratedPanel(ClientPluginSettingsPage settingsPage) { + public GeneratedPanel(SettingsManager settingsManager, ClientPluginSettingsPage settingsPage) { this.settingsPage = settingsPage; setLayout(new GridLayout(0, 2)); - addComponents(this, settingsPage); + addComponents(this, settingsPage, settingsManager); } - private static JSpinner createIntObject(IntSetting intSetting) { - return new JSpinner(new SpinnerNumberModel(intSetting.getDef(), intSetting.getMin(), intSetting.getMax(), intSetting.getStep())); + private static JSpinner createIntObject(PropertyKey propertyKey, SettingsManager settingsManager, IntSetting intSetting) { + var spinner = new JSpinner(new SpinnerNumberModel(intSetting.getDef(), intSetting.getMin(), intSetting.getMax(), intSetting.getStep())); + settingsManager.registerProvider(propertyKey, () -> new JsonPrimitive((int) spinner.getValue())); + settingsManager.registerListener(propertyKey, s -> spinner.setValue(s.getAsInt())); + + return spinner; } - public static void addComponents(JPanel panel, ClientPluginSettingsPage settingsPage) { + public static void addComponents(JPanel panel, ClientPluginSettingsPage settingsPage, SettingsManager settingsManager) { for (var settingEntry : settingsPage.getEntriesList()) { switch (settingEntry.getValueCase()) { case SINGLE -> { var singleEntry = settingEntry.getSingle(); + var propertyKey = new PropertyKey(settingsPage.getNamespace(), singleEntry.getSettingEntryId()); panel.add(new JLabel(singleEntry.getName())); var settingType = singleEntry.getType(); panel.add(switch (settingType.getValueCase()) { case STRING -> { var stringEntry = settingType.getString(); - yield new JTextField(stringEntry.getDef()); + var textField = new JTextField(stringEntry.getDef()); + settingsManager.registerListener(propertyKey, s -> textField.setText(s.getAsString())); + settingsManager.registerProvider(propertyKey, () -> new JsonPrimitive(textField.getText())); + + yield textField; } case INT -> { var intEntry = settingType.getInt(); - yield createIntObject(intEntry); + yield createIntObject(propertyKey, settingsManager, intEntry); } case BOOL -> { var boolEntry = settingType.getBool(); - yield new PresetJCheckBox(boolEntry.getDef()); + var checkBox = new PresetJCheckBox(boolEntry.getDef()); + settingsManager.registerListener(propertyKey, s -> checkBox.setSelected(s.getAsBoolean())); + settingsManager.registerProvider(propertyKey, () -> new JsonPrimitive(checkBox.isSelected())); + + yield checkBox; } case COMBO -> { var comboEntry = settingType.getCombo(); @@ -72,6 +89,10 @@ public static void addComponents(JPanel panel, ClientPluginSettingsPage settings var comboBox = new JComboBox(options.toArray(new ComboOption[0])); comboBox.setRenderer(new ComboRenderer()); comboBox.setSelectedItem(options.get(comboEntry.getDef())); + settingsManager.registerListener(propertyKey, + s -> comboBox.setSelectedItem(options.get(s.getAsInt()))); + settingsManager.registerProvider(propertyKey, + () -> new JsonPrimitive(((ComboOption) Objects.requireNonNull(comboBox.getSelectedItem())).getId())); yield comboBox; } @@ -81,15 +102,17 @@ public static void addComponents(JPanel panel, ClientPluginSettingsPage settings } case MINMAXPAIR -> { var minMaxEntry = settingEntry.getMinMaxPair(); + var minPropertyKey = new PropertyKey(settingsPage.getNamespace(), minMaxEntry.getMin().getSettingEntryId()); + var maxPropertyKey = new PropertyKey(settingsPage.getNamespace(), minMaxEntry.getMax().getSettingEntryId()); var min = minMaxEntry.getMin(); panel.add(new JLabel(min.getName())); - var minSpinner = createIntObject(min.getIntSetting()); + var minSpinner = createIntObject(minPropertyKey, settingsManager, min.getIntSetting()); panel.add(minSpinner); var max = minMaxEntry.getMax(); panel.add(new JLabel(max.getName())); - var maxSpinner = createIntObject(max.getIntSetting()); + var maxSpinner = createIntObject(maxPropertyKey, settingsManager, max.getIntSetting()); panel.add(maxSpinner); JMinMaxHelper.applyLink(minSpinner, maxSpinner); diff --git a/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsManager.java b/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsManager.java index 06f766eda..2a0897bd4 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsManager.java +++ b/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsManager.java @@ -43,6 +43,7 @@ import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.*; +import java.util.function.Consumer; public class SettingsManager { public static final Logger LOGGER = LoggerFactory.getLogger(SettingsManager.class); @@ -68,7 +69,11 @@ public void addClass(Class clazz) { } public void registerProvider(PropertyKey property, Provider provider) { - providers.add(new ProviderRegistration<>(clazz, provider)); + + } + + public void registerListener(PropertyKey property, Consumer listener) { + } public SettingsHolder collectSettings() {