mirror of
https://github.com/vlang/v.git
synced 2025-09-07 14:20:10 -04:00
93 lines
2.6 KiB
V
93 lines
2.6 KiB
V
import term.ui as tui
|
|
import flag
|
|
|
|
struct DocTest {
|
|
show_version bool @[short: v; xdoc: 'Show version and exit']
|
|
debug_level int @[long: debug; short: d; xdoc: 'Debug level']
|
|
level f32 @[only: l; xdoc: 'Do not show this']
|
|
example string
|
|
square bool
|
|
multi int @[only: m; repeats]
|
|
wroom []int @[short: w]
|
|
the_limit string
|
|
}
|
|
|
|
struct App {
|
|
mut:
|
|
tui &tui.Context = unsafe { nil }
|
|
frame int
|
|
square string = '.____.\n| |\n| |\n|____|'
|
|
pad int = 1
|
|
direction int = 1
|
|
}
|
|
|
|
fn event(e &tui.Event, mut app App) {
|
|
match e.typ {
|
|
.mouse_down {}
|
|
.mouse_drag {}
|
|
.mouse_up {}
|
|
.key_down {
|
|
if e.code == .c {
|
|
} else if e.code == .escape {
|
|
exit(0)
|
|
}
|
|
}
|
|
else {}
|
|
}
|
|
}
|
|
|
|
fn frame(mut app App) {
|
|
app.tui.clear()
|
|
app.frame++
|
|
|
|
if app.frame % 4 == 0 {
|
|
app.pad += app.direction
|
|
app.square = '${' '.repeat(app.pad)}.____.\n${' '.repeat(app.pad)}| |\n${' '.repeat(app.pad)}| |\n${' '.repeat(app.pad)}|____|'
|
|
}
|
|
if app.frame % 100 == 0 {
|
|
if app.direction > 0 {
|
|
app.direction = -1
|
|
} else {
|
|
app.direction = 1
|
|
}
|
|
}
|
|
|
|
help_text := flag.to_doc[DocTest](
|
|
version: '1.0'
|
|
description: 'Hello! This should show an *animated* example application description.
|
|
We are at frame ${app.frame}.
|
|
Press ESCAPE or Ctrl+C to exit'
|
|
footer: '
|
|
Press ESCAPE or Ctrl+C to exit'
|
|
fields: {
|
|
'level': 'Level of lorem ipsum\nand more\nmany many many more.\nNotice how user newlines/format is kept since\ninput lines are all less or within\nthe default layout.description_padding\nand max width'
|
|
'example': 'Looong example text without newlines or anything else and lorem ipsum and more and many many many more. Should be auto fitted'
|
|
'multi': 'This flag can be repeated'
|
|
'-e, --extra': 'Secret flag that does not exist on the struct, but we want documented (in same format as the others)'
|
|
'-q, --quiet-and-quite-long-flag <string>': 'Mega long description and secret flag that does not exist on the struct, but we want documented. Also the flag has custom newlines\nand the flag line itself is super long'
|
|
'square': '${app.square}'
|
|
}
|
|
) or { '' }
|
|
|
|
app.tui.draw_text(0, 0, '${help_text}')
|
|
app.tui.reset()
|
|
|
|
app.tui.flush()
|
|
}
|
|
|
|
type EventFn = fn (&tui.Event, voidptr)
|
|
|
|
type FrameFn = fn (voidptr)
|
|
|
|
fn main() {
|
|
mut app := &App{}
|
|
app.tui = tui.init(
|
|
user_data: app
|
|
event_fn: EventFn(event)
|
|
frame_fn: FrameFn(frame)
|
|
hide_cursor: true
|
|
frame_rate: 60
|
|
)
|
|
app.tui.run()!
|
|
}
|