tidying up UI and UX.

Add screen dock modes (left/right/top/bottom), better X/Y offset control, replaced tab size with "max tabs"
This commit is contained in:
trunksbomb
2026-03-22 23:46:35 -04:00
parent b51b41206c
commit 638fce4116
5 changed files with 580 additions and 323 deletions

View File

@@ -23,6 +23,7 @@ public class BagTabsClient {
NeoForge.EVENT_BUS.addListener(BagTabsClient::clickTabs);
NeoForge.EVENT_BUS.addListener(BagTabsClient::dragTabs);
NeoForge.EVENT_BUS.addListener(BagTabsClient::releaseTabs);
NeoForge.EVENT_BUS.addListener(BagTabsClient::initScreens);
}
private static void registerScreens(RegisterMenuScreensEvent event) {
@@ -51,6 +52,10 @@ public class BagTabsClient {
BagTabOverlay.mouseDragged(event);
}
private static void initScreens(ScreenEvent.Init.Post event) {
BagTabOverlay.screenInit(event);
}
private static final class BagItemColor {
private static final int DEFAULT_TINT = 0x9E7B4F;

View File

@@ -52,6 +52,17 @@ public final class DockConfigManager {
save();
}
public static void setEffectiveOffsets(String screenKey, int xOffset, int yOffset) {
SessionSettings settings = getSessionSettings();
if (settings.screenOverrides.containsKey(screenKey)) {
DockSettings override = settings.screenOverrides.get(screenKey);
settings.screenOverrides.put(screenKey, override.withXOffset(xOffset).withYOffset(yOffset));
} else {
settings.globalDefault = settings.globalDefault.withXOffset(xOffset).withYOffset(yOffset);
}
save();
}
public static void clearOverride(String screenKey) {
SessionSettings settings = getSessionSettings();
settings.screenOverrides.remove(screenKey);
@@ -149,19 +160,29 @@ public final class DockConfigManager {
TOP,
LEFT,
RIGHT,
FLOATING;
SCREEN_BOTTOM,
SCREEN_TOP,
SCREEN_LEFT,
SCREEN_RIGHT,
FLOATING_HORIZONTAL,
FLOATING_VERTICAL;
public DockSide next() {
DockSide[] values = values();
return values[(ordinal() + 1) % values.length];
}
public DockSide previous() {
DockSide[] values = values();
return values[(ordinal() - 1 + values.length) % values.length];
}
}
public static final class DockSettings {
private DockSide dockSide = DockSide.BOTTOM;
private int xOffset = 0;
private int yOffset = 0;
private int scalePercent = 100;
private int maxTabs = 8;
public DockSide dockSide() {
return dockSide;
@@ -175,8 +196,8 @@ public final class DockConfigManager {
return yOffset;
}
public int scalePercent() {
return scalePercent;
public int maxTabs() {
return maxTabs;
}
public DockSettings withDockSide(DockSide nextDockSide) {
@@ -197,9 +218,9 @@ public final class DockConfigManager {
return copy;
}
public DockSettings withScalePercent(int nextScalePercent) {
public DockSettings withMaxTabs(int nextMaxTabs) {
DockSettings copy = copy();
copy.scalePercent = Math.max(75, Math.min(150, nextScalePercent));
copy.maxTabs = Math.max(1, Math.min(20, nextMaxTabs));
return copy;
}
@@ -208,9 +229,17 @@ public final class DockConfigManager {
copy.dockSide = this.dockSide;
copy.xOffset = this.xOffset;
copy.yOffset = this.yOffset;
copy.scalePercent = this.scalePercent;
copy.maxTabs = this.maxTabs;
return copy;
}
private DockSettings normalize() {
if (dockSide == null) {
dockSide = DockSide.FLOATING_HORIZONTAL;
}
maxTabs = Math.max(1, Math.min(20, maxTabs));
return this;
}
}
private static final class SessionSettings {
@@ -223,8 +252,11 @@ public final class DockConfigManager {
if (globalDefault == null) {
globalDefault = new DockSettings();
}
globalDefault = globalDefault.normalize();
if (screenOverrides == null) {
screenOverrides = new HashMap<>();
} else {
screenOverrides.replaceAll((key, value) -> value == null ? new DockSettings() : value.normalize());
}
if (rememberedPages == null) {
rememberedPages = new HashMap<>();

View File

@@ -4,6 +4,7 @@ import com.trunksbomb.bagtabs.BagTabs;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
@@ -19,8 +20,8 @@ public class DockConfigScreen extends Screen {
private Button xPlusButton;
private Button yMinusButton;
private Button yPlusButton;
private Button scaleMinusButton;
private Button scalePlusButton;
private Button maxTabsMinusButton;
private Button maxTabsPlusButton;
private Button resetButton;
public DockConfigScreen(Screen parent) {
@@ -49,19 +50,19 @@ public class DockConfigScreen extends Screen {
syncLabels();
}).bounds(centerX - 90, top + 26, 180, 20).build());
this.xMinusButton = this.addRenderableWidget(Button.builder(Component.literal("-"), button -> adjustX(-4))
this.xMinusButton = this.addRenderableWidget(Button.builder(Component.literal("-"), button -> adjustX(-getOffsetStep()))
.bounds(centerX - 90, top + 56, 20, 20).build());
this.xPlusButton = this.addRenderableWidget(Button.builder(Component.literal("+"), button -> adjustX(4))
this.xPlusButton = this.addRenderableWidget(Button.builder(Component.literal("+"), button -> adjustX(getOffsetStep()))
.bounds(centerX + 70, top + 56, 20, 20).build());
this.yMinusButton = this.addRenderableWidget(Button.builder(Component.literal("-"), button -> adjustY(-4))
this.yMinusButton = this.addRenderableWidget(Button.builder(Component.literal("-"), button -> adjustY(-getOffsetStep()))
.bounds(centerX - 90, top + 82, 20, 20).build());
this.yPlusButton = this.addRenderableWidget(Button.builder(Component.literal("+"), button -> adjustY(4))
this.yPlusButton = this.addRenderableWidget(Button.builder(Component.literal("+"), button -> adjustY(getOffsetStep()))
.bounds(centerX + 70, top + 82, 20, 20).build());
this.scaleMinusButton = this.addRenderableWidget(Button.builder(Component.literal("-"), button -> adjustScale(-5))
this.maxTabsMinusButton = this.addRenderableWidget(Button.builder(Component.literal("-"), button -> adjustMaxTabs(-1))
.bounds(centerX - 90, top + 108, 20, 20).build());
this.scalePlusButton = this.addRenderableWidget(Button.builder(Component.literal("+"), button -> adjustScale(5))
this.maxTabsPlusButton = this.addRenderableWidget(Button.builder(Component.literal("+"), button -> adjustMaxTabs(1))
.bounds(centerX + 70, top + 108, 20, 20).build());
this.resetButton = this.addRenderableWidget(Button.builder(BagTabs.translation("dock.reset"), button -> {
@@ -75,6 +76,11 @@ public class DockConfigScreen extends Screen {
.bounds(centerX - 90, top + 164, 180, 20).build());
syncLabels();
Tooltip offsetTooltip = Tooltip.create(BagTabs.translation("dock.offset_steps"));
this.xMinusButton.setTooltip(offsetTooltip);
this.xPlusButton.setTooltip(offsetTooltip);
this.yMinusButton.setTooltip(offsetTooltip);
this.yPlusButton.setTooltip(offsetTooltip);
}
@Override
@@ -87,7 +93,7 @@ public class DockConfigScreen extends Screen {
guiGraphics.drawCenteredString(this.font, this.title, centerX, top - 18, 0xFFFFFF);
guiGraphics.drawCenteredString(this.font, Component.literal("X Offset: " + this.dockSettings.xOffset()), centerX, top + 62, 0xFFFFFF);
guiGraphics.drawCenteredString(this.font, Component.literal("Y Offset: " + this.dockSettings.yOffset()), centerX, top + 88, 0xFFFFFF);
guiGraphics.drawCenteredString(this.font, Component.literal("Tab Size: " + this.dockSettings.scalePercent() + "%"), centerX, top + 114, 0xFFFFFF);
guiGraphics.drawCenteredString(this.font, Component.literal("Max Tabs: " + this.dockSettings.maxTabs()), centerX, top + 114, 0xFFFFFF);
}
@Override
@@ -96,6 +102,17 @@ public class DockConfigScreen extends Screen {
Minecraft.getInstance().setScreen(this.parent);
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (button == 1 && this.sideButton != null && this.sideButton.isMouseOver(mouseX, mouseY)) {
this.dockSettings = this.dockSettings.withDockSide(this.dockSettings.dockSide().previous());
saveCurrent();
syncLabels();
return true;
}
return super.mouseClicked(mouseX, mouseY, button);
}
private void adjustX(int delta) {
this.dockSettings = this.dockSettings.withXOffset(this.dockSettings.xOffset() + delta);
saveCurrent();
@@ -108,12 +125,27 @@ public class DockConfigScreen extends Screen {
syncLabels();
}
private void adjustScale(int delta) {
this.dockSettings = this.dockSettings.withScalePercent(this.dockSettings.scalePercent() + delta);
private void adjustMaxTabs(int delta) {
this.dockSettings = this.dockSettings.withMaxTabs(this.dockSettings.maxTabs() + delta);
saveCurrent();
syncLabels();
}
private int getOffsetStep() {
boolean shift = hasShiftDown();
boolean control = hasControlDown();
if (shift && control) {
return 100;
}
if (control) {
return 25;
}
if (shift) {
return 5;
}
return 1;
}
private void syncLabels() {
this.targetButton.setMessage(this.editOverride
? BagTabs.translation("dock.target.override")

View File

@@ -15,13 +15,19 @@
"bagtabs.dock.target.override": "Editing: This Screen Override",
"bagtabs.dock.x_offset": "X Offset",
"bagtabs.dock.y_offset": "Y Offset",
"bagtabs.dock.scale": "Tab Size",
"bagtabs.dock.max_tabs": "Max Tabs",
"bagtabs.dock.open": "Open dock settings",
"bagtabs.dock.lock": "Lock tab interactions",
"bagtabs.dock.unlock": "Unlock tab interactions",
"bagtabs.dock.offset_steps": "Click: 1, Shift: 5, Ctrl: 25, Ctrl+Shift: 100",
"bagtabs.dock.side.bottom": "Dock: Bottom",
"bagtabs.dock.side.top": "Dock: Top",
"bagtabs.dock.side.left": "Dock: Left",
"bagtabs.dock.side.right": "Dock: Right",
"bagtabs.dock.side.floating": "Dock: Floating"
"bagtabs.dock.side.screen_bottom": "Dock: Screen Bottom",
"bagtabs.dock.side.screen_top": "Dock: Screen Top",
"bagtabs.dock.side.screen_left": "Dock: Screen Left",
"bagtabs.dock.side.screen_right": "Dock: Screen Right",
"bagtabs.dock.side.floating_horizontal": "Dock: Floating Horizontal",
"bagtabs.dock.side.floating_vertical": "Dock: Floating Vertical"
}