Conversation
|
As far as I could tell this could be a drop-in implementation in POB for POE2 as well. |
|
Seems like a lot of note space is wasted by the new list box. Might be better if it was next to the colour buttons, and a lot shorter? |
|
This looks pretty neat and I like it from a user perspective, but iirc there was some hesitation with expanding the notes section functionality in the past because it can already kinda bloat the exports, which puts additional strain on the hosting providers. Did you also implement a limit for the number of additional notes sections a user can create? |
|
@majochem thanks for the positive feedback. I understand the concerns here but wasn't aware of the hesitations. Currently there's no limit to the number of notes to create but I'm assuming (maybe wrongly) that if the users can create multiple set of notes then they can split the bigger notes into smaller sections and this will only consume some additional characters in the XML for similar amounts of actual text in favor of improved UI/UX. |
|
This looks pretty great. Think the only thing left to add would be a way to hook the notes into the loadouts so that you could show specific notes based on it. It was the first question I got when I showed it to some large creators that use the notes a bunch |
0cfb38a to
a1a4ff6
Compare
|
Was finally able to get back to this, sorry for the delay. I was able to link it to the Loadout system and tested creating, modifying and changing loadouts and if there is a note with the name of the loadout it will automatically change the active note to match it. |
|
|
||
| self.activeNoteId = noteId | ||
| self.notes[self.activeNoteId].lastContent = self.controls.edit.buf | ||
| self.controls.edit:SetText(self.notes[noteId].content) |
There was a problem hiding this comment.
Editing a note and then creating a new note or selecting a loadout silently loses the edit. This call replaces the editor buffer before the previous note's content is copied back; the next save only updates the destination note, and reopening restores the previous text. A focused base/head load → switch → save → reload reproduction confirmed the loss.
AI-assisted review disclosure: This finding was identified during a review using OpenAI Codex and confirmed with a focused reproduction.
|
|
||
| function NotesTabClass:Load(xml, fileName) | ||
| for _, node in ipairs(xml) do | ||
| self.activeNoteId = 0 |
There was a problem hiding this comment.
Existing builds with an empty <Notes> section cannot be saved. The XML parser produces an empty Notes node; this reset leaves activeNoteId at 0 with no notes[0], and opening Notes or saving the build raises a Lua error. The historical base fixture OccVortex.xml exercises this valid shape, and a parser/load/save comparison passed on the base and failed on this head.
AI-assisted review disclosure: This finding was identified during a review using OpenAI Codex and confirmed with a focused reproduction.
| if #self.list > 1 then | ||
| main:OpenConfirmPopup("Delete Note", "Are you sure you want to delete '"..(note.title or "Default").."'?", "Delete", function() | ||
| t_remove(self.list, index) | ||
| self.notesTab.notes[noteId] = nil |
There was a problem hiding this comment.
Deleting a note is not retained through the normal save flow. This callback removes the note but never marks notesTab.modFlag; with no other changes, the subsequent Notes draw keeps it false, Save remains disabled, and leaving the build skips the save prompt. Reopening restores the deleted note.
AI-assisted review disclosure: This finding was identified during a review using OpenAI Codex and confirmed with a focused reproduction.
| local newItemId = oneItem and 1 or findSetId(self.itemsTab.itemSetOrderList, value, self.itemsTab.itemSets, self.itemListSpecialLinks) | ||
| local newSkillId = oneSkill and 1 or findSetId(self.skillsTab.skillSetOrderList, value, self.skillsTab.skillSets, self.skillListSpecialLinks) | ||
| local newConfigId = oneConfig and 1 or findSetId(self.configTab.configSetOrderList, value, self.configTab.configSets, self.configListSpecialLinks) | ||
| local newNoteId = oneNote and 1 or findSetId(self.notesTab.notesOrderList, value, self.notesTab.notes, self.noteListSpecialLinks) |
There was a problem hiding this comment.
With multiple notes, loadout selection fails in two existing cases. A plain loadout without an exact note title produces nil, and the guard below returns before the tree, items, skills, config, or visible selector changes. A brace-linked loadout such as Leveling {A} instead reaches findSetId, but noteListSpecialLinks is never initialized, so the resolver raises a Lua error before any update. Both paths were reproduced with the exact resolver captured from this head.
AI-assisted review disclosure: This finding was identified during a review using OpenAI Codex and confirmed with a focused reproduction.

Fixes #8948 .
Description of the problem being solved:
The original ticket was requesting the ability to have multiple notes both for POE 1 and 2. I have had a look at the codebase and had a stab at implementing this feature request.
Instead of 1 global notes section, this PR introduces the ability to have multiple notes for a build and allows you to create, delete, reorder and set which note is active for the build, keeping the formatting of the editor.
Steps taken to verify a working solution:
Defaultnote, saved, exited and reopened the build to verify that the changes were savedLink to a build that showcases this PR:
https://maxroll.gg/poe/pob/a13ev0o0
Before screenshot:
After screenshot:
This is the new XML structure when the build is saved: