// paintui handles turning sdl input things // into drawing instructions // it might have some kind of state machine // for doing smooth lines between discrete mouse positions // all mouse pos stuff in this module is in world coordinates // someone else is responsible for doing the transform from // screen to world coords. use drawing; use drawing::{pos}; export const sizes: [_]u8 = [ 1, 2, 4, 8, 16, 32, 48, 64, 80, 96, 112, 128 ]; const colors: [_]u32 = [ 0xffffff, // white 0xff4040, // red 0xff8000, // orange 0xc0c040, // yellow 0x00c000, // green 0x00c0c0, // teal 0x4040ff, // blue 0xc000c0, // purple 0x808080, // grey 0x000000, // black ]; export type state = struct { // last known mouse position, in world coordinates last_mouse_pos: pos, // last known mouse pressed-ness last_mouse_pressed: bool, size_idx: size, color: u32 }; export fn tick( pstate: *state, mouse_pos: pos, mouse_pressed: bool ) (void | drawing::op) = { defer { pstate.last_mouse_pos = mouse_pos; pstate.last_mouse_pressed = mouse_pressed; }; // if mouse down and (position moved OR newly pressed) return if (mouse_pressed && (mouse_pos.0 != pstate.last_mouse_pos.0 || mouse_pos.1 != pstate.last_mouse_pos.1 || (!pstate.last_mouse_pressed))) drawing::op_stroke { pos1 = mouse_pos, pos0 = (0,0), radius = sizes[pstate.size_idx], color = pstate.color, } else void; }; export fn mousewheel(pstate: *state, amt: i32) void = { if (amt < 0 && pstate.size_idx > 0) pstate.size_idx -= 1 else if (amt > 0 && pstate.size_idx < len(sizes) - 1) pstate.size_idx += 1; }; export fn key(pstate: *state, key: uint) void = { assert(key <= 9, "what what what what what"); pstate.color = colors[key]; };