implement comment rendering and positioning after resizes
This commit is contained in:
parent
ad360ed96e
commit
e2df4f4bff
2 changed files with 70 additions and 12 deletions
76
src/board.rs
76
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue