Merge pull request #2585 from dtzxporter/scrollbar-show-always-disabled
Scrollbar disabled style status to allow custom styles for always visible, but not overflowing scrollbars.
This commit is contained in:
commit
2b4f428cf8
1 changed files with 43 additions and 5 deletions
|
|
@ -906,14 +906,21 @@ where
|
|||
is_vertical_scrollbar_dragged: state
|
||||
.y_scroller_grabbed_at
|
||||
.is_some(),
|
||||
is_horizontal_scrollbar_disabled: scrollbars.is_x_disabled(),
|
||||
is_vertical_scrollbar_disabled: scrollbars.is_y_disabled(),
|
||||
}
|
||||
} else if cursor_over_scrollable.is_some() {
|
||||
Status::Hovered {
|
||||
is_horizontal_scrollbar_hovered: mouse_over_x_scrollbar,
|
||||
is_vertical_scrollbar_hovered: mouse_over_y_scrollbar,
|
||||
is_horizontal_scrollbar_disabled: scrollbars.is_x_disabled(),
|
||||
is_vertical_scrollbar_disabled: scrollbars.is_y_disabled(),
|
||||
}
|
||||
} else {
|
||||
Status::Active
|
||||
Status::Active {
|
||||
is_horizontal_scrollbar_disabled: scrollbars.is_x_disabled(),
|
||||
is_vertical_scrollbar_disabled: scrollbars.is_y_disabled(),
|
||||
}
|
||||
};
|
||||
|
||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||
|
|
@ -968,8 +975,13 @@ where
|
|||
_ => mouse::Cursor::Unavailable,
|
||||
};
|
||||
|
||||
let style = theme
|
||||
.style(&self.class, self.last_status.unwrap_or(Status::Active));
|
||||
let style = theme.style(
|
||||
&self.class,
|
||||
self.last_status.unwrap_or(Status::Active {
|
||||
is_horizontal_scrollbar_disabled: false,
|
||||
is_vertical_scrollbar_disabled: false,
|
||||
}),
|
||||
);
|
||||
|
||||
container::draw_background(renderer, &style.container, layout.bounds());
|
||||
|
||||
|
|
@ -1661,6 +1673,7 @@ impl Scrollbars {
|
|||
bounds: scrollbar_bounds,
|
||||
scroller,
|
||||
alignment: vertical.alignment,
|
||||
disabled: content_bounds.height <= bounds.height,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
|
|
@ -1730,6 +1743,7 @@ impl Scrollbars {
|
|||
bounds: scrollbar_bounds,
|
||||
scroller,
|
||||
alignment: horizontal.alignment,
|
||||
disabled: content_bounds.width <= bounds.width,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
|
|
@ -1758,6 +1772,14 @@ impl Scrollbars {
|
|||
}
|
||||
}
|
||||
|
||||
fn is_y_disabled(&self) -> bool {
|
||||
self.y.map(|y| y.disabled).unwrap_or(false)
|
||||
}
|
||||
|
||||
fn is_x_disabled(&self) -> bool {
|
||||
self.x.map(|x| x.disabled).unwrap_or(false)
|
||||
}
|
||||
|
||||
fn grab_y_scroller(&self, cursor_position: Point) -> Option<f32> {
|
||||
let scrollbar = self.y?;
|
||||
let scroller = scrollbar.scroller?;
|
||||
|
|
@ -1804,6 +1826,7 @@ pub(super) mod internals {
|
|||
pub bounds: Rectangle,
|
||||
pub scroller: Option<Scroller>,
|
||||
pub alignment: Anchor,
|
||||
pub disabled: bool,
|
||||
}
|
||||
|
||||
impl Scrollbar {
|
||||
|
|
@ -1867,13 +1890,22 @@ pub(super) mod internals {
|
|||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum Status {
|
||||
/// The [`Scrollable`] can be interacted with.
|
||||
Active,
|
||||
Active {
|
||||
/// Whether or not the horizontal scrollbar is disabled meaning the content isn't overflowing.
|
||||
is_horizontal_scrollbar_disabled: bool,
|
||||
/// Whether or not the vertical scrollbar is disabled meaning the content isn't overflowing.
|
||||
is_vertical_scrollbar_disabled: bool,
|
||||
},
|
||||
/// The [`Scrollable`] is being hovered.
|
||||
Hovered {
|
||||
/// Indicates if the horizontal scrollbar is being hovered.
|
||||
is_horizontal_scrollbar_hovered: bool,
|
||||
/// Indicates if the vertical scrollbar is being hovered.
|
||||
is_vertical_scrollbar_hovered: bool,
|
||||
/// Whether or not the horizontal scrollbar is disabled meaning the content isn't overflowing.
|
||||
is_horizontal_scrollbar_disabled: bool,
|
||||
/// Whether or not the vertical scrollbar is disabled meaning the content isn't overflowing.
|
||||
is_vertical_scrollbar_disabled: bool,
|
||||
},
|
||||
/// The [`Scrollable`] is being dragged.
|
||||
Dragged {
|
||||
|
|
@ -1881,6 +1913,10 @@ pub enum Status {
|
|||
is_horizontal_scrollbar_dragged: bool,
|
||||
/// Indicates if the vertical scrollbar is being dragged.
|
||||
is_vertical_scrollbar_dragged: bool,
|
||||
/// Whether or not the horizontal scrollbar is disabled meaning the content isn't overflowing.
|
||||
is_horizontal_scrollbar_disabled: bool,
|
||||
/// Whether or not the vertical scrollbar is disabled meaning the content isn't overflowing.
|
||||
is_vertical_scrollbar_disabled: bool,
|
||||
},
|
||||
}
|
||||
|
||||
|
|
@ -1958,7 +1994,7 @@ pub fn default(theme: &Theme, status: Status) -> Style {
|
|||
};
|
||||
|
||||
match status {
|
||||
Status::Active => Style {
|
||||
Status::Active { .. } => Style {
|
||||
container: container::Style::default(),
|
||||
vertical_rail: scrollbar,
|
||||
horizontal_rail: scrollbar,
|
||||
|
|
@ -1967,6 +2003,7 @@ pub fn default(theme: &Theme, status: Status) -> Style {
|
|||
Status::Hovered {
|
||||
is_horizontal_scrollbar_hovered,
|
||||
is_vertical_scrollbar_hovered,
|
||||
..
|
||||
} => {
|
||||
let hovered_scrollbar = Rail {
|
||||
scroller: Scroller {
|
||||
|
|
@ -1994,6 +2031,7 @@ pub fn default(theme: &Theme, status: Status) -> Style {
|
|||
Status::Dragged {
|
||||
is_horizontal_scrollbar_dragged,
|
||||
is_vertical_scrollbar_dragged,
|
||||
..
|
||||
} => {
|
||||
let dragged_scrollbar = Rail {
|
||||
scroller: Scroller {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue