From 84a2475799b711b3bd460bc283d0abb27b9014fd Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 2 Apr 2021 10:15:17 +0530 Subject: statusline with container primitives, draw brush preview --- src/app.rs | 86 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/src/app.rs b/src/app.rs index 377c613..1b192df 100644 --- a/src/app.rs +++ b/src/app.rs @@ -11,6 +11,7 @@ use crate::{ symmetry::Symmetry, undo::{ModifyRecord, OpKind, PaintRecord, UndoStack}, utils::{draw_text, handle_error, is_copy_event, is_paste_event, load_script}, + widget::{Container, HorAlign, Offset, Size, VertAlign}, }; use std::{ @@ -326,48 +327,71 @@ impl<'ctx> AppState<'ctx> { } fn draw_statusline(&mut self) { - let (winsize_x, winsize_y) = self.canvas.window().size(); - let status_height: u32 = 20; - let status_width = winsize_x; + let container = Container::new(Offset::Left(0), Offset::Bottom(40), &self.canvas) + .width(Size::Max, &self.canvas) + .height(Size::Absolute(20), &self.canvas); self.canvas.set_draw_color(WHITE); - self.canvas - .fill_rect(rect!( - 0, - winsize_y - status_height - 20, - status_width, - status_height - )) - .unwrap(); + self.canvas.fill_rect(container.area()).unwrap(); + + let mut padding_box = Container::uninit() + .width(Size::Absolute(18), &self.canvas) + .height(Size::Absolute(18), &self.canvas); + + let mut primary = Container::uninit() + .width(Size::Absolute(16), &self.canvas) + .height(Size::Absolute(16), &self.canvas); + + container.place(&mut padding_box, HorAlign::Right, VertAlign::Center); + padding_box.place(&mut primary, HorAlign::Center, VertAlign::Center); + + self.canvas.set_draw_color(if !self.active_color { WHITE } else { BLACK }); + self.canvas.fill_rect(primary.area()).unwrap(); + self.canvas.set_draw_color(if self.active_color { WHITE } else { BLACK }); + + let brush_box = (0..8) + .map(|x| (0..8).map(|y| (x, y).into()).collect::>()) + .flatten() + .filter(|&pt| dither::bayer(self.dither_level, pt)) + .collect::>(); + + for pt in brush_box { + let canvas_pt = Point::from(primary.start) + + Point::from((pt.x as i32 * 2, pt.y as i32 * 2)); + self.canvas.fill_rect(rect!(canvas_pt.x(), canvas_pt.y(), 2, 2)).unwrap(); + } + + // self.canvas + // .set_draw_color(if self.active_color { WHITE } else { BLACK }); + // self.canvas + // .fill_rect(Rect::from_center(primary.area().center(), 12, 12)) + // .unwrap(); + let mouse_coords = if let Some((x, y)) = self.idx_at_coord(self.mouse) { format!("{:3}, {:3}", x + 1, y + 1) } else { format!("---, ---") }; let status_text = format!( - "[DITHER {}][SYM {}][PT {}][ACTIVE {}][KIND {}]", - self.dither_level, - self.symmetry, - mouse_coords, - if self.active_color { "WHT" } else { "BLK" }, - self.brush + "[DITHER {}][PT {}][KIND {}]", + self.dither_level, mouse_coords, self.brush ); draw_text( &mut self.canvas, self.ttf_context, status_text, BLACK, - (0, winsize_y - status_height - 20), + container.start, ); } fn draw_command_box(&mut self) { - let (winsize_x, winsize_y) = self.canvas.window().size(); - let cmd_height: u32 = 20; - let cmd_width = winsize_x; + let container = Container::new(Offset::Left(0), Offset::Bottom(20), &self.canvas) + .width(Size::Max, &self.canvas) + .height(Size::Absolute(20), &self.canvas); + self.canvas.set_draw_color(BLACK); - self.canvas - .fill_rect(rect!(0, winsize_y - cmd_height, cmd_width, cmd_height)) - .unwrap(); + self.canvas.fill_rect(container.area()).unwrap(); + if self.command_box.is_empty() { self.mode = Mode::Draw; // show msg @@ -376,7 +400,7 @@ impl<'ctx> AppState<'ctx> { self.ttf_context, &self.message.text[..], self.message.kind.into(), - (0, winsize_y - cmd_height), + container.start, ); return; } @@ -386,7 +410,7 @@ impl<'ctx> AppState<'ctx> { self.ttf_context, &self.command_box.text[..], WHITE, - (0, winsize_y - cmd_height), + container.start, ); self.canvas.set_draw_color(PINK); @@ -397,14 +421,14 @@ impl<'ctx> AppState<'ctx> { let prev_text_dim = font.size_of_latin1(prev_text.as_bytes()).unwrap(); let cursor = rect!( prev_text_dim.0, - winsize_y - cmd_height + 2, + container.start.1 + 2, 2, - cmd_height - 4 + container.height - 4 ); self.canvas.fill_rect(cursor).unwrap(); } - fn draw_mouse(&mut self) { + fn draw_brush(&mut self) { let cs = self.zoom as u32; let pt = self.idx_at_coord(self.mouse); if matches!(self.brush, Brush::Circle { .. } | Brush::Line { .. }) { @@ -434,7 +458,7 @@ impl<'ctx> AppState<'ctx> { self.ttf_context, format!("{}°", positive_angle_with_x(from, to.into())), PINK, - (self.mouse.0 as u32 + size, self.mouse.1 as u32 + size), + (self.mouse.0 + size as i32, self.mouse.1 + size as i32), ); for MapPoint { x, y } in line.into_iter() { self.canvas.set_draw_color(PINK); @@ -499,7 +523,7 @@ impl<'ctx> AppState<'ctx> { self.draw_symmetry(); self.draw_statusline(); self.draw_command_box(); - self.draw_mouse(); + self.draw_brush(); } fn redraw(&mut self) { -- cgit v1.2.3