91 lines
1.3 KiB
V
91 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()
|