shrink board bounds when erasing
This commit is contained in:
parent
af66e68c5f
commit
28a54a231b
2 changed files with 71 additions and 1 deletions
|
@ -130,7 +130,10 @@ impl Editor {
|
||||||
|
|
||||||
fn step(&mut self) {
|
fn step(&mut self) {
|
||||||
self.machine.step();
|
self.machine.step();
|
||||||
if self.level.outputs() == self.machine.output() && self.complete_popup == Popup::Start {
|
if !self.level.outputs().is_empty()
|
||||||
|
&& self.level.outputs() == self.machine.output()
|
||||||
|
&& self.complete_popup == Popup::Start
|
||||||
|
{
|
||||||
self.complete_popup = Popup::Visible;
|
self.complete_popup = Popup::Visible;
|
||||||
self.exit_state = ExitState::Save;
|
self.exit_state = ExitState::Save;
|
||||||
self.sim_state = SimState::Stepping;
|
self.sim_state = SimState::Stepping;
|
||||||
|
@ -190,6 +193,9 @@ impl Editor {
|
||||||
fn set_tile(&mut self, pos: Pos, tile: Tile) {
|
fn set_tile(&mut self, pos: Pos, tile: Tile) {
|
||||||
self.source_board.grow_to_include(pos);
|
self.source_board.grow_to_include(pos);
|
||||||
self.source_board.set(pos, tile);
|
self.source_board.set(pos, tile);
|
||||||
|
if tile.is_blank() {
|
||||||
|
self.source_board.trim_size();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self, rl: &RaylibHandle) {
|
pub fn update(&mut self, rl: &RaylibHandle) {
|
||||||
|
|
|
@ -204,6 +204,70 @@ impl Board {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn trim_size(&mut self) {
|
||||||
|
{
|
||||||
|
let mut top_blanks = 0;
|
||||||
|
while top_blanks < self.height && self.rows[top_blanks].iter().all(Tile::is_blank) {
|
||||||
|
top_blanks += 1;
|
||||||
|
}
|
||||||
|
let trim_top = top_blanks.saturating_sub(2);
|
||||||
|
for _ in 0..trim_top {
|
||||||
|
self.rows.remove(0);
|
||||||
|
}
|
||||||
|
self.offset_y -= trim_top as isize;
|
||||||
|
self.height -= trim_top;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let mut bottom_blanks = 0;
|
||||||
|
while bottom_blanks < self.height
|
||||||
|
&& self.rows[self.height - bottom_blanks - 1]
|
||||||
|
.iter()
|
||||||
|
.all(Tile::is_blank)
|
||||||
|
{
|
||||||
|
bottom_blanks += 1;
|
||||||
|
}
|
||||||
|
let trim_bottom = bottom_blanks.saturating_sub(2);
|
||||||
|
for _ in 0..trim_bottom {
|
||||||
|
self.rows.pop();
|
||||||
|
}
|
||||||
|
self.height -= trim_bottom;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let mut left_blanks = 0;
|
||||||
|
while left_blanks < self.width
|
||||||
|
&& self.rows.iter().all(|row| row[left_blanks].is_blank())
|
||||||
|
{
|
||||||
|
left_blanks += 1;
|
||||||
|
}
|
||||||
|
let trim_left = left_blanks.saturating_sub(2);
|
||||||
|
for row in &mut self.rows {
|
||||||
|
for _ in 0..trim_left {
|
||||||
|
row.remove(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.offset_x -= trim_left as isize;
|
||||||
|
self.width -= trim_left;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let mut right_blanks = 0;
|
||||||
|
while right_blanks < self.height
|
||||||
|
&& self
|
||||||
|
.rows
|
||||||
|
.iter()
|
||||||
|
.all(|row| row[self.width - right_blanks - 1].is_blank())
|
||||||
|
{
|
||||||
|
right_blanks += 1;
|
||||||
|
}
|
||||||
|
let trim_right = right_blanks.saturating_sub(2);
|
||||||
|
for row in &mut self.rows {
|
||||||
|
for _ in 0..trim_right {
|
||||||
|
row.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.width -= trim_right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn width(&self) -> usize {
|
pub fn width(&self) -> usize {
|
||||||
self.width
|
self.width
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue