mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-31 13:38:14 -06:00
MENU-EDIT-SELECTNONE: Edit lists Select Only Active Photo and Paste Settings from Previous with their kin, and the native Edit menu keeps single separators
This commit is contained in:
@@ -295,12 +295,20 @@ fn label_text(s: &str) -> String {
|
||||
lightcraft_ui_egui::i18n::tr(s).replace('&', "&&")
|
||||
}
|
||||
|
||||
/// Drop a trailing separator (left behind when an item moved to the app menu).
|
||||
fn tidy_separators(mut nodes: Vec<MenuNode>) -> Vec<MenuNode> {
|
||||
while matches!(nodes.last(), Some(MenuNode::Separator)) {
|
||||
nodes.pop();
|
||||
/// Drop the separators left behind when an item moved to the app menu: a leading one, a trailing
|
||||
/// one and the second of two in a row.
|
||||
fn tidy_separators(nodes: Vec<MenuNode>) -> Vec<MenuNode> {
|
||||
let mut out: Vec<MenuNode> = Vec::with_capacity(nodes.len());
|
||||
for node in nodes {
|
||||
if node == MenuNode::Separator && out.last().is_none_or(|last| *last == MenuNode::Separator) {
|
||||
continue;
|
||||
}
|
||||
out.push(node);
|
||||
}
|
||||
nodes
|
||||
while out.last() == Some(&MenuNode::Separator) {
|
||||
out.pop();
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
impl NativeMenu {
|
||||
@@ -570,6 +578,24 @@ impl NativeMenu {
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
/// An item that moves to the app menu (Settings…) can sit between two separators, or open or
|
||||
/// close the menu's list: the rows left behind keep at most one separator between them.
|
||||
#[test]
|
||||
fn rows_left_after_a_move_keep_single_separators() {
|
||||
let item = |id: &str| MenuNode::Item {
|
||||
id: id.to_string(),
|
||||
label: id.to_string(),
|
||||
shortcut: None,
|
||||
enabled: true,
|
||||
checked: None,
|
||||
params: Value::Null,
|
||||
};
|
||||
let sep = || MenuNode::Separator;
|
||||
let tidy = tidy_separators(vec![sep(), item("a"), sep(), sep(), item("b"), sep(), sep()]);
|
||||
assert_eq!(tidy, vec![item("a"), sep(), item("b")]);
|
||||
assert_eq!(tidy_separators(vec![sep(), sep()]), Vec::<MenuNode>::new());
|
||||
}
|
||||
|
||||
/// The menu model's titles stay English, so only the language can tell the native menu to
|
||||
/// rebuild its titles (and the macOS app menu): every language switch — also between two CJK
|
||||
/// languages — must change the structure key.
|
||||
|
||||
Reference in New Issue
Block a user