feat: make donation panel size and layout configurable#420
feat: make donation panel size and layout configurable#420tastybento merged 4 commits intodevelopfrom
Conversation
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>
There was a problem hiding this comment.
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
DonationPanelLayoutresolver that derives inventory size, button slots, donation slots, and icon materials from a panel template with a hardcoded fallback. - Updated
DonationPanelto readpanels/donation_panel.ymland 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.
|
@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>
Done in commit 633f2a7. Three issues addressed:
|
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>
|



Summary
DonationPanelwith a templated layout loaded frompanels/donation_panel.yml, matching the pattern used byvalue_panel.yml,detail_panel.yml, andtop_panel.yml.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.Why this is split out
The donation panel can't fully use
TemplatedPanelBuilderbecause its donation slots are interactive (players drag arbitrary blocks in, items are validated againstBlockConfig, invalid items get returned). The standardTemplatedPanelinfrastructure assumes static, click-only icons. So this PR keeps the rawBukkit.createInventory(...)+ customListenerapproach and usesTemplateReaderonly for layout resolution.Implementation notes
DonationPanelLayoutis a pure-Java resolver (no Bukkit dependencies in its logic) so it can be unit-tested without MockBukkit.data.typereserves the slot — admins placing decorative items won't see them stomped by donations.INFO/CANCEL/PREVIEW/CONFIRMis missing from the template, the resolver falls back to the full hardcoded default rather than rendering a half-broken UI.Level.onLoad()now callssaveResource("panels/donation_panel.yml", false)alongside the other panel templates.Test plan
mvn test— 184/184 pass, including 9 newDonationPanelLayoutTestcases (null template, default 4-row, 6-row expansion, 1-row pathological, no-border, missing-button fallback, content-inferred row count, title overrides, unknowndata.type).donation_panel.ymlintoplugins/BentoBox/addons/Level/panels/, changeforce-shownto5, restart, run/island donate, confirm the panel renders with 5 rows and all four buttons in their relocated positions.donation_panel.ymlfrom the data folder and confirm the panel still renders with the legacy 4-row layout (fallback path).🤖 Generated with Claude Code