//! Gameboard view. use graphics::types::Color; use graphics::{Context, Graphics}; use crate::gameboard_controller::GameboardController; pub struct GameboardViewSettings { pub position: [f64; 2], pub size: f64, pub background_color: Color, pub border_color: Color, pub board_edge_color: Color, pub section_edge_color: Color, pub cell_edge_color: Color, pub board_edge_radius: f64, pub section_edge_radius: f64, pub cell_edge_radius: f64, pub selected_cell_background_color: Color, } impl GameboardViewSettings { pub fn new() -> GameboardViewSettings { GameboardViewSettings { position: [10.0; 2], size: 400.0, background_color: [0.8, 0.8, 1.0, 1.0], border_color: [0.0, 0.0, 0.2, 1.0], board_edge_color: [0.0, 0.0, 0.2, 1.0], section_edge_color: [0.0, 0.0, 0.2, 1.0], cell_edge_color: [0.0, 0.0, 0.2, 1.0], board_edge_radius: 3.0, section_edge_radius: 2.0, cell_edge_radius: 1.0, selected_cell_background_color: [0.9, 0.9, 1.0, 1.0], } } } pub struct GameboardView { pub settings: GameboardViewSettings, } impl GameboardView { pub fn new(settings: GameboardViewSettings) -> GameboardView { GameboardView { settings: settings } } pub fn draw(&self, controller: &GameboardController, c: &Context, g: &mut G) { use graphics::{Line, Rectangle}; let ref settings = self.settings; let board_rect = [ settings.position[0], settings.position[1], settings.size, settings.size, ]; Rectangle::new(settings.background_color).draw(board_rect, &c.draw_state, c.transform, g); if let Some(ind) = controller.selected_cell { let cell_size = settings.size / 9.0; let pos = [ind[0] as f64 * cell_size, ind[1] as f64 * cell_size]; let cell_rect = [ settings.position[0] + pos[0], settings.position[1] + pos[1], cell_size, cell_size, ]; Rectangle::new(settings.selected_cell_background_color).draw( cell_rect, &c.draw_state, c.transform, g, ); } let cell_edge = Line::new(settings.cell_edge_color, settings.cell_edge_radius); let section_edge = Line::new(settings.section_edge_color, settings.section_edge_radius); for i in 0..9 { let x = settings.position[0] + i as f64 / 9.0 * settings.size; let y = settings.position[1] + i as f64 / 9.0 * settings.size; let x2 = settings.position[0] + settings.size; let y2 = settings.position[1] + settings.size; let vline = [x, settings.position[1], x, y2]; let hline = [settings.position[0], y, x2, y]; if (i % 3) == 0 { section_edge.draw(vline, &c.draw_state, c.transform, g); section_edge.draw(hline, &c.draw_state, c.transform, g); } else { cell_edge.draw(vline, &c.draw_state, c.transform, g); cell_edge.draw(hline, &c.draw_state, c.transform, g); } } Rectangle::new_border(settings.board_edge_color, settings.board_edge_radius).draw( board_rect, &c.draw_state, c.transform, g, ); } }