diff options
Diffstat (limited to 'src/map')
| -rw-r--r-- | src/map/icon.rs | 28 | ||||
| -rw-r--r-- | src/map/mappable.rs | 7 | ||||
| -rw-r--r-- | src/map/mod.rs | 6 | ||||
| -rw-r--r-- | src/map/polygon_room.rs | 25 | ||||
| -rw-r--r-- | src/map/rect_room.rs | 25 | ||||
| -rw-r--r-- | src/map/wall.rs | 43 |
6 files changed, 93 insertions, 41 deletions
diff --git a/src/map/icon.rs b/src/map/icon.rs index 50e1906..f623c98 100644 --- a/src/map/icon.rs +++ b/src/map/icon.rs @@ -1,9 +1,9 @@ use super::icon_renderer::IconRenderer; +use crate::colours::DEFAULT_COLOURS; use crate::map::Mappable; -use crate::math::{Vec2, Rect}; +use crate::math::{Rect, Vec2}; use crate::transform::Transform; use raylib::core::drawing::{RaylibDraw, RaylibDrawHandle}; -use raylib::ffi::Color; use serde::{Deserialize, Serialize}; use std::ops::{Deref, DerefMut}; use std::rc::Rc; @@ -21,6 +21,7 @@ pub struct IconData { #[derive(Clone)] pub struct Icon { data: IconData, + selected: bool, renderer: Rc<IconRenderer>, } @@ -37,7 +38,11 @@ impl Icon { } pub fn from_data(data: IconData, renderer: Rc<IconRenderer>) -> Self { - Self { data, renderer } + Self { + data, + selected: false, + renderer, + } } } @@ -54,15 +59,22 @@ impl Mappable for Icon { position_px, self.rotation as f32, (transform.pixels_per_m() / info.pixels_per_m) as f32, - Color { - r: 255, - g: 255, - b: 255, - a: 255, + if self.selected() { + DEFAULT_COLOURS.icon_selected + } else { + DEFAULT_COLOURS.icon_normal }, ); } + fn set_selected(&mut self, selected: bool) { + self.selected = selected; + } + + fn selected(&self) -> bool { + self.selected + } + fn bounding_rect(&self) -> Rect<f64> { Rect::new(self.data.position.x, self.data.position.y, 0., 0.) } diff --git a/src/map/mappable.rs b/src/map/mappable.rs index f75c990..b348c4b 100644 --- a/src/map/mappable.rs +++ b/src/map/mappable.rs @@ -11,6 +11,13 @@ pub trait Mappable { /// this must always be implemented. fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform); + /// Set the selection status of this item. If it is selected, actions that concern all selected + /// items will be applied to this item as well. + fn set_selected(&mut self, selected: bool); + + /// Get if this item is currently selected. + fn selected(&self) -> bool; + /// Get the rectangle that contains the mappable object in its entirety without excess. fn bounding_rect(&self) -> Rect<f64>; diff --git a/src/map/mod.rs b/src/map/mod.rs index 93f51a2..ff03474 100644 --- a/src/map/mod.rs +++ b/src/map/mod.rs @@ -75,7 +75,7 @@ impl Map { } pub fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { - for element in self.iter() { + for element in self.elements() { element.draw(rld, transform); } } @@ -98,7 +98,7 @@ impl Map { /// Iterator over all elements as objects when an operation needs to go over all elements of the /// map. - pub fn iter(&self) -> impl Iterator<Item = &dyn Mappable> { + pub fn elements(&self) -> impl Iterator<Item = &dyn Mappable> { self.rect_rooms .iter() .map(|r| r as &dyn Mappable) @@ -107,7 +107,7 @@ impl Map { .chain(self.icons.iter().map(|i| i as &dyn Mappable)) } - pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut dyn Mappable> { + pub fn elements_mut(&mut self) -> impl Iterator<Item = &mut dyn Mappable> { self.rect_rooms .iter_mut() .map(|r| r as &mut dyn Mappable) diff --git a/src/map/polygon_room.rs b/src/map/polygon_room.rs index 12c480b..a209a7c 100644 --- a/src/map/polygon_room.rs +++ b/src/map/polygon_room.rs @@ -1,9 +1,9 @@ use super::Mappable; -use crate::math::{self, Rect, Polygon, Triangle, Vec2}; +use crate::colours::DEFAULT_COLOURS; +use crate::math::{self, Polygon, Rect, Triangle, Vec2}; use crate::scaleable::Scaleable; use crate::transform::Transform; use raylib::drawing::{RaylibDraw, RaylibDrawHandle}; -use raylib::ffi::Color; pub type PolygonRoomData = Polygon<f64>; @@ -11,13 +11,15 @@ pub struct PolygonRoom { data: PolygonRoomData, // The polygon shape, but in triangles, so the polygon does not have to be triangulated every frame. triangulated: Vec<Triangle<f64>>, + selected: bool, } impl PolygonRoom { pub fn from_data(data: PolygonRoomData) -> Self { Self { data: data.clone(), - triangulated: math::triangulate(data) + triangulated: math::triangulate(data), + selected: false, } } @@ -33,16 +35,23 @@ impl Mappable for PolygonRoom { transform.point_m_to_px(&triangle.corners()[0]), transform.point_m_to_px(&triangle.corners()[1]), transform.point_m_to_px(&triangle.corners()[2]), - Color { - r: 180, - g: 180, - b: 180, - a: 255, + if self.selected() { + DEFAULT_COLOURS.room_selected + } else { + DEFAULT_COLOURS.room_normal }, ) } } + fn set_selected(&mut self, selected: bool) { + self.selected = selected; + } + + fn selected(&self) -> bool { + self.selected + } + fn bounding_rect(&self) -> Rect<f64> { Rect::bounding_rect_n(&self.data.corners()) } diff --git a/src/map/rect_room.rs b/src/map/rect_room.rs index 07f201c..5008c63 100644 --- a/src/map/rect_room.rs +++ b/src/map/rect_room.rs @@ -1,9 +1,9 @@ +use crate::colours::DEFAULT_COLOURS; use crate::map::Mappable; use crate::math::{Rect, Vec2}; use crate::scaleable::Scaleable; use crate::transform::Transform; use raylib::drawing::{RaylibDraw, RaylibDrawHandle}; -use raylib::ffi::Color; use serde::Serialize; use std::ops::{Deref, DerefMut}; @@ -12,11 +12,15 @@ pub type RectRoomData = Rect<f64>; #[derive(Serialize)] pub struct RectRoom { data: RectRoomData, + selected: bool, } impl RectRoom { pub fn from_data(data: RectRoomData) -> Self { - RectRoom { data } + RectRoom { + data, + selected: false, + } } } @@ -24,15 +28,22 @@ impl Mappable for RectRoom { fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { rld.draw_rectangle_rec( transform.rect_m_to_px(&self.data), - Color { - r: 180, - g: 180, - b: 180, - a: 255, + if self.selected() { + DEFAULT_COLOURS.room_selected + } else { + DEFAULT_COLOURS.room_normal }, ); } + fn set_selected(&mut self, selected: bool) { + self.selected = selected; + } + + fn selected(&self) -> bool { + self.selected + } + fn bounding_rect(&self) -> Rect<f64> { self.data.clone() } diff --git a/src/map/wall.rs b/src/map/wall.rs index 6c90fda..22393bb 100644 --- a/src/map/wall.rs +++ b/src/map/wall.rs @@ -1,15 +1,16 @@ use super::Mappable; -use crate::math::{LineSegment, Vec2, Rect}; +use crate::colours::DEFAULT_COLOURS; +use crate::math::{LineSegment, Rect, Vec2}; use crate::scaleable::Scaleable; use crate::transform::Transform; use raylib::drawing::{RaylibDraw, RaylibDrawHandle}; -use raylib::ffi::Color; use std::ops::{Deref, DerefMut}; pub type WallData = LineSegment<f64>; pub struct Wall { data: WallData, + selected: bool, round_start: bool, round_end: bool, } @@ -18,6 +19,7 @@ impl Wall { pub fn from_data(data: WallData, round_start: bool, round_end: bool) -> Self { Self { data, + selected: false, round_start, round_end, } @@ -28,15 +30,19 @@ impl Wall { } } -fn draw_round_corner(rld: &mut RaylibDrawHandle, pos_px: Vec2<f64>, transform: &Transform) { +fn draw_round_corner( + rld: &mut RaylibDrawHandle, + pos_px: Vec2<f64>, + transform: &Transform, + selected: bool, +) { rld.draw_circle_v( pos_px, transform.length_m_to_px(0.05) as f32, - Color { - r: 200, - g: 120, - b: 120, - a: 255, + if selected { + DEFAULT_COLOURS.wall_selected + } else { + DEFAULT_COLOURS.wall_normal }, ); } @@ -49,22 +55,29 @@ impl Mappable for Wall { start_px, end_px, transform.length_m_to_px(0.1) as f32, - Color { - r: 200, - g: 120, - b: 120, - a: 255, + if self.selected() { + DEFAULT_COLOURS.wall_selected + } else { + DEFAULT_COLOURS.wall_normal }, ); if self.round_start { - draw_round_corner(rld, start_px, transform); + draw_round_corner(rld, start_px, transform, self.selected()); } if self.round_end { - draw_round_corner(rld, end_px, transform); + draw_round_corner(rld, end_px, transform, self.selected()); } } + fn set_selected(&mut self, selected: bool) { + self.selected = selected; + } + + fn selected(&self) -> bool { + self.selected + } + fn bounding_rect(&self) -> Rect<f64> { Rect::bounding_rect(self.data.start, self.data.end) } |
