Part of the JSON Note umbrella (SF #795, phase 1 native type shipped as #796): a
native "Notes Report" alongside the existing Track Lengths/Curve Stats/Turnout
Density/Equipment Suitability/Gaps/Kinked Joints reports (SF #217's Reports
feature), per the implementation plan's section 5
(.claude/json-note-implementation-plan-2026-09-15-v1.md).
Report-only (no click-to-navigate -- a note's position isn't a "go look at
this" target the way a gap or kinked joint is), built on the shared
reportsDialog_t/ReportsShowDialog() viewer per docs/doxygen/creating-a-report.md,
copying the Equipment Suitability report's shape (reports.c) as the closest
existing precedent for "flat interactive list, grouped-by-category Save/Print
text" (ReportsFormatEquipmentList()'s PASS/MARGINAL/FAIL subheadings ->
per-kind subheadings here).
Compute pass walks TRK_ITERATE, filters GetTrkType(trk) == T_NOTE, applies
ReportsFilterLayerIncluded() (SF #787's shared Layer Group filter, same
mechanism every other report already uses -- this report depends on the
Layer Groups Hg branch for the same reason JSON Note phase 1 does).
OP_NOTEJSON notes are cJSON-parsed and grouped by their "kind" field
(station/industry/storage/yard_track/house_track/reference, per #795's
schema table) into per-kind row lists; non-JSON notes (Text/Weblink/Document
-- still legal, this report doesn't require every note be JSON) are counted
into an "Other Notes" bucket with id/layer/a raw-text preview instead.
Additional simple kind filter (PD_DROPLIST, "All kinds" + one entry per
kind) alongside the standard Layer Group filter button, re-running the
compute pass scoped to just that kind when set.
Scope: GTK3V2MAIN only (same Layer Groups/PARAMVERSION-13 dependency as the
rest of JSON Note). New files: app/wlib/gtk3lib/ui/reportsnotes.ui. Touches:
reports.h/reports.c/reportsformat.c/menu.c/acclkeys.h/
app/wlib/gtk3lib/ui/wlib.gresource.xml.in, unittest/reportstest.c, plus a new
.xtr demo fixture under app/lib/demos/.
Independent of MCP's own write_notes_report tool (section 6.2 of the same
plan) -- that's a separate, MCP-side deliverable with its own Layer Group
parsing prerequisite, not blocking or blocked by this native report.
Anonymous
Implemented and pushed for review: git PR #204 (https://github.com/adbyrne/XTrkCAD/pull/204), Hg bug branch bug-799-jsonnote-notes-report-gtk3 (forked from bug-798-jsonnote-structured-editor-gtk3 tip r7326, same Layer Groups PARAMVERSION-13 dependency as the rest of JSON Note -- cannot merge to Hg mainline until Layer Groups own branch does).
New Notes entry in the Reports menu -- report-only, flat interactive list + grouped-by-kind Save/Print text (station/industry/storage/yard_track/house_track/reference, non-JSON notes bucketed as Other Notes), Kind filter dropdown alongside the standard Layer Group filter. 5 new CMocka tests, full local ctest green, live-verified via Xvfb (created station/industry/text notes, confirmed grouping and Kind filter + Refresh). Full design/reasoning in the PR description.
Deferred: a .xtr demo fixture under app/lib/demos/ (implementation plan step 8) -- lower priority than the report itself, not blocking.
Follow-up commit pushed (git 1597b5c1, Hg r7328, same PR #204): the report is now interactive -- selecting a row pans the canvas to that note'''s position and draws the same indicator Gaps/Kinked Joints use, per live-testing feedback that a note'''s position is worth navigating to. cmdReportsnotes help page corrected to match (previously said no click-to-navigate). SF #800 filed separately for the larger Kind-filter redesign also raised during testing -- deferred, not part of this ticket.
PR #204 merged into git GTK3V2MAIN (13c6755e0652). Hg bug branch pushed to SF (both hops) -- status set to needs-review, matching #796/#797's precedent: cannot merge into Hg GTK3V2MAIN mainline until Layer Groups' own Hg branch (#782/#787/#789) does, since this branch forks from that lineage for the PARAMVERSION-13 dependency.