fix(tahuantinsuyu): crash al abrir modal + simplificación de anillos
- Crash fix (panic en gpui entity_map.rs:138 / double_lease): `render_chart_form` hacía `cx.entity().read(cx)` mientras estaba dentro del `render()` del tree — la entity ya estaba leased como `&mut self` y un read concurrente disparaba el double_lease_panic. Se cambió la firma para recibir `picker_open` y `city_atlas` como parámetros desde `render_modal` (que sí tiene `&self`). - Simplificación de anillos: el carril de planetas se acerca (bodies 0.60·r / bodies_inner 0.57·r) — antes 0.05 de separación, ahora 0.03, se ve como "carril" en lugar de dos anillos sueltos. El stroke visible del círculo de aspectos se elimina — `radii.aspects` queda solo como punto de anclaje para las líneas. El `bodies_inner` cambia a stroke plano más sutil (no 3D) para no competir con `bodies`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1370,12 +1370,24 @@ impl TahuantinsuyuTree {
|
||||
input.clone(),
|
||||
"Enter = crear — Escape = cancelar",
|
||||
),
|
||||
Modal::CreateChart { form, error, .. } => {
|
||||
render_chart_form(theme, "Nueva carta natal", form, error.clone(), cx)
|
||||
}
|
||||
Modal::EditChart { form, error, .. } => {
|
||||
render_chart_form(theme, "Editar carta natal", form, error.clone(), cx)
|
||||
}
|
||||
Modal::CreateChart { form, error, .. } => render_chart_form(
|
||||
theme,
|
||||
"Nueva carta natal",
|
||||
form,
|
||||
error.clone(),
|
||||
self.city_picker_open,
|
||||
&self.city_atlas,
|
||||
cx,
|
||||
),
|
||||
Modal::EditChart { form, error, .. } => render_chart_form(
|
||||
theme,
|
||||
"Editar carta natal",
|
||||
form,
|
||||
error.clone(),
|
||||
self.city_picker_open,
|
||||
&self.city_atlas,
|
||||
cx,
|
||||
),
|
||||
};
|
||||
|
||||
div()
|
||||
@@ -1454,6 +1466,12 @@ fn render_chart_form(
|
||||
title: &str,
|
||||
form: &ChartForm,
|
||||
error: Option<SharedString>,
|
||||
// Datos del tree que el form necesita renderizar — recibidos por
|
||||
// parámetro porque esta función se llama desde `render()` y la
|
||||
// entity del tree ya está leased; un `cx.entity().read(cx)`
|
||||
// adentro causa double_lease_panic en gpui.
|
||||
picker_open: bool,
|
||||
city_atlas: &[CityPreset],
|
||||
cx: &mut Context<'_, TahuantinsuyuTree>,
|
||||
) -> gpui::Div {
|
||||
let labeled = |label: &'static str, input: Entity<TextInput>| -> gpui::Div {
|
||||
@@ -1526,10 +1544,6 @@ fn render_chart_form(
|
||||
|
||||
// Header del form: title + botón "Ciudad rápida" con dropdown
|
||||
// que autocompleta place/lat/lon/tz al elegir un preset.
|
||||
let (picker_open, atlas_snapshot) = {
|
||||
let me = cx.entity().read(cx);
|
||||
(me.city_picker_open, me.city_atlas.clone())
|
||||
};
|
||||
let city_btn = div()
|
||||
.id("tts-form-city-btn")
|
||||
.px(px(10.0))
|
||||
@@ -1580,7 +1594,7 @@ fn render_chart_form(
|
||||
.flex()
|
||||
.flex_col()
|
||||
.overflow_y_scroll();
|
||||
for preset in atlas_snapshot.iter().cloned() {
|
||||
for preset in city_atlas.iter().cloned() {
|
||||
let row_id: SharedString =
|
||||
SharedString::from(format!("tts-city-{}", preset.name));
|
||||
let label = preset.name.clone();
|
||||
|
||||
Reference in New Issue
Block a user