1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//! **The box a menu item sends the operator to** (bl-dbc9): which of the
//! composer's two parameter boxes wants filling, and the one door that names a
//! conversation and asks for it.
//!
//! # Why a menu item ever needs this
//!
//! `crate::ui::convs::menu` fires the acts on a conversation row that take the
//! wall and the conversation and nothing else. Two of the acts on that row take
//! a **third** parameter — `flag`'s reason and `delete-agent`'s arming — and
//! each has a box of its own on the composer's second row
//! (`crate::ui::composer::acts`). A menu cannot hold that box: the composer is
//! a bottom panel that stands down off the conversation's own column in the
//! narrow shape (`crate::ui::shell`), so a box in a list row's menu would be a
//! parameter reachable at one width and not the other, and firing without one
//! would be an act composed from a control that never asked for it.
//!
//! So the menu item is a **navigation**: it names the conversation, goes to
//! where the box is, and puts the cursor in it. It crosses no wire and carries
//! no `act:` token, which is `Model::go_to`'s division exactly (§4.16: an aim,
//! a selection and a focus are views, and views are out of the parity
//! contract).
//!
//! # It is taken once, by the frame that paints the box
//!
//! [`Model::filling`] is `Model::revealing`'s shape one noun over: the field is
//! set by the surface that asked and **taken** by the surface that answers, so
//! a request cannot fight the next frame's focus. Taking it in one read rather
//! than one per box is what keeps a frame that paints the row from leaving half
//! a request standing.
//!
//! In the broad shape the composer paints later in the same frame as the list,
//! so the cursor lands on the keypress. In the narrow shape the list is the
//! central panel and the composer is already behind it, so it lands on the next
//! frame — which is the reason this is a field at all rather than a call.
use Model;
/// **Which of the composer's two parameter boxes wants the cursor.**
///
/// Two variants and no third: these are exactly the acts on a conversation
/// whose extra parameter has a box of its OWN. `message` and `interrupt` share
/// the composer's one draft, so pointing at it would name neither — which is
/// why neither is on the row's menu (`crate::ui::convs::menu`).