Skip to content

Commit ff7b9f0

Browse files
committed
prepare for refactoring to use events
1 parent 4ff7737 commit ff7b9f0

7 files changed

Lines changed: 129 additions & 96 deletions

File tree

crates/bevy_animation_graph_editor/src/ui/editor_windows/ragdoll_editor/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use bevy::{
22
asset::{AssetId, Handle},
3+
ecs::world::CommandQueue,
34
platform::collections::HashMap,
45
prelude::World,
56
utils::default,

crates/bevy_animation_graph_editor/src/ui/generic_widgets/body_id.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use bevy_animation_graph::core::ragdoll::definition::{BodyId, Ragdoll};
2-
use uuid::Uuid;
2+
3+
use crate::ui::generic_widgets::uuid::UuidWidget;
34

45
pub struct BodyIdWidget<'a> {
56
pub body_id: &'a mut BodyId,
@@ -30,14 +31,13 @@ impl<'a> egui::Widget for BodyIdWidget<'a> {
3031
.horizontal(|ui| {
3132
let picker_response = self.ragdoll.map(|r| picker(ui, self.body_id, r));
3233

33-
let mut uuid_str = format!("{}", self.body_id.uuid().hyphenated());
34-
let mut response = ui.text_edit_singleline(&mut uuid_str);
34+
let mut uuid = self.body_id.uuid();
35+
let mut response =
36+
ui.add(UuidWidget::new_salted(&mut uuid, "body id uuid"));
3537
if let Some(picker_response) = picker_response {
3638
response |= picker_response;
3739
}
38-
if let Ok(uuid) = Uuid::parse_str(&uuid_str) {
39-
*self.body_id = BodyId::from_uuid(uuid);
40-
}
40+
*self.body_id = BodyId::from_uuid(uuid);
4141

4242
response
4343
})

crates/bevy_animation_graph_editor/src/ui/generic_widgets/bone_id.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use bevy_animation_graph::core::{id::BoneId, skeleton::Skeleton};
2-
use uuid::Uuid;
2+
3+
use crate::ui::generic_widgets::uuid::UuidWidget;
34

45
pub struct BoneIdWidget<'a> {
56
pub bone_id: &'a mut BoneId,
@@ -31,17 +32,13 @@ impl<'a> egui::Widget for BoneIdWidget<'a> {
3132
let picker_response =
3233
self.skeleton.map(|skn| picker(ui, self.bone_id, skn));
3334

34-
let mut uuid_str = format!("{}", self.bone_id.id().hyphenated());
35-
let mut response = ui.add(
36-
egui::TextEdit::singleline(&mut uuid_str)
37-
.min_size(egui::Vec2::new(200., 0.)),
38-
);
35+
let mut uuid = self.bone_id.id();
36+
let mut response =
37+
ui.add(UuidWidget::new_salted(&mut uuid, "bone id uuid"));
3938
if let Some(picker_response) = picker_response {
4039
response |= picker_response;
4140
}
42-
if let Ok(uuid) = Uuid::parse_str(&uuid_str) {
43-
*self.bone_id = BoneId::from_uuid(uuid);
44-
}
41+
*self.bone_id = BoneId::from_uuid(uuid);
4542

4643
response
4744
})

crates/bevy_animation_graph_editor/src/ui/generic_widgets/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ pub mod list;
77
pub mod quat;
88
pub mod ragdoll_config;
99
pub mod u32_flags;
10+
pub mod uuid;
1011
pub mod vec3;
Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,58 @@
11
use bevy_animation_graph::core::ragdoll::configuration::RagdollConfig;
22

3+
use crate::ui::generic_widgets::{bone_id::BoneIdWidget, hashmap::HashMapWidget};
4+
35
pub struct RagdollConfigWidget<'a> {
46
pub config: &'a mut RagdollConfig,
57
pub id_hash: egui::Id,
6-
pub width: f32,
78
}
89

910
impl<'a> RagdollConfigWidget<'a> {
1011
pub fn new_salted(config: &'a mut RagdollConfig, salt: impl std::hash::Hash) -> Self {
1112
Self {
1213
config,
1314
id_hash: egui::Id::new(salt),
14-
width: 300.,
1515
}
1616
}
17-
18-
pub fn with_width(mut self, width: f32) -> Self {
19-
self.width = width;
20-
self
21-
}
2217
}
2318

