Sketch dialog follows "Dialog buttons at top" (#9860) (#9884)

* claim: #9860

Co-Authored-By: Claude <noreply@anthropic.com>

* Sketch panel follows Dialog buttons at top (#9860)

The Sketch panel drew Finish Sketch, Look at and Slice in a footer under
its options even with Preferences > Interface > Dialog buttons set to
Top. Panel::palette now reads the same published preference as the
feature cards and draws its footer row under the header, above the
options, when it is Top. With the preference off nothing changes.

Changes a default: no

Co-Authored-By: Claude <noreply@anthropic.com>

* Docs: Dialog buttons at top also moves the Sketch panel's Finish row (#9860)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
momysnow
2026-10-31 06:23:41 +00:00
committed by GitHub
parent 5d9e4d5f95
commit da23eb1377
5 changed files with 34 additions and 4 deletions
@@ -265,6 +265,25 @@ fn apply_in_the_header_row_commits_once_and_keeps_the_dialog() {
assert_eq!(scenario::rect_of("dialog:apply"), Some(apply), "the buttons stay where they were");
}
/// Interface › Dialog buttons › Top (#9860): the sketch panel's Finish Sketch row sits above its
/// options, and below them with the preference off.
#[test]
fn sketch_panel_finish_row_follows_dialog_buttons() {
for (placement, on_top) in [("top", true), ("bottom", false)] {
let mut h = fixture();
h.call("ui.prefs", json!({"dialog_buttons": placement}));
h.settle();
let finish = scenario::rect_of("sketch_palette:finish").unwrap_or_else(|| panic!("{placement}: no Finish Sketch"));
let first = scenario::rect_of("sketch_palette:toggle:show_constraints").unwrap_or_else(|| panic!("{placement}: no first option"));
if on_top {
assert!(finish.bottom() <= first.top(), "top: Finish {finish:?} above its first option {first:?}");
} else {
assert!(first.bottom() <= finish.top(), "bottom: Finish {finish:?} below its first option {first:?}");
}
assert!(scenario::handle_at("sketch_palette:finish").is_some(), "{placement}: the handle stays");
}
}
#[test]
fn picked_list_removes_one_item_and_field_still_activates_input() {
let mut h = fixture();
+10 -2
View File
@@ -851,6 +851,8 @@ impl<'a> Panel<'a> {
/// Tokens: space_24 and form_footer_height; header/body/footer own their historical padding.
pub(crate) fn palette(&self, ui: &mut Ui, bottom: f32, top: f32, mut add: impl FnMut(&mut Ui, Part)) {
let t = Tokens::get();
// Dialog buttons at top (#9860): the footer row moves under the header, above the options.
let at_top = DialogButtons::current(ui.ctx()) == DialogButtons::Top;
ui.set_max_height((bottom - ui.cursor().top()).max(0.0));
super::scope(ui, |ui| {
ui.spacing_mut().item_spacing.y = 0.0;
@@ -858,7 +860,11 @@ impl<'a> Panel<'a> {
let short = height < t.space_24 * 6.0;
let mut contents = |ui: &mut Ui| {
add(ui, Part::Header);
let body_height = (bottom - ui.cursor().top() - t.form_footer_height).max(0.0);
if at_top {
add(ui, Part::Footer);
}
let footer_height = if at_top { 0.0 } else { t.form_footer_height };
let body_height = (bottom - ui.cursor().top() - footer_height).max(0.0);
let mut body = |ui: &mut Ui| {
egui::Frame::NONE.inner_margin(egui::Margin::symmetric(t.space_10 as i8, t.space_4 as i8)).show(ui, |ui| add(ui, Part::Body));
};
@@ -878,7 +884,9 @@ impl<'a> Panel<'a> {
.inner;
scenario::publish_rect("sketch_palette:options", scroll.inner_rect);
}
add(ui, Part::Footer);
if !at_top {
add(ui, Part::Footer);
}
};
if short {
let scroll = egui::ScrollArea::vertical()
+2 -1
View File
@@ -124,7 +124,8 @@
wide as that column; the column comes back as it was when the dialog closes.
Interface › **Dialog buttons** › **Top** puts OK, Cancel and Apply in
the dialog's title row, right of the title, where they stay while sections open and close;
Cancel then also takes the place of the close button. Enter and Esc work as before.
Cancel then also takes the place of the close button. Enter and Esc work as before. The Sketch
panel's Finish Sketch, Look at and Slice move up under its title, above the options.
- **Timeline** (bottom). Every feature in order. Double-click to edit, drag the marker to roll
back, and drag features to reorder them. A sketch's icon, here and in the browser, takes the
colour of its state: the sketch colour while it is under constrained, the fully constrained
+1 -1
View File
@@ -433,7 +433,7 @@ One setting per line, sorted by name. A change that adds a setting adds its own
- `check_updates` (default true; [updates](book/src/guide/updates.md))
- `color_vision` (`off` (default), `protan`, `deutan`, `tritan`: colour vision modes, #778)
- `default_units`
- `dialog_buttons` (`bottom` (default), `top`: a feature dialog's OK, Cancel and Apply sit in its title row instead of under its inputs, #6708; the buttons keep their handles, and `dialog:close` is then Cancel's)
- `dialog_buttons` (`bottom` (default), `top`: a feature dialog's OK, Cancel and Apply sit in its title row instead of under its inputs, #6708; the buttons keep their handles, and `dialog:close` is then Cancel's; the Sketch panel's Finish Sketch row moves above its options, #9860)
- `dialog_place` (`edge` (default) or `left_column`: command dialogs open in the left column in place of the browser and the History, #6707)
- `extrude_auto_to_object` (default false: in the Extrude dialog, with a profile picked, a face, vertex or parallel plane picked off its plane switches the extent to To Object; it applies to Extrude dialogs opened afterwards)
- `frame_rate_details` (default false: with the frame rate, a frame-time graph of the frames drawn with the triangles over it, a frame-time histogram and what the GPU drew; clicking the readout switches it)
+2
View File
@@ -107,6 +107,8 @@ rules. Its compass is 110 pt; the 48 pt Shots strip clears the docks by 8 pt.
puts the actions in the header row through `HeaderActions` instead of a footer: the same
buttons, enabled states, keyboard and handles, each as wide as its bold label, with Cancel
standing in for the close button and the compute status in the title's place.
`palette` (the Sketch panel) follows the same preference: its footer row moves under the
header, above the options.
`body_rows` caps a manager's scrolling body independently of its position; short
viewports still keep the header and actions visible.
- `Window` composes the shared Panel frame with a 40 pt icon/title/close header,