From 6698c73f37ad6380a54bc099607f4e046d880153 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Wed, 3 May 2023 14:32:05 -0400 Subject: [PATCH] Make the game work --- src/components/main_window.slint | 10 +++++++-- src/components/memory_tile.slint | 1 + src/main.rs | 36 ++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/components/main_window.slint b/src/components/main_window.slint index 5978af0..6d74619 100644 --- a/src/components/main_window.slint +++ b/src/components/main_window.slint @@ -4,7 +4,10 @@ export component MainWindow inherits Window { width: 326px; height: 326px; - in property <[TileData]> memory_tiles: [{ + callback check_if_pair_solved(); + in property disable_tiles; + + in-out property <[TileData]> memory_tiles: [{ image: @image-url("../../icons/at.png") }, { image: @image-url("../../icons/balance-scale.png") @@ -32,7 +35,10 @@ export component MainWindow inherits Window { // propagate the solved status from the model to the tile solved: tile.solved; clicked => { - tile.image_visible = !tile.image_visible; + if (!root.disable_tiles) { + tile.image_visible = !tile.image_visible; + root.check_if_pair_solved(); + } } } } diff --git a/src/components/memory_tile.slint b/src/components/memory_tile.slint index 3e6f0b4..2c12479 100644 --- a/src/components/memory_tile.slint +++ b/src/components/memory_tile.slint @@ -13,6 +13,7 @@ export component MemoryTile inherits Rectangle { width: 64px; height: 64px; background: solved ? #34CE57 : #3960D5; + border-radius: 12px; Image { source: icon; diff --git a/src/main.rs b/src/main.rs index 4f1d4a9..34d2e6d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,8 @@ use ::rand::seq::SliceRandom; use ::slint::include_modules; -use ::slint::{Model, VecModel}; +use ::slint::{Model, Timer, VecModel}; use std::rc::Rc; +use std::time::Duration; include_modules!(); @@ -18,7 +19,38 @@ fn main() { // Update the model let tiles_model = Rc::new(VecModel::from(tiles)); - main_window.set_memory_tiles(tiles_model.into()); + main_window.set_memory_tiles(tiles_model.clone().into()); + + let main_window_weak = main_window.as_weak(); + main_window.on_check_if_pair_solved(move || { + let mut flipped_tiles = tiles_model + .iter() + .enumerate() + .filter(|(_, tile)| tile.image_visible && !tile.solved); + + if let (Some((t1_idx, mut t1)), Some((t2_idx, mut t2))) = + (flipped_tiles.next(), flipped_tiles.next()) + { + let is_pair_solved = t1 == t2; + if is_pair_solved { + t1.solved = true; + tiles_model.set_row_data(t1_idx, t1); + t2.solved = true; + tiles_model.set_row_data(t2_idx, t2); + } else { + let main_window = main_window_weak.unwrap(); + main_window.set_disable_tiles(true); + let tiles_model = tiles_model.clone(); + Timer::single_shot(Duration::from_secs(1), move || { + main_window.set_disable_tiles(false); + t1.image_visible = false; + tiles_model.set_row_data(t1_idx, t1); + t2.image_visible = false; + tiles_model.set_row_data(t2_idx, t2); + }); + } + } + }); main_window.run().unwrap(); }