konnektoren_bevy/settings/
systems.rs1use super::components::*;
2use bevy::prelude::*;
3
4pub 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 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 commands.entity(entity).remove::<SettingChanged>();
21 }
22 }
23}
24
25pub 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
44pub 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
54pub 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
62pub 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(¤t_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
93pub 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}