Skip to content

Commit 86720de

Browse files
committed
VTDemo: extract event processing
This extracts the input event processing to make the task group code more legible.
1 parent 66305ad commit 86720de

1 file changed

Lines changed: 62 additions & 50 deletions

File tree

Sources/VTDemo/VTDemo.swift

Lines changed: 62 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)