6.4 KiB
Level editor – user manual and in-app help (editor.tools.help)
The complete user manual (English, forum audience) lives as Markdown in docs/manual/ (one
file per chapter + img/). It is bundled into the jar (build.gradle → processResources copies
docs/manual to com/eliasmueller/llamamod/editor/tools/help/manual/) and shown by
Help → Manual (F1).
Chapters
index.md defines the order and the groups of the contents tree (H2 = group, list links = chapters):
Getting started (01 introduction & concepts, 02 installing, 03 editor window, 04 navigation,
05 selection), Tutorials (first level in 10 minutes, parkour, edit an original level, Blender model),
Building levels (06 geometry, 07 meshes & library, 08 textures, 09 objects incl. cross-world import,
10 waypoints, 11 cameras & triggers, 12 environment, 13 visibility, 14 level settings), Testing and
sharing (15 build/problems/play-test, 16 original levels, 17 sharing), Reference (18 mods, 19
keyboard/mouse/menu, 20 troubleshooting & FAQ, 21 glossary).
Markdown subset (own converter Markdown, no dependency): ATX headings (one H1 per file),
paragraphs, bold/italic/code, links, images on their own line, nested lists, GFM tables,
block quotes (callouts), fenced code, rules; no raw HTML. Anchors = GitHub slugs, so the files also
read well on GitHub/forums.
Generated blocks <!-- generated:NAME -->…<!-- /generated:NAME --> are filled from the live
program (ManualContent): shortcuts (tool keys, keyed commands, key conflicts), menus (every
menu command with key and tooltip), panels (dock panels) – from EditorExtensions, i.e. built-ins
and all plugins – and mods (built-in LlamaMod mods with options, from ModRegistry). The window
regenerates them at run time; ManualTest rewrites the copies in docs/manual when they are stale
(-Dllamamod.manual.noUpdate=true turns that off). Key names are locale-independent ("Ctrl+Shift+D").
Manual window (ManualWindow)
Own frame (stays open next to the editor, works while a modal dialog is open): toolbar back /
forward (Alt+Left/Right), contents (Alt+Home), previous / next chapter, search field (Ctrl+F),
Export menu; left: Contents tree (groups → chapters → H2 sections, follows navigation) and
Search (all words must match; ranked by title hits; excerpt; the words are highlighted on the
page); right: the page (Swing HTML with CSS from the current FlatLaf colours, images scaled to the
page width and loaded synchronously so anchors land correctly, previous/next links at the end).
Internal links navigate, external ones open the browser. Re-rendered on theme change (light/dark).
-Dllamamod.manual.dir=docs/manual reads the Markdown from a folder (reloaded on every open) for
writing the manual.
Export (ManualExport): HTML folder (index.html + one page per chapter with a sidebar,
manual.css with light/dark prefers-color-scheme, used images), one self-contained HTML file
(all chapters, images as data URIs, links rewritten to in-page anchors – for forum attachments),
and Print this chapter (system print dialog → PDF). Also Help → Export manual as HTML….
Context help (ContextHelp, context-help.txt)
F1 opens the chapter for what the mouse pointer is over (else the focus owner), in the main
window and in every dialog/window owned by it. Topics, collected walking up the component tree:
client property HelpTopics.PROP (inspector sections inspector.x:<title> / inspector.g:<group>,
tool options bar tool.<id>), menu items / toolbar buttons (action.<id> via the action's
"spec"), tool buttons (tool.<id> by tooltip), inner tabs (tab.<title>), dock tabs
(panel.<id>), the selected node kind inside Inspector/Outliner (node.<KIND>), the viewport
(tool.<active tool>), the window title (dialog.<title>), window.editor. Mapping file
src/main/resources/.../tools/help/context-help.txt (topic = file.md#anchor, prefix* keys are
wildcards; exact matches of any candidate beat wildcards). The Help → Manual menu item opens the
manual where it was (F1 key = context).
"?" buttons: every Inspector section header, the tool options bar (next to the tool name), and the right end of every dock's tab row (FlatLaf trailing component, help for the visible panel).
Shell changes (minimal, backwards compatible): new editor/ui/HelpTopics (handler hook + "?"
button helper; without a handler nothing is shown), InspectorPanel.section (topic property +
"?"), ToolOptionsBar (topic property + "?"), build.gradle (processResources). help.shortcuts
moved from F1 to Ctrl+F1 (re-registered by the help plugin).
Tests / verification
ManualTest: every .md is in the contents; exactly one H1 per file; all internal links and anchors resolve, all images exist, no placeholder images; everycontext-help.txttarget resolves; generated references contain every tool / every built-in mod; search; HTML folder and single-file export; Markdown subset unit checks. Unmapped tools/panels/sections are reported on stdout (not a failure, so new plugins do not break the build).ManualTour(test classes, X display): screenshots for the manual and an end-to-end context-help run with java.awt.Robot (real mouse/F1 events) on Xvfb :17. Results:?on the Inspector's "Object parameters" → 09-objects#object-parameters; F1 over the Textures panel → 08-textures#texture-manager; F1 over the viewport with the Brush tool → 06-geometry#brush-tool-b; F1 over the "Waypoint chain" section → 10-waypoints#waypoint-chain-section; F1 in the modal Preferences dialog → 03-editor-window#preferences. Images:img/editor/manual_*.jpg.
Maintaining the manual
- Edit
docs/manual/*.md; run./gradlew test --tests '*ManualTest*'(link check + regenerates the generated blocks). New chapter: add it toindex.md. - New tool/panel/section/dialog: add a line to
context-help.txt(the test prints what is unmapped). - Screenshots:
ManualTourstepsgeo,nav,village,manual,context,dark,RetakeTourstepslibrary,insert(open aGeoLibDemolevel) andtexpaint(village), and the other tours (EditorTour,ObjectsTour,EnvTour); keep images ≤ 1000 px wide (jar size). SmokeTour(same command line, GeoLibDemo level): real-input checks of the death plane height field (typed value without Enter + OK), Ctrl-inverted snapping of the place tool and the Inspector's "Exclude from build"; prints PASS/FAIL.
