Another project
0

Configure Feed

Select the types of activity you want to include in your feed.

feat(ui): shaper thru framectx tests

Lewis: May this revision serve well! <lu5a@proton.me>

author
Lewis
date (May 11, 2026, 9:33 AM +0300) commit c99beeed parent c30f7b10 change-id rvtvskoo
+240 -50
+2 -2
clippy.toml
··· 1 1 disallowed-methods = [ 2 - { path = "palette::rgb::Rgb::new", reason = "construct Color via theme tokens; raw palette colour bypasses the bone-ui::theme boundary" }, 3 - { path = "palette::Oklch::new", reason = "construct Color via theme tokens; raw palette colour bypasses the bone-ui::theme boundary" }, 2 + { path = "palette::rgb::Rgb::new", reason = "construct Color via theme tokens; raw palette color bypasses the bone-ui::theme boundary" }, 3 + { path = "palette::Oklch::new", reason = "construct Color via theme tokens; raw palette color bypasses the bone-ui::theme boundary" }, 4 4 ]
+1 -1
crates/bone-document/tests/folder_roundtrip.rs
··· 513 513 }; 514 514 f(&mut header); 515 515 let Ok(out) = to_string(&header) else { 516 - panic!("serialise header"); 516 + panic!("serialize header"); 517 517 }; 518 518 write_file(path, &out); 519 519 }
+1 -1
crates/bone-render/src/surface.rs
··· 13 13 #[error("wgpu device request failed: {0}")] 14 14 Device(#[from] wgpu::RequestDeviceError), 15 15 #[error( 16 - "surface exposes no srgb colour format; baseline requires one. available: {available:?}" 16 + "surface exposes no srgb color format; baseline requires one. available: {available:?}" 17 17 )] 18 18 NoSrgbFormat { available: Vec<wgpu::TextureFormat> }, 19 19 #[error("viewport dimension is zero")]
+44 -3
crates/bone-ui/src/frame.rs
··· 1 1 use std::sync::Arc; 2 2 3 + use bone_text::Shaper; 4 + 3 5 use crate::a11y::{AccessNode, AccessTreeBuilder}; 4 6 use crate::focus::FocusManager; 5 7 use crate::hit_test::{HitFrame, HitItem, HitState, Interaction, Sense, ZLayer}; ··· 75 77 pub hits: &'a mut HitFrame, 76 78 pub previous: &'a HitState, 77 79 pub a11y: &'a mut AccessTreeBuilder, 80 + pub shaper: &'a mut Shaper, 78 81 } 79 82 80 83 impl<'a> FrameCtx<'a> { ··· 92 95 hits: &'a mut HitFrame, 93 96 previous: &'a HitState, 94 97 a11y: &'a mut AccessTreeBuilder, 98 + shaper: &'a mut Shaper, 95 99 ) -> Self { 96 100 focus.begin_frame(); 97 101 focus.observe_input(input); ··· 105 109 hits, 106 110 previous, 107 111 a11y, 112 + shaper, 108 113 } 109 114 } 110 115 ··· 128 133 self.focus.focused() == Some(id) 129 134 } 130 135 136 + pub fn request_focus(&mut self, id: WidgetId) { 137 + self.focus.request_focus(id); 138 + } 139 + 131 140 pub fn interact(&mut self, declaration: InteractDeclaration) -> Interaction { 132 141 if !declaration.disabled { 133 142 self.focus.register_focusable(declaration.id); ··· 241 250 let mut hits = HitFrame::new(); 242 251 let prev = HitState::new(); 243 252 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 253 + let mut shaper = bone_text::Shaper::new(); 244 254 let mut a11y = AccessTreeBuilder::new(); 245 255 { 246 256 let mut frame = FrameCtx::new( ··· 252 262 &mut hits, 253 263 &prev, 254 264 &mut a11y, 265 + &mut shaper, 255 266 ); 256 267 let _ = frame.interact( 257 268 InteractDeclaration::new(id("button"), rect(), Sense::INTERACTIVE).focusable(true), ··· 279 290 let mut focus = FocusManager::new(); 280 291 let mut hits = HitFrame::new(); 281 292 let prev = HitState::new(); 293 + let mut shaper = bone_text::Shaper::new(); 282 294 let mut a11y = AccessTreeBuilder::new(); 283 295 let actions = { 284 296 let mut frame = FrameCtx::new( ··· 290 302 &mut hits, 291 303 &prev, 292 304 &mut a11y, 305 + &mut shaper, 293 306 ); 294 307 frame.dispatch_hotkeys(&global_scope()) 295 308 }; ··· 306 319 let mut focus = FocusManager::new(); 307 320 let mut hits = HitFrame::new(); 308 321 let prev = HitState::new(); 322 + let mut shaper = bone_text::Shaper::new(); 309 323 let mut a11y = AccessTreeBuilder::new(); 310 324 let actions = { 311 325 let mut frame = FrameCtx::new( ··· 317 331 &mut hits, 318 332 &prev, 319 333 &mut a11y, 334 + &mut shaper, 320 335 ); 321 336 frame.dispatch_hotkeys(&global_scope()) 322 337 }; ··· 338 353 ))); 339 354 press.buttons_pressed = PointerButtonMask::just(PointerButton::Primary); 340 355 356 + let mut shaper = bone_text::Shaper::new(); 341 357 let mut a11y = AccessTreeBuilder::new(); 342 358 { 343 359 let mut frame = FrameCtx::new( ··· 349 365 &mut hits, 350 366 &state, 351 367 &mut a11y, 368 + &mut shaper, 352 369 ); 353 370 let _ = frame.interact( 354 371 InteractDeclaration::new(id("btn"), rect(), Sense::INTERACTIVE).focusable(true), ··· 376 393 &mut hits, 377 394 &state, 378 395 &mut a11y, 396 + &mut shaper, 379 397 ); 380 398 let _ = frame.interact( 381 399 InteractDeclaration::new(id("btn"), rect(), Sense::INTERACTIVE).focusable(true), ··· 396 414 &mut hits, 397 415 &state, 398 416 &mut a11y, 417 + &mut shaper, 399 418 ); 400 419 let _ = frame.interact( 401 420 InteractDeclaration::new(id("btn"), rect(), Sense::INTERACTIVE).focusable(true), ··· 415 434 let mut hits = HitFrame::new(); 416 435 let prev = HitState::new(); 417 436 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 437 + let mut shaper = bone_text::Shaper::new(); 418 438 let mut a11y = AccessTreeBuilder::new(); 419 439 let mut frame = FrameCtx::new( 420 440 Arc::new(Theme::light()), ··· 425 445 &mut hits, 426 446 &prev, 427 447 &mut a11y, 448 + &mut shaper, 428 449 ); 429 450 assert_eq!(frame.theme().mode, ThemeMode::Light); 430 451 let inner_mode = frame.theme_scope(|_| Theme::dark(), |frame| frame.theme().mode); ··· 439 460 let mut hits = HitFrame::new(); 440 461 let prev = HitState::new(); 441 462 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 463 + let mut shaper = bone_text::Shaper::new(); 442 464 let mut a11y = AccessTreeBuilder::new(); 443 465 let mut frame = FrameCtx::new( 444 466 Arc::new(Theme::light()), ··· 449 471 &mut hits, 450 472 &prev, 451 473 &mut a11y, 474 + &mut shaper, 452 475 ); 453 476 let modes = frame.theme_scope( 454 477 |_| Theme::dark(), ··· 470 493 let mut hits = HitFrame::new(); 471 494 let prev = HitState::new(); 472 495 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 496 + let mut shaper = bone_text::Shaper::new(); 473 497 let mut a11y = AccessTreeBuilder::new(); 474 498 let mut frame = FrameCtx::new( 475 499 Arc::new(Theme::light()), ··· 480 504 &mut hits, 481 505 &prev, 482 506 &mut a11y, 507 + &mut shaper, 483 508 ); 484 509 let outer_accent = frame.theme().colors.accent_solid(); 485 510 let outer_ring = frame.theme().colors.focus_ring(); ··· 512 537 focus: &mut FocusManager, 513 538 hits: &mut HitFrame, 514 539 input: &mut InputSnapshot, 515 - a11y: &mut AccessTreeBuilder| { 516 - let frame = FrameCtx::new(theme, input, focus, &hotkeys, strings, hits, &prev, a11y); 540 + a11y: &mut AccessTreeBuilder, 541 + shaper: &mut bone_text::Shaper| { 542 + let frame = FrameCtx::new( 543 + theme, input, focus, &hotkeys, strings, hits, &prev, a11y, shaper, 544 + ); 517 545 ( 518 546 frame.theme().mode, 519 547 frame.theme().colors.text_primary(), ··· 523 551 524 552 let mut hits_a = HitFrame::new(); 525 553 let mut input_a = InputSnapshot::idle(FrameInstant::ZERO); 554 + let mut shaper_a = bone_text::Shaper::new(); 526 555 let mut a11y_a = AccessTreeBuilder::new(); 527 556 let (mode_a, text_a, surface_a) = read_tokens( 528 557 Arc::new(Theme::light()), ··· 530 559 &mut hits_a, 531 560 &mut input_a, 532 561 &mut a11y_a, 562 + &mut shaper_a, 533 563 ); 534 564 535 565 let mut hits_b = HitFrame::new(); 536 566 let mut input_b = InputSnapshot::idle(FrameInstant::ZERO); 567 + let mut shaper_b = bone_text::Shaper::new(); 537 568 let mut a11y_b = AccessTreeBuilder::new(); 538 569 let (mode_b, text_b, surface_b) = read_tokens( 539 570 Arc::new(Theme::dark()), ··· 541 572 &mut hits_b, 542 573 &mut input_b, 543 574 &mut a11y_b, 575 + &mut shaper_b, 544 576 ); 545 577 546 578 assert_eq!(mode_a, ThemeMode::Light); ··· 560 592 let prev = HitState::new(); 561 593 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 562 594 let strings = StringTable::for_locale(Locale::ArXb); 595 + let mut shaper = bone_text::Shaper::new(); 563 596 let mut a11y = AccessTreeBuilder::new(); 564 597 let frame = FrameCtx::new( 565 - theme, &mut input, &mut focus, &hotkeys, &strings, &mut hits, &prev, &mut a11y, 598 + theme, 599 + &mut input, 600 + &mut focus, 601 + &hotkeys, 602 + &strings, 603 + &mut hits, 604 + &prev, 605 + &mut a11y, 606 + &mut shaper, 566 607 ); 567 608 assert_eq!(frame.locale(), Locale::ArXb); 568 609 assert_eq!(frame.direction(), LayoutDirection::Rtl);
+11 -1
crates/bone-ui/src/gallery.rs
··· 369 369 let prev = prev_hit_state(); 370 370 let mut input = InputSnapshot::idle(GALLERY_FRAME_NOW); 371 371 let mut paint = Vec::new(); 372 + let mut shaper = bone_text::Shaper::new(); 372 373 373 374 let mut ctx = FrameCtx::new( 374 - theme, &mut input, focus, &table, strings, &mut hits, &prev, a11y, 375 + theme, 376 + &mut input, 377 + focus, 378 + &table, 379 + strings, 380 + &mut hits, 381 + &prev, 382 + a11y, 383 + &mut shaper, 375 384 ); 376 385 render_basics(&mut ctx, state, &mut paint); 377 386 render_inputs(&mut ctx, state, &mut paint); ··· 726 735 label: GALLERY_LABEL, 727 736 items: ribbon_toolbar_items.to_vec(), 728 737 icon_size: RibbonIconSize::Large, 738 + min_width: LayoutPx::new(80.0), 729 739 width: LayoutPx::new(140.0), 730 740 }], 731 741 )];
+13 -13
crates/bone-ui/src/layout/tests.rs
··· 93 93 } 94 94 95 95 #[test] 96 - fn row_justify_center_centres_content() { 96 + fn row_justify_center_centers_content() { 97 97 let layout = Layout::Row { 98 98 gap: sp(0.0), 99 99 justify: MainAxisJustify::Center, ··· 106 106 let right = 100.0 - only.rect.max_x().value(); 107 107 assert!( 108 108 (left - right).abs() < 1.0, 109 - "centred: left={left} right={right}" 109 + "centered: left={left} right={right}" 110 110 ); 111 111 } 112 112 ··· 969 969 ScrollOffset::new(LayoutPx::new(4.0), LayoutPx::new(8.0)), 970 970 ); 971 971 original.set_split(wid(2), SplitFraction::clamped(0.42)); 972 - let Ok(serialised) = ron::ser::to_string(&original) else { 973 - panic!("retained layout serialise failed"); 972 + let Ok(serialized) = ron::ser::to_string(&original) else { 973 + panic!("retained layout serialize failed"); 974 974 }; 975 - let Ok(parsed) = ron::de::from_str::<RetainedLayout>(&serialised) else { 976 - panic!("retained layout deserialise failed"); 975 + let Ok(parsed) = ron::de::from_str::<RetainedLayout>(&serialized) else { 976 + panic!("retained layout deserialize failed"); 977 977 }; 978 978 assert_eq!(original, parsed); 979 979 } 980 980 981 981 #[test] 982 - fn retained_layout_serialises_deterministically_regardless_of_insertion_order() { 982 + fn retained_layout_serializes_deterministically_regardless_of_insertion_order() { 983 983 let entries = (1u8..=10) 984 984 .map(|n| { 985 985 ( ··· 998 998 .rev() 999 999 .fold((), |(), (id, off)| backward.set_scroll(*id, *off)); 1000 1000 let Ok(forward_ron) = ron::ser::to_string(&forward) else { 1001 - panic!("forward serialise failed"); 1001 + panic!("forward serialize failed"); 1002 1002 }; 1003 1003 let Ok(reverse_ron) = ron::ser::to_string(&backward) else { 1004 - panic!("backward serialise failed"); 1004 + panic!("backward serialize failed"); 1005 1005 }; 1006 1006 assert_eq!(forward_ron, reverse_ron); 1007 1007 } ··· 1156 1156 size: LayoutSize::new(LayoutPx::new(640.0), LayoutPx::new(480.0)), 1157 1157 }], 1158 1158 }; 1159 - let Ok(serialised) = ron::ser::to_string(&original) else { 1160 - panic!("dock state serialise failed"); 1159 + let Ok(serialized) = ron::ser::to_string(&original) else { 1160 + panic!("dock state serialize failed"); 1161 1161 }; 1162 - let Ok(parsed) = ron::de::from_str::<DockState>(&serialised) else { 1163 - panic!("dock state deserialise failed"); 1162 + let Ok(parsed) = ron::de::from_str::<DockState>(&serialized) else { 1163 + panic!("dock state deserialize failed"); 1164 1164 }; 1165 1165 assert_eq!(parsed, original); 1166 1166 assert_eq!(parsed.floating.len(), 1);
+13 -13
crates/bone-ui/src/strings.rs
··· 30 30 31 31 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize)] 32 32 pub enum Locale { 33 - EnGb, 33 + EnUs, 34 34 ArXb, 35 35 } 36 36 37 37 impl Locale { 38 - pub const DEFAULT: Self = Self::EnGb; 38 + pub const DEFAULT: Self = Self::EnUs; 39 39 40 40 #[must_use] 41 41 pub const fn as_bcp47(self) -> &'static str { 42 42 match self { 43 - Self::EnGb => "en-GB", 43 + Self::EnUs => "en-US", 44 44 Self::ArXb => "ar-XB", 45 45 } 46 46 } ··· 48 48 #[must_use] 49 49 pub const fn direction(self) -> LayoutDirection { 50 50 match self { 51 - Self::EnGb => LayoutDirection::Ltr, 51 + Self::EnUs => LayoutDirection::Ltr, 52 52 Self::ArXb => LayoutDirection::Rtl, 53 53 } 54 54 } ··· 56 56 #[must_use] 57 57 pub const fn plural_category(self, n: u64) -> PluralCategory { 58 58 match self { 59 - Self::EnGb => english_plural(n), 59 + Self::EnUs => english_plural(n), 60 60 Self::ArXb => arabic_plural(n), 61 61 } 62 62 } ··· 222 222 #[must_use] 223 223 pub fn format_count(&self, n: u64) -> String { 224 224 match self.locale { 225 - Locale::EnGb => group_thousands(n, ','), 225 + Locale::EnUs => group_thousands(n, ','), 226 226 Locale::ArXb => group_thousands(n, '\u{066C}') 227 227 .chars() 228 228 .map(map_arabic_indic) ··· 341 341 } 342 342 343 343 #[test] 344 - fn default_locale_is_en_gb_ltr() { 344 + fn default_locale_is_en_us_ltr() { 345 345 let table = StringTable::new(); 346 - assert_eq!(table.locale(), Locale::EnGb); 346 + assert_eq!(table.locale(), Locale::EnUs); 347 347 assert_eq!(table.direction(), LayoutDirection::Ltr); 348 348 } 349 349 ··· 356 356 357 357 #[test] 358 358 fn english_plural_picks_one_or_other() { 359 - assert_eq!(Locale::EnGb.plural_category(0), PluralCategory::Other); 360 - assert_eq!(Locale::EnGb.plural_category(1), PluralCategory::One); 361 - assert_eq!(Locale::EnGb.plural_category(2), PluralCategory::Other); 362 - assert_eq!(Locale::EnGb.plural_category(42), PluralCategory::Other); 359 + assert_eq!(Locale::EnUs.plural_category(0), PluralCategory::Other); 360 + assert_eq!(Locale::EnUs.plural_category(1), PluralCategory::One); 361 + assert_eq!(Locale::EnUs.plural_category(2), PluralCategory::Other); 362 + assert_eq!(Locale::EnUs.plural_category(42), PluralCategory::Other); 363 363 } 364 364 365 365 #[test] ··· 419 419 420 420 #[test] 421 421 fn english_number_formatting_groups_with_comma() { 422 - let table = StringTable::for_locale(Locale::EnGb); 422 + let table = StringTable::for_locale(Locale::EnUs); 423 423 assert_eq!(table.format_count(0), "0"); 424 424 assert_eq!(table.format_count(42), "42"); 425 425 assert_eq!(table.format_count(1234), "1,234");
+2 -2
crates/bone-ui/src/text/raster/sdf.rs
··· 654 654 } 655 655 656 656 #[test] 657 - fn donut_glyph_centre_stays_outside() { 657 + fn donut_glyph_center_stays_outside() { 658 658 let mut atlas = SdfAtlas::new(small_params()); 659 659 let key = GlyphAtlasKey::new(FontFace::Sans, glyph_for(FontFace::Sans, 'O')); 660 660 let entry = ensure_ok(&mut atlas, key); ··· 664 664 let value = atlas.pixels()[(cy as usize) * (extent as usize) + cx as usize]; 665 665 assert!( 666 666 !SdfPixel(value).is_inside(), 667 - "centre of O lies inside the donut hole, must be outside fill, raw={value}", 667 + "center of O lies inside the donut hole, must be outside fill, raw={value}", 668 668 ); 669 669 } 670 670
+14
crates/bone-ui/src/widgets/button.rs
··· 318 318 activations: &mut Vec<bool>| { 319 319 hits.clear(); 320 320 { 321 + let mut shaper = bone_text::Shaper::new(); 321 322 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 322 323 let mut ctx = FrameCtx::new( 323 324 theme.clone(), ··· 328 329 hits, 329 330 state, 330 331 &mut a11y, 332 + &mut shaper, 331 333 ); 332 334 let response = show_button(&mut ctx, button); 333 335 activations.push(response.activated); ··· 418 420 )]); 419 421 let button = Button::new(id("ok"), rect(), LABEL, ButtonVariant::Primary); 420 422 let response = { 423 + let mut shaper = bone_text::Shaper::new(); 421 424 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 422 425 let mut ctx = FrameCtx::new( 423 426 theme, ··· 428 431 &mut hits, 429 432 &state, 430 433 &mut a11y, 434 + &mut shaper, 431 435 ); 432 436 show_button(&mut ctx, button) 433 437 }; ··· 447 451 )]); 448 452 let button = Button::new(id("ok"), rect(), LABEL, ButtonVariant::Primary); 449 453 let response = { 454 + let mut shaper = bone_text::Shaper::new(); 450 455 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 451 456 let mut ctx = FrameCtx::new( 452 457 theme, ··· 457 462 &mut hits, 458 463 &state, 459 464 &mut a11y, 465 + &mut shaper, 460 466 ); 461 467 show_button(&mut ctx, button) 462 468 }; ··· 475 481 input.keys_pressed.push(event); 476 482 let button = Button::new(id("ok"), rect(), LABEL, ButtonVariant::Primary); 477 483 let response = { 484 + let mut shaper = bone_text::Shaper::new(); 478 485 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 479 486 let mut ctx = FrameCtx::new( 480 487 theme, ··· 485 492 &mut hits, 486 493 &state, 487 494 &mut a11y, 495 + &mut shaper, 488 496 ); 489 497 show_button(&mut ctx, button) 490 498 }; ··· 511 519 let (mut input, mut focus) = focused_input_with(vec![other]); 512 520 let button = Button::new(id("ok"), rect(), LABEL, ButtonVariant::Primary); 513 521 let _ = { 522 + let mut shaper = bone_text::Shaper::new(); 514 523 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 515 524 let mut ctx = FrameCtx::new( 516 525 theme, ··· 521 530 &mut hits, 522 531 &state, 523 532 &mut a11y, 533 + &mut shaper, 524 534 ); 525 535 show_button(&mut ctx, button) 526 536 }; ··· 565 575 let (mut input, mut focus) = focused_input_with(vec![tab]); 566 576 let button = Button::new(id("ok"), rect(), LABEL, ButtonVariant::Primary); 567 577 let response = { 578 + let mut shaper = bone_text::Shaper::new(); 568 579 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 569 580 let mut ctx = FrameCtx::new( 570 581 theme, ··· 575 586 &mut hits, 576 587 &state, 577 588 &mut a11y, 589 + &mut shaper, 578 590 ); 579 591 show_button(&mut ctx, button) 580 592 }; ··· 600 612 focus.end_frame(); 601 613 let button = Button::new(id("ok"), rect(), LABEL, ButtonVariant::Primary); 602 614 let response = { 615 + let mut shaper = bone_text::Shaper::new(); 603 616 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 604 617 let mut ctx = FrameCtx::new( 605 618 theme, ··· 610 623 &mut hits, 611 624 &state, 612 625 &mut a11y, 626 + &mut shaper, 613 627 ); 614 628 show_button(&mut ctx, button) 615 629 };
+8
crates/bone-ui/src/widgets/checkbox.rs
··· 199 199 )); 200 200 let checkbox = Checkbox::new(id_widget(), rect(), LABEL, CheckboxState::Unchecked); 201 201 let response = { 202 + let mut shaper = bone_text::Shaper::new(); 202 203 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 203 204 let mut ctx = FrameCtx::new( 204 205 theme, ··· 209 210 &mut hits, 210 211 &state, 211 212 &mut a11y, 213 + &mut shaper, 212 214 ); 213 215 show_checkbox(&mut ctx, checkbox) 214 216 }; ··· 230 232 hits.clear(); 231 233 let checkbox = Checkbox::new(id_widget(), rect(), LABEL, current); 232 234 let response = { 235 + let mut shaper = bone_text::Shaper::new(); 233 236 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 234 237 let mut ctx = FrameCtx::new( 235 238 theme.clone(), ··· 240 243 &mut hits, 241 244 &state, 242 245 &mut a11y, 246 + &mut shaper, 243 247 ); 244 248 show_checkbox(&mut ctx, checkbox) 245 249 }; ··· 259 263 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 260 264 let checkbox = Checkbox::new(id_widget(), rect(), LABEL, CheckboxState::Indeterminate); 261 265 let response = { 266 + let mut shaper = bone_text::Shaper::new(); 262 267 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 263 268 let mut ctx = FrameCtx::new( 264 269 theme, ··· 269 274 &mut hits, 270 275 &state, 271 276 &mut a11y, 277 + &mut shaper, 272 278 ); 273 279 show_checkbox(&mut ctx, checkbox) 274 280 }; ··· 300 306 let checkbox = 301 307 Checkbox::new(id_widget(), rect(), LABEL, CheckboxState::Unchecked).disabled(true); 302 308 let response = { 309 + let mut shaper = bone_text::Shaper::new(); 303 310 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 304 311 let mut ctx = FrameCtx::new( 305 312 theme, ··· 310 317 &mut hits, 311 318 &state, 312 319 &mut a11y, 320 + &mut shaper, 313 321 ); 314 322 show_checkbox(&mut ctx, checkbox) 315 323 };
+10
crates/bone-ui/src/widgets/dialog.rs
··· 461 461 let table = HotkeyTable::new(); 462 462 let mut hits = HitFrame::new(); 463 463 let response = { 464 + let mut shaper = bone_text::Shaper::new(); 464 465 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 465 466 let mut ctx = FrameCtx::new( 466 467 theme, ··· 471 472 &mut hits, 472 473 prev, 473 474 &mut a11y, 475 + &mut shaper, 474 476 ); 475 477 let (response, ()) = show_dialog( 476 478 &mut ctx, ··· 502 504 ModifierMask::NONE, 503 505 )); 504 506 let response = { 507 + let mut shaper = bone_text::Shaper::new(); 505 508 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 506 509 let mut ctx = FrameCtx::new( 507 510 theme, ··· 512 515 &mut hits, 513 516 &prev, 514 517 &mut a11y, 518 + &mut shaper, 515 519 ); 516 520 let (response, ()) = show_modal( 517 521 &mut ctx, ··· 548 552 let prev = HitState::new(); 549 553 let mut snap = InputSnapshot::idle(FrameInstant::ZERO); 550 554 { 555 + let mut shaper = bone_text::Shaper::new(); 551 556 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 552 557 let mut ctx = FrameCtx::new( 553 558 theme, ··· 558 563 &mut hits, 559 564 &prev, 560 565 &mut a11y, 566 + &mut shaper, 561 567 ); 562 568 let (_response, ()) = show_modal( 563 569 &mut ctx, ··· 611 617 let table = HotkeyTable::new(); 612 618 let mut hits = HitFrame::new(); 613 619 let response = { 620 + let mut shaper = bone_text::Shaper::new(); 614 621 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 615 622 let mut ctx = FrameCtx::new( 616 623 theme, ··· 621 628 &mut hits, 622 629 prev, 623 630 &mut a11y, 631 + &mut shaper, 624 632 ); 625 633 show_confirmation( 626 634 &mut ctx, ··· 700 708 .for_each(|mut snap| { 701 709 let mut hits = HitFrame::new(); 702 710 let response = { 711 + let mut shaper = bone_text::Shaper::new(); 703 712 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 704 713 let mut ctx = FrameCtx::new( 705 714 theme.clone(), ··· 710 719 &mut hits, 711 720 &prev, 712 721 &mut a11y, 722 + &mut shaper, 713 723 ); 714 724 show_confirmation( 715 725 &mut ctx,
+4
crates/bone-ui/src/widgets/dimensioned_input.rs
··· 157 157 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 158 158 let mut clipboard = MemoryClipboard::default(); 159 159 let widget = DimensionedInput::<Length>::new(id_widget(), rect(), PLACEHOLDER, &mut state); 160 + let mut shaper = bone_text::Shaper::new(); 160 161 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 161 162 let mut ctx = FrameCtx::new( 162 163 theme, ··· 167 168 &mut hits, 168 169 &prev, 169 170 &mut a11y, 171 + &mut shaper, 170 172 ); 171 173 show_parsed_input(&mut ctx, widget, &mut clipboard) 172 174 } ··· 184 186 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 185 187 let mut clipboard = MemoryClipboard::default(); 186 188 let widget = DimensionedInput::<Angle>::new(id_widget(), rect(), PLACEHOLDER, &mut state); 189 + let mut shaper = bone_text::Shaper::new(); 187 190 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 188 191 let mut ctx = FrameCtx::new( 189 192 theme, ··· 194 197 &mut hits, 195 198 &prev, 196 199 &mut a11y, 200 + &mut shaper, 197 201 ); 198 202 show_parsed_input(&mut ctx, widget, &mut clipboard) 199 203 }
+16 -1
crates/bone-ui/src/widgets/dropdown.rs
··· 676 676 state, 677 677 ); 678 678 let response = { 679 + let mut shaper = bone_text::Shaper::new(); 679 680 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 680 681 let mut ctx = FrameCtx::new( 681 682 theme, ··· 686 687 &mut hits, 687 688 prev, 688 689 &mut a11y, 690 + &mut shaper, 689 691 ); 690 692 show_dropdown(&mut ctx, widget) 691 693 }; ··· 925 927 PLACEHOLDER, 926 928 state, 927 929 ); 930 + let mut shaper = bone_text::Shaper::new(); 928 931 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 929 932 let mut ctx = FrameCtx::new( 930 - theme, snap, focus, &table, strings, &mut hits, prev, &mut a11y, 933 + theme, 934 + snap, 935 + focus, 936 + &table, 937 + strings, 938 + &mut hits, 939 + prev, 940 + &mut a11y, 941 + &mut shaper, 931 942 ); 932 943 show_dropdown(&mut ctx, widget) 933 944 } ··· 1173 1184 ) 1174 1185 .disabled(true); 1175 1186 let _ = { 1187 + let mut shaper = bone_text::Shaper::new(); 1176 1188 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 1177 1189 let mut ctx = FrameCtx::new( 1178 1190 theme.clone(), ··· 1183 1195 &mut hits, 1184 1196 &prev, 1185 1197 &mut a11y, 1198 + &mut shaper, 1186 1199 ); 1187 1200 show_dropdown(&mut ctx, widget) 1188 1201 }; ··· 1214 1227 ); 1215 1228 let sibling_id = WidgetId::ROOT.child(WidgetKey::new("sibling_under_popup")); 1216 1229 { 1230 + let mut shaper = bone_text::Shaper::new(); 1217 1231 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 1218 1232 let mut ctx = FrameCtx::new( 1219 1233 theme, ··· 1224 1238 &mut hits, 1225 1239 &prev, 1226 1240 &mut a11y, 1241 + &mut shaper, 1227 1242 ); 1228 1243 let _ = show_dropdown(&mut ctx, widget); 1229 1244 let _ = ctx.interact(InteractDeclaration::new(
+4
crates/bone-ui/src/widgets/file_picker.rs
··· 285 285 ModifierMask::NONE, 286 286 )); 287 287 let response = { 288 + let mut shaper = bone_text::Shaper::new(); 288 289 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 289 290 let mut ctx = FrameCtx::new( 290 291 theme, ··· 295 296 &mut hits, 296 297 &prev, 297 298 &mut a11y, 299 + &mut shaper, 298 300 ); 299 301 show_file_picker( 300 302 &mut ctx, ··· 323 325 let prev = HitState::new(); 324 326 let mut snap = InputSnapshot::idle(FrameInstant::ZERO); 325 327 let response = { 328 + let mut shaper = bone_text::Shaper::new(); 326 329 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 327 330 let mut ctx = FrameCtx::new( 328 331 theme, ··· 333 336 &mut hits, 334 337 &prev, 335 338 &mut a11y, 339 + &mut shaper, 336 340 ); 337 341 show_file_picker( 338 342 &mut ctx,
+4
crates/bone-ui/src/widgets/hotkey_capture.rs
··· 232 232 let mut hits = HitFrame::new(); 233 233 let prev = HitState::new(); 234 234 let widget = HotkeyCapture::new(id_widget(), rect(), PLACEHOLDER, state); 235 + let mut shaper = bone_text::Shaper::new(); 235 236 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 236 237 let mut ctx = FrameCtx::new( 237 238 theme, ··· 242 243 &mut hits, 243 244 &prev, 244 245 &mut a11y, 246 + &mut shaper, 245 247 ); 246 248 show_hotkey_capture(&mut ctx, widget) 247 249 } ··· 470 472 let mut hits = HitFrame::new(); 471 473 let widget = HotkeyCapture::new(id_widget(), rect(), PLACEHOLDER, &mut state); 472 474 { 475 + let mut shaper = bone_text::Shaper::new(); 473 476 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 474 477 let mut ctx = FrameCtx::new( 475 478 theme.clone(), ··· 480 483 &mut hits, 481 484 &prev, 482 485 &mut a11y, 486 + &mut shaper, 483 487 ); 484 488 let _ = show_hotkey_capture(&mut ctx, widget); 485 489 }
+6
crates/bone-ui/src/widgets/menu.rs
··· 901 901 let table = HotkeyTable::new(); 902 902 let mut hits = HitFrame::new(); 903 903 let response = { 904 + let mut shaper = bone_text::Shaper::new(); 904 905 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 905 906 let mut ctx = FrameCtx::new( 906 907 theme, ··· 911 912 &mut hits, 912 913 prev, 913 914 &mut a11y, 915 + &mut shaper, 914 916 ); 915 917 show_menu( 916 918 &mut ctx, ··· 1083 1085 .for_each(|mut snap| { 1084 1086 let mut hits = HitFrame::new(); 1085 1087 { 1088 + let mut shaper = bone_text::Shaper::new(); 1086 1089 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 1087 1090 let mut ctx = FrameCtx::new( 1088 1091 theme.clone(), ··· 1093 1096 &mut hits, 1094 1097 &prev, 1095 1098 &mut a11y, 1099 + &mut shaper, 1096 1100 ); 1097 1101 let _ = show_menu_bar( 1098 1102 &mut ctx, ··· 1137 1141 .into_iter() 1138 1142 .for_each(|mut snap| { 1139 1143 let mut hits = HitFrame::new(); 1144 + let mut shaper = bone_text::Shaper::new(); 1140 1145 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 1141 1146 let mut ctx = FrameCtx::new( 1142 1147 theme.clone(), ··· 1147 1152 &mut hits, 1148 1153 &prev, 1149 1154 &mut a11y, 1155 + &mut shaper, 1150 1156 ); 1151 1157 let _ = show_menu_bar( 1152 1158 &mut ctx,
+10
crates/bone-ui/src/widgets/numeric_input.rs
··· 94 94 input.text_committed = String::new(); 95 95 let mut clipboard = MemoryClipboard::default(); 96 96 let widget = NumericInput::<T>::new(id_widget(), rect(), PLACEHOLDER, state); 97 + let mut shaper = bone_text::Shaper::new(); 97 98 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 98 99 let mut ctx = FrameCtx::new( 99 100 theme, ··· 104 105 &mut hits, 105 106 &prev, 106 107 &mut a11y, 108 + &mut shaper, 107 109 ); 108 110 show_parsed_input(&mut ctx, widget, &mut clipboard) 109 111 } ··· 215 217 let mut clipboard = MemoryClipboard::default(); 216 218 let widget = NumericInput::<i32>::new(id_widget(), rect(), PLACEHOLDER, &mut state); 217 219 let response = { 220 + let mut shaper = bone_text::Shaper::new(); 218 221 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 219 222 let mut ctx = FrameCtx::new( 220 223 theme, ··· 225 228 &mut hits, 226 229 &prev, 227 230 &mut a11y, 231 + &mut shaper, 228 232 ); 229 233 show_parsed_input(&mut ctx, widget, &mut clipboard) 230 234 }; ··· 244 248 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 245 249 let mut clipboard = MemoryClipboard::default(); 246 250 let widget = NumericInput::<i32>::new(id_widget(), rect(), PLACEHOLDER, &mut state); 251 + let mut shaper = bone_text::Shaper::new(); 247 252 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 248 253 let mut ctx = FrameCtx::new( 249 254 theme, ··· 254 259 &mut hits, 255 260 &prev, 256 261 &mut a11y, 262 + &mut shaper, 257 263 ); 258 264 let response = show_parsed_input(&mut ctx, widget, &mut clipboard); 259 265 assert_eq!(response.committed, Some(42)); ··· 280 286 let prev = HitState::new(); 281 287 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 282 288 let widget = NumericInput::<i32>::new(id_widget(), rect(), PLACEHOLDER, &mut state); 289 + let mut shaper = bone_text::Shaper::new(); 283 290 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 284 291 let mut ctx = FrameCtx::new( 285 292 theme.clone(), ··· 290 297 &mut hits, 291 298 &prev, 292 299 &mut a11y, 300 + &mut shaper, 293 301 ); 294 302 let response = show_parsed_input(&mut ctx, widget, &mut clipboard); 295 303 assert!( ··· 303 311 let prev = HitState::new(); 304 312 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 305 313 let widget = NumericInput::<i32>::new(id_widget(), rect(), PLACEHOLDER, &mut state); 314 + let mut shaper = bone_text::Shaper::new(); 306 315 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 307 316 let mut ctx = FrameCtx::new( 308 317 theme, ··· 313 322 &mut hits, 314 323 &prev, 315 324 &mut a11y, 325 + &mut shaper, 316 326 ); 317 327 let response = show_parsed_input(&mut ctx, widget, &mut clipboard); 318 328 assert_eq!(
+2
crates/bone-ui/src/widgets/panel.rs
··· 292 292 let table = HotkeyTable::new(); 293 293 let mut hits = HitFrame::new(); 294 294 let response = { 295 + let mut shaper = bone_text::Shaper::new(); 295 296 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 296 297 let mut ctx = FrameCtx::new( 297 298 theme, ··· 302 303 &mut hits, 303 304 prev, 304 305 &mut a11y, 306 + &mut shaper, 305 307 ); 306 308 let mut p = Panel::new(panel_id(), panel_rect(), state).variant(PanelVariant::Card); 307 309 if let Some(t) = bar {
+11 -1
crates/bone-ui/src/widgets/property_grid.rs
··· 224 224 } 225 225 } 226 226 227 - #[derive(Clone, Debug, PartialEq, Eq)] 227 + #[derive(Clone, Debug, PartialEq)] 228 228 pub struct TextEditor { 229 229 pub value: String, 230 230 pub buffer: TextInputState, ··· 507 507 .for_each(|mut snap| { 508 508 let mut hits = HitFrame::new(); 509 509 let response = { 510 + let mut shaper = bone_text::Shaper::new(); 510 511 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 511 512 let mut ctx = FrameCtx::new( 512 513 theme.clone(), ··· 517 518 &mut hits, 518 519 &prev, 519 520 &mut a11y, 521 + &mut shaper, 520 522 ); 521 523 let mut rows = [PropertyRow { 522 524 id: row_id, ··· 557 559 let table = HotkeyTable::new(); 558 560 let mut hits = HitFrame::new(); 559 561 { 562 + let mut shaper = bone_text::Shaper::new(); 560 563 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 561 564 let mut ctx = FrameCtx::new( 562 565 theme.clone(), ··· 567 570 &mut hits, 568 571 &prev, 569 572 &mut a11y, 573 + &mut shaper, 570 574 ); 571 575 let mut rows = [PropertyRow { 572 576 id: row_id, ··· 584 588 let mut snap = InputSnapshot::idle(FrameInstant::ZERO); 585 589 let mut hits = HitFrame::new(); 586 590 { 591 + let mut shaper = bone_text::Shaper::new(); 587 592 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 588 593 let mut ctx = FrameCtx::new( 589 594 theme, ··· 594 599 &mut hits, 595 600 &prev, 596 601 &mut a11y, 602 + &mut shaper, 597 603 ); 598 604 let mut rows = [PropertyRow { 599 605 id: row_id, ··· 628 634 bool_b: &mut BoolEditor, 629 635 mut snap: InputSnapshot| { 630 636 let mut hits = HitFrame::new(); 637 + let mut shaper = bone_text::Shaper::new(); 631 638 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 632 639 let mut ctx = FrameCtx::new( 633 640 theme.clone(), ··· 638 645 &mut hits, 639 646 &prev, 640 647 &mut a11y, 648 + &mut shaper, 641 649 ); 642 650 let mut rows = [ 643 651 PropertyRow { ··· 705 713 let table = HotkeyTable::new(); 706 714 let mut hits = HitFrame::new(); 707 715 let response = { 716 + let mut shaper = bone_text::Shaper::new(); 708 717 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 709 718 let mut ctx = FrameCtx::new( 710 719 theme, ··· 715 724 &mut hits, 716 725 &prev, 717 726 &mut a11y, 727 + &mut shaper, 718 728 ); 719 729 let mut rows = [ 720 730 PropertyRow {
+12
crates/bone-ui/src/widgets/radio_group.rs
··· 305 305 hits.clear(); 306 306 let group = RadioGroup::new(three_options(), selected); 307 307 let response = { 308 + let mut shaper = bone_text::Shaper::new(); 308 309 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 309 310 let mut ctx = FrameCtx::new( 310 311 theme.clone(), ··· 315 316 &mut hits, 316 317 &state, 317 318 &mut a11y, 319 + &mut shaper, 318 320 ); 319 321 show_radio_group(&mut ctx, group) 320 322 }; ··· 349 351 input.keys_pressed = events; 350 352 let group = RadioGroup::new(options, selected).orientation(orientation); 351 353 let response = { 354 + let mut shaper = bone_text::Shaper::new(); 352 355 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 353 356 let mut ctx = FrameCtx::new( 354 357 theme, ··· 359 362 &mut hits, 360 363 &prev, 361 364 &mut a11y, 365 + &mut shaper, 362 366 ); 363 367 show_radio_group(&mut ctx, group) 364 368 }; ··· 522 526 let first_id = two[0].id; 523 527 let group = RadioGroup::new(two, Pick::C); 524 528 { 529 + let mut shaper = bone_text::Shaper::new(); 525 530 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 526 531 let mut ctx = FrameCtx::new( 527 532 theme, ··· 532 537 &mut hits, 533 538 &state, 534 539 &mut a11y, 540 + &mut shaper, 535 541 ); 536 542 let _ = show_radio_group(&mut ctx, group); 537 543 } ··· 553 559 let options = three_options(); 554 560 let group = RadioGroup::new(options.clone(), Pick::B); 555 561 { 562 + let mut shaper = bone_text::Shaper::new(); 556 563 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 557 564 let mut ctx = FrameCtx::new( 558 565 theme, ··· 563 570 &mut hits, 564 571 &state, 565 572 &mut a11y, 573 + &mut shaper, 566 574 ); 567 575 let _ = show_radio_group(&mut ctx, group); 568 576 } ··· 587 595 input.keys_pressed = vec![arrow, space]; 588 596 let group = RadioGroup::new(three_options(), Pick::A); 589 597 { 598 + let mut shaper = bone_text::Shaper::new(); 590 599 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 591 600 let mut ctx = FrameCtx::new( 592 601 theme, ··· 597 606 &mut hits, 598 607 &state, 599 608 &mut a11y, 609 + &mut shaper, 600 610 ); 601 611 let _ = show_radio_group(&mut ctx, group); 602 612 } ··· 621 631 hits.clear(); 622 632 let group = RadioGroup::new(three_options(), selected).disabled(true); 623 633 let response = { 634 + let mut shaper = bone_text::Shaper::new(); 624 635 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 625 636 let mut ctx = FrameCtx::new( 626 637 theme.clone(), ··· 631 642 &mut hits, 632 643 &state, 633 644 &mut a11y, 645 + &mut shaper, 634 646 ); 635 647 show_radio_group(&mut ctx, group) 636 648 };
+6
crates/bone-ui/src/widgets/slider.rs
··· 541 541 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 542 542 input.keys_pressed = events; 543 543 let widget = Slider::new(slider_id(), rect(), LABEL, value, unit_range(), unit_step()); 544 + let mut shaper = bone_text::Shaper::new(); 544 545 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 545 546 let mut ctx = FrameCtx::new( 546 547 theme, ··· 551 552 &mut hits, 552 553 &prev, 553 554 &mut a11y, 555 + &mut shaper, 554 556 ); 555 557 show_slider(&mut ctx, widget) 556 558 } ··· 737 739 let mut hits = HitFrame::new(); 738 740 let response = { 739 741 let widget = Slider::new(slider_id(), rect(), LABEL, value, unit_range(), step); 742 + let mut shaper = bone_text::Shaper::new(); 740 743 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 741 744 let mut ctx = FrameCtx::new( 742 745 theme.clone(), ··· 747 750 &mut hits, 748 751 &prev_state, 749 752 &mut a11y, 753 + &mut shaper, 750 754 ); 751 755 show_slider(&mut ctx, widget) 752 756 }; ··· 865 869 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 866 870 input.keys_pressed = events; 867 871 let widget = Slider::new(slider_id(), rect(), LABEL, value, unit_range(), step); 872 + let mut shaper = bone_text::Shaper::new(); 868 873 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 869 874 let mut ctx = FrameCtx::new( 870 875 theme, ··· 875 880 &mut hits, 876 881 &prev, 877 882 &mut a11y, 883 + &mut shaper, 878 884 ); 879 885 show_slider(&mut ctx, widget) 880 886 }
+2
crates/bone-ui/src/widgets/status_bar.rs
··· 332 332 let table = HotkeyTable::new(); 333 333 let mut hits = HitFrame::new(); 334 334 let response = { 335 + let mut shaper = bone_text::Shaper::new(); 335 336 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 336 337 let mut ctx = FrameCtx::new( 337 338 theme, ··· 342 343 &mut hits, 343 344 prev, 344 345 &mut a11y, 346 + &mut shaper, 345 347 ); 346 348 show_status_bar( 347 349 &mut ctx,
+4
crates/bone-ui/src/widgets/table.rs
··· 787 787 LayoutSize::new(LayoutPx::new(200.0), LayoutPx::new(400.0)), 788 788 ); 789 789 let response = { 790 + let mut shaper = bone_text::Shaper::new(); 790 791 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 791 792 let mut ctx = FrameCtx::new( 792 793 theme, ··· 797 798 &mut hits, 798 799 prev, 799 800 &mut a11y, 801 + &mut shaper, 800 802 ); 801 803 show_list_view( 802 804 &mut ctx, ··· 934 936 LayoutSize::new(LayoutPx::new(220.0), LayoutPx::new(200.0)), 935 937 ); 936 938 let response = { 939 + let mut shaper = bone_text::Shaper::new(); 937 940 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 938 941 let mut ctx = FrameCtx::new( 939 942 theme, ··· 944 947 &mut hits, 945 948 prev, 946 949 &mut a11y, 950 + &mut shaper, 947 951 ); 948 952 show_table( 949 953 &mut ctx,
+2
crates/bone-ui/src/widgets/tabs.rs
··· 407 407 let table = HotkeyTable::new(); 408 408 let mut hits = HitFrame::new(); 409 409 let response = { 410 + let mut shaper = bone_text::Shaper::new(); 410 411 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 411 412 let mut ctx = FrameCtx::new( 412 413 theme, ··· 417 418 &mut hits, 418 419 prev, 419 420 &mut a11y, 421 + &mut shaper, 420 422 ); 421 423 show_tabs( 422 424 &mut ctx,
+2
crates/bone-ui/src/widgets/toast.rs
··· 328 328 let table = HotkeyTable::new(); 329 329 let mut hits = HitFrame::new(); 330 330 let response = { 331 + let mut shaper = bone_text::Shaper::new(); 331 332 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 332 333 let mut ctx = FrameCtx::new( 333 334 theme, ··· 338 339 &mut hits, 339 340 prev, 340 341 &mut a11y, 342 + &mut shaper, 341 343 ); 342 344 show_toast( 343 345 &mut ctx,
+10
crates/bone-ui/src/widgets/toggle_button.rs
··· 141 141 hits.clear(); 142 142 let toggle = ToggleButton::new(id_widget(), rect(), LABEL, *on); 143 143 let response = { 144 + let mut shaper = bone_text::Shaper::new(); 144 145 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 145 146 let mut ctx = FrameCtx::new( 146 147 theme.clone(), ··· 151 152 hits, 152 153 state, 153 154 &mut a11y, 155 + &mut shaper, 154 156 ); 155 157 show_toggle_button(&mut ctx, toggle) 156 158 }; ··· 234 236 )); 235 237 let toggle = ToggleButton::new(id_widget(), rect(), LABEL, false); 236 238 let response = { 239 + let mut shaper = bone_text::Shaper::new(); 237 240 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 238 241 let mut ctx = FrameCtx::new( 239 242 theme, ··· 244 247 &mut hits, 245 248 &state, 246 249 &mut a11y, 250 + &mut shaper, 247 251 ); 248 252 show_toggle_button(&mut ctx, toggle) 249 253 }; ··· 269 273 .map(|mut snap| { 270 274 hits.clear(); 271 275 let response = { 276 + let mut shaper = bone_text::Shaper::new(); 272 277 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 273 278 let mut ctx = FrameCtx::new( 274 279 theme.clone(), ··· 279 284 &mut hits, 280 285 &state, 281 286 &mut a11y, 287 + &mut shaper, 282 288 ); 283 289 show_toggle_button(&mut ctx, toggle) 284 290 }; ··· 335 341 let mut input = InputSnapshot::idle(FrameInstant::ZERO); 336 342 let toggle = ToggleButton::new(id_widget(), rect(), LABEL, true); 337 343 let response = { 344 + let mut shaper = bone_text::Shaper::new(); 338 345 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 339 346 let mut ctx = FrameCtx::new( 340 347 theme.clone(), ··· 345 352 &mut hits, 346 353 &state, 347 354 &mut a11y, 355 + &mut shaper, 348 356 ); 349 357 show_toggle_button(&mut ctx, toggle) 350 358 }; ··· 361 369 )); 362 370 let toggle = ToggleButton::new(id_widget(), rect(), LABEL, false); 363 371 let response = { 372 + let mut shaper = bone_text::Shaper::new(); 364 373 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 365 374 let mut ctx = FrameCtx::new( 366 375 theme.clone(), ··· 371 380 &mut hits, 372 381 &state, 373 382 &mut a11y, 383 + &mut shaper, 374 384 ); 375 385 show_toggle_button(&mut ctx, toggle) 376 386 };
+8 -6
crates/bone-ui/src/widgets/tooltip.rs
··· 124 124 gap: LayoutPx, 125 125 size: LayoutSize, 126 126 ) -> LayoutRect { 127 - let centred_x = 127 + let centered_x = 128 128 anchor.origin.x.value() + anchor.size.width.value() / 2.0 - size.width.value() / 2.0; 129 - let centred_y = 129 + let centered_y = 130 130 anchor.origin.y.value() + anchor.size.height.value() / 2.0 - size.height.value() / 2.0; 131 131 let origin = match placement { 132 132 TooltipPlacement::Below => LayoutPos::new( 133 - LayoutPx::new(centred_x), 133 + LayoutPx::new(centered_x), 134 134 LayoutPx::new(anchor.origin.y.value() + anchor.size.height.value() + gap.value()), 135 135 ), 136 136 TooltipPlacement::Above => LayoutPos::new( 137 - LayoutPx::new(centred_x), 137 + LayoutPx::new(centered_x), 138 138 LayoutPx::new(anchor.origin.y.value() - size.height.value() - gap.value()), 139 139 ), 140 140 TooltipPlacement::Right => LayoutPos::new( 141 141 LayoutPx::new(anchor.origin.x.value() + anchor.size.width.value() + gap.value()), 142 - LayoutPx::new(centred_y), 142 + LayoutPx::new(centered_y), 143 143 ), 144 144 TooltipPlacement::Left => LayoutPos::new( 145 145 LayoutPx::new(anchor.origin.x.value() - size.width.value() - gap.value()), 146 - LayoutPx::new(centred_y), 146 + LayoutPx::new(centered_y), 147 147 ), 148 148 }; 149 149 LayoutRect::new(origin, size) ··· 201 201 let table = HotkeyTable::new(); 202 202 let mut hits = HitFrame::new(); 203 203 let mut input = InputSnapshot::idle(frame); 204 + let mut shaper = bone_text::Shaper::new(); 204 205 let mut a11y = crate::a11y::AccessTreeBuilder::new(); 205 206 let mut ctx = FrameCtx::new( 206 207 theme, ··· 211 212 &mut hits, 212 213 prev, 213 214 &mut a11y, 215 + &mut shaper, 214 216 ); 215 217 show_tooltip(&mut ctx, tooltip, state) 216 218 }
+3 -3
crates/bone-ui/tests/dock_snapshot.rs
··· 23 23 fn solidworks_default_dock_round_trip_is_stable() { 24 24 let original = solidworks_default(); 25 25 let Ok(first) = ron::ser::to_string(&original) else { 26 - panic!("first serialise failed"); 26 + panic!("first serialize failed"); 27 27 }; 28 28 let Ok(parsed) = ron::de::from_str::<DockState>(&first) else { 29 - panic!("deserialise failed"); 29 + panic!("deserialize failed"); 30 30 }; 31 31 let Ok(second) = ron::ser::to_string(&parsed) else { 32 - panic!("second serialise failed"); 32 + panic!("second serialize failed"); 33 33 }; 34 34 assert_eq!(first, second); 35 35 assert_eq!(original, parsed);
+2
crates/bone-ui/tests/input_script_drive.rs
··· 33 33 let theme = Arc::new(Theme::light()); 34 34 let table = HotkeyTable::new(); 35 35 let mut hits = HitFrame::new(); 36 + let mut shaper = bone_text::Shaper::new(); 36 37 let mut a11y = AccessTreeBuilder::new(); 37 38 let response = { 38 39 let mut ctx = FrameCtx::new( ··· 44 45 &mut hits, 45 46 prev, 46 47 &mut a11y, 48 + &mut shaper, 47 49 ); 48 50 render(&mut ctx) 49 51 };
+10
crates/bone-ui/tests/key_ordering.rs
··· 65 65 let scopes = HotkeyScopes::from_outer_to_inner([HotkeyScope::Global]); 66 66 67 67 let actions = { 68 + let mut shaper = bone_text::Shaper::new(); 68 69 let mut a11y = AccessTreeBuilder::new(); 69 70 let mut ctx = FrameCtx::new( 70 71 theme, ··· 75 76 &mut hits, 76 77 &prev, 77 78 &mut a11y, 79 + &mut shaper, 78 80 ); 79 81 let widget = TextInput { 80 82 id: field_id(), ··· 117 119 let scopes = HotkeyScopes::from_outer_to_inner([HotkeyScope::Global]); 118 120 119 121 let actions = { 122 + let mut shaper = bone_text::Shaper::new(); 120 123 let mut a11y = AccessTreeBuilder::new(); 121 124 let mut ctx = FrameCtx::new( 122 125 theme, ··· 127 130 &mut hits, 128 131 &prev, 129 132 &mut a11y, 133 + &mut shaper, 130 134 ); 131 135 let widget = TextInput { 132 136 id: field_id(), ··· 165 169 let scopes = HotkeyScopes::from_outer_to_inner([HotkeyScope::Global]); 166 170 167 171 let (actions, selection_min, selection_max) = { 172 + let mut shaper = bone_text::Shaper::new(); 168 173 let mut a11y = AccessTreeBuilder::new(); 169 174 let mut ctx = FrameCtx::new( 170 175 theme, ··· 175 180 &mut hits, 176 181 &prev, 177 182 &mut a11y, 183 + &mut shaper, 178 184 ); 179 185 let actions = ctx.dispatch_hotkeys(&scopes); 180 186 let widget = TextInput { ··· 227 233 let scopes = HotkeyScopes::from_outer_to_inner([HotkeyScope::Global]); 228 234 229 235 let (actions, captured) = { 236 + let mut shaper = bone_text::Shaper::new(); 230 237 let mut a11y = AccessTreeBuilder::new(); 231 238 let mut ctx = FrameCtx::new( 232 239 theme, ··· 237 244 &mut hits, 238 245 &prev, 239 246 &mut a11y, 247 + &mut shaper, 240 248 ); 241 249 let widget = HotkeyCapture::new(field_id(), rect(), FIELD_LABEL, &mut state); 242 250 let response = show_hotkey_capture(&mut ctx, widget); ··· 280 288 let scopes = HotkeyScopes::from_outer_to_inner([HotkeyScope::Global]); 281 289 282 290 let (actions, captured) = { 291 + let mut shaper = bone_text::Shaper::new(); 283 292 let mut a11y = AccessTreeBuilder::new(); 284 293 let mut ctx = FrameCtx::new( 285 294 theme, ··· 290 299 &mut hits, 291 300 &prev, 292 301 &mut a11y, 302 + &mut shaper, 293 303 ); 294 304 let actions = ctx.dispatch_hotkeys(&scopes); 295 305 let widget = HotkeyCapture::new(field_id(), rect(), FIELD_LABEL, &mut state);
+3 -3
crates/bone-ui/tests/theme_snapshot.rs
··· 22 22 23 23 fn assert_round_trip_stable(theme: &Theme) { 24 24 let Ok(first) = ron::ser::to_string(theme) else { 25 - panic!("first serialise failed"); 25 + panic!("first serialize failed"); 26 26 }; 27 27 let Ok(parsed) = ron::de::from_str::<Theme>(&first) else { 28 - panic!("deserialise failed"); 28 + panic!("deserialize failed"); 29 29 }; 30 30 let Ok(second) = ron::ser::to_string(&parsed) else { 31 - panic!("second serialise failed"); 31 + panic!("second serialize failed"); 32 32 }; 33 33 assert_eq!(first, second); 34 34 }