Merge pull request #520 from deemoun/hide-scrollbar
Hide the Scrollbar when it isn't needed #507
This commit is contained in:
parent
7b511d737f
commit
e11902c5bf
1 changed files with 43 additions and 30 deletions
|
|
@ -579,7 +579,9 @@ where
|
||||||
let mut start_line_opt = None;
|
let mut start_line_opt = None;
|
||||||
let mut end_line = 0;
|
let mut end_line = 0;
|
||||||
let mut max_line_width = 0.0;
|
let mut max_line_width = 0.0;
|
||||||
|
let mut layout_run_count = 0usize;
|
||||||
for run in buffer.layout_runs() {
|
for run in buffer.layout_runs() {
|
||||||
|
layout_run_count += 1;
|
||||||
end_line = run.line_i;
|
end_line = run.line_i;
|
||||||
if start_line_opt.is_none() {
|
if start_line_opt.is_none() {
|
||||||
start_line_opt = Some(end_line);
|
start_line_opt = Some(end_line);
|
||||||
|
|
@ -594,14 +596,24 @@ where
|
||||||
let start_y = (start_line * image_h as usize) / lines;
|
let start_y = (start_line * image_h as usize) / lines;
|
||||||
let end_y = ((end_line + 1) * image_h as usize) / lines;
|
let end_y = ((end_line + 1) * image_h as usize) / lines;
|
||||||
|
|
||||||
let rect = Rectangle::new(
|
let original_condition = start_line > 0 || (end_line + 1) < lines;
|
||||||
[image_w as f32 / scale_factor, start_y as f32 / scale_factor].into(),
|
let visible_runs = (((image_h as f32 / scale_factor) / metrics.line_height)
|
||||||
Size::new(
|
.floor() as usize)
|
||||||
scrollbar_size as f32,
|
.max(1);
|
||||||
(end_y as f32 - start_y as f32) / scale_factor,
|
let wrap_overflow = layout_run_count > visible_runs;
|
||||||
),
|
let scrollable = original_condition || wrap_overflow;
|
||||||
);
|
if scrollable {
|
||||||
state.scrollbar_v_rect.set(rect);
|
let rect = Rectangle::new(
|
||||||
|
[image_w as f32 / scale_factor, start_y as f32 / scale_factor].into(),
|
||||||
|
Size::new(
|
||||||
|
scrollbar_size as f32,
|
||||||
|
(end_y as f32 - start_y as f32) / scale_factor,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
state.scrollbar_v_rect.set(Some(rect));
|
||||||
|
} else {
|
||||||
|
state.scrollbar_v_rect.set(None);
|
||||||
|
}
|
||||||
|
|
||||||
let (buffer_w_opt, buffer_h_opt) = buffer.size();
|
let (buffer_w_opt, buffer_h_opt) = buffer.size();
|
||||||
let buffer_w = buffer_w_opt.unwrap_or(0.0);
|
let buffer_w = buffer_w_opt.unwrap_or(0.0);
|
||||||
|
|
@ -723,8 +735,7 @@ where
|
||||||
});
|
});
|
||||||
|
|
||||||
// Draw vertical scrollbar
|
// Draw vertical scrollbar
|
||||||
{
|
if let Some(scrollbar_v_rect) = state.scrollbar_v_rect.get() {
|
||||||
let scrollbar_v_rect = state.scrollbar_v_rect.get();
|
|
||||||
|
|
||||||
// neutral_3, 0.7
|
// neutral_3, 0.7
|
||||||
let track_color = cosmic_theme
|
let track_color = cosmic_theme
|
||||||
|
|
@ -1158,27 +1169,29 @@ where
|
||||||
}
|
}
|
||||||
state.click = Some((click_kind, Instant::now()));
|
state.click = Some((click_kind, Instant::now()));
|
||||||
state.dragging = Some(Dragging::Buffer);
|
state.dragging = Some(Dragging::Buffer);
|
||||||
} else if scrollbar_v_rect.contains(Point::new(x_logical, y_logical)) {
|
} else if let Some(scrollbar_v_rect) = scrollbar_v_rect {
|
||||||
state.dragging = Some(Dragging::ScrollbarV {
|
if scrollbar_v_rect.contains(Point::new(x_logical, y_logical)) {
|
||||||
start_y: y,
|
|
||||||
start_scroll: editor.with_buffer(|buffer| buffer.scroll()),
|
|
||||||
});
|
|
||||||
} else if x_logical >= scrollbar_v_rect.x
|
|
||||||
&& x_logical < (scrollbar_v_rect.x + scrollbar_v_rect.width)
|
|
||||||
{
|
|
||||||
editor.with_buffer_mut(|buffer| {
|
|
||||||
let mut scroll = buffer.scroll();
|
|
||||||
//TODO: if buffer height is undefined, what should this do?
|
|
||||||
let scroll_line = ((y / buffer.size().1.unwrap_or(1.0))
|
|
||||||
* buffer.lines.len() as f32)
|
|
||||||
as i32;
|
|
||||||
scroll.line = scroll_line.try_into().unwrap_or_default();
|
|
||||||
buffer.set_scroll(scroll);
|
|
||||||
state.dragging = Some(Dragging::ScrollbarV {
|
state.dragging = Some(Dragging::ScrollbarV {
|
||||||
start_y: y,
|
start_y: y,
|
||||||
start_scroll: buffer.scroll(),
|
start_scroll: editor.with_buffer(|buffer| buffer.scroll()),
|
||||||
});
|
});
|
||||||
});
|
} else if x_logical >= scrollbar_v_rect.x
|
||||||
|
&& x_logical < (scrollbar_v_rect.x + scrollbar_v_rect.width)
|
||||||
|
{
|
||||||
|
editor.with_buffer_mut(|buffer| {
|
||||||
|
let mut scroll = buffer.scroll();
|
||||||
|
//TODO: if buffer height is undefined, what should this do?
|
||||||
|
let scroll_line = ((y / buffer.size().1.unwrap_or(1.0))
|
||||||
|
* buffer.lines.len() as f32)
|
||||||
|
as i32;
|
||||||
|
scroll.line = scroll_line.try_into().unwrap_or_default();
|
||||||
|
buffer.set_scroll(scroll);
|
||||||
|
state.dragging = Some(Dragging::ScrollbarV {
|
||||||
|
start_y: y,
|
||||||
|
start_scroll: buffer.scroll(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1358,7 +1371,7 @@ pub struct State {
|
||||||
is_focused: bool,
|
is_focused: bool,
|
||||||
emit_focus: bool,
|
emit_focus: bool,
|
||||||
scale_factor: Cell<f32>,
|
scale_factor: Cell<f32>,
|
||||||
scrollbar_v_rect: Cell<Rectangle<f32>>,
|
scrollbar_v_rect: Cell<Option<Rectangle<f32>>>,
|
||||||
scrollbar_h_rect: Cell<Option<Rectangle<f32>>>,
|
scrollbar_h_rect: Cell<Option<Rectangle<f32>>>,
|
||||||
handle_opt: Mutex<Option<image::Handle>>,
|
handle_opt: Mutex<Option<image::Handle>>,
|
||||||
shift_anchor: Mutex<Option<Cursor>>,
|
shift_anchor: Mutex<Option<Cursor>>,
|
||||||
|
|
@ -1375,7 +1388,7 @@ impl State {
|
||||||
is_focused: false,
|
is_focused: false,
|
||||||
emit_focus: false,
|
emit_focus: false,
|
||||||
scale_factor: Cell::new(1.0),
|
scale_factor: Cell::new(1.0),
|
||||||
scrollbar_v_rect: Cell::new(Rectangle::default()),
|
scrollbar_v_rect: Cell::new(None),
|
||||||
scrollbar_h_rect: Cell::new(None),
|
scrollbar_h_rect: Cell::new(None),
|
||||||
handle_opt: Mutex::new(None),
|
handle_opt: Mutex::new(None),
|
||||||
shift_anchor: Mutex::new(None),
|
shift_anchor: Mutex::new(None),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue