diff --git a/src/main/java/org/saturnclient/modules/mods/Crosshair.java b/src/main/java/org/saturnclient/modules/mods/Crosshair.java index 9dca470..94d5c54 100644 --- a/src/main/java/org/saturnclient/modules/mods/Crosshair.java +++ b/src/main/java/org/saturnclient/modules/mods/Crosshair.java @@ -12,9 +12,11 @@ import net.minecraft.client.render.RenderLayer; public class Crosshair extends Module { public static Property enabled = new Property<>(false); public static Property range_indicator = new Property<>(false); + public static Property idk = new Property<>(-1, Property.PropertyType.HEX); + public static Property idk2 = new Property<>(-1, Property.PropertyType.INTEGER); public Crosshair() { - super(new ModuleDetails("Crosshair", "crosshair").description("Changes the crosshair if you're aiming at a entity").tags("Visuals", "Utility"), enabled.named("Enabled"), range_indicator.named("Range Indicator")); + super(new ModuleDetails("Crosshair", "crosshair").description("Changes the crosshair if you're aiming at a entity").tags("Visuals", "Utility"), enabled.named("Enabled"), range_indicator.named("Range Indicator"), idk.named("Color"), idk2.named("Integer")); } @Override diff --git a/src/main/java/org/saturnclient/saturnclient/menus/ConfigEditor.java b/src/main/java/org/saturnclient/saturnclient/menus/ConfigEditor.java deleted file mode 100644 index 6afca1b..0000000 --- a/src/main/java/org/saturnclient/saturnclient/menus/ConfigEditor.java +++ /dev/null @@ -1,234 +0,0 @@ -package org.saturnclient.saturnclient.menus; - -import java.util.Map; -import net.minecraft.text.Text; -import org.saturnclient.saturnclient.SaturnClientConfig; -import org.saturnclient.saturnclient.config.ConfigManager; -import org.saturnclient.saturnclient.config.Property; -import org.saturnclient.ui.SaturnUi; -import org.saturnclient.ui.SaturnWidget; -import org.saturnclient.ui.Textures; -import org.saturnclient.ui.components.SaturnFloat; -import org.saturnclient.ui.components.SaturnHex; -import org.saturnclient.ui.components.SaturnInteger; -import org.saturnclient.ui.components.SaturnString; -import org.saturnclient.ui.components.SaturnToggle; -import org.saturnclient.ui.widgets.SaturnImageButton; -import org.saturnclient.ui.widgets.SaturnScroll; -import org.saturnclient.ui.widgets.SaturnSprite; -import org.saturnclient.ui.widgets.SaturnText; - -public class ConfigEditor extends SaturnUi { - - private ConfigManager config; - - public ConfigEditor(ConfigManager config) { - super(Text.of("Config editor")); - this.config = config; - } - - @Override - protected void init() { - int rectWidth = 330; - int rectHeight = 228; - int rectX = (width - rectWidth) / 2; - int rectY = (height - rectHeight + 15) / 2; - - draw( - new SaturnSprite(Textures.SETTINGS_BG) - .setX(rectX) - .setY(rectY) - .setWidth(rectWidth) - .setHeight(rectHeight) - .setAnimations(SaturnClientConfig.getAnimations())); - - draw( - new SaturnImageButton(Textures.CLOSE, 9, 9, () -> { - this.close(); - }) - .setX(rectX) - .setY(rectY - 15) - .setWidth(13) - .setHeight(13) - .setAnimations(SaturnClientConfig.getAnimations())); - - SaturnScroll configScroll = new SaturnScroll(); - - int row = 0; - int col = 0; - - drawProperties(configScroll, config.getProperties(), rectWidth, row, col); - - draw( - configScroll - .setX(rectX + 17) - .setY(rectY + 10) - .setWidth(rectWidth - 17) - .setHeight(rectHeight - 10) - .setAnimations(SaturnClientConfig.getAnimations())); - - super.init(); - } - - @SuppressWarnings("unchecked") - private int drawProperties(SaturnScroll configScroll, Map> properties, int rectWidth, - int row, int col) { - int totalRows = row; - for (Map.Entry> propEntry : properties.entrySet()) { - Property prop = propEntry.getValue(); - String propName = propEntry.getKey(); - - boolean full = isFull(prop); - - if (full && col > 0) { - col = 0; - totalRows++; - } - - int modX = ((rectWidth / 2) - 17) * col; - int modY = 14 * totalRows; - - switch (prop.getType()) { - case BOOLEAN: - configScroll.draw( - new SaturnToggle((Property) prop) - .setX(modX) - .setY(modY)); - configScroll.draw( - new SaturnText( - propName.substring(0, 1).toUpperCase() + - propName.substring(1)) - .setX(modX + 18) - .setY(modY) - .setScale(0.8f)); - break; - case INTEGER: - configScroll.draw( - new SaturnText( - propName.substring(0, 1).toUpperCase() + - propName.substring(1)) - .setX(modX) - .setY(modY) - .setScale(0.8f)); - - configScroll.draw( - new SaturnInteger( - (Property) prop, - (rectWidth / 2) - 17, - modY, - 70)); - - configScroll.draw(resetButton(prop, modX, modY)); - break; - case FLOAT: - configScroll.draw( - new SaturnText( - propName.substring(0, 1).toUpperCase() + - propName.substring(1)) - .setX(modX) - .setY(modY) - .setScale(0.8f)); - - configScroll.draw( - new SaturnFloat( - (Property) prop, - (rectWidth / 2) - 17, - modY, - 70)); - - configScroll.draw(resetButton(prop, modX, modY)); - break; - case STRING: - configScroll.draw( - new SaturnText( - propName.substring(0, 1).toUpperCase() + - propName.substring(1)) - .setX(modX) - .setY(modY) - .setScale(0.8f)); - - configScroll.draw( - new SaturnString( - (Property) prop, - (rectWidth / 2) - 17, - modY, - 70)); - - configScroll.draw(resetButton(prop, modX, modY)); - break; - case HEX: - configScroll.draw( - new SaturnText( - propName.substring(0, 1).toUpperCase() + - propName.substring(1)) - .setX(modX) - .setY(modY) - .setScale(0.8f)); - - configScroll.draw( - new SaturnHex( - (Property) prop, - (rectWidth / 2) - 17, - modY, - 70)); - - configScroll.draw(resetButton(prop, modX, modY)); - break; - case NAMESPACE: - configScroll.draw( - new SaturnText( - propName.substring(0, 1).toUpperCase() + - propName.substring(1)) - .setX(modX) - .setY(modY) - .setScale(0.8f)); - - // Recursively draw nested properties and update total rows - Map> nestedProperties = (Map>) prop.value; - totalRows = drawProperties(configScroll, nestedProperties, rectWidth, - totalRows + 1, 0); - } - - if (full) { - totalRows++; - } else { - col++; - if (col > 1) { - col = 0; - totalRows++; - } - } - } - return totalRows; - } - - public static boolean isFull(Property prop) { - switch (prop.getType()) { - case BOOLEAN: - return false; - default: - return true; - } - } - - @Override - public void close() { - ConfigManager.save(); - super.close(); - } - - public SaturnWidget resetButton(Property prop, int modX, int modY) { - int size = textRenderer.fontHeight - 1; - return new SaturnImageButton( - Textures.RESET, - size, - size, - () -> { - prop.reset(); - }) - .setX(modX + 209) - .setY(modY) - .setWidth(size + 3) - .setHeight(size + 3); - } -} diff --git a/src/main/java/org/saturnclient/saturnclient/menus/SaturnConfigEditor.java b/src/main/java/org/saturnclient/saturnclient/menus/SaturnConfigEditor.java deleted file mode 100644 index ea9c3c1..0000000 --- a/src/main/java/org/saturnclient/saturnclient/menus/SaturnConfigEditor.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.saturnclient.saturnclient.menus; - -import org.saturnclient.saturnclient.SaturnClientConfig; -import org.saturnclient.ui.Textures; -import org.saturnclient.ui.widgets.SaturnClickableImage; -import org.saturnclient.ui.widgets.SaturnSprite; -import org.saturnclient.ui2.screens.ModMenu; - -public class SaturnConfigEditor extends ConfigEditor { - - public SaturnConfigEditor() { - super(SaturnClientConfig.config); - } - - @Override - protected void init() { - int rectHeight = 228; - int rectY = (height - rectHeight + 15) / 2; - - int tabsX = (width - 43) / 2; - int tabsY = rectY - 17; - - draw( - new SaturnSprite(Textures.RECT) - .setX(tabsX) - .setY(tabsY) - .setWidth(43) - .setHeight(15) - .setAnimations(SaturnClientConfig.getAnimations())); - - int tabSize = 9; - tabsX = (width - tabSize) / 2; - draw( - new SaturnClickableImage(Textures.SETTINGS, () -> { - }) - .setSelected(true) - .setX(tabsX) - .setY(tabsY + 3) - .setWidth(tabSize) - .setHeight(tabSize) - .setAnimations(SaturnClientConfig.getAnimations())); - - draw( - new SaturnClickableImage(Textures.MODS_TAB, () -> { - client.setScreen(new ModMenu()); - }) - .setX(tabsX - 12) - .setY(tabsY + 3) - .setWidth(tabSize) - .setHeight(tabSize) - .setAnimations(SaturnClientConfig.getAnimations())); - - draw( - new SaturnClickableImage(Textures.SEARCH, () -> { - System.out.println("Pressed"); - }) - .setX(tabsX + 12) - .setY(tabsY + 3) - .setWidth(tabSize) - .setHeight(tabSize) - .setAnimations(SaturnClientConfig.getAnimations())); - - super.init(); - } -} diff --git a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java index d9031ea..b9dff4f 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java @@ -5,10 +5,10 @@ import net.minecraft.client.gui.DrawContext; import org.saturnclient.modules.Module; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClientConfig; -import org.saturnclient.saturnclient.menus.ConfigEditor; import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; import org.saturnclient.ui.Textures; +import org.saturnclient.ui2.screens.ConfigEditor; public class SaturnModComp extends SaturnWidget { diff --git a/src/main/java/org/saturnclient/ui2/components/SaturnModule.java b/src/main/java/org/saturnclient/ui2/components/SaturnModule.java index 0042ab0..109bfe6 100644 --- a/src/main/java/org/saturnclient/ui2/components/SaturnModule.java +++ b/src/main/java/org/saturnclient/ui2/components/SaturnModule.java @@ -4,12 +4,12 @@ import org.saturnclient.modules.Module; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.ThemeManager; -import org.saturnclient.saturnclient.menus.ConfigEditor; import org.saturnclient.ui.Textures; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.Utils; +import org.saturnclient.ui2.screens.ConfigEditor; import net.minecraft.client.render.RenderLayer; diff --git a/src/main/java/org/saturnclient/ui2/components/Sidebar.java b/src/main/java/org/saturnclient/ui2/components/Sidebar.java index 5ff755f..325893b 100644 --- a/src/main/java/org/saturnclient/ui2/components/Sidebar.java +++ b/src/main/java/org/saturnclient/ui2/components/Sidebar.java @@ -1,11 +1,17 @@ package org.saturnclient.ui2.components; +import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.ThemeManager; +import org.saturnclient.ui.Textures; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.Utils; +import org.saturnclient.ui2.screens.CloakMenu; +import org.saturnclient.ui2.screens.HatMenu; +import org.saturnclient.ui2.screens.ModMenu; +import org.saturnclient.ui2.screens.SaturnConfigEditor; import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; @@ -36,14 +42,34 @@ public class Sidebar extends Element { } } - SidebarComponent[] components; + Runnable onClose; + SidebarComponent[] components = { + new Sidebar.SidebarComponent(Textures.MODS_TAB, () -> { + SaturnClient.client.setScreen(new ModMenu()); + }, false), + new Sidebar.SidebarComponent(Textures.SETTINGS, () -> { + SaturnClient.client.setScreen(new SaturnConfigEditor()); + }, false), + + new Sidebar.SidebarComponent(Textures.CLOAK, () -> { + SaturnClient.client.setScreen(new CloakMenu()); + }, false), + + new Sidebar.SidebarComponent(Textures.HAT, () -> { + SaturnClient.client.setScreen(new HatMenu()); + }, false), + + new Sidebar.SidebarComponent(Textures.CLOSE, () -> { + onClose.run(); + }, true) + }; int active = 0; - public Sidebar(int active, SidebarComponent... components) { - this.components = components; + public Sidebar(int active, Runnable onClose) { this.width = 30; this.height = 350; this.active = active; + this.onClose = onClose; } @Override @@ -54,6 +80,8 @@ public class Sidebar extends Element { int sp = 30 - padding.value; int s = 30 - (padding.value * 2); + int s2 = s + padding.value; + renderScope.setRenderLayer(RenderLayer::getGuiTextured); renderScope.drawRoundedRectangle(0, 0, width, height, cornerRadius.value, bgColor.value); @@ -63,7 +91,7 @@ public class Sidebar extends Element { for (SidebarComponent component : components) { if (component.end) { int y = (height - (sp * bottomRow)) - (s * 2); - if (ctx.isHovering(padding.value, y, s, s) || active == i) { + if (ctx.isHovering(0, y - (padding.value / 2), s2, s2) || active == i) { theme.setState("hovering"); } else { theme.setState(null); @@ -73,7 +101,7 @@ public class Sidebar extends Element { bottomRow += 1; } else { int y = padding.value + ((sp) * topRow); - if (ctx.isHovering(padding.value, y, s, s) || active == i) { + if (ctx.isHovering(0, y - (padding.value / 2), s2, s2) || active == i) { theme.setState("hovering"); } else { theme.setState(null); @@ -94,16 +122,17 @@ public class Sidebar extends Element { int sp = 30 - padding.value; int s = 30 - (padding.value * 2); + int s2 = s + padding.value; for (SidebarComponent component : components) { if (component.end) { - if (Utils.isHovering(mouseX - padding.value, mouseY - (height - (sp * bottomRow) - (s * 2)), s, s, scale)) { + if (Utils.isHovering(mouseX, mouseY - (height - (sp * bottomRow) - (s * 2)), s2, s2, scale)) { component.onClick.run(); break; } bottomRow += 1; } else { - if (Utils.isHovering(mouseX - padding.value, mouseY - (padding.value + ((sp) * topRow)), s, s, scale)) { + if (Utils.isHovering(mouseX, mouseY - (padding.value + ((sp) * topRow)), s2, s2, scale)) { component.onClick.run(); break; } diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java index fc3dd0e..1efcc53 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java @@ -7,16 +7,15 @@ import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.components.dialog.ColorDialog; -import org.saturnclient.ui2.resources.Fonts; public class HexInput extends Element { public Property prop; public SaturnScreen screen; public HexInput(Property prop, SaturnScreen screen) { - this.width = 50; + this.width = 58; + this.height = 18; this.prop = prop; - this.height = Fonts.getHeight() + 8; this.scale = 0.8f; this.screen = screen; } @@ -28,6 +27,6 @@ public class HexInput extends Element { @Override public void render(RenderScope renderScope, ElementContext ctx) { - renderScope.drawRoundedRectangle(0, 0, width, height, 10, prop.value); + renderScope.drawRoundedRectangle(0, 0, width, height, 17, prop.value); } } diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/Input.java b/src/main/java/org/saturnclient/ui2/components/inputs/Input.java index da7bc5f..09405c6 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/Input.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/Input.java @@ -66,13 +66,12 @@ public abstract class Input extends Element { int scrollOffset = getScrollOffset(); String visibleText = getVisibleText(scrollOffset); int textColor = focused ? 0xFFFFFF : 0xAAAAAA; - renderScope.drawText(visibleText, 2, 2, false, textColor); + renderScope.drawText(0.6f, visibleText, 2, 2, false, textColor); if (focused) { int cursorX = 2 + SaturnClient.client.textRenderer.getWidth( - SaturnUi.text( - visibleText.substring(0, cursorPosition - scrollOffset))); + SaturnUi.text(visibleText.substring(0, cursorPosition - scrollOffset))); renderScope.drawRect(cursorX, 2, 1, height - 1, 0xFFFFFFFF); } diff --git a/src/main/java/org/saturnclient/ui2/elements/Text.java b/src/main/java/org/saturnclient/ui2/elements/Text.java index ab1bfb8..96b7b03 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Text.java +++ b/src/main/java/org/saturnclient/ui2/elements/Text.java @@ -18,6 +18,6 @@ public class Text extends Element { @Override public void render(RenderScope renderScope, ElementContext ctx) { - renderScope.drawText(this.text, this.x, this.y, false, fgColor.value); + renderScope.drawText(this.text, 0, 0, false, fgColor.value); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java b/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java index 4626c36..30d6d07 100644 --- a/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java @@ -1,10 +1,8 @@ package org.saturnclient.ui2.screens; -import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.auth.Auth; import org.saturnclient.saturnclient.auth.SaturnPlayer; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; -import org.saturnclient.saturnclient.menus.SaturnConfigEditor; import org.saturnclient.ui.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.components.CosmeticPreview; @@ -50,25 +48,6 @@ public class CloakMenu extends SaturnScreen { draw(new SkinPreview(-30.0f, false).scale(3.5f).position(scrollWidth - 40 - p, 200)); - draw(new Sidebar( - 2, - new Sidebar.SidebarComponent(Textures.MODS_TAB, () -> { - SaturnClient.client.setScreen(new ModMenu()); - }, false), - new Sidebar.SidebarComponent(Textures.SETTINGS, () -> { - SaturnClient.client.setScreen(new SaturnConfigEditor()); - }, false), - - new Sidebar.SidebarComponent(Textures.CLOAK, () -> { - }, false), - - new Sidebar.SidebarComponent(Textures.HAT, () -> { - SaturnClient.client.setScreen(new HatMenu()); - }, false), - - new Sidebar.SidebarComponent(Textures.CLOSE, () -> { - this.close(); - }, true) - ).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + draw(new Sidebar(2, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java b/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java new file mode 100644 index 0000000..f50dd78 --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java @@ -0,0 +1,111 @@ +package org.saturnclient.ui2.screens; + +import java.util.Map; + +import org.saturnclient.saturnclient.config.ConfigManager; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui2.SaturnScreen; +import org.saturnclient.ui2.components.Sidebar; +import org.saturnclient.ui2.components.inputs.FloatInput; +import org.saturnclient.ui2.components.inputs.HexInput; +import org.saturnclient.ui2.components.inputs.IntInput; +import org.saturnclient.ui2.components.inputs.Toggle; +import org.saturnclient.ui2.elements.Scroll; +import org.saturnclient.ui2.elements.Text; + +public class ConfigEditor extends SaturnScreen { + private ConfigManager config; + + public ConfigEditor(ConfigManager config) { + super("Config Editor"); + + this.config = config; + } + + @Override + public void ui() { + int p = 10; + int g = 10; + + Scroll scroll = new Scroll(p); + + drawProperties(scroll, config.getProperties(), 0, 0, 480 + 10 + (g * 2)); + + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); + + draw(scroll.dimensions(scrollWidth, 350).center(width, height)); + + draw(new Sidebar(0, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + } + + @SuppressWarnings("unchecked") + private int drawProperties(Scroll configScroll, Map> properties, int row, int col, int w) { + for (Map.Entry> propEntry : properties.entrySet()) { + Property prop = propEntry.getValue(); + String propName = propEntry.getKey(); + boolean full = isFull(prop); + + // Always reset to col 0 if full-width component needs to be drawn mid-row + if (full && col != 0) { + col = 0; + row++; + } + + int modX = (w / 2) * col; // two-column layout + int modY = 25 * row; + + configScroll.draw( + new Text( + propName.substring(0, 1).toUpperCase() + propName.substring(1) + ).position(modX, modY + 1).scale(0.7f)); + + switch (prop.getType()) { + case BOOLEAN: + configScroll.draw( + new Toggle((Property) prop) + .position(modX + (w / 2) - 40, modY) + .scale(0.5f)); + break; + + case HEX: + configScroll.draw(new HexInput((Property) prop, this).position(w / 2, modY)); + break; + + case INTEGER: + configScroll.draw(new IntInput((Property) prop).position(w / 2, modY)); + break; + + case FLOAT: + configScroll.draw(new FloatInput((Property) prop).position(w / 2, modY)); + break; + + case NAMESPACE: + Map> nestedProperties = (Map>) prop.value; + row = drawProperties(configScroll, nestedProperties, row + 1, col, w); + break; + } + + if (full) { + row++; // full-width takes a whole row + col = 0; + } else { + col++; + if (col > 1) { // max 2 columns + col = 0; + row++; + } + } + } + + return row; + } + + public static boolean isFull(Property prop) { + switch (prop.getType()) { + case BOOLEAN: + return false; + default: + return true; + } + } +} diff --git a/src/main/java/org/saturnclient/ui2/screens/HatMenu.java b/src/main/java/org/saturnclient/ui2/screens/HatMenu.java index 280fc11..d47182b 100644 --- a/src/main/java/org/saturnclient/ui2/screens/HatMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/HatMenu.java @@ -1,10 +1,8 @@ package org.saturnclient.ui2.screens; -import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.auth.Auth; import org.saturnclient.saturnclient.auth.SaturnPlayer; import org.saturnclient.saturnclient.cosmetics.Hats; -import org.saturnclient.saturnclient.menus.SaturnConfigEditor; import org.saturnclient.ui.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.components.CosmeticPreview; @@ -50,25 +48,6 @@ public class HatMenu extends SaturnScreen { draw(new SkinPreview(170f, true).scale(3.5f).position(scrollWidth - 40 - p, 200)); - draw(new Sidebar( - 3, - new Sidebar.SidebarComponent(Textures.MODS_TAB, () -> { - SaturnClient.client.setScreen(new ModMenu()); - }, false), - new Sidebar.SidebarComponent(Textures.SETTINGS, () -> { - SaturnClient.client.setScreen(new SaturnConfigEditor()); - }, false), - - new Sidebar.SidebarComponent(Textures.CLOAK, () -> { - SaturnClient.client.setScreen(new CloakMenu()); - }, false), - - new Sidebar.SidebarComponent(Textures.HAT, () -> { - }, false), - - new Sidebar.SidebarComponent(Textures.CLOSE, () -> { - this.close(); - }, true) - ).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + draw(new Sidebar(3, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java index 007c328..8a88883 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java @@ -2,9 +2,6 @@ package org.saturnclient.ui2.screens; import org.saturnclient.modules.ModManager; import org.saturnclient.modules.Module; -import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.menus.SaturnConfigEditor; -import org.saturnclient.ui.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.components.SaturnModule; import org.saturnclient.ui2.components.Sidebar; @@ -40,25 +37,6 @@ public class ModMenu extends SaturnScreen { draw(scroll.dimensions(scrollWidth, 350).center(width, height)); - draw(new Sidebar( - 0, - new Sidebar.SidebarComponent(Textures.MODS_TAB, () -> { - }, false), - new Sidebar.SidebarComponent(Textures.SETTINGS, () -> { - SaturnClient.client.setScreen(new SaturnConfigEditor()); - }, false), - - new Sidebar.SidebarComponent(Textures.CLOAK, () -> { - SaturnClient.client.setScreen(new CloakMenu()); - }, false), - - new Sidebar.SidebarComponent(Textures.HAT, () -> { - SaturnClient.client.setScreen(new HatMenu()); - }, false), - - new Sidebar.SidebarComponent(Textures.CLOSE, () -> { - this.close(); - }, true) - ).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + draw(new Sidebar(0, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/SaturnConfigEditor.java b/src/main/java/org/saturnclient/ui2/screens/SaturnConfigEditor.java new file mode 100644 index 0000000..ef08cbe --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/screens/SaturnConfigEditor.java @@ -0,0 +1,107 @@ +package org.saturnclient.ui2.screens; + +import java.util.Map; + +import org.saturnclient.saturnclient.SaturnClientConfig; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui2.SaturnScreen; +import org.saturnclient.ui2.components.Sidebar; +import org.saturnclient.ui2.components.inputs.FloatInput; +import org.saturnclient.ui2.components.inputs.HexInput; +import org.saturnclient.ui2.components.inputs.IntInput; +import org.saturnclient.ui2.components.inputs.Toggle; +import org.saturnclient.ui2.elements.Scroll; +import org.saturnclient.ui2.elements.Text; + +public class SaturnConfigEditor extends SaturnScreen { + public SaturnConfigEditor() { + super("Saturn Config Editor"); + } + + @Override + public void ui() { + int p = 10; + int g = 10; + + Scroll scroll = new Scroll(p); + + drawProperties(scroll, SaturnClientConfig.config.getProperties(), 0, 0, 480 + 10 + (g * 2)); + + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); + + draw(scroll.dimensions(scrollWidth, 350).center(width, height)); + + draw(new Sidebar(1, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + } + + @SuppressWarnings("unchecked") + private int drawProperties(Scroll configScroll, Map> properties, int row, int col, int w) { + for (Map.Entry> propEntry : properties.entrySet()) { + Property prop = propEntry.getValue(); + String propName = propEntry.getKey(); + boolean full = isFull(prop); + + // Always reset to col 0 if full-width component needs to be drawn mid-row + if (full && col != 0) { + col = 0; + row++; + } + + int modX = (w / 2) * col; // two-column layout + int modY = 25 * row; + + configScroll.draw( + new Text( + propName.substring(0, 1).toUpperCase() + propName.substring(1) + ).position(modX, modY + 1).scale(0.7f)); + + switch (prop.getType()) { + case BOOLEAN: + configScroll.draw( + new Toggle((Property) prop) + .position(modX + (w / 2) - 40, modY) + .scale(0.5f)); + break; + + case HEX: + configScroll.draw(new HexInput((Property) prop, this).position(w / 2, modY)); + break; + + case INTEGER: + configScroll.draw(new IntInput((Property) prop).position(w / 2, modY)); + break; + + case FLOAT: + configScroll.draw(new FloatInput((Property) prop).position(w / 2, modY)); + break; + + case NAMESPACE: + Map> nestedProperties = (Map>) prop.value; + row = drawProperties(configScroll, nestedProperties, row + 1, col, w); + break; + } + + if (full) { + row++; // full-width takes a whole row + col = 0; + } else { + col++; + if (col > 1) { // max 2 columns + col = 0; + row++; + } + } + } + + return row; + } + + public static boolean isFull(Property prop) { + switch (prop.getType()) { + case BOOLEAN: + return false; + default: + return true; + } + } +}