93 lines
1.7 KiB
V
93 lines
1.7 KiB
V
import term.ui as tui
|
|
|
|
const (
|
|
colors = [
|
|
tui.Color{33, 150, 243}
|
|
tui.Color{0, 150, 136}
|
|
tui.Color{205, 220, 57}
|
|
tui.Color{255, 152, 0}
|
|
tui.Color{244, 67, 54}
|
|
tui.Color{156, 39, 176}
|
|
]
|
|
)
|
|
|
|
struct Point {
|
|
x int
|
|
y int
|
|
}
|
|
|
|
struct App {
|
|
mut:
|
|
tui &tui.Context = 0
|
|
points []Point
|
|
color tui.Color = colors[0]
|
|
color_idx int
|
|
cut_rate f64 = 5
|
|
}
|
|
|
|
fn frame(x voidptr) {
|
|
mut app := &App(x)
|
|
|
|
app.tui.clear()
|
|
|
|
if app.points.len > 0 {
|
|
app.tui.set_bg_color(app.color)
|
|
mut last := app.points[0]
|
|
for point in app.points {
|
|
// if the cursor moves quickly enough, different events are not
|
|
// necessarily touching, so we need to draw a line between them
|
|
app.tui.draw_line(last.x, last.y, point.x, point.y)
|
|
last = point
|
|
}
|
|
app.tui.reset()
|
|
|
|
l := int(app.points.len / app.cut_rate) + 1
|
|
app.points = app.points[l..].clone()
|
|
}
|
|
|
|
ww := app.tui.window_width
|
|
|
|
app.tui.bold()
|
|
app.tui.draw_text(ww / 6, 2, 'V term.input: cursor chaser demo')
|
|
app.tui.draw_text((ww - ww / 6) - 14, 2, 'cut rate: ${(100 / app.cut_rate):3.0f}%')
|
|
app.tui.horizontal_separator(3)
|
|
app.tui.reset()
|
|
app.tui.flush()
|
|
}
|
|
|
|
fn event(e &tui.Event, x voidptr) {
|
|
mut app := &App(x)
|
|
|
|
match e.typ {
|
|
.key_down {
|
|
match e.code {
|
|
.escape {
|
|
exit(0)
|
|
}
|
|
.space, .enter {
|
|
app.color_idx++
|
|
if app.color_idx == colors.len { app.color_idx = 0 }
|
|
app.color = colors[app.color_idx]
|
|
} else {}
|
|
}
|
|
} .mouse_move, .mouse_drag, .mouse_down {
|
|
app.points << Point{ e.x, e.y }
|
|
} .mouse_scroll {
|
|
d := if e.direction == .up { 0.1 } else { -0.1 }
|
|
app.cut_rate += d
|
|
if app.cut_rate < 1 { app.cut_rate = 1 }
|
|
} else {}
|
|
}
|
|
}
|
|
|
|
mut app := &App{}
|
|
app.tui = tui.init(
|
|
user_data: app,
|
|
frame_fn: frame,
|
|
event_fn: event,
|
|
|
|
hide_cursor: true
|
|
)
|
|
|
|
app.tui.run()
|