mirror of
https://github.com/storytold/storyteller-bevy.git
synced 2026-10-27 08:48:14 +00:00
Fixed empty field failure and fixed rotation showing
This commit is contained in:
@@ -148,7 +148,12 @@ function create_float_input(element : HTMLInputElement) {
|
|||||||
const onMouseMove = (e: MouseEvent) => {
|
const onMouseMove = (e: MouseEvent) => {
|
||||||
if (isMouseDown) {
|
if (isMouseDown) {
|
||||||
const dx = e.clientX - startX;
|
const dx = e.clientX - startX;
|
||||||
element.value = (value + dx / 10).toString(); // Изменение на 1 за каждые 5 пикселей движения мыши
|
startX = e.clientX;
|
||||||
|
var float_value = parseFloat(element.value);
|
||||||
|
if (float_value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
element.value = (float_value + dx / 10.0).toString(); // Изменение на 1 за каждые 5 пикселей движения мыши
|
||||||
//dispatch update event
|
//dispatch update event
|
||||||
const event = new Event('input', {
|
const event = new Event('input', {
|
||||||
bubbles: true,
|
bubbles: true,
|
||||||
@@ -164,11 +169,11 @@ function create_float_input(element : HTMLInputElement) {
|
|||||||
document.removeEventListener('mouseup', onMouseUp);
|
document.removeEventListener('mouseup', onMouseUp);
|
||||||
};
|
};
|
||||||
|
|
||||||
element.addEventListener('keydown', (e: KeyboardEvent) => {
|
// element.addEventListener('keydown', (e: KeyboardEvent) => {
|
||||||
if (!e.key.match(/^[0-9]$/)) {
|
// if (!e.key.match(/^[0-9]$/)) {
|
||||||
e.preventDefault(); // Предотвратить ввод нечисловых символов
|
// e.preventDefault(); // Предотвратить ввод нечисловых символов
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
};
|
};
|
||||||
|
|
||||||
function append_style(parent : HTMLElement) {
|
function append_style(parent : HTMLElement) {
|
||||||
@@ -205,11 +210,13 @@ function append_style(parent : HTMLElement) {
|
|||||||
.struct-grid {
|
.struct-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: min-content 1fr;
|
grid-template-columns: min-content 1fr;
|
||||||
gap: 8px;
|
column-gap: 8px;
|
||||||
|
row-gap: 4px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
||||||
parent.appendChild(style);
|
parent.appendChild(style);
|
||||||
}
|
}
|
||||||
+87
-18
@@ -165,19 +165,33 @@ impl WebEventExecutor for ReflectValueExecutor {
|
|||||||
if let Some(v) = refl_value.downcast_mut::<String>() {
|
if let Some(v) = refl_value.downcast_mut::<String>() {
|
||||||
*v = value;
|
*v = value;
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<f32>() {
|
} else if let Some(v) = refl_value.downcast_mut::<f32>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<f32>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<f64>() {
|
} else if let Some(v) = refl_value.downcast_mut::<f64>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<f64>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<bool>() {
|
} else if let Some(v) = refl_value.downcast_mut::<bool>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<bool>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<i32>() {
|
} else if let Some(v) = refl_value.downcast_mut::<i32>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<i32>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<i64>() {
|
} else if let Some(v) = refl_value.downcast_mut::<i64>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<i64>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<u32>() {
|
} else if let Some(v) = refl_value.downcast_mut::<u32>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<u32>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
} else if let Some(v) = refl_value.downcast_mut::<u64>() {
|
} else if let Some(v) = refl_value.downcast_mut::<u64>() {
|
||||||
*v = value.parse().unwrap();
|
if let Ok(value) = value.parse::<u64>() {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,12 +220,28 @@ impl EntityChangeExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn euler_to_degrees(euler : (f32, f32, f32)) -> (f32, f32, f32) {
|
||||||
|
(
|
||||||
|
euler.0.to_degrees(),
|
||||||
|
euler.1.to_degrees(),
|
||||||
|
euler.2.to_degrees()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn degrees_to_euler(degrees : (f32, f32, f32)) -> (f32, f32, f32) {
|
||||||
|
(
|
||||||
|
degrees.0.to_radians(),
|
||||||
|
degrees.1.to_radians(),
|
||||||
|
degrees.2.to_radians()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Element> {
|
fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Element> {
|
||||||
if let Some(name) = r.downcast_ref::<Name>() {
|
if let Some(name) = r.downcast_ref::<Name>() {
|
||||||
Some(Element::Component(Component {
|
Some(Element::Component(Component {
|
||||||
tag: "div".to_string(),
|
tag: "div".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("style".to_string(), "font-weight: bold".to_string()),
|
("style".to_string(), "font-weight: bold; font-size: 24px".to_string()),
|
||||||
],
|
],
|
||||||
children: vec![
|
children: vec![
|
||||||
Element::Text(format!("{}", &name)),
|
Element::Text(format!("{}", &name)),
|
||||||
@@ -237,6 +267,7 @@ fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Elemen
|
|||||||
}))
|
}))
|
||||||
} else if let Some(quat) = r.downcast_ref::<Quat>() {
|
} else if let Some(quat) = r.downcast_ref::<Quat>() {
|
||||||
let euler = quat.to_euler(EulerRot::XYZ);
|
let euler = quat.to_euler(EulerRot::XYZ);
|
||||||
|
let degrees = euler_to_degrees(euler);
|
||||||
Some(Element::Component(Component {
|
Some(Element::Component(Component {
|
||||||
tag: "div".to_string(),
|
tag: "div".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
@@ -248,16 +279,23 @@ fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Elemen
|
|||||||
tag: "input".to_string(),
|
tag: "input".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("type".to_string(), "number".to_string()),
|
("type".to_string(), "number".to_string()),
|
||||||
("value".to_string(), euler.0.to_string()),
|
("value".to_string(), format!("{:.2}",degrees.0)),
|
||||||
|
("step".to_string(), "0.01".to_string()),
|
||||||
],
|
],
|
||||||
children: vec![],
|
children: vec![],
|
||||||
onchange: Some(EntityChangeExecutor::new_boxed(
|
onchange: Some(EntityChangeExecutor::new_boxed(
|
||||||
onchange.entity_id,
|
onchange.entity_id,
|
||||||
|world : &mut World, entity, value : String| {
|
|world : &mut World, entity, value : String| {
|
||||||
|
let Some(value) = value.parse::<f32>().ok() else { return; };
|
||||||
|
let value = value.to_radians();
|
||||||
let mut e = world.get_entity_mut(entity).unwrap();
|
let mut e = world.get_entity_mut(entity).unwrap();
|
||||||
|
|
||||||
let mut transform = e.get_mut::<Transform>().unwrap();
|
let mut transform = e.get_mut::<Transform>().unwrap();
|
||||||
|
if transform.is_changed() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
let euler = transform.rotation.to_euler(EulerRot::XYZ);
|
let euler = transform.rotation.to_euler(EulerRot::XYZ);
|
||||||
transform.rotation = Quat::from_euler(EulerRot::XYZ, value.parse().unwrap(), euler.1, euler.2);
|
transform.rotation = Quat::from_euler(EulerRot::XYZ, value, euler.1, euler.2);
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
}),
|
}),
|
||||||
@@ -266,20 +304,48 @@ fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Elemen
|
|||||||
tag: "input".to_string(),
|
tag: "input".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("type".to_string(), "number".to_string()),
|
("type".to_string(), "number".to_string()),
|
||||||
("value".to_string(), euler.1.to_string()),
|
("value".to_string(), format!("{:.2}",degrees.1)),
|
||||||
|
("step".to_string(), "0.01".to_string()),
|
||||||
],
|
],
|
||||||
children: vec![],
|
children: vec![],
|
||||||
onchange: None
|
onchange: Some(EntityChangeExecutor::new_boxed(
|
||||||
|
onchange.entity_id,
|
||||||
|
|world : &mut World, entity, value : String| {
|
||||||
|
let Some(mut value) = value.parse::<f32>().ok() else { return; };
|
||||||
|
let mut e = world.get_entity_mut(entity).unwrap();
|
||||||
|
let mut transform = e.get_mut::<Transform>().unwrap();
|
||||||
|
if transform.is_changed() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let value = value.to_radians();
|
||||||
|
let euler = transform.rotation.to_euler(EulerRot::XYZ);
|
||||||
|
transform.rotation = transform.rotation * Quat::from_axis_angle(Vec3::Y, value - euler.1);
|
||||||
|
}
|
||||||
|
))
|
||||||
}),
|
}),
|
||||||
Element::Text("Z: ".to_string()),
|
Element::Text("Z: ".to_string()),
|
||||||
Element::Component(Component {
|
Element::Component(Component {
|
||||||
tag: "input".to_string(),
|
tag: "input".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("type".to_string(), "number".to_string()),
|
("type".to_string(), "number".to_string()),
|
||||||
("value".to_string(), euler.2.to_string()),
|
("value".to_string(), format!("{:.2}",degrees.2)),
|
||||||
|
("step".to_string(), "0.01".to_string()),
|
||||||
],
|
],
|
||||||
children: vec![],
|
children: vec![],
|
||||||
onchange: None
|
onchange: Some(EntityChangeExecutor::new_boxed(
|
||||||
|
onchange.entity_id,
|
||||||
|
|world : &mut World, entity, value : String| {
|
||||||
|
let Some(value) = value.parse::<f32>().ok() else { return; };
|
||||||
|
let value = value.to_radians();
|
||||||
|
let mut e = world.get_entity_mut(entity).unwrap();
|
||||||
|
let mut transform = e.get_mut::<Transform>().unwrap();
|
||||||
|
if transform.is_changed() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let euler = transform.rotation.to_euler(EulerRot::XYZ);
|
||||||
|
transform.rotation = Quat::from_euler(EulerRot::XYZ, euler.0, euler.1, value);
|
||||||
|
}
|
||||||
|
))
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
onchange: None
|
onchange: None
|
||||||
@@ -297,7 +363,8 @@ fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Elemen
|
|||||||
tag: "input".to_string(),
|
tag: "input".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("type".to_string(), "number".to_string()),
|
("type".to_string(), "number".to_string()),
|
||||||
("value".to_string(), vec.x.to_string()),
|
("value".to_string(), format!("{:.2}", vec.x)),
|
||||||
|
("step".to_string(), "0.01".to_string()),
|
||||||
|
|
||||||
],
|
],
|
||||||
children: vec![],
|
children: vec![],
|
||||||
@@ -308,7 +375,8 @@ fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Elemen
|
|||||||
tag: "input".to_string(),
|
tag: "input".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("type".to_string(), "number".to_string()),
|
("type".to_string(), "number".to_string()),
|
||||||
("value".to_string(), vec.y.to_string()),
|
("value".to_string(), format!("{:.2}", vec.y)),
|
||||||
|
("step".to_string(), "0.01".to_string()),
|
||||||
],
|
],
|
||||||
children: vec![],
|
children: vec![],
|
||||||
onchange: Some(Box::new(ReflectValueExecutor::from(onchange.add_path("y"))))
|
onchange: Some(Box::new(ReflectValueExecutor::from(onchange.add_path("y"))))
|
||||||
@@ -318,7 +386,8 @@ fn check_predefined(r : &dyn Reflect, onchange : ReflectChange) -> Option<Elemen
|
|||||||
tag: "input".to_string(),
|
tag: "input".to_string(),
|
||||||
attributes: vec![
|
attributes: vec![
|
||||||
("type".to_string(), "number".to_string()),
|
("type".to_string(), "number".to_string()),
|
||||||
("value".to_string(), vec.z.to_string()),
|
("value".to_string(), format!("{:.2}", vec.z)),
|
||||||
|
("step".to_string(), "0.01".to_string()),
|
||||||
],
|
],
|
||||||
children: vec![],
|
children: vec![],
|
||||||
onchange: Some(Box::new(ReflectValueExecutor::from(onchange.add_path("z"))))
|
onchange: Some(Box::new(ReflectValueExecutor::from(onchange.add_path("z"))))
|
||||||
|
|||||||
Reference in New Issue
Block a user