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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
//! **Assertion (d): every control lights under the pointer** (DESIGN §4.45
//! item 6).
//!
//! The ruling is that *state should always be immediately represented*, and
//! what the pointer is over is state the glass should show. A seat that
//! senses a click and paints nothing for it is the quietest way to break
//! that: the operator's hand is on a door and the door does not say so. The
//! audit routed every such seat through `theme::paint`'s door or the row
//! idiom; this is what keeps a later one from arriving bare.
//!
//! **The subject is each tagged control**, read off the same accessibility
//! tree the other three assertions walk and `super::parity` inventories —
//! so the set judged here is the set the parity gate already owns, and a
//! control that reaches the ledger reaches this. The pointer is put just
//! above the control — past egui's own reach, which counts a pointer within
//! `interact_radius` of a seat as on it — the frame settles, and the fills
//! inside the control's rectangle are read off the frame
//! (`crate::paint_probe::fills_of`, the one walk); then the pointer is put
//! at its centre and the same fills read again. **Lit means changed**: a row
//! turns its transparent fill into the wash, a button its rest fill into the
//! hover one, a link grows a fill it did not have. A control whose fills are
//! the same with the pointer on it as above it is bare.
//!
//! **Above, not absent, and on a clock of its own.** The bar opens to a
//! pointer near the window's left edge and shuts on a linger
//! (`crate::ui::bar`), so a bar row judged against a frame with no pointer
//! at all is judged against a different bar; a pointer straight above the
//! row is as far into the bar as the pointer on it, so the bar is the same
//! bar in both frames — which is also why the rest point is above and not
//! beside, where a step to the left of the first column would open the bar
//! under a control that is not in it. Each control begins with the pointer
//! gone and is then found under the pointer, because a window lays itself
//! out differently with a pointer in it: the bar opens, a scrolling pane
//! makes room for its bar, and a wrapped strip breaks on a different word.
//! And the linger and the ease run on egui's clock,
//! which is the wall's unless the input says otherwise — so every frame
//! here says otherwise, stepping the clock by more than the linger, and the
//! frame the fills are read off is the settled one whatever the machine was
//! doing.
//!
//! # What is not judged, and by which fact
//!
//! Each exclusion is a fact the tree or egui states about the control, not
//! a name on a list:
//!
//! - **A control egui does not report hovered** with the pointer at its
//! centre. It is disabled, or scrolled past its clip, or covered by an
//! overlay — in every case the pointer is not on it, and a wash under a
//! pointer that is somewhere else would be the defect, not the fix.
//! Where the control stands is read off egui with the pointer on it, so
//! a control that moved when the bar opened or a pane made room for its
//! scroll bar is aimed at where it moved to.
//! - **A selected control.** The chosen row wears `RAISED` and the brand
//! rule, which outranks the wash (`theme::hover`'s own ordering): it is
//! already the lit one, and the pointer arriving changes nothing it says.
//! egui writes a selection into the tree as *toggled*, which is also what
//! a checked box is — and a box's check is a value, not a place the
//! operator is, so a check box is judged whichever way it is set.
//! - **A field that takes text.** Its answer to the pointer is the caret;
//! a wash on a text box is a box that looks like a button.
//!
//! **The way from a node to egui's seat is the tag's own bridge**
//! (`crate::ui::act::seat_of`): AccessKit's id is the egui id's value, and
//! egui answers nothing about a number, so the tag records the seat it
//! wrote and this reads it back — where the control stands, and whether the
//! pointer on it is on it.
use crate;
use crate;
use Harness;
use ;
/// One tagged control as the tree offers it, held apart from the tree so the
/// harness can be driven while the list is walked.
/// The fills a frame put inside `rect`, in the order they were painted.
/// **Whether a role takes text**, by the tree's own name for it.
/// **Whether a control is the chosen one**: toggled on, and not a check box.
/// Both are read by their names because the types they come in belong to a
/// crate this one does not declare (`super::clipped::fault`'s reasoning).
/// **Every tagged control**, read in one pass over the settled tree.
/// **The fills of the last settled frame**. The frame is read by path
/// rather than as a method because `rules/no-bare-fork.yml` reads
/// `.output()` on anything as a child's — and this is a frame, not a fork.
/// **Hand the frame one pointer event and settle it**, two passes on a
/// clock that steps past the bar's linger each pass — so what the frame
/// holds is what the pointer there holds, and never where an animation was.
/// **Every tagged control, hovered and judged.** The count is how many were
/// judged at all — a screen that judged none is a screen this said nothing
/// about, and the caller holds the matrix to a floor. An empty list is the
/// assertion holding.
pub