0.6.1: pre-size sub-panels in addWidgets to fix blank panel content
Build / build (push) Has been cancelled

FTB Library's Panel.refreshWidgets runs in this order:
  1. clearWidgets
  2. addWidgets    (parent creates sub-panels, default size 0x0)
  3. for each Panel child: refreshWidgets()  ← recurses HERE
  4. alignWidgets  (parent sizes children, but it's too late)

Step 3 means sub-panels' own addWidgets/alignWidgets run with
width=height=0. Children sized via setSize(width, 12) end up 0 wide,
visible content disappears.

Fix is mechanical: every screen now sizes its sub-panels in
addWidgets() BEFORE the add() call. By the time the recursive
refreshWidgets hits the sub-panel, its dimensions are correct.

Caught when HubScreen rendered blank (status panel was set up to fill
the body but its Row children were 0px wide). Same latent issue in
TierUpgrade, CountingHouse, Bounty, Plot, Quest Log — all fixed.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Matt
2026-06-08 15:51:08 +00:00
parent 1d38d86a2e
commit 2888cf1814
7 changed files with 62 additions and 35 deletions
+1 -1
View File
@@ -19,5 +19,5 @@ loader_version_range=[1,)
mod_id=bnstoolkit
mod_name=Brass and Sigil Toolkit
mod_license=All Rights Reserved
mod_version=0.6.0
mod_version=0.6.1
mod_group_id=uk.sijbers.bnstoolkit
@@ -34,8 +34,16 @@ public final class BountyBoardScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
add(new BountyList(this));
add(new BountyDetail(this));
BountyList list = new BountyList(this);
list.setPos(8, contentTop());
list.setSize(170, getHeight() - 30);
add(list);
BountyDetail detail = new BountyDetail(this);
detail.setPos(186, contentTop());
detail.setSize(getWidth() - 194, getHeight() - 30);
add(detail);
add(SimpleTextButton.create(this,
Component.literal("Refresh"),
Icons.REFRESH,
@@ -44,10 +52,6 @@ public final class BountyBoardScreen extends BaseBnsScreen {
@Override
public void alignWidgets() {
getWidgets().get(0).setPos(8, contentTop());
getWidgets().get(0).setSize(170, getHeight() - 30);
getWidgets().get(1).setPos(186, contentTop());
getWidgets().get(1).setSize(getWidth() - 194, getHeight() - 30);
Widget rf = getWidgets().get(2);
rf.setSize(60, 16);
rf.setPos(getWidth() - 68, getHeight() - 22);
@@ -47,8 +47,16 @@ public final class CountingHouseScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
add(new ItemGrid(this));
add(new SellDetail(this));
ItemGrid grid = new ItemGrid(this);
grid.setPos(8, contentTop());
grid.setSize(170, getHeight() - 30);
add(grid);
SellDetail detail = new SellDetail(this);
detail.setPos(186, contentTop());
detail.setSize(getWidth() - 194, getHeight() - 30);
add(detail);
add(SimpleTextButton.create(this,
Component.literal("Refresh"),
Icons.REFRESH,
@@ -57,10 +65,6 @@ public final class CountingHouseScreen extends BaseBnsScreen {
@Override
public void alignWidgets() {
getWidgets().get(0).setPos(8, contentTop());
getWidgets().get(0).setSize(170, getHeight() - 30);
getWidgets().get(1).setPos(186, contentTop());
getWidgets().get(1).setSize(getWidth() - 194, getHeight() - 30);
Widget rf = getWidgets().get(2);
rf.setSize(60, 16);
rf.setPos(getWidth() - 68, getHeight() - 22);
@@ -33,7 +33,16 @@ public final class HubScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
add(new StatusPanel(this));
// CRITICAL: size the sub-panel BEFORE adding. FTB Library's
// Panel.refreshWidgets() recurses into sub-panels BEFORE the
// parent's alignWidgets runs, so a sub-panel sized in
// alignWidgets shows up with width=height=0 to its own children
// (every Row gets setSize(0,12) → invisible).
StatusPanel sp = new StatusPanel(this);
sp.setPos(8, contentTop());
sp.setSize(getWidth() - 16, getHeight() - 50);
add(sp);
add(SimpleTextButton.create(this, Component.literal("Quest Log"), Icons.INFO,
btn -> { NetSend.requestSnapshot("ALL"); new QuestLogScreen().openGui(); }));
add(SimpleTextButton.create(this, Component.literal("Refresh"), Icons.REFRESH,
@@ -44,11 +53,8 @@ public final class HubScreen extends BaseBnsScreen {
@Override
public void alignWidgets() {
// Status panel fills most of the body
getWidgets().get(0).setPos(8, contentTop());
getWidgets().get(0).setSize(getWidth() - 16, getHeight() - 50);
// Bottom action row
// Sub-panel already sized + positioned in addWidgets; only the
// action-row buttons need placement here.
int btnY = getHeight() - 22;
int btnH = 16;
Widget quest = getWidgets().get(1);
@@ -33,8 +33,16 @@ public final class PlotPurchaseScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
add(new PlotList(this));
add(new PlotDetail(this));
PlotList list = new PlotList(this);
list.setPos(8, contentTop());
list.setSize(170, getHeight() - 30);
add(list);
PlotDetail detail = new PlotDetail(this);
detail.setPos(186, contentTop());
detail.setSize(getWidth() - 194, getHeight() - 30);
add(detail);
add(SimpleTextButton.create(this,
Component.literal("Refresh"),
Icons.REFRESH,
@@ -43,10 +51,6 @@ public final class PlotPurchaseScreen extends BaseBnsScreen {
@Override
public void alignWidgets() {
getWidgets().get(0).setPos(8, contentTop());
getWidgets().get(0).setSize(170, getHeight() - 30);
getWidgets().get(1).setPos(186, contentTop());
getWidgets().get(1).setSize(getWidth() - 194, getHeight() - 30);
Widget rf = getWidgets().get(2);
rf.setSize(60, 16);
rf.setPos(getWidth() - 68, getHeight() - 22);
@@ -32,15 +32,17 @@ public final class QuestLogScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
add(new SummaryPanel(this));
SummaryPanel summary = new SummaryPanel(this);
summary.setPos(8, contentTop());
summary.setSize(getWidth() - 16, getHeight() - 30);
add(summary);
add(SimpleTextButton.create(this, Component.literal("Refresh"), Icons.REFRESH,
btn -> NetSend.requestSnapshot("ALL")));
}
@Override
public void alignWidgets() {
getWidgets().get(0).setPos(8, contentTop());
getWidgets().get(0).setSize(getWidth() - 16, getHeight() - 30);
Widget rf = getWidgets().get(1);
rf.setSize(60, 16);
rf.setPos(getWidth() - 68, getHeight() - 22);
@@ -37,8 +37,19 @@ public final class TierUpgradeScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
add(new LadderPanel(this));
add(new DetailPanel(this));
// Pre-size sub-panels so their addWidgets/alignWidgets (called
// via the recursive Panel.refreshWidgets BEFORE our own
// alignWidgets) see the correct dimensions.
LadderPanel ladder = new LadderPanel(this);
ladder.setPos(8, contentTop());
ladder.setSize(180, getHeight() - 28);
add(ladder);
DetailPanel detail = new DetailPanel(this);
detail.setPos(196, contentTop());
detail.setSize(getWidth() - 204, getHeight() - 50);
add(detail);
add(SimpleTextButton.create(this,
Component.literal("Refresh"),
Icons.REFRESH,
@@ -47,11 +58,7 @@ public final class TierUpgradeScreen extends BaseBnsScreen {
@Override
public void alignWidgets() {
// FTB Library setPos uses parent-relative coords.
getWidgets().get(0).setPos(8, contentTop());
getWidgets().get(0).setSize(180, getHeight() - 28);
getWidgets().get(1).setPos(196, contentTop());
getWidgets().get(1).setSize(getWidth() - 204, getHeight() - 50);
// Sub-panels are sized in addWidgets; only position the refresh button here.
Widget rf = getWidgets().get(2);
rf.setSize(60, 16);
rf.setPos(getWidth() - 68, getHeight() - 22);