|
5 | 5 | //! buttons. |
6 | 6 |
|
7 | 7 | mod utils; |
8 | | -use bevy_ui::{Pressed, widget::NodeImageMode}; |
9 | 8 | use utils::*; |
10 | 9 |
|
11 | 10 | use std::sync::OnceLock; |
12 | 11 |
|
13 | | -use bevy::{prelude::*, window::WindowResized}; |
| 12 | +use bevy::{ |
| 13 | + prelude::*, |
| 14 | + ui::{Pressed, widget::NodeImageMode}, |
| 15 | + window::WindowResized, |
| 16 | +}; |
14 | 17 | use haalka::prelude::*; |
15 | 18 |
|
16 | 19 | fn main() { |
@@ -111,67 +114,58 @@ fn nine_slice_button() -> impl Element { |
111 | 114 | .cursor(CursorIcon::System(SystemCursorIcon::Pointer)) |
112 | 115 | } |
113 | 116 |
|
114 | | -fn horizontal() -> impl Element { |
115 | | - Row::<Node>::new() |
116 | | - .with_node(|mut node| { |
117 | | - node.width = Val::Percent(100.); |
118 | | - node.height = Val::Percent(100.); |
119 | | - node.column_gap = Val::Px(GAP); |
120 | | - }) |
121 | | - .item( |
122 | | - Column::<Node>::new() |
123 | | - .with_node(|mut node| { |
124 | | - node.width = Val::Percent(50.); |
125 | | - node.height = Val::Percent(100.); |
126 | | - node.row_gap = Val::Px(GAP); |
127 | | - }) |
128 | | - .align_content(Align::center()) |
129 | | - .items((0..8).map(|_| nine_slice_button())), |
130 | | - ) |
131 | | - .item(El::<ImageNode>::new().image_node(ImageNode::new(image().clone()))) |
132 | | -} |
133 | | - |
134 | | -fn vertical() -> impl Element { |
135 | | - Column::<Node>::new() |
136 | | - .with_node(|mut node| { |
137 | | - node.width = Val::Percent(100.); |
138 | | - node.height = Val::Percent(100.); |
139 | | - node.row_gap = Val::Px(GAP); |
140 | | - }) |
141 | | - .item(El::<ImageNode>::new().image_node(ImageNode::new(image().clone()))) |
142 | | - .item( |
143 | | - Row::<Node>::new() |
144 | | - .multiline() |
145 | | - .align_content(Align::center()) |
146 | | - .with_node(|mut node| { |
147 | | - node.width = Val::Percent(100.); |
148 | | - node.height = Val::Percent(50.); |
149 | | - node.column_gap = Val::Px(GAP); |
150 | | - }) |
151 | | - .items((0..8).map(|_| nine_slice_button())), |
152 | | - ) |
153 | | -} |
154 | | - |
155 | 117 | fn menu() -> impl Element { |
156 | | - let width = SignalBuilder::from_resource::<Width>().map_in(deref_copied); |
| 118 | + let width = SignalBuilder::from_resource::<Width>().dedupe().map_in(deref_copied); |
| 119 | + let is_wide = width.clone().map_in(|width| width > 400.).dedupe(); |
| 120 | + let image_el = || El::<ImageNode>::new().image_node(ImageNode::new(image().clone())); |
157 | 121 | nine_slice_el(SignalBuilder::always(3)) |
158 | 122 | .with_node(|mut node| { |
159 | 123 | node.height = Val::Px(BASE_SIZE); |
160 | 124 | node.padding = UiRect::all(Val::Px(GAP)); |
161 | 125 | }) |
162 | 126 | .on_signal_with_node( |
163 | | - width |
164 | | - .clone() |
165 | | - .map_in(|width| BASE_SIZE.min(width)) |
166 | | - .dedupe() |
167 | | - .map_in(Val::Px), |
| 127 | + width.map_in(|width| BASE_SIZE.min(width)).dedupe().map_in(Val::Px), |
168 | 128 | |mut node, width| node.width = width, |
169 | 129 | ) |
170 | | - .child_signal( |
171 | | - width |
172 | | - .map_in(|width| width > 400.) |
173 | | - .dedupe() |
174 | | - .map_bool_in(|| horizontal().type_erase(), || vertical().type_erase()), |
| 130 | + .child( |
| 131 | + Stripe::<Node>::new() |
| 132 | + .direction_signal( |
| 133 | + is_wide |
| 134 | + .clone() |
| 135 | + .map_bool_in(|| stripe::Direction::Row, || stripe::Direction::Column), |
| 136 | + ) |
| 137 | + .with_node(|mut node| { |
| 138 | + node.width = Val::Percent(100.); |
| 139 | + node.height = Val::Percent(100.); |
| 140 | + node.column_gap = Val::Px(GAP); |
| 141 | + node.row_gap = Val::Px(GAP); |
| 142 | + }) |
| 143 | + .item_signal(is_wide.clone().not().map_true_in(image_el)) |
| 144 | + .item( |
| 145 | + Stripe::<Node>::new() |
| 146 | + .direction_signal( |
| 147 | + is_wide |
| 148 | + .clone() |
| 149 | + .map_bool_in(|| stripe::Direction::Column, || stripe::Direction::Row), |
| 150 | + ) |
| 151 | + .multiline_row_signal(is_wide.clone().not()) |
| 152 | + .align_content(Align::center()) |
| 153 | + .on_signal_with_node(is_wide.clone().dedupe(), |mut node, wide| { |
| 154 | + if wide { |
| 155 | + node.width = Val::Percent(50.); |
| 156 | + node.height = Val::Percent(100.); |
| 157 | + node.row_gap = Val::Px(GAP); |
| 158 | + node.column_gap = Val::Px(0.); |
| 159 | + } else { |
| 160 | + node.width = Val::Percent(100.); |
| 161 | + node.height = Val::Percent(50.); |
| 162 | + node.column_gap = Val::Px(GAP); |
| 163 | + node.row_gap = Val::Px(0.); |
| 164 | + } |
| 165 | + }) |
| 166 | + .items((0..8).map(|_| nine_slice_button())), |
| 167 | + ) |
| 168 | + .item_signal(is_wide.clone().map_true_in(image_el)), |
175 | 169 | ) |
176 | 170 | } |
177 | 171 |
|
|
0 commit comments