diff --git a/src/board.rs b/src/board.rs index 7cfe928..a253178 100644 --- a/src/board.rs +++ b/src/board.rs @@ -1,15 +1,24 @@ +use raylib::{ + color::Color, + drawing::{RaylibDraw, RaylibDrawHandle}, + math::Vector2, +}; use serde::{Deserialize, Serialize}; -use crate::marble_engine::{ - grid::{Grid, ResizeDeltas}, - pos::Pos, - tile::Tile, +use crate::{ + marble_engine::{ + grid::{Grid, ResizeDeltas}, + pos::Pos, + tile::Tile, + }, + theme::TILE_TEXTURE_SIZE, }; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Comment { text: String, - pos: Pos, + x: i32, + y: i32, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -62,9 +71,28 @@ impl Board { } } + pub fn draw_comments(&self, d: &mut RaylibDrawHandle, offset: Vector2, scale: f32) { + let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; + + for c in &self.comments { + let px = c.x * tile_size + offset.x as i32; + let py = c.y * tile_size + offset.y as i32; + d.draw_text(&c.text, px, py, 10 * scale as i32, Color::ORANGE); + } + } + pub fn get_rect(&self, pos: Pos, width: usize, height: usize) -> Self { - // TODO filter for comments in the area - let comments = self.comments.clone(); + let comments = self + .comments + .iter() + .filter(|c| c.in_area(pos, width, height)) + .map(|c| { + let mut c = c.clone(); + c.x -= pos.x as i32; + c.y -= pos.y as i32; + c + }) + .collect(); Self { grid: self.grid.get_rect(pos, width, height), comments, @@ -72,19 +100,36 @@ impl Board { } pub fn paste_board(&mut self, pos: Pos, board: &Board) { - // TODO remove overlapping comments self.grid.paste_grid(pos, &board.grid); - self.comments.extend_from_slice(&board.comments); + for c in &board.comments { + let mut comment = c.clone(); + comment.x += pos.x as i32; + comment.y += pos.y as i32; + self.add_comment(comment); + } + } + + pub fn add_comment(&mut self, comment: Comment) { + if self.comments.iter().any(|c| c == &comment) { + return; + } + self.comments.push(comment); } pub fn grow(&mut self, deltas: &ResizeDeltas) { self.grid.grow(deltas); - // TODO adjust comments + for c in &mut self.comments { + c.x += deltas.x_neg as i32; + c.y += deltas.y_neg as i32; + } } pub fn shrink(&mut self, deltas: &ResizeDeltas) { self.grid.shrink(deltas); - // TODO adjust comments + for c in &mut self.comments { + c.x -= deltas.x_neg as i32; + c.y -= deltas.y_neg as i32; + } } pub fn from_user_str(source: &str) -> Self { @@ -102,3 +147,12 @@ impl Board { self.grid.height() } } + +impl Comment { + fn in_area(&self, pos: Pos, width: usize, height: usize) -> bool { + self.x >= pos.x as i32 + && self.y >= pos.y as i32 + && self.x < pos.x as i32 + width as i32 + && self.y < pos.y as i32 + height as i32 + } +} diff --git a/src/editor.rs b/src/editor.rs index 21d7352..36b50da 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -553,7 +553,7 @@ impl Editor { self.pasting_board = Some(b); } } else if rl.is_key_pressed(KeyboardKey::KEY_Z) { - self.undo() + self.undo(); } else if rl.is_key_pressed(KeyboardKey::KEY_Y) { self.redo(); } @@ -584,6 +584,10 @@ impl Editor { .draw_marble_values(d, textures, self.view_offset, self.zoom); } } + if self.draw_overlay { + self.source_board + .draw_comments(d, self.view_offset, self.zoom); + } } pub fn draw(&mut self, d: &mut RaylibDrawHandle, textures: &Textures) {