@@ -61,9 +61,12 @@ impl crate::Prompt for Json {
6161 }
6262
6363 async fn evaluate ( & mut self , event : & Event ) -> anyhow:: Result < Signal > {
64+ let should_render = self . should_render_after_event ( event) . await ;
6465 let ret = ( self . evaluator ) ( event, self ) . await ;
65- let size = crossterm:: terminal:: size ( ) ?;
66- self . render ( size. 0 , size. 1 ) . await ?;
66+ if should_render {
67+ let size = crossterm:: terminal:: size ( ) ?;
68+ self . render ( size. 0 , size. 1 ) . await ?;
69+ }
6770 ret
6871 }
6972
@@ -188,4 +191,72 @@ impl Json {
188191 None => Err ( anyhow:: anyhow!( "Renderer not initialized" ) ) ,
189192 }
190193 }
194+
195+ async fn should_render_after_event ( & self , event : & Event ) -> bool {
196+ use crate :: core:: crossterm:: event:: {
197+ KeyCode , KeyEvent , KeyEventKind , KeyEventState , KeyModifiers , MouseEvent ,
198+ MouseEventKind ,
199+ } ;
200+
201+ match event {
202+ Event :: Resize ( _, _) => false ,
203+ Event :: Key ( KeyEvent {
204+ code : KeyCode :: Up ,
205+ modifiers : KeyModifiers :: NONE ,
206+ kind : KeyEventKind :: Press ,
207+ state : KeyEventState :: NONE ,
208+ } )
209+ | Event :: Mouse ( MouseEvent {
210+ kind : MouseEventKind :: ScrollUp ,
211+ modifiers : KeyModifiers :: NONE ,
212+ ..
213+ } ) => self . json . document . position ( ) > 0 ,
214+
215+ Event :: Key ( KeyEvent {
216+ code : KeyCode :: Down ,
217+ modifiers : KeyModifiers :: NONE ,
218+ kind : KeyEventKind :: Press ,
219+ state : KeyEventState :: NONE ,
220+ } )
221+ | Event :: Mouse ( MouseEvent {
222+ kind : MouseEventKind :: ScrollDown ,
223+ modifiers : KeyModifiers :: NONE ,
224+ ..
225+ } ) => self . json . document . position ( ) != self . json . document . tail_position ( ) ,
226+
227+ Event :: Key ( KeyEvent {
228+ code : KeyCode :: Char ( ' ' ) ,
229+ modifiers : KeyModifiers :: NONE ,
230+ kind : KeyEventKind :: Press ,
231+ state : KeyEventState :: NONE ,
232+ } ) => self . json . document . can_toggle_current ( ) ,
233+
234+ Event :: Mouse ( MouseEvent {
235+ kind : MouseEventKind :: Down ( _) ,
236+ column,
237+ row,
238+ modifiers : KeyModifiers :: NONE ,
239+ } ) => {
240+ let Some ( renderer) = self . renderer . as_ref ( ) else {
241+ return false ;
242+ } ;
243+ let Some ( hit) = renderer. hit_test ( * row, * column) . await else {
244+ return false ;
245+ } ;
246+ if hit. key != Index :: Json {
247+ return false ;
248+ }
249+
250+ let Some ( index) = self . json . document . visible_offset_to_index ( hit. visible_row )
251+ else {
252+ return false ;
253+ } ;
254+
255+ index != self . json . document . position ( )
256+ || self . json . document . row_is_toggleable ( index)
257+ }
258+
259+ _ => false ,
260+ }
261+ }
191262}
0 commit comments