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
//! **The window's one list** (DESIGN §4.39): the servers this seat reaches as
//! an accordion, the open one's workspaces under it, and the AIMED workspace's
//! conversations under their own workspace's row.
//!
//! It is one list and one scroll region because the middle column is gone:
//! what `crate::ui::convs` painted as a pane is a level of this one, a tree
//! under one heading rather than two panes disagreeing about what is selected.
//!
//! The grouping is the point. A seat holds one channel per workspace it
//! participates in elsewhere plus this box's own server (§8.2), and those are
//! separate trust relationships that share nothing — not anchors, not leaves,
//! not addresses. Painting them as one flat list would say they are one thing.
//!
//! **At most one server is open**, and it is painted first; the rest follow in
//! the order each was last opened on this seat, most recent first, the name
//! breaking a tie (`crate::ui::model::Servers`). A closed server paints its
//! row and whatever it has to say about itself, and no workspaces. Opening one
//! closes the other, so the arrangement is one fact and not a set of flags.
//!
//! **And a workspace that is not the aimed one paints no conversations**, not even
//! an emptiness (§4.39, §4.12): the standing read set asks about the aimed
//! workspace, so this seat holds no rows for any other and no evidence that there
//! are none — aiming is the act that asks.
//!
//! **A row carries the channel it came from as a client-side stamp** and no
//! origin crosses the wire; the stamp is applied where the answer is absorbed
//! ([`crate::ui::Model::absorb`]) and read here.
use crateWsRow;
use crateServer;
use crate;
/// The four ops whose subject is every channel, and the strip they hang on.
/// One server's row, the order the rows stand in, and the pane's cursor track.
/// One workspace's row, and the five per-workspace controls that hang off the aimed one.
pub use ;
pub use ;
/// **What a section says while nothing has come down its channel yet.**
///
/// The [`crate::ui::convs`] rows' doctrine one noun over: an empty list is not
/// evidence that a thing holds nothing until somebody has looked. It stands
/// from the window's first paint — before any server is dialled, deliberately
/// — until the first roster answer lands.
pub const NOT_ANSWERED: &str = "waiting to hear from this server";
/// What a section says for a server that answered and holds no workspace. A
/// fact about that server, and the one empty state that is not a wait.
pub const NO_WORKSPACES: &str = "this server holds no workspace this box is in";
/// The word this pane wears, and the subject the arrows act on when it is
/// focused. **It is painted by `crate::ui::shell`** — above the pane in the
/// broad shape, on the navigation bar in the narrow one (bl-dfda) — because a
/// column's name has one home and which one it is depends on the shape, and
/// the narrow bar's word follows this one for free.
///
/// **The word is *servers*, and the crate's word stays *channel*** (§4.39).
/// A channel is what this crate calls the client-side entry that reaches one
/// server (§4.6), which is the right word for a thing in `wire/workspaces/`
/// and the wrong one over a list an operator reads: what they are looking at
/// is yogs, each by the name this box gave it.
pub const HEADING: &str = "servers";
/// Paint the roster and take a click on it. **The heading is the shell's** —
/// see [`HEADING`].
/// One server's section: its row, what it has to say about itself, and — while
/// it is the open one — its workspaces.
///
/// **What it says about itself is painted open or closed** (bl-e620): the bar
/// holds one sentence and the last writer wins, so a seat with two unreachable
/// servers could discover only one of them from the glass. A channel that
/// cannot be dialled says so under its own row whether or not anybody has
/// opened it. What the accordion folds away is the WORKSPACES.
/// The section header: what this box calls the channel, what its host calls the
/// workspace when the two differ, and **the address it dials**.
///
/// It takes the channel and not the chunk because the decision queue groups its
/// rows by channel too (`crate::ui::queue`), and two spellings of a section
/// header would be two things an operator has to reconcile.
///
/// The rename is here because a local rename is the remedy for a name
/// collision, and an operator has to be able to see one. The address is here
/// because the pane used to drop the one fact that explains a duplicate
/// (bl-77df): an entry whose `address` file holds what this box's own server
/// listens on paints every workspace of that server twice, under two headers,
/// with nothing on either saying they are the same server. `lernie entries`
/// prints the address under every row and the window did not.
/// **Pinned first, in pin order**, then the rest by name.
///
/// The rank is what makes this a sort rather than a filter: a seat given only a
/// flag would have to read the pin list back to order them, which is the seat
/// joining an answer against a document only the server holds.