2419
impl<'a> egui::Widget for RagdollConfigWidget<'a> {
2520
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
26-
let button_response = ui.button("Edit");
27-
let popup_response =
28-
egui::Popup::from_toggle_button_response(&button_response).show(|ui| {
29-
// let mut response = ui.label("default mode:");
30-
// response |= egui::ComboBox::from_id_salt("joint variant")
31-
// .selected_text(match &self.joint.variant {
32-
// JointVariant::Spherical(_) => "Spherical",
33-
// JointVariant::Revolute(_) => "Revolute",
34-
// })
35-
// .show_ui(ui, |ui| {
36-
// ui.selectable_value(
37-
// &mut self.joint.variant,
38-
// JointVariant::Spherical(SphericalJoint::default()),
39-
// "Spherical",
40-
// );
41-
// ui.selectable_value(
42-
// &mut self.joint.variant,
43-
// JointVariant::Revolute(RevoluteJoint::default()),
44-
// "Revolute",
45-
// );
46-
// })
47-
// .response;
48-
});
21+
ui.push_id(self.id_hash, |ui| {
22+
let mut response = ui.button("Edit");
23+
let popup_response = egui::Popup::from_toggle_button_response(&response)
24+
.close_behavior(egui::PopupCloseBehavior::IgnoreClicks)
25+
.show(|ui| {
26+
ui.push_id("default mode", |ui| {
27+
// env.ui_for_reflect(&mut value.default_mode, ui)
28+
})
29+
.inner;
30+
ui.push_id("default readback", |ui| {
31+
// env.ui_for_reflect(&mut value.default_readback, ui)
32+
})
33+
.inner;
34+
let response = HashMapWidget::new_salted(
35+
&mut self.config.readback_overrides,
36+
"readback overrides",
37+
)
38+
.ui(
39+
ui,
40+
|ui, key| ui.add(BoneIdWidget::new_salted(key, "bone id edit")),
41+
|ui, key| ui.label(format!("{}", key.id().hyphenated())),
42+
|ui, value| ui.add(egui::Checkbox::without_text(value)),
43+
);
44+
45+
response
46+
});
47+
48+
if let Some(popup_response) = popup_response {
49+
if popup_response.inner.changed() {
50+
response.mark_changed();
51+
}
52+
}
4953

50-
button_response
54+
response
55+
})
56+
.inner
5157
}
5258
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use uuid::Uuid;
2+
3+
pub struct UuidWidget<'a> {
4+
pub uuid: &'a mut Uuid,
5+
pub id_hash: egui::Id,
6+
}
7+
8+
impl<'a> UuidWidget<'a> {
9+
pub fn new_salted(uuid: &'a mut Uuid, salt: impl std::hash::Hash) -> Self {
10+
Self {
11+
uuid,
12+
id_hash: egui::Id::new(salt),
13+
}
14+
}
15+
}
16+
17+
#[derive(Clone)]
18+
struct UuidData {
19+
original: Uuid,
20+
buffer: String,
21+
}
22+
23+
impl UuidData {
24+
pub fn from_uuid(uuid: Uuid) -> Self {
25+
Self {
26+
original: uuid,
27+
buffer: format!("{}", uuid.hyphenated()),
28+
}
29+
}
30+
}
31+
32+
impl<'a> egui::Widget for UuidWidget<'a> {
33+
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
34+
ui.push_id(self.id_hash, |ui| {
35+
let buffer_id = ui.id().with("buffer");
36+
let mut data = ui.memory_mut(|mem| {
37+
let prev_data = mem.data.get_temp::<UuidData>(buffer_id);
38+
if prev_data.is_none_or(|d| d.original != *self.uuid) {
39+
mem.data
40+
.insert_temp(buffer_id, UuidData::from_uuid(*self.uuid));
41+
}
42+
43+
mem.data
44+
.get_temp_mut_or_insert_with(buffer_id, || UuidData::from_uuid(*self.uuid))
45+
.clone()
46+
});
47+
48+
let mut response = ui.add(
49+
egui::TextEdit::singleline(&mut data.buffer).min_size(egui::Vec2::new(250., 0.)),
50+
);
51+
52+
// Mark non-changed; we only consider the response changed if the uuid string is valid
53+
response.flags &= !egui::response::Flags::CHANGED;
54+
55+
if let Ok(new_uuid) = Uuid::parse_str(&data.buffer) {
56+
*self.uuid = new_uuid;
57+
response.mark_changed();
58+
}
59+
60+
ui.memory_mut(|mem| mem.data.insert_temp(buffer_id, data));
61+
62+
response
63+
})
64+
.inner
65+
}
66+
}

