# Conflicts: # ROADMAP.md # crates/ui-egui/src/tests_font_menu.rs
This commit is contained in:
commit
896f8efea8
File diff suppressed because one or more lines are too long
|
|
@ -134,6 +134,10 @@ struct MenuState {
|
|||
/// The pass the list was last drawn in, and the pass it opened in.
|
||||
last: u64,
|
||||
opened: u64,
|
||||
/// The family the text had as the menu opened. A preview shows another one in the document
|
||||
/// (and the menu's caller), but this one stays the current family: hovering it ends the
|
||||
/// preview (#563).
|
||||
current: String,
|
||||
/// The highlighted row and the query and filters it belongs to.
|
||||
highlight: Option<usize>,
|
||||
query: String,
|
||||
|
|
@ -194,6 +198,7 @@ fn list(ui: &mut Ui, state_id: egui::Id, st: &mut MenuState, current: &str, samp
|
|||
st.opened = pass;
|
||||
st.highlight = None;
|
||||
st.query.clear();
|
||||
st.current = current.to_string();
|
||||
}
|
||||
st.last = pass;
|
||||
// For [`end_stale_preview`]: the menu is open, in this layer.
|
||||
|
|
@ -243,8 +248,9 @@ fn list(ui: &mut Ui, state_id: egui::Id, st: &mut MenuState, current: &str, samp
|
|||
});
|
||||
let enter = ui.input(|i| i.key_pressed(egui::Key::Enter));
|
||||
let db = vectorcraft_text::FontDb::global();
|
||||
// The current family by its own name (a document may name it in Japanese: ヒラギノ角ゴシック).
|
||||
let current = db.canonical(current, "").0;
|
||||
// The current family by its own name (a document may name it in Japanese: ヒラギノ角ゴシック),
|
||||
// as it was before any preview.
|
||||
let current = db.canonical(&st.current, "").0;
|
||||
let current = current.as_str();
|
||||
let favorite = |f: &str| look.favorites.iter().any(|x| x.eq_ignore_ascii_case(f));
|
||||
// The generation is read first: fonts that load meanwhile make the next frame list them.
|
||||
|
|
|
|||
|
|
@ -318,3 +318,61 @@ fn the_search_field_stays_put_while_the_list_scrolls() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// #563: a preview stays on the text while the menu stays on its family. The menu's caller passes
|
||||
/// the text's font, which the preview changed; the menu keeps the font from before the preview as
|
||||
/// the current one, so it doesn't take the previewed family for it and end the preview, then
|
||||
/// preview it again, every frame (the text flickered).
|
||||
#[test]
|
||||
fn a_preview_stays_put_while_the_menu_is_still() {
|
||||
let ctx = egui::Context::default();
|
||||
crate::theme::install_fonts(&ctx);
|
||||
let mut app = VectorcraftApp::new(Session::new(), Default::default());
|
||||
app.run("file.new", json!({"width": 300, "height": 200})).unwrap();
|
||||
let id = app.session.execute("text.create", &json!({"x": 20, "y": 50, "text": "Gagaku", "font": "Inter"})).unwrap()["id"].as_u64().unwrap();
|
||||
app.session.execute("select.set", &json!({"ids": [id]})).unwrap();
|
||||
let font = |app: &VectorcraftApp| match &app.session.active().unwrap().doc.node(vectorcraft_doc::NodeId(id)).unwrap().kind {
|
||||
NodeKind::Text(t) => t.first_style().font_family,
|
||||
_ => String::new(),
|
||||
};
|
||||
let revision = |app: &VectorcraftApp| app.session.active().unwrap().revision;
|
||||
// A panel's frame: the menu shows the text's font, and what it picks is applied.
|
||||
let frame = |app: &mut VectorcraftApp, events: Vec<egui::Event>| {
|
||||
let input =
|
||||
egui::RawInput { events, screen_rect: Some(egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(600.0, 800.0))), ..Default::default() };
|
||||
let current = font(app);
|
||||
let (mut at, mut picked) = (egui::Pos2::ZERO, None);
|
||||
let mut out = ctx.run_ui(input, |ui| {
|
||||
crate::font_menu::end_stale_preview(app, ui.ctx());
|
||||
at = ui.next_widget_position();
|
||||
picked = font_menu(ui, "test-steady", ¤t, 260.0, None, MenuLook::default());
|
||||
if let Some(p) = picked.clone() {
|
||||
crate::font_menu::apply(app, ui.ctx(), p);
|
||||
}
|
||||
});
|
||||
out.textures_delta.clear();
|
||||
(at, picked)
|
||||
};
|
||||
let (at, _) = frame(&mut app, vec![]);
|
||||
let click = at + egui::vec2(40.0, 10.0);
|
||||
let button = |pressed| egui::Event::PointerButton { pos: click, button: egui::PointerButton::Primary, pressed, modifiers: Default::default() };
|
||||
frame(&mut app, vec![egui::Event::PointerMoved(click), button(true)]);
|
||||
frame(&mut app, vec![button(false)]);
|
||||
for _ in 0..5 {
|
||||
frame(&mut app, vec![]);
|
||||
}
|
||||
let (_, picked) = frame(&mut app, key(egui::Key::ArrowDown));
|
||||
assert!(matches!(picked, Some(FontPick::Preview(..))), "{picked:?}");
|
||||
let previewed = font(&app);
|
||||
assert_ne!(previewed, "Inter");
|
||||
let rev = revision(&app);
|
||||
for _ in 0..6 {
|
||||
let (_, picked) = frame(&mut app, vec![]);
|
||||
assert_eq!(picked, None, "nothing more to apply");
|
||||
}
|
||||
assert_eq!((font(&app), revision(&app)), (previewed, rev), "the preview stays, untouched");
|
||||
// Back on the text's own family, the preview ends.
|
||||
let (_, picked) = frame(&mut app, key(egui::Key::ArrowUp));
|
||||
assert_eq!(picked, Some(FontPick::EndPreview));
|
||||
assert_eq!(font(&app), "Inter");
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue