added indicators for hovering over corredors
This commit is contained in:
+29
-2
@@ -32,6 +32,7 @@ struct DungeonApp {
|
|||||||
add_corridor_drag: Option<AddCorridorDrag>,
|
add_corridor_drag: Option<AddCorridorDrag>,
|
||||||
resize_state: Option<RoomResizeState>,
|
resize_state: Option<RoomResizeState>,
|
||||||
hover_room_idx: Option<usize>,
|
hover_room_idx: Option<usize>,
|
||||||
|
hover_corridor_idx: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for DungeonApp {
|
impl Default for DungeonApp {
|
||||||
@@ -60,6 +61,7 @@ impl Default for DungeonApp {
|
|||||||
add_corridor_drag: None,
|
add_corridor_drag: None,
|
||||||
resize_state: None,
|
resize_state: None,
|
||||||
hover_room_idx: None,
|
hover_room_idx: None,
|
||||||
|
hover_corridor_idx: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -170,7 +172,7 @@ impl eframe::App for DungeonApp {
|
|||||||
let (response, painter) = ui.allocate_painter(available, egui::Sense::click_and_drag());
|
let (response, painter) = ui.allocate_painter(available, egui::Sense::click_and_drag());
|
||||||
let canvas = response.rect.shrink(12.0);
|
let canvas = response.rect.shrink(12.0);
|
||||||
let geometry = draw_grid(&painter, canvas, self.settings.cols, self.settings.rows);
|
let geometry = draw_grid(&painter, canvas, self.settings.cols, self.settings.rows);
|
||||||
self.update_hover_room(ctx, &geometry);
|
self.update_hover_targets(ctx, &geometry);
|
||||||
let resizing = self.handle_resize(ctx, &response, &geometry);
|
let resizing = self.handle_resize(ctx, &response, &geometry);
|
||||||
if !resizing {
|
if !resizing {
|
||||||
self.handle_drag(ctx, &response, &geometry);
|
self.handle_drag(ctx, &response, &geometry);
|
||||||
@@ -190,6 +192,7 @@ impl eframe::App for DungeonApp {
|
|||||||
);
|
);
|
||||||
self.draw_add_overlay(&painter, &geometry);
|
self.draw_add_overlay(&painter, &geometry);
|
||||||
self.draw_resize_overlay(&painter, &geometry);
|
self.draw_resize_overlay(&painter, &geometry);
|
||||||
|
self.draw_corridor_hover_overlay(&painter, &geometry);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -545,15 +548,22 @@ impl DungeonApp {
|
|||||||
self.refresh_doors();
|
self.refresh_doors();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_hover_room(&mut self, ctx: &egui::Context, geometry: &GridGeometry) {
|
fn update_hover_targets(&mut self, ctx: &egui::Context, geometry: &GridGeometry) {
|
||||||
let Some(pointer_pos) = ctx.pointer_hover_pos() else {
|
let Some(pointer_pos) = ctx.pointer_hover_pos() else {
|
||||||
self.hover_room_idx = None;
|
self.hover_room_idx = None;
|
||||||
|
self.hover_corridor_idx = None;
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
if let Some((room_idx, _, _)) = self.room_at_pointer(pointer_pos, geometry) {
|
if let Some((room_idx, _, _)) = self.room_at_pointer(pointer_pos, geometry) {
|
||||||
self.hover_room_idx = Some(room_idx);
|
self.hover_room_idx = Some(room_idx);
|
||||||
|
self.hover_corridor_idx = None;
|
||||||
} else {
|
} else {
|
||||||
self.hover_room_idx = None;
|
self.hover_room_idx = None;
|
||||||
|
if let Some(corridor_drag) = self.corridor_drag_at_pointer(pointer_pos, geometry) {
|
||||||
|
self.hover_corridor_idx = Some(corridor_drag.corridor_index);
|
||||||
|
} else {
|
||||||
|
self.hover_corridor_idx = None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -750,6 +760,23 @@ impl DungeonApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn draw_corridor_hover_overlay(&self, painter: &egui::Painter, geometry: &GridGeometry) {
|
||||||
|
let Some(idx) = self.hover_corridor_idx else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let Some(corridor) = self.layout.corridors.get(idx) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let color = Color32::from_gray(170);
|
||||||
|
let stroke = Stroke::new(2.0, color);
|
||||||
|
for pair in corridor.path.windows(2) {
|
||||||
|
let a = cell_center(geometry, pair[0].0, pair[0].1);
|
||||||
|
let b = cell_center(geometry, pair[1].0, pair[1].1);
|
||||||
|
draw_dashed_line(painter, a, b, stroke, 6.0, 6.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn delete_at_pointer(&mut self, pointer_pos: egui::Pos2, geometry: &GridGeometry) {
|
fn delete_at_pointer(&mut self, pointer_pos: egui::Pos2, geometry: &GridGeometry) {
|
||||||
if let Some((room_idx, _, _)) = self.room_at_pointer(pointer_pos, geometry) {
|
if let Some((room_idx, _, _)) = self.room_at_pointer(pointer_pos, geometry) {
|
||||||
self.delete_room(room_idx);
|
self.delete_room(room_idx);
|
||||||
|
|||||||
Reference in New Issue
Block a user