diff options
Diffstat (limited to 'v_windows/v/examples/term.ui/rectangles.v')
-rw-r--r-- | v_windows/v/examples/term.ui/rectangles.v | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/v_windows/v/examples/term.ui/rectangles.v b/v_windows/v/examples/term.ui/rectangles.v new file mode 100644 index 0000000..09e9d6a --- /dev/null +++ b/v_windows/v/examples/term.ui/rectangles.v @@ -0,0 +1,97 @@ +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 tui.Color{ + 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 = 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 +} + +fn main() { + 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() ? +} |