Port map: client2-010's widget narration rows cite the narrator

Thirteen rows said Horizon has no narrator. The narrator exists, so each
row now names the fn or arm that answers it: narrate's checkbox, cycle,
edit-box, text, container-list and list arms, narrate_row, the lock
button's narration in lan_screen.rs, the stats screen's item row, and the
command suggestions' three narration fns in chat.rs.
This commit is contained in:
MSedgeMC committed 2026-11-02 11:12:19 +00:00
1 parent 0c027235cf
commit 9fe8a7d1ce
1 file changed
+13 -13
+13 -13
View File
@@ -30,13 +30,13 @@ ChatComponent.DrawingFocusedGraphicsAccess.showTooltip port crates/horizon-clien
Checkbox.adjustWidth missing minor: the checkbox width is never capped or its label wrapped; dialog_screen.rs:137 sets the width to the full label
Checkbox.overflowsRowLimit missing minor: no tooltip for a label that wraps past two rows; Horizon dialog labels never wrap
Checkbox.onPress port crates/horizon-client/src/game/dialogs.rs::Game::dialog_click toggles the boolean input value (dialogs.rs:448)
Checkbox.updateWidgetNarration skip:other narration text; Horizon has no narrator (the Narrator option is stored only)
Checkbox.updateWidgetNarration inline crates/horizon-client/src/screen_narrator.rs::narrate narrate's checkbox arm: gui.narrate.button(message), then narration.checkbox.usage.{focused,hovered}.{check,uncheck} while the widget is active
Checkbox.extractContents port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog box sprite for checked and focused states, then the label (Part::Check)
Checkbox.Builder.selected skip:java builder setter
Checkbox.Builder.build skip:java builder: makes the checkbox and its tooltip
CommandSuggestions.mouseScrolled port crates/horizon-client-render/src/chat.rs::ChatScreen::scroll wheel over the suggestion list, clamped to the list
CommandSuggestions.mouseClicked port crates/horizon-client-render/src/chat.rs::ChatScreen::click click on a suggestion row uses it, else the input box
CommandSuggestions.getUsageNarration skip:other narration text; no narrator in Horizon
CommandSuggestions.getUsageNarration port crates/horizon-client-render/src/chat.rs::ChatScreen::suggestions_usage narration.suggestion.usage.{cycle,fill}.{hidable,fixed} while the list shows; Game::draw_command_block passes it as the screen's usage
CommandSuggestions.sortSuggestions port crates/horizon-client-render/src/chat.rs::ChatScreen::show_suggestions suggestions starting with the typed word first, including the minecraft: prefix
CommandSuggestions.hasMessageArguments missing minor: a /say or /msg style command with a message argument counts as a command here; Horizon's parse keeps no argument kinds (see update_usage_info comment)
CommandSuggestions.getExceptionMessage port crates/horizon-client-render/src/chat.rs::ChatScreen::update_usage_info parse errors shown with their context (e.with_context)
@@ -46,29 +46,29 @@ CommandSuggestions.formatChat port crates/horizon-client-render/src/chat.rs::Cha
CommandSuggestions.calculateSuggestionSuffix port crates/horizon-client-render/src/chat.rs::ChatScreen::select the grey suffix for the highlighted suggestion (strip the typed prefix)
CommandSuggestions.extractSuggestions port crates/horizon-client-render/src/chat.rs::ChatScreen::draw the suggestion list drawn when it is open
CommandSuggestions.extractUsage port crates/horizon-client-render/src/chat.rs::ChatScreen::draw usage lines drawn upward from the bottom, as vanilla's bottom anchor
CommandSuggestions.getNarrationMessage skip:other narration text; no narrator in Horizon
CommandSuggestions.getNarrationMessage inline crates/horizon-client-render/src/chat.rs::SuggestionList::narration_message the selected suggestion, said when the selection moves (ChatScreen::select); gap: minor: the chat screen's own narration does not add it (screen_info::chat reads the usage and the typed message)
CommandSuggestions.hasAllowedInput port crates/horizon-client-render/src/chat.rs::ChatAbilities::allows gap: minor: a /say style command is judged as a command, not a message (see hasMessageArguments)
CommandSuggestions.SuggestionsList.extractRenderState port crates/horizon-client-render/src/chat.rs::ChatScreen::draw_list rows, scroll marks, highlight and tooltip; gap: minor: no pointing-hand cursor over the rows
CommandSuggestions.SuggestionsList.mouseClicked port crates/horizon-client-render/src/chat.rs::ChatScreen::click row click selects and uses the suggestion
CommandSuggestions.SuggestionsList.keyPressed port crates/horizon-client-render/src/chat.rs::ChatScreen::key up, down and tab cycle and use the suggestion
CommandSuggestions.SuggestionsList.cycle port crates/horizon-client-render/src/chat.rs::ChatScreen::cycle moves the selection and the scroll offset
CommandSuggestions.SuggestionsList.getNarrationMessage skip:other narration text; no narrator in Horizon
CommandSuggestions.SuggestionsList.getNarrationMessage port crates/horizon-client-render/src/chat.rs::suggestion_narration narration.suggestion, or narration.suggestion.tooltip when the entry has one, over the position, the count and the text; SuggestionList::narration_message marks lastNarratedEntry
ComponentRenderUtils.stripColor port crates/horizon-client-render/src/chat.rs::Chat::displayed with Chat Colors off the section codes are stripped before wrapping
ContainerObjectSelectionList.nextFocusPath port crates/horizon-client-input/src/gamepad.rs::focus_step gap: minor: picks the nearest target by geometry, not row by row with a wrap to the next entry
ContainerObjectSelectionList.setFocused missing minor: unsure: no list focus model beyond gamepad focus_step; losing focus does not clear a selection here
ContainerObjectSelectionList.updateWidgetNarration skip:other narration text; no narrator in Horizon
ContainerObjectSelectionList.updateWidgetNarration inline crates/horizon-client/src/screen_narrator.rs::narrate narrate's container-list arm: the row under the mouse for the mouse and the system, else the focused one, then narrator.position.list; the row's own widgets one level deeper (narrate_row)
ContainerObjectSelectionList.Entry.setFocused missing minor: unsure: focus inside a row is not tracked; focus_step works on target rectangles
ContainerObjectSelectionList.Entry.focusPathAtIndex missing minor: unsure: no per-row focus path; see focus_step
ContainerObjectSelectionList.Entry.nextFocusPath port crates/horizon-client-input/src/gamepad.rs::focus_step gap: minor: moves by nearest target rectangle, not by child index within the row
ContainerObjectSelectionList.Entry.updateNarration skip:other narration text; no narrator in Horizon
ContainerObjectSelectionList.Entry.updateNarration port crates/horizon-client/src/screen_narrator.rs::narrate_row the row widget findNarratableWidget picks (inactive ones too), with narrator.position.object_list when the row has more than one
CycleButton.extractContents port crates/horizon-client-render/src/options_ui.rs::OptionsUi::draw option button sprite and its label
CycleButton.onPress port crates/horizon-client-render/src/options_ui.rs::Opt::cycle click cycles forward; the back flag comes from the caller
CycleButton.getCycledValue skip:other only feeds the narration of the next value
CycleButton.mouseScrolled port crates/horizon-client-render/src/options_ui.rs::OptionsUi::wheel the wheel over a cycle button takes its step (up goes back) and the list stays put; a blocked row falls through to the page
CycleButton.updateValue inline crates/horizon-client-render/src/options_ui.rs::Opt::cycle labels are read live from Settings (Opt::label), so no cached message needs updating
CycleButton.createLabelForValue port crates/horizon-client-render/src/options_ui.rs::Opt::label value label or full name, from the setting
CycleButton.updateWidgetNarration skip:other narration text; no narrator in Horizon
CycleButton.createDefaultNarrationMessage skip:other narration text; no narrator in Horizon
CycleButton.updateWidgetNarration inline crates/horizon-client/src/screen_narrator.rs::narrate narrate's cycle arm: gui.narrate.button(name: value), then narration.cycle_button.usage.{focused,hovered} with the value a click moves to
CycleButton.createDefaultNarrationMessage inline crates/horizon-client/src/screen_narrator.rs::narrate the gui.narrate.button wrap of narrate's cycle arm; the name and value it wraps are built where the widget is recorded (options.generic_value in the screen's label)
CycleButton.builder skip:java builder
CycleButton.booleanBuilder skip:java builder
CycleButton.onOffBuilder skip:java builder
@@ -92,7 +92,7 @@ DebugScreenOverlay.toggleFpsCharts port crates/horizon-client/src/debug_chart.rs
DebugScreenOverlay.toggleLightmapTexture port crates/horizon-client/src/debug_chart.rs::DebugCharts::toggle_lightmap toggles the lightmap and clears the others
DebugScreenOverlay.toggleProfilerChart missing minor: no profiler chart (see showProfilerChart)
DebugScreenOverlay.logRemoteSample missing minor: unsure: the debug_sample packet is only named in horizon-protocol/src/ids.rs, so a server's samples are not logged
EditBox.createNarrationMessage skip:other narration text; no narrator in Horizon
EditBox.createNarrationMessage inline crates/horizon-client/src/screen_narrator.rs::narrate narrate's edit-box arm: gui.narrate.editBox(message, value); Narratable::edit_box is recorded by ui::EditBox::draw and screen_draw's field
EditBox.getHighlighted port crates/horizon-client-render/src/ui.rs::EditBox::selected_text the text between cursor and highlight
EditBox.moveCursorTo port crates/horizon-client-render/src/ui.rs::EditBox::set_cursor sets the cursor and keeps the highlight unless extending
EditBox.setCursorPosition port crates/horizon-client-render/src/ui.rs::EditBox::set_cursor clamps and scrolls to the cursor
@@ -109,7 +109,7 @@ EditBox.setHint inline crates/horizon-client/src/title/create_world.rs::Title::c
FittingMultiLineTextWidget.setWidth skip:ui layout: wrap width
FittingMultiLineTextWidget.minimizeHeight skip:ui layout: height to content
FittingMultiLineTextWidget.extractContents port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog message lines drawn as text parts
FocusableTextWidget.updateWidgetNarration skip:other narration text; no narrator in Horizon
FocusableTextWidget.updateWidgetNarration inline crates/horizon-client/src/screen_narrator.rs::narrate narrate's text arm reads the widget's message; gap: minor: the focusedUsageNarration and hoveredUsageNarration a FocusableTextWidget can carry are not modelled
FocusableTextWidget.extractWidgetRenderState port crates/horizon-client/src/game/lan_screen.rs::Game::draw_restrictions gap: minor: text only; no focus outline or background fill
FocusableTextWidget.updateWidth skip:ui layout: width from the message
FocusableTextWidget.updateHeight skip:ui layout: height from the wrapped lines
@@ -124,12 +124,12 @@ ImageWidget.texture skip:java factory
ImageWidget.Sprite.extractWidgetRenderState skip:other picture of a popup or social tab; Horizon's lock popup has no picture
ImageWidget.Texture.extractWidgetRenderState skip:other picture of a popup or social tab; Horizon's lock popup has no picture
ItemDisplayWidget.extractWidgetRenderState port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog a dialog's item body draws the item at its corner, then its decorations, and its tooltip under the cursor
ItemDisplayWidget.updateWidgetNarration skip:other narration text; no narrator in Horizon
ItemDisplayWidget.updateWidgetNarration inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats narration.item(hover name) recorded as the stats screen's item row text, the ItemRowWidget that is an ItemDisplayWidget
LoadingDotsWidget.extractWidgetRenderState port crates/horizon-client/src/multiplayer.rs::Screen::draw the scanning label and the animated dots under it on the LAN row
LockIconButton.createNarrationMessage skip:other narration text; no narrator in Horizon
LockIconButton.createNarrationMessage inline crates/horizon-client/src/game/lan_screen.rs::WorldOptions::narration gui.narrate.button(narrator.button.difficulty_lock) joined for narration with narrator.button.difficulty_lock.locked or .unlocked (Button::Lock)
LockIconButton.extractContents port crates/horizon-client/src/game/lan_screen.rs::Game::draw_options_view lock or unlock sprite by state
LogoRenderer.extractRenderState port crates/horizon-client/src/title.rs::Title::draw logo top 44 rows and edition banner; gap: minor: no easter-egg logo variant
MultiLineEditBox.updateWidgetNarration skip:other narration text; no narrator in Horizon
MultiLineEditBox.updateWidgetNarration inline crates/horizon-client/src/screen_narrator.rs::narrate narrate's edit-box arm: gui.narrate.editBox(message, value), the two things MultiLineEditBox adds; books and dialogs record their multi-line boxes as Narratable::edit_box
MultiLineEditBox.onClick port crates/horizon-client-render/src/screen_draw.rs::TextField::click click places the cursor; gap: minor: no double-click word select
MultiLineEditBox.onDrag port crates/horizon-client-render/src/multiline_edit.rs::MultiLineEdit::drag the selection follows the pointer, or the held scroll bar does
MultiLineEditBox.charTyped port crates/horizon-client-render/src/screen_draw.rs::TextField::insert_text typed text replaces the selection or goes at the cursor
1 BossHealthOverlay.extractBar port crates/horizon-client-render/src/hud_overlays.rs::boss_overlay background bar, then progress at the lerped width; the notch overlay only when not PROGRESS
30 Checkbox.adjustWidth missing minor: the checkbox width is never capped or its label wrapped; dialog_screen.rs:137 sets the width to the full label
31 Checkbox.overflowsRowLimit missing minor: no tooltip for a label that wraps past two rows; Horizon dialog labels never wrap
32 Checkbox.onPress port crates/horizon-client/src/game/dialogs.rs::Game::dialog_click toggles the boolean input value (dialogs.rs:448)
33 Checkbox.updateWidgetNarration skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; Horizon has no narrator (the Narrator option is stored only) narrate's checkbox arm: gui.narrate.button(message), then narration.checkbox.usage.{focused,hovered}.{check,uncheck} while the widget is active
34 Checkbox.extractContents port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog box sprite for checked and focused states, then the label (Part::Check)
35 Checkbox.Builder.selected skip:java builder setter
36 Checkbox.Builder.build skip:java builder: makes the checkbox and its tooltip
37 CommandSuggestions.mouseScrolled port crates/horizon-client-render/src/chat.rs::ChatScreen::scroll wheel over the suggestion list, clamped to the list
38 CommandSuggestions.mouseClicked port crates/horizon-client-render/src/chat.rs::ChatScreen::click click on a suggestion row uses it, else the input box
39 CommandSuggestions.getUsageNarration skip:other port crates/horizon-client-render/src/chat.rs::ChatScreen::suggestions_usage narration text; no narrator in Horizon narration.suggestion.usage.{cycle,fill}.{hidable,fixed} while the list shows; Game::draw_command_block passes it as the screen's usage
40 CommandSuggestions.sortSuggestions port crates/horizon-client-render/src/chat.rs::ChatScreen::show_suggestions suggestions starting with the typed word first, including the minecraft: prefix
41 CommandSuggestions.hasMessageArguments missing minor: a /say or /msg style command with a message argument counts as a command here; Horizon's parse keeps no argument kinds (see update_usage_info comment)
42 CommandSuggestions.getExceptionMessage port crates/horizon-client-render/src/chat.rs::ChatScreen::update_usage_info parse errors shown with their context (e.with_context)
46 CommandSuggestions.calculateSuggestionSuffix port crates/horizon-client-render/src/chat.rs::ChatScreen::select the grey suffix for the highlighted suggestion (strip the typed prefix)
47 CommandSuggestions.extractSuggestions port crates/horizon-client-render/src/chat.rs::ChatScreen::draw the suggestion list drawn when it is open
48 CommandSuggestions.extractUsage port crates/horizon-client-render/src/chat.rs::ChatScreen::draw usage lines drawn upward from the bottom, as vanilla's bottom anchor
49 CommandSuggestions.getNarrationMessage skip:other inline crates/horizon-client-render/src/chat.rs::SuggestionList::narration_message narration text; no narrator in Horizon the selected suggestion, said when the selection moves (ChatScreen::select); gap: minor: the chat screen's own narration does not add it (screen_info::chat reads the usage and the typed message)
50 CommandSuggestions.hasAllowedInput port crates/horizon-client-render/src/chat.rs::ChatAbilities::allows gap: minor: a /say style command is judged as a command, not a message (see hasMessageArguments)
51 CommandSuggestions.SuggestionsList.extractRenderState port crates/horizon-client-render/src/chat.rs::ChatScreen::draw_list rows, scroll marks, highlight and tooltip; gap: minor: no pointing-hand cursor over the rows
52 CommandSuggestions.SuggestionsList.mouseClicked port crates/horizon-client-render/src/chat.rs::ChatScreen::click row click selects and uses the suggestion
53 CommandSuggestions.SuggestionsList.keyPressed port crates/horizon-client-render/src/chat.rs::ChatScreen::key up, down and tab cycle and use the suggestion
54 CommandSuggestions.SuggestionsList.cycle port crates/horizon-client-render/src/chat.rs::ChatScreen::cycle moves the selection and the scroll offset
55 CommandSuggestions.SuggestionsList.getNarrationMessage skip:other port crates/horizon-client-render/src/chat.rs::suggestion_narration narration text; no narrator in Horizon narration.suggestion, or narration.suggestion.tooltip when the entry has one, over the position, the count and the text; SuggestionList::narration_message marks lastNarratedEntry
56 ComponentRenderUtils.stripColor port crates/horizon-client-render/src/chat.rs::Chat::displayed with Chat Colors off the section codes are stripped before wrapping
57 ContainerObjectSelectionList.nextFocusPath port crates/horizon-client-input/src/gamepad.rs::focus_step gap: minor: picks the nearest target by geometry, not row by row with a wrap to the next entry
58 ContainerObjectSelectionList.setFocused missing minor: unsure: no list focus model beyond gamepad focus_step; losing focus does not clear a selection here
59 ContainerObjectSelectionList.updateWidgetNarration skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; no narrator in Horizon narrate's container-list arm: the row under the mouse for the mouse and the system, else the focused one, then narrator.position.list; the row's own widgets one level deeper (narrate_row)
60 ContainerObjectSelectionList.Entry.setFocused missing minor: unsure: focus inside a row is not tracked; focus_step works on target rectangles
61 ContainerObjectSelectionList.Entry.focusPathAtIndex missing minor: unsure: no per-row focus path; see focus_step
62 ContainerObjectSelectionList.Entry.nextFocusPath port crates/horizon-client-input/src/gamepad.rs::focus_step gap: minor: moves by nearest target rectangle, not by child index within the row
63 ContainerObjectSelectionList.Entry.updateNarration skip:other port crates/horizon-client/src/screen_narrator.rs::narrate_row narration text; no narrator in Horizon the row widget findNarratableWidget picks (inactive ones too), with narrator.position.object_list when the row has more than one
64 CycleButton.extractContents port crates/horizon-client-render/src/options_ui.rs::OptionsUi::draw option button sprite and its label
65 CycleButton.onPress port crates/horizon-client-render/src/options_ui.rs::Opt::cycle click cycles forward; the back flag comes from the caller
66 CycleButton.getCycledValue skip:other only feeds the narration of the next value
67 CycleButton.mouseScrolled port crates/horizon-client-render/src/options_ui.rs::OptionsUi::wheel the wheel over a cycle button takes its step (up goes back) and the list stays put; a blocked row falls through to the page
68 CycleButton.updateValue inline crates/horizon-client-render/src/options_ui.rs::Opt::cycle labels are read live from Settings (Opt::label), so no cached message needs updating
69 CycleButton.createLabelForValue port crates/horizon-client-render/src/options_ui.rs::Opt::label value label or full name, from the setting
70 CycleButton.updateWidgetNarration skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; no narrator in Horizon narrate's cycle arm: gui.narrate.button(name: value), then narration.cycle_button.usage.{focused,hovered} with the value a click moves to
71 CycleButton.createDefaultNarrationMessage skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; no narrator in Horizon the gui.narrate.button wrap of narrate's cycle arm; the name and value it wraps are built where the widget is recorded (options.generic_value in the screen's label)
72 CycleButton.builder skip:java builder
73 CycleButton.booleanBuilder skip:java builder
74 CycleButton.onOffBuilder skip:java builder
92 DebugScreenOverlay.toggleLightmapTexture port crates/horizon-client/src/debug_chart.rs::DebugCharts::toggle_lightmap toggles the lightmap and clears the others
93 DebugScreenOverlay.toggleProfilerChart missing minor: no profiler chart (see showProfilerChart)
94 DebugScreenOverlay.logRemoteSample missing minor: unsure: the debug_sample packet is only named in horizon-protocol/src/ids.rs, so a server's samples are not logged
95 EditBox.createNarrationMessage skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; no narrator in Horizon narrate's edit-box arm: gui.narrate.editBox(message, value); Narratable::edit_box is recorded by ui::EditBox::draw and screen_draw's field
96 EditBox.getHighlighted port crates/horizon-client-render/src/ui.rs::EditBox::selected_text the text between cursor and highlight
97 EditBox.moveCursorTo port crates/horizon-client-render/src/ui.rs::EditBox::set_cursor sets the cursor and keeps the highlight unless extending
98 EditBox.setCursorPosition port crates/horizon-client-render/src/ui.rs::EditBox::set_cursor clamps and scrolls to the cursor
109 FittingMultiLineTextWidget.setWidth skip:ui layout: wrap width
110 FittingMultiLineTextWidget.minimizeHeight skip:ui layout: height to content
111 FittingMultiLineTextWidget.extractContents port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog message lines drawn as text parts
112 FocusableTextWidget.updateWidgetNarration skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; no narrator in Horizon narrate's text arm reads the widget's message; gap: minor: the focusedUsageNarration and hoveredUsageNarration a FocusableTextWidget can carry are not modelled
113 FocusableTextWidget.extractWidgetRenderState port crates/horizon-client/src/game/lan_screen.rs::Game::draw_restrictions gap: minor: text only; no focus outline or background fill
114 FocusableTextWidget.updateWidth skip:ui layout: width from the message
115 FocusableTextWidget.updateHeight skip:ui layout: height from the wrapped lines
124 ImageWidget.Sprite.extractWidgetRenderState skip:other picture of a popup or social tab; Horizon's lock popup has no picture
125 ImageWidget.Texture.extractWidgetRenderState skip:other picture of a popup or social tab; Horizon's lock popup has no picture
126 ItemDisplayWidget.extractWidgetRenderState port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog a dialog's item body draws the item at its corner, then its decorations, and its tooltip under the cursor
127 ItemDisplayWidget.updateWidgetNarration skip:other inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats narration text; no narrator in Horizon narration.item(hover name) recorded as the stats screen's item row text, the ItemRowWidget that is an ItemDisplayWidget
128 LoadingDotsWidget.extractWidgetRenderState port crates/horizon-client/src/multiplayer.rs::Screen::draw the scanning label and the animated dots under it on the LAN row
129 LockIconButton.createNarrationMessage skip:other inline crates/horizon-client/src/game/lan_screen.rs::WorldOptions::narration narration text; no narrator in Horizon gui.narrate.button(narrator.button.difficulty_lock) joined for narration with narrator.button.difficulty_lock.locked or .unlocked (Button::Lock)
130 LockIconButton.extractContents port crates/horizon-client/src/game/lan_screen.rs::Game::draw_options_view lock or unlock sprite by state
131 LogoRenderer.extractRenderState port crates/horizon-client/src/title.rs::Title::draw logo top 44 rows and edition banner; gap: minor: no easter-egg logo variant
132 MultiLineEditBox.updateWidgetNarration skip:other inline crates/horizon-client/src/screen_narrator.rs::narrate narration text; no narrator in Horizon narrate's edit-box arm: gui.narrate.editBox(message, value), the two things MultiLineEditBox adds; books and dialogs record their multi-line boxes as Narratable::edit_box
133 MultiLineEditBox.onClick port crates/horizon-client-render/src/screen_draw.rs::TextField::click click places the cursor; gap: minor: no double-click word select
134 MultiLineEditBox.onDrag port crates/horizon-client-render/src/multiline_edit.rs::MultiLineEdit::drag the selection follows the pointer, or the held scroll bar does
135 MultiLineEditBox.charTyped port crates/horizon-client-render/src/screen_draw.rs::TextField::insert_text typed text replaces the selection or goes at the cursor