Reapply "ui: Account for padding of parent container during scrollbar layout" (#30577)
This PR reapplies #27402 which was reverted in https://github.com/zed-industries/zed/pull/30544 due to the issue @ConradIrwin reported in https://github.com/zed-industries/zed/pull/27402#issuecomment-2871745132. The reported issue is already present on main but not visible, see https://github.com/zed-industries/zed/pull/27402#issuecomment-2872546903 for more context and reproduction steps. The fix here was to move the padding for the hover popover up to the parent container. This does not fix the underlying problem but serves as workaround without any disadvantages until a better solution is found. I would currently guess that the underlying issue might be related to some rem-size calculations for small font sizes or something similar (e.g. https://github.com/zed-industries/zed/pull/22732 could possibly be somewhat related). Notably, the fix here does not cause any difference in layouting (the following screenshots are actually distinct images), yet fixes the problem at hand. ### Default font size (`15px`) | `main` | This PR | | --- | --- | |  | | ### Smaller font size (`12px`) | `main` | This PR | | --- | --- | |  |  | Furthermore, for the second scenario, the popover would be scrollable on main. As there is no scrollbar in the second image for this PR, this no longer happens with this branch. Release Notes: - N/A
This commit is contained in:
parent
ea5b289459
commit
4280bff10a
5 changed files with 126 additions and 204 deletions
|
@ -1559,32 +1559,20 @@ impl Interactivity {
|
|||
) -> Point<Pixels> {
|
||||
if let Some(scroll_offset) = self.scroll_offset.as_ref() {
|
||||
let mut scroll_to_bottom = false;
|
||||
if let Some(scroll_handle) = &self.tracked_scroll_handle {
|
||||
let mut state = scroll_handle.0.borrow_mut();
|
||||
state.overflow = style.overflow;
|
||||
scroll_to_bottom = mem::take(&mut state.scroll_to_bottom);
|
||||
let mut tracked_scroll_handle = self
|
||||
.tracked_scroll_handle
|
||||
.as_ref()
|
||||
.map(|handle| handle.0.borrow_mut());
|
||||
if let Some(mut scroll_handle_state) = tracked_scroll_handle.as_deref_mut() {
|
||||
scroll_handle_state.overflow = style.overflow;
|
||||
scroll_to_bottom = mem::take(&mut scroll_handle_state.scroll_to_bottom);
|
||||
}
|
||||
|
||||
let rem_size = window.rem_size();
|
||||
let padding_size = size(
|
||||
style
|
||||
.padding
|
||||
.left
|
||||
.to_pixels(bounds.size.width.into(), rem_size)
|
||||
+ style
|
||||
.padding
|
||||
.right
|
||||
.to_pixels(bounds.size.width.into(), rem_size),
|
||||
style
|
||||
.padding
|
||||
.top
|
||||
.to_pixels(bounds.size.height.into(), rem_size)
|
||||
+ style
|
||||
.padding
|
||||
.bottom
|
||||
.to_pixels(bounds.size.height.into(), rem_size),
|
||||
);
|
||||
let scroll_max = (self.content_size + padding_size - bounds.size).max(&Size::default());
|
||||
let padding = style.padding.to_pixels(bounds.size.into(), rem_size);
|
||||
let padding_size = size(padding.left + padding.right, padding.top + padding.bottom);
|
||||
let padded_content_size = self.content_size + padding_size;
|
||||
let scroll_max = (padded_content_size - bounds.size).max(&Size::default());
|
||||
// Clamp scroll offset in case scroll max is smaller now (e.g., if children
|
||||
// were removed or the bounds became larger).
|
||||
let mut scroll_offset = scroll_offset.borrow_mut();
|
||||
|
@ -1596,6 +1584,10 @@ impl Interactivity {
|
|||
scroll_offset.y = scroll_offset.y.clamp(-scroll_max.height, px(0.));
|
||||
}
|
||||
|
||||
if let Some(mut scroll_handle_state) = tracked_scroll_handle {
|
||||
scroll_handle_state.padded_content_size = padded_content_size;
|
||||
}
|
||||
|
||||
*scroll_offset
|
||||
} else {
|
||||
Point::default()
|
||||
|
@ -2913,6 +2905,7 @@ impl ScrollAnchor {
|
|||
struct ScrollHandleState {
|
||||
offset: Rc<RefCell<Point<Pixels>>>,
|
||||
bounds: Bounds<Pixels>,
|
||||
padded_content_size: Size<Pixels>,
|
||||
child_bounds: Vec<Bounds<Pixels>>,
|
||||
scroll_to_bottom: bool,
|
||||
overflow: Point<Overflow>,
|
||||
|
@ -2975,6 +2968,11 @@ impl ScrollHandle {
|
|||
self.0.borrow().child_bounds.get(ix).cloned()
|
||||
}
|
||||
|
||||
/// Get the size of the content with padding of the container.
|
||||
pub fn padded_content_size(&self) -> Size<Pixels> {
|
||||
self.0.borrow().padded_content_size
|
||||
}
|
||||
|
||||
/// scroll_to_item scrolls the minimal amount to ensure that the child is
|
||||
/// fully visible
|
||||
pub fn scroll_to_item(&self, ix: usize) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue