96 lines
1.3 KiB
V
96 lines
1.3 KiB
V
import term.ui as tui
|
|
import rand
|
|
|
|
struct Rect {
|
|
mut:
|
|
c tui.Color
|
|
x int
|
|
y int
|
|
x2 int
|
|
y2 int
|
|
}
|
|
|
|
struct App {
|
|
mut:
|
|
tui &tui.Context = 0
|
|
rects []Rect
|
|
cur_rect Rect
|
|
is_drag bool
|
|
redraw bool
|
|
}
|
|
|
|
fn random_color() tui.Color {
|
|
return {
|
|
r: byte(rand.intn(256))
|
|
g: byte(rand.intn(256))
|
|
b: byte(rand.intn(256))
|
|
}
|
|
}
|
|
|
|
fn event(e &tui.Event, x voidptr) {
|
|
mut app := &App(x)
|
|
match e.typ {
|
|
.mouse_down {
|
|
app.is_drag = true
|
|
app.cur_rect = {
|
|
c: random_color()
|
|
x: e.x
|
|
y: e.y
|
|
x2: e.x
|
|
y2: e.y
|
|
}
|
|
}
|
|
.mouse_drag {
|
|
app.cur_rect.x2 = e.x
|
|
app.cur_rect.y2 = e.y
|
|
}
|
|
.mouse_up {
|
|
app.rects << app.cur_rect
|
|
app.is_drag = false
|
|
}
|
|
.key_down {
|
|
if e.code == .c {
|
|
app.rects.clear()
|
|
} else if e.code == .escape {
|
|
exit(0)
|
|
}
|
|
}
|
|
else {}
|
|
}
|
|
app.redraw = true
|
|
}
|
|
|
|
fn frame(x voidptr) {
|
|
mut app := &App(x)
|
|
if !app.redraw {
|
|
return
|
|
}
|
|
|
|
app.tui.clear()
|
|
|
|
for rect in app.rects {
|
|
app.tui.set_bg_color(rect.c)
|
|
app.tui.draw_rect(rect.x, rect.y, rect.x2, rect.y2)
|
|
}
|
|
|
|
if app.is_drag {
|
|
r := app.cur_rect
|
|
app.tui.set_bg_color(r.c)
|
|
app.tui.draw_empty_rect(r.x, r.y, r.x2, r.y2)
|
|
}
|
|
|
|
app.tui.reset_bg_color()
|
|
app.tui.flush()
|
|
app.redraw = false
|
|
}
|
|
|
|
mut app := &App{}
|
|
app.tui = tui.init(
|
|
user_data: app
|
|
event_fn: event
|
|
frame_fn: frame
|
|
hide_cursor: true
|
|
frame_rate: 60
|
|
)
|
|
app.tui.run() ?
|