refactor: extract drop indicator geometry

This commit is contained in:
lix-2026
2026-05-25 05:06:28 +08:00
parent 63d1ea7e47
commit dddf9eb9c1
5 changed files with 61 additions and 12 deletions
@@ -3,7 +3,7 @@
//! 本模块只承接拖拽命中所需的窄 helper,不处理 Leptos signal
//! 也不分发 editor command;调用方负责保留编辑器状态编排。
use crate::editor_runtime::block_hover_state::DropPlacement;
use crate::editor_runtime::block_hover_state::{DropIndicatorState, DropPlacement};
use web_sys::{window, EventTarget};
pub(crate) struct HandleCorridorGeometry {
@@ -57,6 +57,23 @@ pub(crate) fn drop_indicator_top(
}
}
pub(crate) fn drop_indicator_from_geometry(
block_index: usize,
block_top: f64,
block_height: f64,
stage_top: f64,
client_y: i32,
) -> DropIndicatorState {
let placement = drop_placement_from_block_point(client_y, block_top, block_height);
let block_bottom = block_top + block_height;
let top = drop_indicator_top(stage_top, block_top, block_bottom, placement);
DropIndicatorState {
index: block_index,
top,
placement,
}
}
pub(crate) fn event_target_from_point(client_x: i32, client_y: i32) -> Option<EventTarget> {
window()
.and_then(|win| win.document())
@@ -97,4 +114,24 @@ mod tests {
DropPlacement::After
);
}
#[test]
fn drop_indicator_geometry_returns_stage_relative_top() {
assert_eq!(
drop_indicator_from_geometry(3, 140.0, 40.0, 100.0, 150),
DropIndicatorState {
index: 3,
top: 40.0,
placement: DropPlacement::Before,
}
);
assert_eq!(
drop_indicator_from_geometry(3, 140.0, 40.0, 100.0, 161),
DropIndicatorState {
index: 3,
top: 80.0,
placement: DropPlacement::After,
}
);
}
}