Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
CHANGELOG
=========

0.1.1
-----

- Fix scroll limitation in source view #41

0.1.0
-----

Expand Down
3 changes: 2 additions & 1 deletion src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -637,8 +637,9 @@ impl App {
context,
});
}
self.history.push(entry);
self.session_view.reset();
self.session_view.scroll_to_line(entry.source(0).line_no);
self.history.push(entry);
Ok(())
}

Expand Down
60 changes: 53 additions & 7 deletions src/view/session.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::cell::Cell;

use super::context::ContextComponent;
use super::source::SourceComponent;
use super::stack::StackComponent;
Expand Down Expand Up @@ -184,6 +186,7 @@ fn build_pane_widget(frame: &mut Frame, app: &App, pane: &Pane, area: Rect, inde
};
}

#[derive(Default)]
pub struct SearchState {
pub show: bool,
pub search: String,
Expand All @@ -196,9 +199,11 @@ impl SearchState {
}
}

#[derive(Default)]
pub struct SessionViewState {
pub full_screen: bool,
pub source_scroll: (u16, u16),
pub source_area: Cell<Rect>,
pub context_scroll: (u16, u16),
pub context_filter: SearchState,
pub stack_scroll: (u16, u16),
Expand All @@ -207,17 +212,12 @@ pub struct SessionViewState {
pub current_pane: usize,
}

impl Default for SessionViewState {
fn default() -> Self {
Self::new()
}
}

impl SessionViewState {
pub fn new() -> Self {
Self {
full_screen: false,
source_scroll: (0, 0),
source_area: Cell::new(Rect::new(0, 0, 0, 0)),
context_scroll: (0, 0),
context_filter: SearchState {
show: false,
Expand Down Expand Up @@ -271,10 +271,56 @@ impl SessionViewState {
pub(crate) fn stack_depth(&self) -> u16 {
self.stack_scroll.0
}

pub(crate) fn scroll_to_line(&mut self, line_no: u32) -> () {
let area = self.source_area.get();
let mid_point = (area.height as u32).div_ceil(2);
let offset = if line_no > mid_point {
line_no - mid_point
} else {
0
};
self.source_scroll.0 = offset as u16;
}
}

#[derive(Debug, Clone)]
#[derive(Debug, Clone, Default)]
pub enum SessionViewMode {
#[default]
Current,
History,
}

#[cfg(test)]
mod test {
use super::*;

#[test]
pub fn scroll_to_line() -> () {
let mut view = SessionViewState::default();
view.source_area = Cell::new(Rect{
x: 0,
y: 0,
width: 0,
height: 10,
});
view.scroll_to_line(0);

assert_eq!(0, view.source_scroll.0);

view.scroll_to_line(5);
assert_eq!(0, view.source_scroll.0);

view.scroll_to_line(6);
assert_eq!(1, view.source_scroll.0);

view.scroll_to_line(10);
assert_eq!(5, view.source_scroll.0);

view.scroll_to_line(20);
assert_eq!(15, view.source_scroll.0);

view.scroll_to_line(100);
assert_eq!(95, view.source_scroll.0);
}
}
22 changes: 10 additions & 12 deletions src/view/source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ impl View for SourceComponent {
.constraints(constraints)
.split(area);

// make the app aware of the source area so we can
// center the source code on the releant line when
// setpping into code
app.session_view.source_area.set(rows[0]);

let mut annotations = vec![];
let mut lines: Vec<Line> = Vec::new();

Expand Down Expand Up @@ -86,23 +91,16 @@ impl View for SourceComponent {
}
}

let scroll: u16 = if stack.source.line_no as u16 > area.height {
let center = (stack.source.line_no as u16)
.saturating_sub(area.height.div_ceil(2)) as i16;
center
.saturating_add(app.session_view.source_scroll.0 as i16)
.max(0) as u16
} else {
app.session_view.source_scroll.0
};

frame.render_widget(Paragraph::new(lines.clone()).scroll((scroll, app.session_view.source_scroll.1)), rows[0]);
frame.render_widget(
Paragraph::new(lines.clone()).scroll(app.session_view.source_scroll),
rows[0],
);

for (line_no, line_length, line) in annotations {
let x_offset = rows[0].x + (line_length as u16).saturating_sub(app.session_view.source_scroll.1);
let area = Rect {
x: x_offset,
y: (line_no as u32).saturating_sub(scroll as u32) as u16 + 1,
y: (line_no as u32).saturating_sub(app.session_view.source_scroll.0 as u32) as u16 + 1,
width: rows[0].width.saturating_sub(x_offset),
height: 1,
};
Expand Down