mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
fix: <datalist> dropdown positioning (#36959)
fix: datalist dropdown positioning Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
@@ -33,12 +33,14 @@
|
||||
|
||||
namespace electron {
|
||||
|
||||
namespace {
|
||||
|
||||
void CalculatePopupXAndWidthHorizontallyCentered(
|
||||
int popup_preferred_width,
|
||||
const gfx::Rect& content_area_bounds,
|
||||
const gfx::Rect& element_bounds,
|
||||
bool is_rtl,
|
||||
gfx::Rect* bubble_bounds) {
|
||||
gfx::Rect* popup_bounds) {
|
||||
// The preferred horizontal starting point for the pop-up is at the horizontal
|
||||
// center of the field.
|
||||
int preferred_starting_point =
|
||||
@@ -66,15 +68,15 @@ void CalculatePopupXAndWidthHorizontallyCentered(
|
||||
int amount_to_grow_in_unpreferred_direction =
|
||||
std::max(0, popup_width - space_to_grow_in_preferred_direction);
|
||||
|
||||
bubble_bounds->set_width(popup_width);
|
||||
popup_bounds->set_width(popup_width);
|
||||
if (is_rtl) {
|
||||
// Note, in RTL the |pop_up_width| must be subtracted to achieve
|
||||
// right-alignment of the pop-up with the element.
|
||||
bubble_bounds->set_x(preferred_starting_point - popup_width +
|
||||
amount_to_grow_in_unpreferred_direction);
|
||||
popup_bounds->set_x(preferred_starting_point - popup_width +
|
||||
amount_to_grow_in_unpreferred_direction);
|
||||
} else {
|
||||
bubble_bounds->set_x(preferred_starting_point -
|
||||
amount_to_grow_in_unpreferred_direction);
|
||||
popup_bounds->set_x(preferred_starting_point -
|
||||
amount_to_grow_in_unpreferred_direction);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +84,7 @@ void CalculatePopupXAndWidth(int popup_preferred_width,
|
||||
const gfx::Rect& content_area_bounds,
|
||||
const gfx::Rect& element_bounds,
|
||||
bool is_rtl,
|
||||
gfx::Rect* bubble_bounds) {
|
||||
gfx::Rect* popup_bounds) {
|
||||
int right_growth_start = base::clamp(
|
||||
element_bounds.x(), content_area_bounds.x(), content_area_bounds.right());
|
||||
int left_growth_end =
|
||||
@@ -107,15 +109,15 @@ void CalculatePopupXAndWidth(int popup_preferred_width,
|
||||
right_available < popup_width && right_available < left_available;
|
||||
}
|
||||
|
||||
bubble_bounds->set_width(popup_width);
|
||||
bubble_bounds->set_x(grow_left ? left_growth_end - popup_width
|
||||
: right_growth_start);
|
||||
popup_bounds->set_width(popup_width);
|
||||
popup_bounds->set_x(grow_left ? left_growth_end - popup_width
|
||||
: right_growth_start);
|
||||
}
|
||||
|
||||
void CalculatePopupYAndHeight(int popup_preferred_height,
|
||||
const gfx::Rect& content_area_bounds,
|
||||
const gfx::Rect& element_bounds,
|
||||
gfx::Rect* bubble_bounds) {
|
||||
gfx::Rect* popup_bounds) {
|
||||
int top_growth_end = base::clamp(element_bounds.y(), content_area_bounds.y(),
|
||||
content_area_bounds.bottom());
|
||||
int bottom_growth_start =
|
||||
@@ -125,18 +127,18 @@ void CalculatePopupYAndHeight(int popup_preferred_height,
|
||||
int top_available = top_growth_end - content_area_bounds.y();
|
||||
int bottom_available = content_area_bounds.bottom() - bottom_growth_start;
|
||||
|
||||
bubble_bounds->set_height(popup_preferred_height);
|
||||
bubble_bounds->set_y(top_growth_end);
|
||||
popup_bounds->set_height(popup_preferred_height);
|
||||
popup_bounds->set_y(top_growth_end);
|
||||
|
||||
if (bottom_available >= popup_preferred_height ||
|
||||
bottom_available >= top_available) {
|
||||
bubble_bounds->AdjustToFit(
|
||||
gfx::Rect(bubble_bounds->x(), element_bounds.bottom(),
|
||||
bubble_bounds->width(), bottom_available));
|
||||
popup_bounds->AdjustToFit(
|
||||
gfx::Rect(popup_bounds->x(), element_bounds.bottom(),
|
||||
popup_bounds->width(), bottom_available));
|
||||
} else {
|
||||
bubble_bounds->AdjustToFit(
|
||||
gfx::Rect(bubble_bounds->x(), content_area_bounds.y(),
|
||||
bubble_bounds->width(), top_available));
|
||||
popup_bounds->AdjustToFit(gfx::Rect(popup_bounds->x(),
|
||||
content_area_bounds.y(),
|
||||
popup_bounds->width(), top_available));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,22 +147,24 @@ gfx::Rect CalculatePopupBounds(const gfx::Size& desired_size,
|
||||
const gfx::Rect& element_bounds,
|
||||
bool is_rtl,
|
||||
bool horizontally_centered) {
|
||||
gfx::Rect bubble_bounds;
|
||||
gfx::Rect popup_bounds;
|
||||
|
||||
if (horizontally_centered) {
|
||||
CalculatePopupXAndWidthHorizontallyCentered(
|
||||
desired_size.width(), content_area_bounds, element_bounds, is_rtl,
|
||||
&bubble_bounds);
|
||||
&popup_bounds);
|
||||
} else {
|
||||
CalculatePopupXAndWidth(desired_size.width(), content_area_bounds,
|
||||
element_bounds, is_rtl, &bubble_bounds);
|
||||
element_bounds, is_rtl, &popup_bounds);
|
||||
}
|
||||
CalculatePopupYAndHeight(desired_size.height(), content_area_bounds,
|
||||
element_bounds, &bubble_bounds);
|
||||
element_bounds, &popup_bounds);
|
||||
|
||||
return bubble_bounds;
|
||||
return popup_bounds;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
AutofillPopup::AutofillPopup() {
|
||||
bold_font_list_ = gfx::FontList().DeriveWithWeight(gfx::Font::Weight::BOLD);
|
||||
smaller_font_list_ =
|
||||
@@ -242,16 +246,12 @@ void AutofillPopup::UpdatePopupBounds() {
|
||||
views::View::ConvertPointToScreen(parent_, &origin);
|
||||
|
||||
gfx::Rect bounds(origin, element_bounds_.size());
|
||||
gfx::Rect window_bounds = parent_->GetBoundsInScreen();
|
||||
|
||||
gfx::Size preferred_size =
|
||||
gfx::Size(GetDesiredPopupWidth(), GetDesiredPopupHeight());
|
||||
|
||||
popup_bounds_ = CalculatePopupBounds(preferred_size, window_bounds, bounds,
|
||||
base::i18n::IsRTL(), true);
|
||||
CalculatePopupXAndWidthHorizontallyCentered(
|
||||
preferred_size.width(), window_bounds, element_bounds_,
|
||||
base::i18n::IsRTL(), &popup_bounds_);
|
||||
popup_bounds_ =
|
||||
CalculatePopupBounds(preferred_size, parent_->GetBoundsInScreen(), bounds,
|
||||
base::i18n::IsRTL(), false);
|
||||
}
|
||||
|
||||
gfx::Rect AutofillPopup::popup_bounds_in_view() {
|
||||
|
||||
Reference in New Issue
Block a user