Add option to isolate an element
This commit is contained in:
parent
bd9cca5f11
commit
7a40050799
3 changed files with 44 additions and 1 deletions
|
@ -72,6 +72,7 @@ pub struct ButtonInfo {
|
|||
|
||||
// the chosen element for controller input
|
||||
pub select: bool,
|
||||
pub isolate: bool,
|
||||
|
||||
pub parent: Weak<GridInfo>,
|
||||
}
|
||||
|
@ -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: {}",
|
||||
|
|
|
@ -24,6 +24,8 @@ pub struct ButtonBuilder {
|
|||
icon: Option<Arc<Image>>,
|
||||
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<GuiHandler>) -> Result<Arc<Self>> {
|
||||
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);
|
||||
|
|
|
@ -29,6 +29,7 @@ pub struct Selectable {
|
|||
click_audible: RwLock<Option<Arc<Audible>>>,
|
||||
|
||||
ui_layer: AtomicI32,
|
||||
isolate: bool,
|
||||
|
||||
// used when clicked
|
||||
executable: Arc<Executable<()>>,
|
||||
|
@ -54,6 +55,7 @@ impl Selectable {
|
|||
executable: Arc<Executable<()>>,
|
||||
selected_changed_executable: Arc<Executable<bool>>,
|
||||
on_select_executable: Arc<Executable<bool>>,
|
||||
isolate: bool,
|
||||
) -> Arc<Self> {
|
||||
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<Selectable>>) {
|
||||
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<Selectable>>) {
|
||||
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<Selectable>>) {
|
||||
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<Selectable>>) {
|
||||
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<Selectable>, lower: &Arc<Selectable>) {
|
||||
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<Selectable>, right: &Arc<Selectable>) {
|
||||
if left.isolate || right.isolate {
|
||||
return;
|
||||
}
|
||||
|
||||
*left.east_neighbour.write().unwrap() = Some(Arc::downgrade(right));
|
||||
*right.west_neighbour.write().unwrap() = Some(Arc::downgrade(left));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue