Combobox .wrap(true) width usage (#2472)

* Combobox .wrap(true) width fix

.wrap(true) does note use all the available width
this fix does not change the original .wrap(false) behaviours

* Code comment convention

Co-authored-by: IVANMK-7 <68190772+IVANMK-7@users.noreply.github.com>
This commit is contained in:
Ivan 2022-12-19 10:55:39 +01:00 committed by GitHub
parent 2c9b130423
commit f9728b88db
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -265,21 +265,35 @@ fn combo_box_dyn<'c, R>(
let button_response = button_frame(ui, button_id, is_popup_open, Sense::click(), |ui| { let button_response = button_frame(ui, button_id, is_popup_open, Sense::click(), |ui| {
// We don't want to change width when user selects something new // We don't want to change width when user selects something new
let full_minimum_width = if wrap_enabled { let full_minimum_width = if wrap_enabled {
ui.available_width() - ui.spacing().item_spacing.x * 2.0 // Currently selected value's text will be wrapped if needed, so occupy the available width.
ui.available_width()
} else { } else {
// Occupy at least the minimum width assigned to Slider and ComboBox.
ui.spacing().slider_width - 2.0 * margin.x ui.spacing().slider_width - 2.0 * margin.x
}; };
let icon_size = Vec2::splat(ui.spacing().icon_width); let icon_size = Vec2::splat(ui.spacing().icon_width);
let wrap_width = if wrap_enabled { let wrap_width = if wrap_enabled {
// Use the available width, currently selected value's text will be wrapped if exceeds this value.
ui.available_width() - ui.spacing().item_spacing.x - icon_size.x ui.available_width() - ui.spacing().item_spacing.x - icon_size.x
} else { } else {
// Use all the width necessary to display the currently selected value's text.
f32::INFINITY f32::INFINITY
}; };
let galley = let galley =
selected_text.into_galley(ui, Some(wrap_enabled), wrap_width, TextStyle::Button); selected_text.into_galley(ui, Some(wrap_enabled), wrap_width, TextStyle::Button);
let width = galley.size().x + ui.spacing().item_spacing.x + icon_size.x; // The width necessary to contain the whole widget with the currently selected value's text.
let width = if wrap_enabled {
full_minimum_width
} else {
// Occupy at least the minimum width needed to contain the widget with the currently selected value's text.
galley.size().x + ui.spacing().item_spacing.x + icon_size.x
};
// Case : wrap_enabled : occupy all the available width.
// Case : !wrap_enabled : occupy at least the minimum width assigned to Slider and ComboBox,
// increase if the currently selected value needs additional horizontal space to fully display its text (up to wrap_width (f32::INFINITY)).
let width = width.at_least(full_minimum_width); let width = width.at_least(full_minimum_width);
let height = galley.size().y.max(icon_size.y); let height = galley.size().y.max(icon_size.y);