diff --git a/Cargo.lock b/Cargo.lock index 61b32d031f..49351cd053 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -3573,12 +3573,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" -[[package]] -name = "indoc" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" - [[package]] name = "inout" version = "0.1.3" @@ -3851,6 +3845,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -5981,7 +5984,6 @@ dependencies = [ "similar", "slog", "smallvec 1.13.2", - "socket2 0.5.7", "spin 0.9.8", "string_cache", "subtle", @@ -6940,7 +6942,7 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3aa6f61d235de56ccffbca8627377ebe6ff0052a419f67b098f319a5f32e06d" dependencies = [ - "indoc 1.0.9", + "indoc", "js-sys", "lalrpop", "lalrpop-util", @@ -7562,21 +7564,22 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.26.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564a852040e82671dc50a37d88f3aa83bbc690dfc6844cfe7a2591620206a80" +checksum = "d16546c5b5962abf8ce6e2881e722b4e0ae3b6f1a08a26ae3573c55853ca68d3" dependencies = [ "bitflags 2.5.0", "cassowary", "compact_str", "crossterm", - "indoc 2.0.5", - "itertools 0.12.1", + "itertools 0.13.0", "lru", "paste", "stability", "strum", + "strum_macros 0.26.4", "unicode-segmentation", + "unicode-truncate", "unicode-width", ] @@ -7705,7 +7708,7 @@ dependencies = [ "serde", "strip-ansi-escapes", "strum", - "strum_macros 0.26.2", + "strum_macros 0.26.4", "thiserror", "unicode-segmentation", "unicode-width", @@ -9405,7 +9408,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" dependencies = [ - "strum_macros 0.26.2", + "strum_macros 0.26.4", ] [[package]] @@ -9436,11 +9439,11 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", @@ -10367,9 +10370,9 @@ dependencies = [ [[package]] name = "tui-tree-widget" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0c6f924587e719c50b8f83485afbe4d4c16edca6b641d5d9a3204edeba5cf0" +checksum = "0ac69db35529be6a75f9d27516ff33df299e2e8e961a1986d52185cef0427352" dependencies = [ "ratatui", "unicode-width", @@ -10535,11 +10538,21 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-truncate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5fbabedabe362c618c714dbefda9927b5afc8e2a8102f47f081089a9019226" +dependencies = [ + "itertools 0.12.1", + "unicode-width", +] + [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" diff --git a/Cargo.toml b/Cargo.toml index 8e4d5efeed..b69dfe82ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -417,7 +417,7 @@ rand = "0.8.5" rand_core = "0.6.4" rand_distr = "0.4.3" rand_seeder = "0.2.3" -ratatui = "0.26.2" +ratatui = "0.27.0" rayon = "1.10" rcgen = "0.12.1" reedline = "0.31.0" @@ -510,7 +510,7 @@ trust-dns-server = "0.22" trybuild = "1.0.91" tufaceous = { path = "tufaceous" } tufaceous-lib = { path = "tufaceous-lib" } -tui-tree-widget = "0.19.0" +tui-tree-widget = "0.21.0" typed-rng = { path = "typed-rng" } unicode-width = "0.1.11" update-common = { path = "update-common" } diff --git a/wicket/src/ui/panes/update.rs b/wicket/src/ui/panes/update.rs index 6269228bc2..09b119443d 100644 --- a/wicket/src/ui/panes/update.rs +++ b/wicket/src/ui/panes/update.rs @@ -178,7 +178,7 @@ pub struct UpdatePane { impl UpdatePane { pub fn new(log: &Logger) -> UpdatePane { let log = log.new(o!("component" => "UpdatePane")); - let mut tree_state = TreeState::default(); + let tree_state = TreeState::default(); let items = ALL_COMPONENT_IDS .iter() .enumerate() @@ -187,7 +187,8 @@ impl UpdatePane { .expect("no children so no duplicate identifiers") }) .collect::>(); - tree_state.select_first(&items); + // `ensure_selection_matches_rack_state` will perform the initial + // selection on the update tree. UpdatePane { log, @@ -1319,12 +1320,14 @@ impl UpdatePane { } // When we switch panes, we may have moved around in the rack. We want to - // ensure that the currently selected rack component in the update tree + // ensure that the currently selected rack component in the update tree // matches what was selected in the rack or inventory views. We already do // the converse when on this pane and move around the tree. fn ensure_selection_matches_rack_state(&mut self, state: &State) { - let selected = self.tree_state.selected(); - if state.rack_state.selected != ALL_COMPONENT_IDS[selected[0]] { + let tree_selected = self.tree_state.selected(); + let should_reselect = tree_selected.is_empty() + || state.rack_state.selected != ALL_COMPONENT_IDS[tree_selected[0]]; + if should_reselect { let index = ALL_COMPONENT_IDS .iter() .position(|&id| id == state.rack_state.selected) @@ -1377,7 +1380,7 @@ impl UpdatePane { self.update_items(state); // Draw the contents - let tree = Tree::new(self.items.clone()) + let tree = Tree::new(&self.items) .expect("tree does not have duplicate identifiers") .block(block.clone().borders(Borders::LEFT | Borders::RIGHT)) .style(style::plain_text()) @@ -2486,13 +2489,13 @@ impl Control for UpdatePane { match cmd { Cmd::Up => { - self.tree_state.key_up(&self.items); + self.tree_state.key_up(); let selected = self.tree_state.selected(); state.rack_state.selected = ALL_COMPONENT_IDS[selected[0]]; Some(Action::Redraw) } Cmd::Down => { - self.tree_state.key_down(&self.items); + self.tree_state.key_down(); let selected = self.tree_state.selected(); state.rack_state.selected = ALL_COMPONENT_IDS[selected[0]]; Some(Action::Redraw) @@ -2500,7 +2503,7 @@ impl Control for UpdatePane { Cmd::Collapse | Cmd::Left => { // We always want something selected. If we close the root, // we want to re-open it. - let selected = self.tree_state.selected(); + let selected = self.tree_state.selected().to_vec(); self.tree_state.key_left(); if self.tree_state.selected().is_empty() { self.tree_state.select(selected); @@ -2523,12 +2526,12 @@ impl Control for UpdatePane { Some(Action::Redraw) } Cmd::GotoTop => { - self.tree_state.select_first(&self.items); + self.tree_state.select_first(); state.rack_state.selected = ALL_COMPONENT_IDS[0]; Some(Action::Redraw) } Cmd::GotoBottom => { - self.tree_state.select_last(&self.items); + self.tree_state.select_last(); state.rack_state.selected = ALL_COMPONENT_IDS[ALL_COMPONENT_IDS.len() - 1]; Some(Action::Redraw) diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index 2d9a4731f9..87ac8b9307 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -98,7 +98,6 @@ sha2 = { version = "0.10.8", features = ["oid"] } similar = { version = "2.5.0", features = ["inline", "unicode"] } slog = { version = "2.7.0", features = ["dynamic-keys", "max_level_trace", "release_max_level_debug", "release_max_level_trace"] } smallvec = { version = "1.13.2", default-features = false, features = ["const_new"] } -socket2 = { version = "0.5.7", default-features = false, features = ["all"] } spin = { version = "0.9.8" } string_cache = { version = "0.8.7" } subtle = { version = "2.5.0" } @@ -203,7 +202,6 @@ sha2 = { version = "0.10.8", features = ["oid"] } similar = { version = "2.5.0", features = ["inline", "unicode"] } slog = { version = "2.7.0", features = ["dynamic-keys", "max_level_trace", "release_max_level_debug", "release_max_level_trace"] } smallvec = { version = "1.13.2", default-features = false, features = ["const_new"] } -socket2 = { version = "0.5.7", default-features = false, features = ["all"] } spin = { version = "0.9.8" } string_cache = { version = "0.8.7" } subtle = { version = "2.5.0" }