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,
}
);
}
}
+9 -10
View File
@@ -22,8 +22,8 @@ use web_sys::{
use editor_runtime::attachment_upload::dispatch_editor_upload_request;
use editor_runtime::block_dnd::{
drop_indicator_top, drop_placement_from_block_point, event_target_from_point,
pointer_in_handle_corridor_geometry, HandleCorridorGeometry,
drop_indicator_from_geometry, event_target_from_point, pointer_in_handle_corridor_geometry,
HandleCorridorGeometry,
};
use editor_runtime::block_menu_overlay;
use editor_runtime::block_menu_legacy_html::{
@@ -5419,14 +5419,13 @@ fn drop_indicator_from_target(
let stage = editor_stage_element()?;
let block_rect = block.get_bounding_client_rect();
let stage_rect = stage.get_bounding_client_rect();
let placement = drop_placement_from_block_point(client_y, block_rect.top(), block_rect.height());
let top = drop_indicator_top(stage_rect.top(), block_rect.top(), block_rect.bottom(), placement);
Some(DropIndicatorState {
index: hovered.index,
top,
placement,
})
Some(drop_indicator_from_geometry(
hovered.index,
block_rect.top(),
block_rect.height(),
stage_rect.top(),
client_y,
))
}
fn drop_indicator_from_point(client_x: i32, client_y: i32) -> Option<DropIndicatorState> {