From 67ad8bf6656a88e74188c53b2ed410b5e8d48a31 Mon Sep 17 00:00:00 2001 From: hodasemi Date: Sat, 25 May 2024 09:42:05 +0200 Subject: [PATCH] Implement connection method for grid --- src/elements/button.rs | 17 ++++++++-- src/elements/grid.rs | 76 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/src/elements/button.rs b/src/elements/button.rs index 5d0304d..fc6b005 100644 --- a/src/elements/button.rs +++ b/src/elements/button.rs @@ -15,9 +15,12 @@ use super::{ }; use cgmath::{vec2, vec4}; -use std::sync::{ - atomic::{AtomicBool, Ordering::SeqCst}, - Arc, Mutex, +use std::{ + ops::Deref, + sync::{ + atomic::{AtomicBool, Ordering::SeqCst}, + Arc, Mutex, + }, }; pub struct ButtonBuilder { @@ -694,3 +697,11 @@ impl Button { Ok(()) } } + +impl Deref for Button { + type Target = Arc; + + fn deref(&self) -> &Self::Target { + &self.selectable + } +} diff --git a/src/elements/grid.rs b/src/elements/grid.rs index eacfef8..f19e193 100644 --- a/src/elements/grid.rs +++ b/src/elements/grid.rs @@ -11,6 +11,13 @@ use std::{ops::Deref, sync::Weak}; use super::fill_type::FillType; +pub enum ConnectDirection { + East, + West, + South, + North, +} + #[derive(Clone)] enum ChildState { Some { @@ -315,6 +322,75 @@ impl Grid { self.framable.allow_size_scale(false) } + pub fn connect<'a>( + &self, + direction: ConnectDirection, + elements: impl IntoIterator)>, + ) -> Result<()> { + for (index, selectable) in elements { + match direction { + ConnectDirection::East => { + let y = index; + + for x in (0..self.dim_x).rev() { + if let Some(child) = self.child_at(x, y)? { + if let Some(gridable) = child.gridable() { + if let Some(grid_selectable) = gridable.selectable() { + Selectable::connect_horizontally(grid_selectable, selectable); + break; + } + } + } + } + } + ConnectDirection::West => { + let y = index; + + for x in 0..self.dim_x { + if let Some(child) = self.child_at(x, y)? { + if let Some(gridable) = child.gridable() { + if let Some(grid_selectable) = gridable.selectable() { + Selectable::connect_horizontally(selectable, grid_selectable); + break; + } + } + } + } + } + ConnectDirection::South => { + let x = index; + + for y in (0..self.dim_y).rev() { + if let Some(child) = self.child_at(x, y)? { + if let Some(gridable) = child.gridable() { + if let Some(grid_selectable) = gridable.selectable() { + Selectable::connect_vertically(grid_selectable, selectable); + break; + } + } + } + } + } + ConnectDirection::North => { + let x = index; + + for y in (0..self.dim_y).rev() { + if let Some(child) = self.child_at(x, y)? { + if let Some(gridable) = child.gridable() { + if let Some(grid_selectable) = gridable.selectable() { + Selectable::connect_vertically(grid_selectable, selectable); + break; + } + } + } + } + } + } + } + + Ok(()) + } + pub fn attach( &self, child: Arc,