refactor: extract drop indicator geometry
This commit is contained in:
@@ -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,
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user