diff --git a/src/builder/validator/buttoninfo.rs b/src/builder/validator/buttoninfo.rs index 67353e4..2596dc8 100644 --- a/src/builder/validator/buttoninfo.rs +++ b/src/builder/validator/buttoninfo.rs @@ -72,6 +72,7 @@ pub struct ButtonInfo { // the chosen element for controller input pub select: bool, + pub isolate: bool, pub parent: Weak, } @@ -120,6 +121,7 @@ impl ButtonInfo { neighbour_infos: Vec::new(), select: false, + isolate: false, parent: Arc::downgrade(grid), }; @@ -168,6 +170,7 @@ impl ButtonInfo { .add_neighbour(NeighbourDirection::North, cow_to_str(attribute.value)), b"south_neighbour" => button_info .add_neighbour(NeighbourDirection::South, cow_to_str(attribute.value)), + b"isolate" => button_info.isolate = str_into(attribute.value)?, _ => { return Err(anyhow::Error::msg(format!( "Unsupported attribute in Button: {}", diff --git a/src/elements/button.rs b/src/elements/button.rs index 2002c26..e83bfc9 100644 --- a/src/elements/button.rs +++ b/src/elements/button.rs @@ -24,6 +24,8 @@ pub struct ButtonBuilder { icon: Option>, margin: u32, + isolate: bool, + text: String, text_color: Color, ratio: f32, @@ -42,6 +44,12 @@ pub struct ButtonBuilder { } impl ButtonBuilder { + pub fn set_isolate(mut self, isolate: bool) -> Self { + self.isolate = isolate; + + self + } + pub fn set_select_mode(mut self, select_mode: ButtonSelectMode) -> Self { self.button_select_mode = select_mode; @@ -147,6 +155,7 @@ impl ButtonBuilder { click_executable.clone(), select_executable.clone(), on_select_executable.clone(), + self.isolate, ); let hoverable = Hoverable::new( @@ -278,6 +287,8 @@ impl Button { icon: None, margin: 0, + isolate: false, + text: String::new(), text_color: Color::Black, ratio: 0.7, @@ -357,7 +368,9 @@ impl Button { } pub fn try_from(button_info: &ButtonInfo, gui_handler: &Arc) -> Result> { - let mut button_builder = Button::builder().set_select_mode(button_info.select_mode); + let mut button_builder = Button::builder() + .set_select_mode(button_info.select_mode) + .set_isolate(button_info.isolate); if let Some(normal) = button_info.normal.clone() { button_builder = button_builder.set_normal(normal); diff --git a/src/guihandler/gui/selectable.rs b/src/guihandler/gui/selectable.rs index 02b5999..b1f96cc 100644 --- a/src/guihandler/gui/selectable.rs +++ b/src/guihandler/gui/selectable.rs @@ -29,6 +29,7 @@ pub struct Selectable { click_audible: RwLock>>, ui_layer: AtomicI32, + isolate: bool, // used when clicked executable: Arc>, @@ -54,6 +55,7 @@ impl Selectable { executable: Arc>, selected_changed_executable: Arc>, on_select_executable: Arc>, + isolate: bool, ) -> Arc { Arc::new(Selectable { gui_handler, @@ -78,6 +80,7 @@ impl Selectable { custom_callback: RwLock::new(None), ui_layer: AtomicI32::new(0), + isolate, }) } @@ -215,6 +218,10 @@ impl Selectable { /// /// * `selectable` the new east neighbour pub fn set_east_neighbour(&self, selectable: Option<&Arc>) { + if self.isolate { + return; + } + let mut east_neighbour = self.east_neighbour.write().unwrap(); match selectable { @@ -240,6 +247,10 @@ impl Selectable { /// /// * `selectable` the new west neighbour pub fn set_west_neighbour(&self, selectable: Option<&Arc>) { + if self.isolate { + return; + } + let mut west_neighbour = self.west_neighbour.write().unwrap(); match selectable { @@ -265,6 +276,10 @@ impl Selectable { /// /// * `selectable` the new north neighbour pub fn set_north_neighbour(&self, selectable: Option<&Arc>) { + if self.isolate { + return; + } + let mut north_neighbour = self.north_neighbour.write().unwrap(); match selectable { @@ -290,6 +305,10 @@ impl Selectable { /// /// * `selectable` the new south neighbour pub fn set_south_neighbour(&self, selectable: Option<&Arc>) { + if self.isolate { + return; + } + let mut south_neighbour = self.south_neighbour.write().unwrap(); match selectable { @@ -299,11 +318,19 @@ impl Selectable { } pub fn connect_vertically(upper: &Arc, lower: &Arc) { + if upper.isolate || lower.isolate { + return; + } + *upper.south_neighbour.write().unwrap() = Some(Arc::downgrade(lower)); *lower.north_neighbour.write().unwrap() = Some(Arc::downgrade(upper)); } pub fn connect_horizontally(left: &Arc, right: &Arc) { + if left.isolate || right.isolate { + return; + } + *left.east_neighbour.write().unwrap() = Some(Arc::downgrade(right)); *right.west_neighbour.write().unwrap() = Some(Arc::downgrade(left)); }