konnektoren_bevy/settings/
systems.rs

1use super::components::*;
2use bevy::prelude::*;
3
4/// System to detect and handle setting changes
5pub fn update_settings_from_components(
6    mut changed_settings: Query<(Entity, &mut Setting, Option<&SettingChanged>), Changed<Setting>>,
7    mut commands: Commands,
8    mut setting_events: EventWriter<SettingChangedEvent>,
9) {
10    for (entity, setting, changed_marker) in changed_settings.iter_mut() {
11        if let Some(changed) = changed_marker {
12            // Send event about the change
13            setting_events.write(SettingChangedEvent {
14                setting_id: setting.id.clone(),
15                old_value: changed.old_value.clone(),
16                new_value: setting.value.clone(),
17            });
18
19            // Remove the changed marker
20            commands.entity(entity).remove::<SettingChanged>();
21        }
22    }
23}
24
25/// Helper function to update a setting value by ID
26pub fn update_setting_by_id(
27    setting_id: &str,
28    new_value: SettingValue,
29    mut settings_query: Query<(Entity, &mut Setting)>,
30    mut commands: Commands,
31) -> bool {
32    for (entity, mut setting) in settings_query.iter_mut() {
33        if setting.id == setting_id {
34            let old_value = setting.value.clone();
35            setting.value = new_value;
36
37            commands.entity(entity).insert(SettingChanged { old_value });
38            return true;
39        }
40    }
41    false
42}
43
44/// Query helper to find a setting by ID
45pub fn find_setting_by_id<'a>(
46    settings_query: &'a Query<&Setting>,
47    setting_id: &str,
48) -> Option<&'a Setting> {
49    settings_query
50        .iter()
51        .find(|setting| setting.id == setting_id)
52}
53
54/// Query helper to get setting value by ID
55pub fn get_setting_value(
56    settings_query: &Query<&Setting>,
57    setting_id: &str,
58) -> Option<SettingValue> {
59    find_setting_by_id(settings_query, setting_id).map(|setting| setting.value.clone())
60}
61
62/// Helper function to update a setting value using a closure
63pub fn update_setting_with<F>(
64    setting_id: &str,
65    mut settings_query: Query<(Entity, &mut Setting)>,
66    mut commands: Commands,
67    updater: F,
68) -> bool
69where
70    F: FnOnce(&SettingValue) -> Option<SettingValue>,
71{
72    let setting_info = settings_query.iter().find_map(|(entity, setting)| {
73        if setting.id == setting_id {
74            Some((entity, setting.value.clone()))
75        } else {
76            None
77        }
78    });
79
80    if let Some((entity, current_value)) = setting_info {
81        if let Some(new_value) = updater(&current_value) {
82            if let Ok((_, mut setting)) = settings_query.get_mut(entity) {
83                let old_value = setting.value.clone();
84                setting.value = new_value;
85                commands.entity(entity).insert(SettingChanged { old_value });
86                return true;
87            }
88        }
89    }
90    false
91}
92
93/// Helper function to get all settings in a category
94pub fn get_settings_in_category<'a>(
95    settings_query: &'a Query<&Setting>,
96    category: &str,
97) -> Vec<&'a Setting> {
98    settings_query
99        .iter()
100        .filter(|setting| setting.category.as_ref().is_some_and(|cat| cat == category))
101        .collect()
102}