@@ -15,7 +15,7 @@ use crate::{model::cell::col_name, theme::Theme};
1515
1616use self :: {
1717 layout:: GridLayout ,
18- primitives:: { BorderStroke , CellRect , RegionRect } ,
18+ primitives:: { BorderSides , BorderStroke , CellRect , RegionRect } ,
1919 view:: { GridScroll , GridSelection } ,
2020} ;
2121
@@ -130,11 +130,12 @@ impl TableGrid {
130130 && let Some ( region) =
131131 selection_to_region_rect ( & cfg. layout , & sc, & sel, rendered_rows, rendered_cols)
132132 {
133- draw:: draw_region_border (
133+ draw:: draw_region_border_sides (
134134 buffer,
135135 region,
136136 Style :: default ( ) . fg ( cfg. theme . accent ) ,
137137 BorderStroke :: Solid ,
138+ selection_border_sides ( & sel) ,
138139 ) ;
139140 }
140141
@@ -143,11 +144,12 @@ impl TableGrid {
143144 && let Some ( rect) =
144145 selection_to_region_rect ( & cfg. layout , & sc, & region, rendered_rows, rendered_cols)
145146 {
146- draw:: draw_region_border (
147+ draw:: draw_region_border_sides (
147148 buffer,
148149 rect,
149150 Style :: default ( ) . fg ( cfg. theme . accent ) ,
150151 BorderStroke :: Dashed ,
152+ selection_border_sides ( & region) ,
151153 ) ;
152154 }
153155
@@ -179,6 +181,14 @@ fn cursor_cell_rect(
179181 layout. cell_rect ( vis_row, vis_col)
180182}
181183
184+ fn selection_border_sides ( selection : & GridSelection ) -> BorderSides {
185+ match selection {
186+ GridSelection :: Row ( _) => BorderSides :: HORIZONTAL ,
187+ GridSelection :: Column ( _) => BorderSides :: VERTICAL ,
188+ GridSelection :: Range { .. } => BorderSides :: ALL ,
189+ }
190+ }
191+
182192fn selection_to_region_rect (
183193 layout : & GridLayout ,
184194 scroll : & GridScroll ,
@@ -225,3 +235,76 @@ fn selection_to_region_rect(
225235 }
226236 }
227237}
238+
239+ #[ cfg( test) ]
240+ mod tests {
241+ use ratatui:: { Terminal , backend:: TestBackend , layout:: Rect } ;
242+
243+ use super :: {
244+ TableGrid , TableGridConfig ,
245+ layout:: GridMetrics ,
246+ view:: { GridScroll , GridSelection } ,
247+ } ;
248+ use crate :: { model:: cell:: CellAddress , theme:: Theme } ;
249+
250+ fn render_selection ( selection : GridSelection ) -> ratatui:: buffer:: Buffer {
251+ let backend = TestBackend :: new ( 40 , 10 ) ;
252+ let mut terminal = Terminal :: new ( backend) . unwrap ( ) ;
253+ let theme = Theme :: dark ( ) ;
254+ let cell_text = |_: usize , _: usize | String :: new ( ) ;
255+
256+ let frame = terminal
257+ . draw ( |frame| {
258+ let area = Rect :: new ( 0 , 0 , 40 , 10 ) ;
259+ let layout = GridMetrics :: new ( 8 , 4 , 2 ) . layout ( area) ;
260+ TableGrid :: render (
261+ frame,
262+ frame. area ( ) ,
263+ TableGridConfig {
264+ scroll : GridScroll {
265+ scroll_row : 0 ,
266+ scroll_col : 0 ,
267+ visible_rows : 3 ,
268+ visible_cols : 3 ,
269+ cursor : CellAddress { row : 1 , col : 1 } ,
270+ total_rows : 3 ,
271+ total_cols : 3 ,
272+ } ,
273+ layout,
274+ theme,
275+ blink_visible : true ,
276+ edit_buffer : None ,
277+ selection : Some ( selection) ,
278+ copied_region : None ,
279+ cell_text : & cell_text,
280+ } ,
281+ ) ;
282+ } )
283+ . unwrap ( ) ;
284+
285+ frame. buffer . clone ( )
286+ }
287+
288+ #[ test]
289+ fn column_selection_draws_only_left_and_right_edges ( ) {
290+ let buffer = render_selection ( GridSelection :: Column ( 1 ) ) ;
291+ let accent = Theme :: dark ( ) . accent ;
292+
293+ assert_eq ! ( buffer[ ( 13 , 1 ) ] . fg, accent) ;
294+ assert_eq ! ( buffer[ ( 22 , 1 ) ] . fg, accent) ;
295+ assert_ne ! ( buffer[ ( 14 , 0 ) ] . symbol( ) , "━" ) ;
296+ assert_ne ! ( buffer[ ( 14 , 7 ) ] . symbol( ) , "━" ) ;
297+ assert_ne ! ( buffer[ ( 14 , 7 ) ] . fg, accent) ;
298+ }
299+
300+ #[ test]
301+ fn row_selection_draws_only_top_and_bottom_edges ( ) {
302+ let buffer = render_selection ( GridSelection :: Row ( 1 ) ) ;
303+ let accent = Theme :: dark ( ) . accent ;
304+
305+ assert_eq ! ( buffer[ ( 14 , 3 ) ] . fg, accent) ;
306+ assert_eq ! ( buffer[ ( 14 , 5 ) ] . fg, accent) ;
307+ assert_ne ! ( buffer[ ( 4 , 4 ) ] . fg, accent) ;
308+ assert_ne ! ( buffer[ ( 31 , 4 ) ] . fg, accent) ;
309+ }
310+ }
0 commit comments