Advertisement
loloof64

chess_board.rs

Aug 11th, 2022
1,429
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 6.23 KB | None | 0 0
  1. use pleco::{board::Board, Piece, File, Player, Rank, SQ};
  2. use vizia::prelude::*;
  3. use super::svg_zone::SvgZone;
  4.  
  5. #[derive(Default, Lens)]
  6. pub struct ChessBoard {
  7.     board_state: Board,
  8. }
  9.  
  10. impl ChessBoard {
  11.     pub fn new<'a>(cx: &'a mut Context /* todo pass init parameters */) -> Handle<'a, Self> {
  12.        Self {
  13.            board_state: Board::from_fen(
  14.                "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2",
  15.            )
  16.            .expect("Bad fen position."),
  17.        }
  18.        .build(cx, |cx| {
  19.            let turn_color = ChessBoard::board_state.map(|board_state| {
  20.                let turn = board_state.turn();
  21.                if turn == Player::White {
  22.                    Color::white()
  23.                } else {
  24.                    Color::black()
  25.                }
  26.            });
  27.            HStack::new(cx, |cx| {
  28.                for i in 0..9 {
  29.                    for j in 0..9 {
  30.                        let bg_color = if i > 0 && i < 9 && j > 0 && j < 9 {
  31.                            if (i % 2 == 0) ^ (j % 2 == 0) {
  32.                                Color::rgb(125, 47, 31)
  33.                            } else {
  34.                                Color::rgb(200, 200, 120)
  35.                            }
  36.                        } else {
  37.                            Color::rgb(20, 60, 200)
  38.                        };
  39.                        HStack::new(cx, |cx| {
  40.                            if i > 0 && i < 9 && j > 0 && j < 9 {
  41.                                let file = i - 1;
  42.                                let rank = 9 - j;
  43.                                let pleco_file = build_file(file).unwrap();
  44.                                let pleco_rank = build_rank(rank).unwrap();
  45.                                let square = SQ::make(pleco_file, pleco_rank);
  46.                                let piece = ChessBoard::board_state.get(cx).piece_at_sq(square);
  47.  
  48.                                if piece != Piece::None {
  49.                                    get_image_from_piece(cx, piece, 30.0).unwrap();
  50.                                }
  51.                            }
  52.                        })
  53.                        .col_index(i)
  54.                        .row_index(j)
  55.                        .background_color(bg_color);
  56.                    }
  57.                }
  58.  
  59.                Element::new(cx)
  60.                    .col_index(9)
  61.                    .row_index(9)
  62.                    .background_color(turn_color)
  63.                    .border_radius(Percentage(50.0));
  64.            })
  65.            .layout_type(LayoutType::Grid)
  66.            .grid_rows(vec![
  67.                Stretch(1.0),
  68.                Stretch(2.0),
  69.                Stretch(2.0),
  70.                Stretch(2.0),
  71.                Stretch(2.0),
  72.                Stretch(2.0),
  73.                Stretch(2.0),
  74.                Stretch(2.0),
  75.                Stretch(2.0),
  76.                Stretch(1.0),
  77.            ])
  78.            .grid_cols(vec![
  79.                Stretch(1.0),
  80.                Stretch(2.0),
  81.                Stretch(2.0),
  82.                Stretch(2.0),
  83.                Stretch(2.0),
  84.                Stretch(2.0),
  85.                Stretch(2.0),
  86.                Stretch(2.0),
  87.                Stretch(2.0),
  88.                Stretch(1.0),
  89.            ])
  90.            .background_color(Color::rgb(20, 60, 200));
  91.        })
  92.        .focusable(false)
  93.    }
  94. }
  95.  
  96. impl View for ChessBoard {
  97.    fn event(&mut self, cx: &mut EventContext, event: &mut Event) {
  98.        event.map(|window_event, meta| match window_event {
  99.            WindowEvent::TriggerDown { .. } => {}
  100.  
  101.            WindowEvent::TriggerUp { .. } => {}
  102.  
  103.            _ => {}
  104.        });
  105.    }
  106. }
  107.  
  108. fn build_file(file: u8) -> Result<File, String> {
  109.    match file {
  110.        0 => Ok(File::A),
  111.        1 => Ok(File::B),
  112.        2 => Ok(File::C),
  113.        3 => Ok(File::D),
  114.        4 => Ok(File::E),
  115.        5 => Ok(File::F),
  116.        6 => Ok(File::G),
  117.        7 => Ok(File::H),
  118.        _ => Err(format!("Not available file {}.", file)),
  119.    }
  120. }
  121.  
  122. fn build_rank(rank: u8) -> Result<Rank, String> {
  123.    match rank {
  124.        0 => Ok(Rank::R1),
  125.        1 => Ok(Rank::R2),
  126.        2 => Ok(Rank::R3),
  127.        3 => Ok(Rank::R4),
  128.        4 => Ok(Rank::R5),
  129.        5 => Ok(Rank::R6),
  130.        6 => Ok(Rank::R7),
  131.        7 => Ok(Rank::R8),
  132.        _ => Err(format!("Not available rank {}.", rank)),
  133.    }
  134. }
  135.  
  136. fn get_image_from_piece(cx: &mut Context, piece: Piece, sizePx: f32) -> Option<Handle<SvgZone>> {
  137.    match piece {
  138.        Piece::WhitePawn => {
  139.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_plt45.svg")).size(Pixels(sizePx)))
  140.        },
  141.        Piece::WhiteKnight => {
  142.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_nlt45.svg")).size(Pixels(sizePx)))
  143.        },
  144.        Piece::WhiteBishop => {
  145.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_blt45.svg")).size(Pixels(sizePx)))
  146.        },
  147.        Piece::WhiteRook => {
  148.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_rlt45.svg")).size(Pixels(sizePx)))
  149.        },
  150.        Piece::WhiteQueen => {
  151.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_qlt45.svg")).size(Pixels(sizePx)))
  152.        },
  153.        Piece::WhiteKing => {
  154.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_klt45.svg")).size(Pixels(sizePx)))
  155.        },
  156.  
  157.        Piece::BlackPawn => {
  158.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_pdt45.svg")).size(Pixels(sizePx)))
  159.        },
  160.        Piece::BlackKnight => {
  161.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_ndt45.svg")).size(Pixels(sizePx)))
  162.        },
  163.        Piece::BlackBishop => {
  164.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_bdt45.svg")).size(Pixels(sizePx)))
  165.        },
  166.        Piece::BlackRook => {
  167.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_rdt45.svg")).size(Pixels(sizePx)))
  168.        },
  169.        Piece::BlackQueen => {
  170.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_qdt45.svg")).size(Pixels(sizePx)))
  171.        },
  172.        Piece::BlackKing => {
  173.            Some(SvgZone::new(cx, include_bytes!("./vectors/Chess_kdt45.svg")).size(Pixels(sizePx)))
  174.        },
  175.        _ => None
  176.    }
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement