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
204
//! **One workspace's row**, the band of per-workspace controls that hangs off the aimed
//! one ([`controls`]), and the conversations that stand beneath it.
//!
//! Split from [`super`] at the design-time budget on the seam that module's own
//! doc draws twice over: it is *the channels and their sections*, `acts` is
//! *the ops whose subject is every channel*, and this is *one workspace* — the
//! line it wears, whether this seat can address it at all, and what an operator
//! can do to it once it is aimed at. The first changes when a section grows a
//! sentence; this one when a workspace-level op lands a control.
use crateWsRow;
use crate;
/// **What a row this seat cannot address says instead of being hidden.**
///
/// Dropping it would hide a workspace the operator has; addressing it by the
/// entry's leaf would aim a gesture at a different workspace. So it is painted, and
/// painted as what it is.
///
/// The wording states the FACT rather than a verdict (bl-77df). It used to read
/// *"this seat holds no name for it"*, which lands beside a perfectly correct
/// provisioning and reads as an error about the row above it. What is actually
/// true is structural: an entry directory names one workspace, the channel
/// enumerates every workspace that client is registered in, and the extras have
/// no entry of their own — so no envelope this seat can write reaches them.
pub const NO_NAME_HERE: &str =
"this box has no connection set up for it, so nothing here can reach it";
/// **The word on the control that floats this workspace to the front of the strip**,
/// offered on an aimed row that is not pinned.
pub const PIN: &str = "pin";
/// **And the one that takes it back out**, offered where it is pinned. Two
/// words rather than one that toggles, because the two ops are assertions: the
/// control names the act it fires (`crate::verbs::workspace`).
pub const UNPIN: &str = "unpin";
/// **The row that begins a conversation on this workspace** (§4.42 item 7, §4.39's
/// `+` moved under the workspace it begins on). A glyph and a word: `+` alone at
/// the far edge of the server's row was the one control a first-time operator
/// did not find.
pub const NEW: &str = "+ new";
/// What a workspace's row does, what `+ new` does, and what a nameless workspace is.
pub const AIM_HELP: &str =
"aims the window at this workspace: its conversations, its settings, its providers";
pub const NEW_HELP: &str =
"begins a conversation on this workspace; the box takes its first message";
pub const NO_NAME_HELP: &str =
"a workspace this box has no name for, so nothing here can aim at it";
/// One workspace: selectable when this seat can address it, a plain line when it
/// cannot.
///
/// **The eight per-workspace controls hang off the aimed row and off no other**,
/// because
/// an enrollment mints the pair `(client, workspace)` and the workspace is
/// exactly what an aim is. Offering it on every row would be offering it before
/// the operator had said which workspace — and the answer to that question is
/// already on the screen, once.
/// **`+ new`**: aim the workspace, clear the selection, ask for the caret in the
/// start, and close the switcher on the way (`Model::begin_at`).
///
/// **It stands down while a pane covers the conversation** — the per-workspace
/// controls' own rule: what it does is put the caret in the composer's box,
/// and the composer stands down under every covering pane but the switcher.
/// **A begin's row, which the walk can stand on** (bl-f991): the brand rule
/// while the cursor stands there, a Tab that lands on it stands it there too,
/// and the answer is whether it was clicked — the door Enter fires as well
/// (`crate::ui::keys`).
pub
/// One workspace's line: what it is called, then the state it is in, then the
/// facts that never change what the operator does next.
///
/// **The order is what survives the cut** (bl-cecd). The row is one run elided
/// at the column's width ([`theme::paint::row`]), so whatever stands last is
/// what a narrow roster loses. The rollups that carry a state — `N waiting`,
/// `running` — follow the name, where the rule at the row's left edge is
/// echoed in words; the count of conversations and the classification are the
/// weakest facts and go last, where losing them costs least. The two rollups
/// are stated only when they are non-zero — a roster of `0 waiting` on every
/// row teaches nothing and costs the one that says `3`.
///
/// **The ledger column** (REMOTE §9.23, DESIGN §4.41) is what the workspace has
/// cost, whole, where the server priced it — after the state and before the
/// weak facts, because money is what an operator scans a roster for second.