1 | // Copyright © SixtyFPS GmbH <info@slint.dev> |
2 | // SPDX-License-Identifier: MIT |
3 | |
4 | use slint::{Model, Timer, VecModel}; |
5 | use std::rc::Rc; |
6 | use std::time::Duration; |
7 | |
8 | #[cfg (target_arch = "wasm32" )] |
9 | use wasm_bindgen::prelude::*; |
10 | |
11 | slint::slint! { |
12 | import { MainWindow } from "memory.slint" ; |
13 | } |
14 | |
15 | #[cfg_attr (target_arch = "wasm32" , wasm_bindgen(start))] |
16 | pub fn main() { |
17 | // This provides better error messages in debug mode. |
18 | // It's disabled in release mode so it doesn't bloat up the file size. |
19 | #[cfg (all(debug_assertions, target_arch = "wasm32" ))] |
20 | console_error_panic_hook::set_once(); |
21 | |
22 | let main_window = MainWindow::new().unwrap(); |
23 | |
24 | let mut tiles: Vec<TileData> = main_window.get_memory_tiles().iter().collect(); |
25 | tiles.extend(tiles.clone()); |
26 | |
27 | use rand::seq::SliceRandom; |
28 | let mut rng = rand::thread_rng(); |
29 | tiles.shuffle(&mut rng); |
30 | |
31 | let tiles_model = Rc::new(VecModel::from(tiles)); |
32 | |
33 | main_window.set_memory_tiles(tiles_model.clone().into()); |
34 | |
35 | let main_window_weak = main_window.as_weak(); |
36 | |
37 | main_window.on_check_if_pair_solved(move || { |
38 | let mut flipped_tiles = |
39 | tiles_model.iter().enumerate().filter(|(_, tile)| tile.image_visible && !tile.solved); |
40 | |
41 | if let (Some((t1_idx, mut t1)), Some((t2_idx, mut t2))) = |
42 | (flipped_tiles.next(), flipped_tiles.next()) |
43 | { |
44 | let is_pair_solved = t1 == t2; |
45 | if is_pair_solved { |
46 | t1.solved = true; |
47 | tiles_model.set_row_data(t1_idx, t1); |
48 | t2.solved = true; |
49 | tiles_model.set_row_data(t2_idx, t2); |
50 | } else { |
51 | main_window_weak.unwrap().set_disable_tiles(true); |
52 | let main_window_weak = main_window_weak.clone(); |
53 | let tiles_model = tiles_model.clone(); |
54 | Timer::single_shot(Duration::from_secs(1), move || { |
55 | main_window_weak.unwrap().set_disable_tiles(false); |
56 | t1.image_visible = false; |
57 | tiles_model.set_row_data(t1_idx, t1); |
58 | t2.image_visible = false; |
59 | tiles_model.set_row_data(t2_idx, t2); |
60 | }) |
61 | } |
62 | } |
63 | }); |
64 | |
65 | main_window.run().unwrap(); |
66 | } |
67 | |