Skip to content

feat: make donation panel size and layout configurable#420

Merged
tastybento merged 4 commits intodevelopfrom
feat/configurable-donation-panel
May 3, 2026
Merged

feat: make donation panel size and layout configurable#420
tastybento merged 4 commits intodevelopfrom
feat/configurable-donation-panel

Conversation

@tastybento
Copy link
Copy Markdown
Member

@tastybento tastybento commented May 2, 2026

Summary

  • Replaces the hardcoded 36-slot, 4-row layout in DonationPanel with a templated layout loaded from panels/donation_panel.yml, matching the pattern used by value_panel.yml, detail_panel.yml, and top_panel.yml.
  • Admins can change the panel size (1–6 rows via force-shown), relocate the four named buttons (INFO / CANCEL / PREVIEW / CONFIRM), or swap their icons; the donation grid auto-fills every cell that isn't a border or named button.
  • Listener logic (drag/click/close handling) is unchanged — only slot resolution is now template-driven, with the original hardcoded layout kept as a fallback when the template is missing or malformed.

Why this is split out

The donation panel can't fully use TemplatedPanelBuilder because its donation slots are interactive (players drag arbitrary blocks in, items are validated against BlockConfig, invalid items get returned). The standard TemplatedPanel infrastructure assumes static, click-only icons. So this PR keeps the raw Bukkit.createInventory(...) + custom Listener approach and uses TemplateReader only for layout resolution.

Implementation notes

  • New DonationPanelLayout is a pure-Java resolver (no Bukkit dependencies in its logic) so it can be unit-tested without MockBukkit.
  • A non-null template cell with an unrecognised data.type reserves the slot — admins placing decorative items won't see them stomped by donations.
  • If any of INFO / CANCEL / PREVIEW / CONFIRM is missing from the template, the resolver falls back to the full hardcoded default rather than rendering a half-broken UI.
  • Level.onLoad() now calls saveResource("panels/donation_panel.yml", false) alongside the other panel templates.

Test plan

  • mvn test — 184/184 pass, including 9 new DonationPanelLayoutTest cases (null template, default 4-row, 6-row expansion, 1-row pathological, no-border, missing-button fallback, content-inferred row count, title overrides, unknown data.type).
  • Manual: drop the new donation_panel.yml into plugins/BentoBox/addons/Level/panels/, change force-shown to 5, restart, run /island donate, confirm the panel renders with 5 rows and all four buttons in their relocated positions.
  • Manual: delete donation_panel.yml from the data folder and confirm the panel still renders with the legacy 4-row layout (fallback path).

🤖 Generated with Claude Code

DonationPanel previously had a hardcoded 36-slot, 4-row layout. Move it
to the standard BentoBox templated-panel pattern so admins can change
rows, button positions, and icons via panels/donation_panel.yml without
touching code. The panel still uses a custom listener for the
drag-and-drop donation slots; only layout resolution is template-driven,
with the original hardcoded layout kept as a fallback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR moves the donation UI away from a hardcoded 4-row inventory layout and toward the repo’s panel-template approach by introducing a DonationPanelLayout resolver, a new donation_panel.yml, and wiring the donation panel to load its slot positions and icons from config at runtime. It fits into the Level addon’s existing panel system by making the donation panel configurable in the same resource-driven area as the top/detail/value panels, while preserving the custom drag/drop listener logic the donation flow requires.

Changes:

  • Added a new DonationPanelLayout resolver that derives inventory size, button slots, donation slots, and icon materials from a panel template with a hardcoded fallback.
  • Updated DonationPanel to read panels/donation_panel.yml and use the resolved layout instead of fixed slot constants.
  • Added the new donation panel resource file and unit tests for layout resolution, and registered the resource in Level.onLoad().

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/test/java/world/bentobox/level/panels/DonationPanelLayoutTest.java Adds unit tests for template-to-layout resolution and fallback cases.
src/main/resources/panels/donation_panel.yml Introduces the configurable donation panel template shipped with the addon.
src/main/java/world/bentobox/level/panels/DonationPanelLayout.java Implements the template-driven layout resolver used by the donation panel.
src/main/java/world/bentobox/level/panels/DonationPanel.java Replaces hardcoded slot usage with runtime-loaded layout data.
src/main/java/world/bentobox/level/Level.java Ensures the new donation panel template is copied into the data folder on load.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/main/java/world/bentobox/level/panels/DonationPanel.java
Comment thread src/main/java/world/bentobox/level/panels/DonationPanel.java Outdated
@tastybento
Copy link
Copy Markdown
Member Author

@copilot apply changes based on the comments in this thread

…rce-shown format

Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/9233b785-a13b-4ea5-9b58-18fe24bdf4e9

Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

Copilot AI commented May 2, 2026

@copilot apply changes based on the comments in this thread

Done in commit 633f2a7. Three issues addressed:

  1. Decorative items now renderedDonationPanelLayout stores icons for slots with absent/unrecognised data.type in a new decorativeItems map. DonationPanel places those icons in the inventory (skipping border-fill for those slots), so admin-added decorations are visible instead of empty holes.

  2. Template title now respectedDonationPanelLayout exposes a panelTitle field (from template.title(), falling back to DEFAULT_TITLE_REF). DonationPanel calls user.getTranslation(layout.panelTitle) instead of the former hardcoded constant.

  3. YAML format + test coverage — Changed force-shown: 4 to force-shown: [1,2,3,4] in donation_panel.yml to match the list syntax used by the other panel templates. Added 6 new tests including one that reads the actual donation_panel.yml file via YamlConfiguration and verifies its structure (list force-shown, all four button positions and types, and the default title key). Total: 190/190 tests pass.

tastybento and others added 2 commits May 3, 2026 14:13
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- DonationPanel: use HashSet.newHashSet (S6485) and method reference
  for forEach (S1612).
- DonationPanelLayout: replace 15-param constructor (S107) with a
  Builder accumulator. Extract processCell/addDecorative helpers from
  fromTemplate to bring cognitive complexity (S3776) and brain-method
  metrics (S6541) under threshold, eliminating the multi-decl
  warnings (S1659) and reducing in-loop continues (S135).
- DonationPanelLayoutTest: use assertNotEquals instead of assertTrue
  with != (S5785).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 3, 2026

@tastybento tastybento merged commit 2dc713d into develop May 3, 2026
3 checks passed
@tastybento tastybento deleted the feat/configurable-donation-panel branch May 3, 2026 21:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants