| 16 |
16 |
|
//! # What this crate does and does not own
|
| 17 |
17 |
|
//!
|
| 18 |
18 |
|
//! It owns the *expression*: two mitred polylines for a bevel and a `Frame`
|
| 19 |
|
- |
//! for a filled region. It owns no colours and no sizes, and no longer owns a
|
| 20 |
|
- |
//! substitution: it briefly supplied the page for a well, which was a stand-in
|
| 21 |
|
- |
//! for `surface-well` before makeover derived it, and every consumer reads the
|
| 22 |
|
- |
//! real token now. [`Palette`] is supplied by the caller,
|
|
19 |
+ |
//! for a filled region. It owns no colours, no sizes and no substitutions:
|
|
20 |
+ |
//! makeover derives `surface-well` and every consumer reads the real token.
|
|
21 |
+ |
//! [`Palette`] is supplied by the caller,
|
| 23 |
22 |
|
//! already resolved, and every radius, margin and stroke width arrives in
|
| 24 |
23 |
|
//! [`FrameStyle`].
|
| 25 |
24 |
|
//!
|
| 34 |
33 |
|
//! every call site decides. [`makeover_layout::Depth::pressed`] is what keeps
|
| 35 |
34 |
|
//! the decision from being re-derived per widget.
|
| 36 |
35 |
|
//!
|
| 37 |
|
- |
//! # 0.11.0: the overlay becomes reachable
|
|
36 |
+ |
//! # Overlays
|
| 38 |
37 |
|
//!
|
| 39 |
|
- |
//! 0.10.0 answered what overlaying means in immediate mode with
|
| 40 |
|
- |
//! [`Palette::cast`], and nothing could ask: the description had no
|
| 41 |
|
- |
//! `Depth::Overlay` until `makeover-layout` 0.14.0, so the answer sat beside a
|
| 42 |
|
- |
//! question that could not be posed. [`frame`] now hands the cast shadow to the
|
| 43 |
|
- |
//! `egui::Frame` for any depth whose fill is [`Fill::Overlay`], keyed off the
|
| 44 |
|
- |
//! fill rather than the variant.
|
|
38 |
+ |
//! [`Palette::cast`] is what overlaying means in immediate mode. [`frame`] hands
|
|
39 |
+ |
//! the cast shadow to the `egui::Frame` for any depth whose fill is
|
|
40 |
+ |
//! [`Fill::Overlay`], keyed off the fill rather than the variant.
|
| 45 |
41 |
|
//!
|
| 46 |
|
- |
//! The same release brings `makeover_layout::CellPart`, which 0.11.0 carried
|
| 47 |
|
- |
//! and did not draw. [`table`] draws it, below.
|
|
42 |
+ |
//! # The table
|
| 48 |
43 |
|
//!
|
| 49 |
|
- |
//! # 0.12.0: the table
|
|
44 |
+ |
//! [`table`] draws `makeover_layout::CellPart`. Two things it forces, both named
|
|
45 |
+ |
//! where they land:
|
| 50 |
46 |
|
//!
|
| 51 |
|
- |
//! [`table`] is the vocabulary 0.11.0 took without using. The consumer is
|
| 52 |
|
- |
//! audiofiles, whose file list is the only table in the tree exercising all four
|
| 53 |
|
- |
//! of what the description says about one at once: sortable headings with
|
| 54 |
|
- |
//! carets, fixed and remainder tracks, and buttons inside cells.
|
| 55 |
|
- |
//!
|
| 56 |
|
- |
//! Two things it forces, both named where they land:
|
| 57 |
|
- |
//!
|
| 58 |
|
- |
//! - **`egui_extras`**, this crate's first dependency past egui. egui has no
|
|
47 |
+ |
//! - **`egui_extras`**, this crate's one dependency past egui. egui has no
|
| 59 |
48 |
|
//! table, and `Grid` gives no per-column sizing, no sticky header and no
|
| 60 |
|
- |
//! scroll sync, which is why audiofiles reached for `egui_extras` rather than
|
| 61 |
|
- |
//! building on `Grid`. A third answer here would reimplement that crate worse.
|
| 62 |
|
- |
//! - **[`Palette::action`]**, on the footing [`Palette::content`] arrived on: a
|
| 63 |
|
- |
//! link in a cell is the first thing here needing the action intent.
|
|
49 |
+ |
//! scroll sync. A third answer here would reimplement that crate worse.
|
|
50 |
+ |
//! - **[`Palette::action`]**, on the footing [`Palette::content`] sits on: a
|
|
51 |
+ |
//! link in a cell needs the action intent.
|
| 64 |
52 |
|
//!
|
| 65 |
53 |
|
//! Narrowing works differently from the terminal's and the module header says
|
| 66 |
54 |
|
//! why: a content column cannot be measured before the app's closure has drawn
|
| 67 |
55 |
|
//! it, so `egui_extras` sizes it and the declared floor budgets it.
|
| 68 |
56 |
|
//!
|
| 69 |
|
- |
//! # 0.13.0: what the adoption found missing
|
| 70 |
|
- |
//!
|
| 71 |
|
- |
//! 0.12.0 shipped [`table`] before audiofiles had taken it, and taking it found
|
| 72 |
|
- |
//! three things the file list already did that the function could not say. All
|
| 73 |
|
- |
//! three are host idiom rather than description, which is why they land here and
|
| 74 |
|
- |
//! not in `makeover-layout`, and all three are answered on a handle the app
|
| 75 |
|
- |
//! never sees: the `egui_extras` row and builder this crate owns. That is
|
|
57 |
+ |
//! Three things are host idiom rather than description, which is why they land
|
|
58 |
+ |
//! here and not in `makeover-layout`, and all three are answered on a handle the
|
|
59 |
+ |
//! app never sees: the `egui_extras` row and builder this crate owns. That is
|
| 76 |
60 |
|
//! [`table::cell`]'s reasoning again: what the app cannot reach, the renderer
|
| 77 |
61 |
|
//! owes it.
|
| 78 |
62 |
|
//!
|
| 82 |
66 |
|
//! - **Scrolling a row into view.** [`table::Body::scroll_to`], because
|
| 83 |
67 |
|
//! `scroll_to_row` is a method on the builder. A keyboard cursor that moves
|
| 84 |
68 |
|
//! off-screen and stays there is the bug this prevents.
|
| 85 |
|
- |
//! - **Dragging a divider.** [`table::TableStyle::resizable`], which passes the
|
| 86 |
|
- |
//! test `sticky_header` failed in 0.12.0: egui_extras offers two settings here
|
| 87 |
|
- |
//! and a renderer can honestly make either choice.
|
|
69 |
+ |
//! - **Dragging a divider.** [`table::TableStyle::resizable`], which is a knob
|
|
70 |
+ |
//! because egui_extras offers two settings here and a renderer can honestly
|
|
71 |
+ |
//! make either choice.
|
| 88 |
72 |
|
//!
|
| 89 |
|
- |
//! A fourth was found and is not a knob. Cells are centred on the row's centre
|
| 90 |
|
- |
//! line, always, because there is no second honest answer and egui's own default
|
| 91 |
|
- |
//! (top-aligned) is the one thing it cannot be.
|
|
73 |
+ |
//! Cells are centred on the row's centre line, always, because there is no
|
|
74 |
+ |
//! second honest answer and egui's own default (top-aligned) is the one thing it
|
|
75 |
+ |
//! cannot be. That is not a knob.
|
| 92 |
76 |
|
//!
|
| 93 |
77 |
|
//! [`table::Body`] is also what splits a table's per-frame facts from its
|
| 94 |
78 |
|
//! description and from its style. A row count, a selection and a scroll request
|
| 95 |
79 |
|
//! are none of them style, and none of them survive the frame.
|
| 96 |
80 |
|
//!
|
| 97 |
|
- |
//! # 0.18.0: the nodes that were not fields, tables or frames
|
|
81 |
+ |
//! # The nodes that are not fields, tables or frames
|
| 98 |
82 |
|
//!
|
| 99 |
|
- |
//! [`widget`] draws a meter, a token, a control and a figure. `makeover-tui` has
|
| 100 |
|
- |
//! had all four for releases and this crate had none of them, which stayed
|
| 101 |
|
- |
//! invisible while the only consumer was an app calling [`field`] and [`table`]
|
| 102 |
|
- |
//! directly. It stopped being invisible the moment anything tried to draw a
|
| 103 |
|
- |
//! whole `quasi_router::Screen` in egui: the four are ordinary nodes, so a
|
| 104 |
|
- |
//! screen walk would have had to draw them itself, one copy per consumer.
|
| 105 |
|
- |
//!
|
| 106 |
|
- |
//! [`Palette`] grows the three status intents with it. They arrive together
|
| 107 |
|
- |
//! rather than one per widget for the reason [`Palette::fill`] is an `Option`:
|
| 108 |
|
- |
//! `Tone` is five members wide, and a resolver missing one has to invent a
|
| 109 |
|
- |
//! colour, which is the substitution 0.2.0 spent a release removing.
|
|
83 |
+ |
//! [`widget`] draws a meter, a token, a control and a figure. The four are
|
|
84 |
+ |
//! ordinary nodes, so without them a screen walk has to draw them itself, one
|
|
85 |
+ |
//! copy per consumer.
|
| 110 |
86 |
|
//!
|
|
87 |
+ |
//! [`Palette`] carries the three status intents together rather than one per
|
|
88 |
+ |
//! widget, for the reason [`Palette::fill`] is an `Option`: `Tone` is five
|
|
89 |
+ |
//! members wide, and a resolver missing one has to invent a colour, which is a
|
|
90 |
+ |
//! substitution this crate does not make.
|
| 111 |
91 |
|
//! # Forms
|
| 112 |
92 |
|
//!
|
| 113 |
|
- |
//! 0.5.0 adds the field vocabulary on top of the depth vocabulary:
|
|
93 |
+ |
//! The field vocabulary sits on top of the depth vocabulary:
|
| 114 |
94 |
|
//! [`makeover_layout::Field`] rendered to egui widgets, in [`field`], and a set
|
| 115 |
|
- |
//! of them laid down a column in [`group`]. Before it, a description saying
|
| 116 |
|
- |
//! "text field, labelled, required, with this hint" had no way to become a
|
| 117 |
|
- |
//! widget here, and audiofiles' forms stayed hand-rolled.
|
|
95 |
+ |
//! of them laid down a column in [`group`].
|
| 118 |
96 |
|
//!
|
| 119 |
|
- |
//! `makeover-webview` got there first and its form emitter is the precedent
|
| 120 |
|
- |
//! followed rather than re-derived, including the parts that are bug fixes: a
|
|
97 |
+ |
//! `makeover-webview`'s form emitter is the precedent, followed rather than
|
|
98 |
+ |
//! re-derived, including the parts that are bug fixes: a
|
| 121 |
99 |
|
//! select handed a value none of its options carries keeps that value visible
|
| 122 |
100 |
|
//! instead of silently reading as the first option, which is a save-the-wrong-
|
| 123 |
101 |
|
//! thing bug goingson hit for real.
|
| 135 |
113 |
|
//! **focus** and the **focus ring** are this renderer's three answers and
|
| 136 |
114 |
|
//! egui already has all three: its own id stack decides what is reachable,
|
| 137 |
115 |
|
//! its own state decides what holds the keyboard, and it paints exactly one
|
| 138 |
|
- |
//! ring. A description states none of them — `makeover_layout` removed the
|
| 139 |
|
- |
//! member that used to try in 0.19.0 — and drawing a second ring on top of
|
| 140 |
|
- |
//! egui's would break the one-ring rule it would have come from. The terms
|
|
116 |
+ |
//! ring. A description states none of them, and drawing a second ring on top
|
|
117 |
+ |
//! of egui's would break the one-ring rule. The terms
|
| 141 |
118 |
|
//! are defined once in `makeover_layout`'s crate header, "Reach, focus and
|
| 142 |
119 |
|
//! the focus ring". [`makeover_layout::State::Disabled`] *is* drawn, because
|
| 143 |
120 |
|
//! egui has no opinion about it until told.
|
| 154 |
131 |
|
//! looks for it, and because the silent version reads as "egui does not need
|
| 155 |
132 |
|
//! a palette" rather than "nobody has built the renderer yet".
|
| 156 |
133 |
|
|
| 157 |
|
- |
//! # 0.33.0: an interval is a sixth control shape
|
|
134 |
+ |
//! # An interval is a sixth control shape
|
| 158 |
135 |
|
//!
|
| 159 |
|
- |
//! `makeover-layout` 0.34.0's [`FieldKind::Interval`], drawn as `Control::Spanned`:
|
| 160 |
|
- |
//! two drag boxes on one row with the word `to` between them.
|
|
136 |
+ |
//! [`FieldKind::Interval`] is drawn as `Control::Spanned`: two drag boxes on one
|
|
137 |
+ |
//! row with the word `to` between them.
|
| 161 |
138 |
|
//!
|
| 162 |
139 |
|
//! - **Dragged rather than typed**, because that is what these controls already
|
| 163 |
140 |
|
//! were. audiofiles' six filter axes are `DragValue` pairs sharing an extent,
|
| 169 |
146 |
|
//! - **An empty end reads as the bound it stands for.** An unset minimum sits
|
| 170 |
147 |
|
//! on the low edge and stores no filter, which is what the shipped control
|
| 171 |
148 |
|
//! did; egui's `DragValue` has no empty state, and a text box in its place
|
| 172 |
|
- |
//! would be the regression above. With no extent to fall back on it reads
|
|
149 |
+ |
//! would cost the app a control. With no extent to fall back on it reads
|
| 173 |
150 |
|
//! zero -- the one number this renderer invents, invented where the
|
| 174 |
151 |
|
//! description declined to say anything.
|
| 175 |
152 |
|
//! - **The word rather than a dash**, which on a signed axis is a minus sign.
|
| 179 |
156 |
|
//! reading `min`, `max`, `step` and `unit` once is what stops the two ends
|
| 180 |
157 |
|
//! drifting apart.
|
| 181 |
158 |
|
//!
|
| 182 |
|
- |
//! # 0.32.0: a number draws its unit
|
|
159 |
+ |
//! # A number draws its unit
|
| 183 |
160 |
|
//!
|
| 184 |
|
- |
//! `makeover-layout` 0.33.0's [`Field::unit`], and this host is the one the
|
| 185 |
|
- |
//! member was argued from: egui's `Slider` already draws a suffix beside its
|
| 186 |
|
- |
//! readout, which is where these controls put the unit before they were
|
| 187 |
|
- |
//! described and is somewhere a label cannot reach.
|
|
161 |
+ |
//! [`Field::unit`], and this host is the one with somewhere better than the
|
|
162 |
+ |
//! label to put it: egui's `Slider` draws a suffix beside its readout.
|
| 188 |
163 |
|
//!
|
| 189 |
164 |
|
//! So a slider takes it as a suffix, inside the control. A typed number has no
|
| 190 |
165 |
|
//! readout of its own and takes it as a muted label after the box. Every other
|
| 191 |
166 |
|
//! kind ignores it, and the description says which those are --
|
| 192 |
167 |
|
//! `FieldKind::measurable`, rather than a `matches!` kept here.
|
| 193 |
168 |
|
//!
|
| 194 |
|
- |
//! # 0.31.0: the slider's track is a curve
|
|
169 |
+ |
//! # The slider's track is a curve
|
| 195 |
170 |
|
//!
|
| 196 |
|
- |
//! `makeover-layout` 0.32.0 says what a slider is: a fraction and a function
|
|
171 |
+ |
//! `makeover-layout` says what a slider is: a fraction and a function
|
| 197 |
172 |
|
//! taking numbers to numbers, with `min` and `max` being `f(0)` and `f(1)`
|
| 198 |
173 |
|
//! rather than the control's extent. This host has the easiest job of the
|
| 199 |
174 |
|
//! three, because egui already has the control -- `Slider::logarithmic` is a
|
| 200 |
175 |
|
//! constant-ratio track, so the mapping is a builder call rather than an
|
| 201 |
176 |
|
//! arithmetic of its own.
|
| 202 |
177 |
|
//!
|
| 203 |
|
- |
//! Two things worth knowing. The granularity moved onto the curve, so a range
|
| 204 |
|
- |
//! reads `Field::curve.step()` and every other kind still reads `Field::step`;
|
| 205 |
|
- |
//! the step is in the value's own units under either curve, so the display
|
| 206 |
|
- |
//! precision is derived exactly as before. And the fallback for a ratio curve
|
|
178 |
+ |
//! Two things worth knowing. The granularity rides on the curve, so a range
|
|
179 |
+ |
//! reads `Field::curve.step()` and every other kind reads `Field::step`; the
|
|
180 |
+ |
//! step is in the value's own units under either curve, so the display
|
|
181 |
+ |
//! precision derives from it directly. And the fallback for a ratio curve
|
| 207 |
182 |
|
//! across zero is asked of `Curve::is_ratio` rather than matched on the
|
| 208 |
183 |
|
//! variant, so this renderer and a terminal cannot disagree about when a
|
| 209 |
184 |
|
//! logarithmic request is honoured.
|
| 210 |
185 |
|
//!
|
| 211 |
|
- |
//! # 0.28.0: the slider, the unanswered chooser, and the option that is not
|
| 212 |
|
- |
//! offered yet
|
|
186 |
+ |
//! # The slider, the unanswered chooser, and the option that is not offered
|
|
187 |
+ |
//! yet
|
| 213 |
188 |
|
//!
|
| 214 |
|
- |
//! Three things `makeover-layout` 0.28.0 lets a description say, all three
|
| 215 |
|
- |
//! found by audiofiles' forms port hitting a wall it could not describe its way
|
| 216 |
|
- |
//! past.
|
|
189 |
+ |
//! Three things a description can say here.
|
| 217 |
190 |
|
//!
|
| 218 |
|
- |
//! - **[`FieldKind::Range`] is a fifth control shape**, `Control::Slid`, and
|
| 219 |
|
- |
//! the first one added since 0.5.0. egui has `Slider` and this crate had no
|
| 220 |
|
- |
//! way to be asked for one, so four sliders in the only consuming app stayed
|
| 221 |
|
- |
//! hand-rolled against a vocabulary that could not name them. A range missing
|
| 222 |
|
- |
//! an end falls back to a well rather than to invented bounds, which is what
|
|
191 |
+ |
//! - **[`FieldKind::Range`] is a fifth control shape**, `Control::Slid`, drawn
|
|
192 |
+ |
//! with egui's `Slider`. A range missing an end falls back to a well rather
|
|
193 |
+ |
//! than to invented bounds, which is what
|
| 223 |
194 |
|
//! `makeover_layout::Field::bounded` is for.
|
| 224 |
|
- |
//! - **`Field::placeholder` finally reads on a chooser.** It was sayable and
|
| 225 |
|
- |
//! this renderer ignored it, so a select with nothing chosen showed an empty
|
| 226 |
|
- |
//! box. Nothing new is described; the renderer caught up.
|
|
195 |
+ |
//! - **`Field::placeholder` reads on a chooser**, so a select with nothing
|
|
196 |
+ |
//! chosen does not show an empty box.
|
| 227 |
197 |
|
//! - **`Choice::unavailable` is drawn rather than dropped.** The option stays
|
| 228 |
198 |
|
//! in the list, inert, with its precondition beside it instead of behind a
|
| 229 |
199 |
|
//! hover — a greyed row with no reason reads as a dead end, which is the
|
| 230 |
200 |
|
//! whole finding.
|
| 231 |
|
- |
//! - **`Choice::detail` (makeover-layout 0.39.0) is drawn under the option in a
|
|
201 |
+ |
//! - **`Choice::detail` is drawn under the option in a
|
| 232 |
202 |
|
//! radio group and inside the row in a combo.** A closed chooser hides its
|
| 233 |
203 |
|
//! list, so everything an option carries has to travel with its row; a group
|
| 234 |
204 |
|
//! has a line to spare and putting a sentence beside the control instead
|
| 270 |
240 |
|
pub overlay: Color32,
|
| 271 |
241 |
|
/// `surface-well`.
|
| 272 |
242 |
|
///
|
| 273 |
|
- |
/// Required, not optional. makeover derives it for every theme from 2.3.0,
|
| 274 |
|
- |
/// so a resolved palette without a well is not a thing that exists here.
|
| 275 |
|
- |
/// It was an `Option` while that was untrue, and this renderer substituted
|
| 276 |
|
- |
/// the page; `makeover-tui` keeps its own `Option` for a different reason,
|
| 277 |
|
- |
/// since a terminal can have the colour and still be unable to show it.
|
|
243 |
+ |
/// Required, not optional. makeover derives it for every theme, so a
|
|
244 |
+ |
/// resolved palette without a well is not a thing that exists here.
|
|
245 |
+ |
/// `makeover-tui` keeps its own `Option` for a different reason, since a
|
|
246 |
+ |
/// terminal can have the colour and still be unable to show it.
|
| 278 |
247 |
|
pub well: Color32,
|
| 279 |
248 |
|
/// `surface-sunken`.
|
| 280 |
249 |
|
///
|
| 308 |
277 |
|
pub elevation: Color32,
|
| 309 |
278 |
|
/// `content`.
|
| 310 |
279 |
|
///
|
| 311 |
|
- |
/// Ordinary text. Added 0.5.0 with the field renderer, which is the first
|
| 312 |
|
- |
/// thing here that draws any: until then this crate painted surfaces and
|
| 313 |
|
- |
/// edges and let the caller's own egui visuals answer for text.
|
|
280 |
+ |
/// Ordinary text.
|
| 314 |
281 |
|
pub content: Color32,
|
| 315 |
282 |
|
/// `content-secondary`.
|
| 316 |
283 |
|
///
|
| 317 |
284 |
|
/// Inactive but usable: it still answers a press. The middle tone of the
|
| 318 |
285 |
|
/// three (wiki `three-tone-convention`), and the one an unchosen option in
|
| 319 |
|
- |
/// a choice field takes. Added 0.26.0 for that widget, which drew every
|
| 320 |
|
- |
/// option at full `content` and so said nothing about which one was
|
| 321 |
|
- |
/// chosen beyond the dot egui paints.
|
|
286 |
+ |
/// a choice field takes.
|
| 322 |
287 |
|
///
|
| 323 |
288 |
|
/// Not [`content_muted`](Self::content_muted), which carries a claim:
|
| 324 |
289 |
|
/// `State::Disabled` resolves to it, so a live control wearing it tells the
|
| 338 |
303 |
|
pub content_muted: Color32,
|
| 339 |
304 |
|
/// `action-primary`.
|
| 340 |
305 |
|
///
|
| 341 |
|
- |
/// What a control is drawn in. Added 0.12.0 with the table renderer, for the
|
| 342 |
|
- |
/// reason `content` was added 0.5.0 with the field renderer: a link in a
|
| 343 |
|
- |
/// cell is the first thing here that needs the action intent, and a palette
|
| 344 |
|
- |
/// should carry what is used.
|
|
306 |
+ |
/// What a control is drawn in.
|
| 345 |
307 |
|
///
|
| 346 |
308 |
|
/// This is the intent [`CellPart`](makeover_layout::CellPart) exists to
|
| 347 |
|
- |
/// separate. A cell holding a control took the cell's text colour until the
|
| 348 |
|
- |
/// description could say otherwise, which is the drift `makeover-layout`
|
| 349 |
|
- |
/// 0.14.0 named and `makeover-webview` 0.25.0 fixed on its own side.
|
|
309 |
+ |
/// separate. A cell holding a control that takes the cell's text colour is
|
|
310 |
+ |
/// the drift `CellPart` names.
|
| 350 |
311 |
|
pub action: Color32,
|
| 351 |
312 |
|
/// `danger`.
|
| 352 |
313 |
|
///
|
| 354 |
315 |
|
pub danger: Color32,
|
| 355 |
316 |
|
/// `success`.
|
| 356 |
317 |
|
///
|
| 357 |
|
- |
/// Added 0.18.0 with [`widget`], which is the first thing here that draws a
|
| 358 |
|
- |
/// [`Tone`]. The three status intents arrive together and not one at a
|
| 359 |
|
- |
/// time: [`Tone`] is five members wide and a resolver missing one has to
|
| 360 |
|
- |
/// invent a colour for it, which is the substitution this crate spent
|
| 361 |
|
- |
/// 0.2.0 removing from [`Palette::fill`].
|
|
318 |
+ |
/// The three status intents arrive together and not one at a time:
|
|
319 |
+ |
/// [`Tone`] is five members wide and a resolver missing one has to invent
|
|
320 |
+ |
/// a colour for it, which is the substitution [`Palette::fill`] refuses.
|
| 362 |
321 |
|
pub success: Color32,
|
| 363 |
322 |
|
/// `warning`.
|
| 364 |
323 |
|
pub warning: Color32,
|
| 369 |
328 |
|
impl Palette {
|
| 370 |
329 |
|
/// Resolve a surface intent, or `None` for one this renderer does not know.
|
| 371 |
330 |
|
///
|
| 372 |
|
- |
/// A plain lookup. There is still no substitution: the old one existed only
|
| 373 |
|
- |
/// while `surface-well` was underived, and every consumer reads the real
|
| 374 |
|
- |
/// token now.
|
|
331 |
+ |
/// A plain lookup, and no substitution.
|
| 375 |
332 |
|
///
|
| 376 |
|
- |
/// `Option` since 0.3.0, because [`Fill`] became `#[non_exhaustive]` in
|
| 377 |
|
- |
/// `makeover-layout` 0.4.0 and a total function over an open enum can only
|
| 378 |
|
- |
/// stay total by inventing a colour for a member it has never heard of.
|
| 379 |
|
- |
/// That is the substitution this crate spent 0.2.0 removing, so the return
|
| 380 |
|
- |
/// type moved instead. Every member the description has today is answered
|
| 381 |
|
- |
/// with `Some`.
|
|
333 |
+ |
/// `Option`, because [`Fill`] is `#[non_exhaustive]` and a total function
|
|
334 |
+ |
/// over an open enum can only stay total by inventing a colour for a member
|
|
335 |
+ |
/// it has never heard of. Every member the description has today is
|
|
336 |
+ |
/// answered with `Some`.
|
| 382 |
337 |
|
#[must_use]
|
| 383 |
338 |
|
pub const fn fill(&self, fill: Fill) -> Option<Color32> {
|
| 384 |
339 |
|
match fill {
|
| 626 |
581 |
|
///
|
| 627 |
582 |
|
/// Either end may be empty while the other stands. An open end is an
|
| 628 |
583 |
|
/// answer -- "over 120 BPM" -- rather than a half-filled box.
|
| 629 |
|
- |
///
|
| 630 |
|
- |
/// Added 0.33.0 with makeover-layout 0.34.0.
|
| 631 |
584 |
|
Between {
|
| 632 |
585 |
|
/// The lower end's buffer.
|
| 633 |
586 |
|
lower: &'a mut String,
|
| 684 |
637 |
|
/// come from members [`Field::options`] does not have, so a shared arm
|
| 685 |
638 |
|
/// would be a `matches!` on the kind inside the loop rather than one arm
|
| 686 |
639 |
|
/// less.
|
| 687 |
|
- |
///
|
| 688 |
|
- |
/// Added with makeover-layout 0.38.0's [`FieldKind::Theme`].
|
| 689 |
640 |
|
Themed,
|
| 690 |
641 |
|
/// Two values dragged across one axis, drawn as one question.
|
| 691 |
642 |
|
///
|
| 702 |
653 |
|
/// description since this renderer was built degrades to a text box, which
|
| 703 |
654 |
|
/// accepts any value the others would, rather than to nothing drawn at all.
|
| 704 |
655 |
|
///
|
| 705 |
|
- |
/// `FieldKind::File` lands there as of makeover-layout 0.11.0, and it is left
|
| 706 |
|
- |
/// there rather than grown a shape of its own. egui's honest answer is a button
|
| 707 |
|
- |
/// that opens a native picker, which is a fifth control and a file-dialog
|
| 708 |
|
- |
/// dependency; no consumer of this crate asks for a file field yet. Same
|
| 709 |
|
- |
/// position this crate took on `Meter` at 0.10.0: the membership test is that
|
| 710 |
|
- |
/// every renderer *could* answer honestly, not that each one does on the day.
|
| 711 |
|
- |
/// A path in a text box is not nothing, and it is what an app that needs this
|
| 712 |
|
- |
/// tomorrow gets today.
|
|
656 |
+ |
/// `FieldKind::File` lands there rather than growing a shape of its own. egui's
|
|
657 |
+ |
/// honest answer is a button that opens a native picker, which is a fifth
|
|
658 |
+ |
/// control and a file-dialog dependency, and no consumer of this crate asks for
|
|
659 |
+ |
/// a file field. The membership test is that every renderer *could* answer
|
|
660 |
+ |
/// honestly, not that each one does on the day. A path in a text box is not
|
|
661 |
+ |
/// nothing.
|
| 713 |
662 |
|
///
|
| 714 |
|
- |
/// makeover-layout 0.31.0 added `Field::accept` and `Field::multiple`, and this
|
| 715 |
|
- |
/// position is what they land on: both are the picker's arguments, and this
|
|
663 |
+ |
/// `Field::accept` and `Field::multiple` land on the same position: both are the picker's arguments, and this
|
| 716 |
664 |
|
/// renderer has no picker to give them to. They are not lost — the description
|
| 717 |
665 |
|
/// still carries them, and the day the native dialog arrives here it is opened
|
| 718 |
666 |
|
/// with them rather than with a filter written twice.
|
| 719 |
667 |
|
///
|
| 720 |
|
- |
/// `FieldKind::Date` and `FieldKind::DateTime` land there too, as of
|
| 721 |
|
- |
/// makeover-layout 0.15.0, on the same footing and with one thing owed. A
|
|
668 |
+ |
/// `FieldKind::Date` and `FieldKind::DateTime` land there too, on the same
|
|
669 |
+ |
/// footing and with one thing owed. A
|
| 722 |
670 |
|
/// calendar is a sixth control and bare `egui` has none, so a typed value is
|
| 723 |
671 |
|
/// the honest answer here; what the app gets is the format the description
|
| 724 |
672 |
|
/// names, `makeover_layout::DATE_FORMAT` and `DATETIME_FORMAT`, which is why
|
| 726 |
674 |
|
/// of this crate and asks for neither today. A calendar popup is the upgrade
|
| 727 |
675 |
|
/// whenever one does.
|
| 728 |
676 |
|
///
|
| 729 |
|
- |
/// `Field::as_instant` (makeover-layout 0.37.0) is carried and not honoured, on
|
|
677 |
+ |
/// `Field::as_instant` is carried and not honoured, on
|
| 730 |
678 |
|
/// the same footing. It asks for the typed wall-clock value to be submitted as
|
| 731 |
679 |
|
/// the moment it names, and this renderer has no submission to convert on: it
|
| 732 |
680 |
|
/// draws the control and the app reads the value back, so the conversion would
|
| 753 |
701 |
|
|
| 754 |
702 |
|
/// How far an option's second line is inset, in points.
|
| 755 |
703 |
|
///
|
| 756 |
|
- |
/// makeover-layout 0.39.0. The width of egui's radio button plus the gap after
|
| 757 |
|
- |
/// it, so the line starts under the label rather than under the control. A
|
|
704 |
+ |
/// The width of egui's radio button plus the gap after it, so the line starts under the label rather than under the control. A
|
| 758 |
705 |
|
/// magnitude, which is `makeover-geometry`'s subject and not this crate's --
|
| 759 |
706 |
|
/// but this one is measured off a widget egui draws and sizes, so there is
|
| 760 |
707 |
|
/// nothing for a spacing scale to say about it.
|