Panels whose background isn't solid draw the blurred game behind them, cut to the same rounded rectangle texture as the background, where the version supports glass. Panel screens then leave the rest of the game unblurred. Co-Authored-By: Claude Opus 5.5 <[email protected]>
87 lines
2.8 KiB
Java
87 lines
2.8 KiB
Java
package org.saturnclient.ui;
|
|
|
|
import org.saturnclient.common.provider.Providers;
|
|
import org.saturnclient.ui.components.Sidebar;
|
|
import org.saturnclient.ui.elements.ImageTexture;
|
|
import org.saturnclient.ui.elements.Panel;
|
|
import org.saturnclient.ui.elements.Scroll;
|
|
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;
|
|
|
|
/** How far a scroll reaches past its content area, into the padding, for its bar */
|
|
private static final int SCROLL_OVERHANG = 14;
|
|
|
|
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() {
|
|
// The panels are frosted themselves, so the rest of the game stays clear.
|
|
blurBackground = !Providers.saturn.supportsGlass();
|
|
|
|
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();
|
|
|
|
/**
|
|
* The width of a scroll filling {@code width} of the content area.
|
|
*/
|
|
protected static int scrollWidth(int width) {
|
|
return width + SCROLL_OVERHANG;
|
|
}
|
|
|
|
/**
|
|
* The width left for a scroll's children, clear of its scrollbar.
|
|
*/
|
|
protected static int scrollContentWidth(int width) {
|
|
return scrollWidth(width) - Scroll.SCROLLBAR_SPACE;
|
|
}
|
|
}
|