@@ -316,6 +316,67 @@ private struct VTDemo {
316316 private static nonisolated ( unsafe) var state = ApplicationState . menu
317317 private static nonisolated ( unsafe) var menu = Menu ( size: . zero)
318318
319+ private static func process( _ event: VTEvent ,
320+ _ renderer: borrowing VTRenderer ) -> Bool {
321+ switch event {
322+ case . key( let key) where key. type == . press:
323+ // Global Key Handling
324+ switch key. character {
325+ case " q " , " Q " :
326+ return false
327+ case " p " , " P " :
328+ statistics. toggle ( )
329+ return true
330+ case " m " , " M " :
331+ state = . menu
332+ return true
333+ default :
334+ break
335+ }
336+
337+ // Handle escape key
338+ if key. keycode == VTKeyCode . escape {
339+ switch VTDemo . state {
340+ case . menu:
341+ return false
342+
343+ case . display( _) :
344+ VTDemo . state = . menu
345+ return true
346+ }
347+ }
348+
349+ switch VTDemo . state {
350+ case . menu:
351+ if [ " \r " , " \n " ] . contains ( key. character) {
352+ if let scene = menu. scene {
353+ state = . display( scene. init ( size: renderer. back. size) )
354+ }
355+ return true
356+ }
357+
358+ for option in Menu . Options {
359+ if option. hotkey == key. character {
360+ VTDemo . state = . display( option. scene. init ( size: renderer. back. size) )
361+ break
362+ }
363+ }
364+
365+ menu. process ( input: event)
366+
367+ case . display( var scene) :
368+ // Process scene-specific input
369+ scene. process ( input: event)
370+ VTDemo . state = . display( scene)
371+ }
372+
373+ default :
374+ break
375+ }
376+
377+ return true
378+ }
379+
319380 static func main( ) async throws {
320381 let renderer = try await VTRenderer ( mode: . raw)
321382 let terminal = renderer. terminal
@@ -336,56 +397,7 @@ private struct VTDemo {
336397 // Input handling task
337398 group. addTask {
338399 for try await event in terminal. input {
339- switch event {
340- case . key( let key) where key. type == . press:
341- // Global Key Handling
342- switch key. character {
343- case " q " , " Q " : return
344- case " p " , " P " : statistics. toggle ( )
345- case " m " , " M " :
346- state = . menu
347- continue
348- default :
349- break
350- }
351-
352- // Handle escape key
353- if key. keycode == VTKeyCode . escape {
354- switch VTDemo . state {
355- case . menu:
356- return
357-
358- case . display( _) :
359- VTDemo . state = . menu
360- }
361- }
362-
363- switch VTDemo . state {
364- case . menu:
365- if [ " \r " , " \n " ] . contains ( key. character) {
366- if let scene = menu. scene {
367- state = . display( scene. init ( size: renderer. back. size) )
368- }
369- continue
370- }
371-
372- for option in Menu . Options {
373- if option. hotkey == key. character {
374- VTDemo . state = . display( option. scene. init ( size: renderer. back. size) )
375- break
376- }
377- }
378-
379- menu. process ( input: event)
380-
381- case . display( var scene) :
382- // Process scene-specific input
383- scene. process ( input: event)
384- VTDemo . state = . display( scene)
385- }
386-
387- default : continue
388- }
400+ if !process( event, renderer) { return }
389401 }
390402 }
391403
0 commit comments