1+ use std:: cell:: Cell ;
2+
13use super :: context:: ContextComponent ;
24use super :: source:: SourceComponent ;
35use super :: stack:: StackComponent ;
@@ -184,6 +186,7 @@ fn build_pane_widget(frame: &mut Frame, app: &App, pane: &Pane, area: Rect, inde
184186 } ;
185187}
186188
189+ #[ derive( Default ) ]
187190pub struct SearchState {
188191 pub show : bool ,
189192 pub search : String ,
@@ -196,9 +199,11 @@ impl SearchState {
196199 }
197200}
198201
202+ #[ derive( Default ) ]
199203pub struct SessionViewState {
200204 pub full_screen : bool ,
201205 pub source_scroll : ( u16 , u16 ) ,
206+ pub source_area : Cell < Rect > ,
202207 pub context_scroll : ( u16 , u16 ) ,
203208 pub context_filter : SearchState ,
204209 pub stack_scroll : ( u16 , u16 ) ,
@@ -207,17 +212,12 @@ pub struct SessionViewState {
207212 pub current_pane : usize ,
208213}
209214
210- impl Default for SessionViewState {
211- fn default ( ) -> Self {
212- Self :: new ( )
213- }
214- }
215-
216215impl SessionViewState {
217216 pub fn new ( ) -> Self {
218217 Self {
219218 full_screen : false ,
220219 source_scroll : ( 0 , 0 ) ,
220+ source_area : Cell :: new ( Rect :: new ( 0 , 0 , 0 , 0 ) ) ,
221221 context_scroll : ( 0 , 0 ) ,
222222 context_filter : SearchState {
223223 show : false ,
@@ -271,10 +271,56 @@ impl SessionViewState {
271271 pub ( crate ) fn stack_depth ( & self ) -> u16 {
272272 self . stack_scroll . 0
273273 }
274+
275+ pub ( crate ) fn scroll_to_line ( & mut self , line_no : u32 ) -> ( ) {
276+ let area = self . source_area . get ( ) ;
277+ let mid_point = ( area. height as u32 ) . div_ceil ( 2 ) ;
278+ let offset = if line_no > mid_point {
279+ line_no - mid_point
280+ } else {
281+ 0
282+ } ;
283+ self . source_scroll . 0 = offset as u16 ;
284+ }
274285}
275286
276- #[ derive( Debug , Clone ) ]
287+ #[ derive( Debug , Clone , Default ) ]
277288pub enum SessionViewMode {
289+ #[ default]
278290 Current ,
279291 History ,
280292}
293+
294+ #[ cfg( test) ]
295+ mod test {
296+ use super :: * ;
297+
298+ #[ test]
299+ pub fn scroll_to_line ( ) -> ( ) {
300+ let mut view = SessionViewState :: default ( ) ;
301+ view. source_area = Cell :: new ( Rect {
302+ x : 0 ,
303+ y : 0 ,
304+ width : 0 ,
305+ height : 10 ,
306+ } ) ;
307+ view. scroll_to_line ( 0 ) ;
308+
309+ assert_eq ! ( 0 , view. source_scroll. 0 ) ;
310+
311+ view. scroll_to_line ( 5 ) ;
312+ assert_eq ! ( 0 , view. source_scroll. 0 ) ;
313+
314+ view. scroll_to_line ( 6 ) ;
315+ assert_eq ! ( 1 , view. source_scroll. 0 ) ;
316+
317+ view. scroll_to_line ( 10 ) ;
318+ assert_eq ! ( 5 , view. source_scroll. 0 ) ;
319+
320+ view. scroll_to_line ( 20 ) ;
321+ assert_eq ! ( 15 , view. source_scroll. 0 ) ;
322+
323+ view. scroll_to_line ( 100 ) ;
324+ assert_eq ! ( 95 , view. source_scroll. 0 ) ;
325+ }
326+ }
0 commit comments