1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: MIT
3
4use slint::{Model, Timer, VecModel};
5use std::rc::Rc;
6use std::time::Duration;
7
8#[cfg(target_arch = "wasm32")]
9use wasm_bindgen::prelude::*;
10
11slint::slint! {
12 import { MainWindow } from "memory.slint";
13}
14
15#[cfg_attr(target_arch = "wasm32", wasm_bindgen(start))]
16pub 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