[layout] change clickable_diameter: f32
to interact_size: Vec2
This commit is contained in:
parent
85a67ab15e
commit
4df8def9e2
8 changed files with 38 additions and 32 deletions
|
@ -191,9 +191,7 @@ impl CollapsingHeader {
|
||||||
desired_width,
|
desired_width,
|
||||||
galley.size.y + 2.0 * ui.style().spacing.button_padding.y,
|
galley.size.y + 2.0 * ui.style().spacing.button_padding.y,
|
||||||
);
|
);
|
||||||
desired_size.y = desired_size
|
desired_size = desired_size.at_least(ui.style().spacing.interact_size);
|
||||||
.y
|
|
||||||
.at_least(ui.style().spacing.clickable_diameter);
|
|
||||||
let rect = ui.allocate_space(desired_size);
|
let rect = ui.allocate_space(desired_size);
|
||||||
let rect = rect.expand2(ui.style().spacing.button_expand);
|
let rect = rect.expand2(ui.style().spacing.button_expand);
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ impl ColorTest {
|
||||||
let vertex_color = Rgba::new(0.5, 0.75, 0.75, 1.0);
|
let vertex_color = Rgba::new(0.5, 0.75, 0.75, 1.0);
|
||||||
|
|
||||||
ui.horizontal_centered(|ui| {
|
ui.horizontal_centered(|ui| {
|
||||||
let color_size = vec2(2.0, 1.0) * ui.style().spacing.clickable_diameter;
|
let color_size = ui.style().spacing.interact_size;
|
||||||
ui.label("texture");
|
ui.label("texture");
|
||||||
show_color(ui, tex_color, color_size);
|
show_color(ui, tex_color, color_size);
|
||||||
ui.label(" * ");
|
ui.label(" * ");
|
||||||
|
@ -133,7 +133,7 @@ impl ColorTest {
|
||||||
let is_opaque = left.is_opaque() && right.is_opaque();
|
let is_opaque = left.is_opaque() && right.is_opaque();
|
||||||
|
|
||||||
ui.horizontal_centered(|ui| {
|
ui.horizontal_centered(|ui| {
|
||||||
let color_size = vec2(2.0, 1.0) * ui.style().spacing.clickable_diameter;
|
let color_size = ui.style().spacing.interact_size;
|
||||||
if !is_opaque {
|
if !is_opaque {
|
||||||
ui.label("Background:");
|
ui.label("Background:");
|
||||||
show_color(ui, bg_fill, color_size);
|
show_color(ui, bg_fill, color_size);
|
||||||
|
|
|
@ -20,7 +20,7 @@ pub fn toggle(ui: &mut Ui, on: &mut bool) -> Response {
|
||||||
// 1. Deciding widget size:
|
// 1. Deciding widget size:
|
||||||
// You can query the `ui` how much space is available,
|
// You can query the `ui` how much space is available,
|
||||||
// but in this example we have a fixed size component:
|
// but in this example we have a fixed size component:
|
||||||
let desired_size = vec2(2.0, 1.0) * ui.style().spacing.clickable_diameter;
|
let desired_size = ui.style().spacing.interact_size;
|
||||||
|
|
||||||
// 2. Allocating space:
|
// 2. Allocating space:
|
||||||
// This is where we get a region (`Rect`) of the screen assigned.
|
// This is where we get a region (`Rect`) of the screen assigned.
|
||||||
|
|
|
@ -45,17 +45,18 @@ pub struct Spacing {
|
||||||
/// Expand buttons by this much *after* allocating them.
|
/// Expand buttons by this much *after* allocating them.
|
||||||
/// This is then mostly a visual change (but also makes them easier to hit with the mouse).
|
/// This is then mostly a visual change (but also makes them easier to hit with the mouse).
|
||||||
/// This allows for compact layout where buttons actually eat into item_spacing a bit
|
/// This allows for compact layout where buttons actually eat into item_spacing a bit
|
||||||
pub button_expand: Vec2,
|
pub button_expand: Vec2, // TODO: remove
|
||||||
|
|
||||||
/// Indent collapsing regions etc by this much.
|
/// Indent collapsing regions etc by this much.
|
||||||
pub indent: f32,
|
pub indent: f32,
|
||||||
|
|
||||||
/// Anything clickable is (at least) this wide.
|
/// Minimum size of e.g. a button.
|
||||||
/// TODO: rename `button_height` or something?
|
/// `interact_size.y` is the default height of button, slider, etc.
|
||||||
pub clickable_diameter: f32,
|
/// Anything clickable should be (at least) this size.
|
||||||
|
pub interact_size: Vec2, // TODO: rename min_interact_size ?
|
||||||
|
|
||||||
/// Total width of a slider
|
/// Total width of a slider.
|
||||||
pub slider_width: f32,
|
pub slider_width: f32, // TODO: rename big_interact_size ?
|
||||||
|
|
||||||
/// Checkboxes, radio button and collapsing headers have an icon at the start.
|
/// Checkboxes, radio button and collapsing headers have an icon at the start.
|
||||||
/// The text starts after this many pixels.
|
/// The text starts after this many pixels.
|
||||||
|
@ -202,7 +203,7 @@ impl Default for Spacing {
|
||||||
button_padding: vec2(2.0, 0.0),
|
button_padding: vec2(2.0, 0.0),
|
||||||
button_expand: vec2(1.0, 1.0),
|
button_expand: vec2(1.0, 1.0),
|
||||||
indent: 21.0,
|
indent: 21.0,
|
||||||
clickable_diameter: 14.0, // TODO: automatically higher on touch screens
|
interact_size: vec2(28.0, 14.0), // TODO: larger interact_size.y
|
||||||
slider_width: 140.0,
|
slider_width: 140.0,
|
||||||
icon_width: 14.0,
|
icon_width: 14.0,
|
||||||
menu_bar_height: 16.0,
|
menu_bar_height: 16.0,
|
||||||
|
@ -319,7 +320,7 @@ impl Spacing {
|
||||||
button_padding,
|
button_padding,
|
||||||
button_expand,
|
button_expand,
|
||||||
indent,
|
indent,
|
||||||
clickable_diameter,
|
interact_size,
|
||||||
slider_width,
|
slider_width,
|
||||||
icon_width,
|
icon_width,
|
||||||
menu_bar_height,
|
menu_bar_height,
|
||||||
|
@ -330,7 +331,8 @@ impl Spacing {
|
||||||
ui_slider_vec2(ui, button_padding, 0.0..=10.0, "button_padding");
|
ui_slider_vec2(ui, button_padding, 0.0..=10.0, "button_padding");
|
||||||
ui_slider_vec2(ui, button_expand, 0.0..=10.0, "button_expand");
|
ui_slider_vec2(ui, button_expand, 0.0..=10.0, "button_expand");
|
||||||
ui.add(Slider::f32(indent, 0.0..=100.0).text("indent"));
|
ui.add(Slider::f32(indent, 0.0..=100.0).text("indent"));
|
||||||
ui.add(Slider::f32(clickable_diameter, 0.0..=40.0).text("clickable_diameter"));
|
ui_slider_vec2(ui, interact_size, 0.0..=40.0, "interact_size")
|
||||||
|
.tooltip_text("Minimum size of an interactive widget");
|
||||||
ui.add(Slider::f32(slider_width, 0.0..=1000.0).text("slider_width"));
|
ui.add(Slider::f32(slider_width, 0.0..=1000.0).text("slider_width"));
|
||||||
ui.add(Slider::f32(icon_width, 0.0..=40.0).text("icon_width"));
|
ui.add(Slider::f32(icon_width, 0.0..=40.0).text("icon_width"));
|
||||||
ui.add(Slider::f32(menu_bar_height, 0.0..=40.0).text("menu_bar_height"));
|
ui.add(Slider::f32(menu_bar_height, 0.0..=40.0).text("menu_bar_height"));
|
||||||
|
@ -443,12 +445,18 @@ impl Stroke {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: improve and standardize ui_slider_vec2
|
// TODO: improve and standardize ui_slider_vec2
|
||||||
fn ui_slider_vec2(ui: &mut Ui, value: &mut Vec2, range: std::ops::RangeInclusive<f32>, text: &str) {
|
fn ui_slider_vec2(
|
||||||
ui.horizontal_centered(|ui| {
|
ui: &mut Ui,
|
||||||
|
value: &mut Vec2,
|
||||||
|
range: std::ops::RangeInclusive<f32>,
|
||||||
|
text: &str,
|
||||||
|
) -> Response {
|
||||||
|
let (_, rect) = ui.horizontal_centered(|ui| {
|
||||||
ui.label(format!("{}: ", text));
|
ui.label(format!("{}: ", text));
|
||||||
ui.add(Slider::f32(&mut value.x, range.clone()).text("w"));
|
ui.add(Slider::f32(&mut value.x, range.clone()).text("w"));
|
||||||
ui.add(Slider::f32(&mut value.y, range.clone()).text("h"));
|
ui.add(Slider::f32(&mut value.y, range.clone()).text("h"));
|
||||||
});
|
});
|
||||||
|
ui.interact_hover(rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ui_color(ui: &mut Ui, srgba: &mut Srgba, text: &str) {
|
fn ui_color(ui: &mut Ui, srgba: &mut Srgba, text: &str) {
|
||||||
|
|
|
@ -658,13 +658,19 @@ impl Ui {
|
||||||
|
|
||||||
/// Start a ui with horizontal layout
|
/// Start a ui with horizontal layout
|
||||||
pub fn horizontal<R>(&mut self, add_contents: impl FnOnce(&mut Ui) -> R) -> (R, Rect) {
|
pub fn horizontal<R>(&mut self, add_contents: impl FnOnce(&mut Ui) -> R) -> (R, Rect) {
|
||||||
let initial_size = vec2(self.available().width(), 0.0);
|
let initial_size = vec2(
|
||||||
|
self.available().width(),
|
||||||
|
self.style().spacing.interact_size.y,
|
||||||
|
);
|
||||||
self.inner_layout(Layout::horizontal(Align::Min), initial_size, add_contents)
|
self.inner_layout(Layout::horizontal(Align::Min), initial_size, add_contents)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start a ui with horizontal layout where elements are centered on the Y axis.
|
/// Start a ui with horizontal layout where elements are centered on the Y axis.
|
||||||
pub fn horizontal_centered<R>(&mut self, add_contents: impl FnOnce(&mut Ui) -> R) -> (R, Rect) {
|
pub fn horizontal_centered<R>(&mut self, add_contents: impl FnOnce(&mut Ui) -> R) -> (R, Rect) {
|
||||||
let initial_size = vec2(self.available().width(), 0.0);
|
let initial_size = vec2(
|
||||||
|
self.available().width(),
|
||||||
|
self.style().spacing.interact_size.y,
|
||||||
|
);
|
||||||
self.inner_layout(
|
self.inner_layout(
|
||||||
Layout::horizontal(Align::Center),
|
Layout::horizontal(Align::Center),
|
||||||
initial_size,
|
initial_size,
|
||||||
|
|
|
@ -55,7 +55,7 @@ fn show_srgba(ui: &mut Ui, srgba: Srgba, desired_size: Vec2) -> Response {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn color_button(ui: &mut Ui, color: Srgba) -> Response {
|
fn color_button(ui: &mut Ui, color: Srgba) -> Response {
|
||||||
let desired_size = Vec2::splat(ui.style().spacing.clickable_diameter);
|
let desired_size = ui.style().spacing.interact_size;
|
||||||
let rect = ui.allocate_space(desired_size);
|
let rect = ui.allocate_space(desired_size);
|
||||||
let rect = rect.expand2(ui.style().spacing.button_expand);
|
let rect = rect.expand2(ui.style().spacing.button_expand);
|
||||||
let id = ui.make_position_id();
|
let id = ui.make_position_id();
|
||||||
|
@ -76,7 +76,7 @@ fn color_slider_1d(ui: &mut Ui, value: &mut f32, color_at: impl Fn(f32) -> Srgba
|
||||||
|
|
||||||
let desired_size = vec2(
|
let desired_size = vec2(
|
||||||
ui.style().spacing.slider_width,
|
ui.style().spacing.slider_width,
|
||||||
ui.style().spacing.clickable_diameter * 2.0,
|
ui.style().spacing.interact_size.y * 2.0,
|
||||||
);
|
);
|
||||||
let rect = ui.allocate_space(desired_size);
|
let rect = ui.allocate_space(desired_size);
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma) {
|
||||||
ui.vertical_centered(|ui| {
|
ui.vertical_centered(|ui| {
|
||||||
let current_color_size = vec2(
|
let current_color_size = vec2(
|
||||||
ui.style().spacing.slider_width,
|
ui.style().spacing.slider_width,
|
||||||
ui.style().spacing.clickable_diameter * 2.0,
|
ui.style().spacing.interact_size.y * 2.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
show_color(ui, *hsva, current_color_size).tooltip_text("Current color");
|
show_color(ui, *hsva, current_color_size).tooltip_text("Current color");
|
||||||
|
|
|
@ -292,9 +292,7 @@ impl Widget for Button {
|
||||||
let font = &ui.fonts()[text_style];
|
let font = &ui.fonts()[text_style];
|
||||||
let galley = font.layout_multiline(text, ui.available().width());
|
let galley = font.layout_multiline(text, ui.available().width());
|
||||||
let mut desired_size = galley.size + 2.0 * ui.style().spacing.button_padding;
|
let mut desired_size = galley.size + 2.0 * ui.style().spacing.button_padding;
|
||||||
desired_size.y = desired_size
|
desired_size = desired_size.at_least(ui.style().spacing.interact_size);
|
||||||
.y
|
|
||||||
.at_least(ui.style().spacing.clickable_diameter);
|
|
||||||
let rect = ui.allocate_space(desired_size);
|
let rect = ui.allocate_space(desired_size);
|
||||||
let rect = rect.expand2(ui.style().spacing.button_expand);
|
let rect = rect.expand2(ui.style().spacing.button_expand);
|
||||||
|
|
||||||
|
@ -357,9 +355,7 @@ impl<'a> Widget for Checkbox<'a> {
|
||||||
let button_padding = ui.style().spacing.button_padding;
|
let button_padding = ui.style().spacing.button_padding;
|
||||||
let mut desired_size =
|
let mut desired_size =
|
||||||
button_padding + vec2(icon_width, 0.0) + galley.size + button_padding;
|
button_padding + vec2(icon_width, 0.0) + galley.size + button_padding;
|
||||||
desired_size.y = desired_size
|
desired_size = desired_size.at_least(ui.style().spacing.interact_size);
|
||||||
.y
|
|
||||||
.at_least(ui.style().spacing.clickable_diameter);
|
|
||||||
let rect = ui.allocate_space(desired_size);
|
let rect = ui.allocate_space(desired_size);
|
||||||
|
|
||||||
let response = ui.interact(rect, id, Sense::click());
|
let response = ui.interact(rect, id, Sense::click());
|
||||||
|
@ -441,9 +437,7 @@ impl Widget for RadioButton {
|
||||||
let button_padding = ui.style().spacing.button_padding;
|
let button_padding = ui.style().spacing.button_padding;
|
||||||
let mut desired_size =
|
let mut desired_size =
|
||||||
button_padding + vec2(icon_width, 0.0) + galley.size + button_padding;
|
button_padding + vec2(icon_width, 0.0) + galley.size + button_padding;
|
||||||
desired_size.y = desired_size
|
desired_size = desired_size.at_least(ui.style().spacing.interact_size);
|
||||||
.y
|
|
||||||
.at_least(ui.style().spacing.clickable_diameter);
|
|
||||||
let rect = ui.allocate_space(desired_size);
|
let rect = ui.allocate_space(desired_size);
|
||||||
|
|
||||||
let response = ui.interact(rect, id, Sense::click());
|
let response = ui.interact(rect, id, Sense::click());
|
||||||
|
|
|
@ -272,7 +272,7 @@ impl<'a> Widget for Slider<'a> {
|
||||||
let font = &ui.fonts()[text_style];
|
let font = &ui.fonts()[text_style];
|
||||||
let height = font
|
let height = font
|
||||||
.line_spacing()
|
.line_spacing()
|
||||||
.at_least(ui.style().spacing.clickable_diameter);
|
.at_least(ui.style().spacing.interact_size.y);
|
||||||
|
|
||||||
if let Some(text) = &self.text {
|
if let Some(text) = &self.text {
|
||||||
self.id = self.id.or_else(|| Some(ui.make_unique_child_id(text)));
|
self.id = self.id.or_else(|| Some(ui.make_unique_child_id(text)));
|
||||||
|
|
Loading…
Reference in a new issue