From 544e375f5b30e557b2e4ab948d59dadac7e7579c Mon Sep 17 00:00:00 2001 From: Sam Lewis Date: Wed, 19 Jan 2022 14:21:35 +1100 Subject: [PATCH 1/2] Don't show settings that aren't published by device [CPP-587] Changes the settings tab to only show the settings that the device has published. This avoids settings being shown that exist within the libsettings `settings.yaml` that are old or are for a different mode of operation. --- console_backend/src/settings_tab.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/console_backend/src/settings_tab.rs b/console_backend/src/settings_tab.rs index d7750f6c4..0bf581cb1 100644 --- a/console_backend/src/settings_tab.rs +++ b/console_backend/src/settings_tab.rs @@ -517,13 +517,7 @@ struct Settings { impl Settings { fn new() -> Self { Self { - inner: Setting::all() - .iter() - .fold(IndexMap::new(), |mut settings, setting| { - (*settings.entry(setting.group.clone()).or_default()) - .insert(setting.name.clone(), SettingsEntry::new(setting)); - settings - }), + inner: IndexMap::new(), default: SettingValue::String("".into()), } } @@ -574,12 +568,3 @@ struct SettingsEntry { setting: Cow<'static, Setting>, value: Option, } - -impl SettingsEntry { - fn new(setting: &'static Setting) -> Self { - Self { - setting: Cow::Borrowed(setting), - value: None, - } - } -} From 6b086b9a13a4468ff44eeb772b8a5c8ffd3310f3 Mon Sep 17 00:00:00 2001 From: Sam Lewis Date: Thu, 20 Jan 2022 09:50:59 +1100 Subject: [PATCH 2/2] Preserve order from settings.yaml [CPP-563] --- console_backend/src/settings_tab.rs | 35 +++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/console_backend/src/settings_tab.rs b/console_backend/src/settings_tab.rs index 0bf581cb1..e452d2480 100644 --- a/console_backend/src/settings_tab.rs +++ b/console_backend/src/settings_tab.rs @@ -1,4 +1,5 @@ use std::borrow::Cow; +use std::collections::HashMap; use std::fs; use std::path::Path; use std::time::Duration; @@ -514,17 +515,35 @@ struct Settings { default: SettingValue, } +lazy_static! { + static ref SETTING_ORDERING: HashMap<(&'static str, &'static str), usize> = { + Setting::all() + .iter() + .enumerate() + .fold(HashMap::new(), |mut settings, (index, setting)| { + settings.insert((&setting.group, &setting.name), index); + settings + }) + }; +} + impl Settings { fn new() -> Self { Self { - inner: IndexMap::new(), + // Keep the settings ordered in the same order as defined in the libsettings settings.yaml file + inner: Setting::all() + .iter() + .fold(IndexMap::new(), |mut settings, setting| { + settings.insert(setting.group.clone(), IndexMap::new()); + settings + }), default: SettingValue::String("".into()), } } fn groups(&self) -> Vec> { self.inner.values().fold(Vec::new(), |mut groups, group| { - let group: Vec<_> = group + let mut group: Vec<_> = group .values() .map(|setting| { setting.value.as_ref().map_or_else( @@ -533,6 +552,18 @@ impl Settings { ) }) .collect(); + + // Sort settings within a group by the order in which they're defined within the libsettings settings.yaml file + group.sort_by(|a, b| { + let a_index = SETTING_ORDERING + .get(&(&a.0.group, &a.0.name)) + .unwrap_or(&usize::MAX); + let b_index = SETTING_ORDERING + .get(&(&b.0.group, &b.0.name)) + .unwrap_or(&usize::MAX); + a_index.cmp(b_index) + }); + if !group.is_empty() { groups.push(group); }