Redesign mod settings
A mod's settings button now opens ModSettings: a header with the mod's icon, name, version, tags and description, a Reset button and an on/off switch, then its properties as rows, with nested namespaces as titled sections and a live preview card beside them for HUD mods. PanelScreen holds the sidebar-and-panel frame that the mod menu, mod settings and config editor share. PropertyList lays out any config as rows. The inputs share one field look: Toggle is a switch, Select steps with arrows, and the number, keybinding and color inputs are boxes. The color picker opens to the left and closes on outside clicks. Every property type now implements reset(), which was a no-op, and ModLayout keeps its settings in order instead of Map.of's. ConfigEditor moves onto the same frame and rows and drops its HUD preview, which added a new element every frame. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
package org.saturnclient.ui;
|
||||
|
||||
import org.saturnclient.ui.components.Sidebar;
|
||||
import org.saturnclient.ui.elements.ImageTexture;
|
||||
import org.saturnclient.ui.elements.Panel;
|
||||
import org.saturnclient.ui.resources.Textures;
|
||||
|
||||
/**
|
||||
* A screen laid out as the sidebar beside one panel, centered and shrunk to
|
||||
* fit smaller windows. Subclasses fill the panel in {@link #panel()}, using the
|
||||
* content bounds this class computes.
|
||||
*/
|
||||
public abstract class PanelScreen extends SaturnScreen {
|
||||
private static final int MAX_WIDTH = 900;
|
||||
private static final int MAX_HEIGHT = 580;
|
||||
private static final int MARGIN = 40;
|
||||
private static final int GAP = 12;
|
||||
|
||||
protected static final int PADDING = 20;
|
||||
|
||||
private final int sidebarItem;
|
||||
|
||||
protected int panelX, panelY, panelWidth, panelHeight;
|
||||
/** The panel's area inside its padding */
|
||||
protected int contentX, contentY, contentWidth, contentHeight;
|
||||
|
||||
/**
|
||||
* @param sidebarItem the {@link Sidebar} item to highlight
|
||||
*/
|
||||
public PanelScreen(String title, int sidebarItem) {
|
||||
super(title);
|
||||
this.sidebarItem = sidebarItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void ui() {
|
||||
panelWidth = Math.min(MAX_WIDTH, width - MARGIN * 2 - Sidebar.WIDTH - GAP);
|
||||
panelHeight = Math.min(MAX_HEIGHT, height - MARGIN * 2);
|
||||
|
||||
int left = (width - (Sidebar.WIDTH + GAP + panelWidth)) / 2;
|
||||
panelX = left + Sidebar.WIDTH + GAP;
|
||||
panelY = (height - panelHeight) / 2;
|
||||
|
||||
contentX = panelX + PADDING;
|
||||
contentY = panelY + PADDING;
|
||||
contentWidth = panelWidth - PADDING * 2;
|
||||
contentHeight = panelHeight - PADDING * 2;
|
||||
|
||||
draw(new Sidebar(sidebarItem, this.provider::close)
|
||||
.dimensions(Sidebar.WIDTH, panelHeight)
|
||||
.position(left, panelY));
|
||||
|
||||
draw(new Panel().dimensions(panelWidth, panelHeight).position(panelX, panelY));
|
||||
|
||||
panel();
|
||||
|
||||
draw(new ImageTexture(Textures.LOGO_TEXT_BIG).dimensions(180, 18).position(width - 180 - 20, height - 18 - 20));
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the panel's content.
|
||||
*/
|
||||
protected abstract void panel();
|
||||
}
|
||||
Reference in New Issue
Block a user