crates/bevy_animation_graph_editor/src/ui/reflect_widgets/ragdoll_config.rs

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
use std::any::Any;
22

3-
use bevy_animation_graph::core::{id::BoneId, ragdoll::configuration::RagdollConfig};
3+
use bevy_animation_graph::core::ragdoll::configuration::RagdollConfig;
44
use bevy_inspector_egui::reflect_inspector::InspectorUi;
5+
use egui::Widget;
56
use egui_dock::egui;
67

7-
use crate::ui::generic_widgets::{bone_id::BoneIdWidget, hashmap::HashMapWidget};
8+
use crate::ui::{
9+
generic_widgets::{
10+
bone_id::BoneIdWidget, hashmap::HashMapWidget, ragdoll_config::RagdollConfigWidget,
11+
},
12+
utils::with_assets_all,
13+
};
814

915
use super::{EguiInspectorExtension, MakeBuffer};
1016

@@ -21,55 +27,11 @@ impl EguiInspectorExtension for RagdollConfigInspector {
2127
ui: &mut egui::Ui,
2228
_options: &dyn Any,
2329
_id: egui::Id,
24-
mut env: InspectorUi<'_, '_>,
30+
_env: InspectorUi<'_, '_>,
2531
) -> bool {
26-
let button_response = ui.button("Edit");
27-
let popup_response = egui::Popup::from_toggle_button_response(&button_response)
28-
.close_behavior(egui::PopupCloseBehavior::IgnoreClicks)
29-
.show(|ui| {
30-
let default_mode_changed = ui
31-
.push_id("default mode", |ui| {
32-
env.ui_for_reflect(&mut value.default_mode, ui)
33-
})
34-
.inner;
35-
let default_readback_changed = ui
36-
.push_id("default readback", |ui| {
37-
env.ui_for_reflect(&mut value.default_readback, ui)
38-
})
39-
.inner;
40-
let readback_overrides_changed =
41-
HashMapWidget::new_salted(&mut value.readback_overrides, "readback overrides")
42-
.ui(
43-
ui,
44-
|ui, key| ui.add(BoneIdWidget::new_salted(key, "bone id edit")),
45-
|ui, key| ui.label(format!("{}", key.id().hyphenated())),
46-
|ui, value| ui.add(egui::Checkbox::without_text(value)),
47-
)
48-
.changed();
49-
50-
// let mut response = ui.label("default mode:");
51-
// response |= egui::ComboBox::from_id_salt("joint variant")
52-
// .selected_text(match &self.joint.variant {
53-
// JointVariant::Spherical(_) => "Spherical",
54-
// JointVariant::Revolute(_) => "Revolute",
55-
// })
56-
// .show_ui(ui, |ui| {
57-
// ui.selectable_value(
58-
// &mut self.joint.variant,
59-
// JointVariant::Spherical(SphericalJoint::default()),
60-
// "Spherical",
61-
// );
62-
// ui.selectable_value(
63-
// &mut self.joint.variant,
64-
// JointVariant::Revolute(RevoluteJoint::default()),
65-
// "Revolute",
66-
// );
67-
// })
68-
// .response;
69-
default_mode_changed || default_readback_changed || readback_overrides_changed
70-
});
71-
72-
popup_response.map(|r| r.inner).unwrap_or(false)
32+
RagdollConfigWidget::new_salted(value, "config widget")
33+
.ui(ui)
34+
.changed()
7335
}
7436

7537
fn readonly(

0 commit comments

Comments
 (0)