Got the first 'input box' to work. Did some changes to keyboard input

Renamed KeyboardKey to KeyCode, redid the encoding layout (preemtively getting ready for SDL later as well)

I got the input box working but it has no constraints and needs to be lifted. The scroll box construction does as well.
This commit is contained in:
Edward R. Gonzalez 2024-05-19 11:06:09 -04:00
parent b137bc542c
commit 275ffcf143
13 changed files with 782 additions and 500 deletions

View File

@ -266,18 +266,23 @@ ui_screen_settings_menu :: proc( captures : rawptr = nil ) -> ( should_raise : b
style.corner_radii[0] = 0.35
}
@static value_str : Array(rune)
if value_str.data == nil {
if value_str.header == nil {
error : AllocatorError
value_str, error = array_init_reserve(rune, persistent_slab_allocator(), Kilo)
ensure(error != AllocatorError.None, "Failed to allocate array for value_str of input_box")
array_append( & value_str, rune('_'))
ensure(error == AllocatorError.None, "Failed to allocate array for value_str of input_box")
}
if input_box.pressed {
array_clear( value_str )
}
if input_box.active {
array_append( & value_str, input.keyboard_events.chars_pressed )
array_clear( input.keyboard_events.chars_pressed )
}
else if input_box.was_active {
value, success := parse_uint(to_string(array_to_slice(value_str)))
if success {
config.engine_refresh_hz = value
}
}
else {
array_clear( value_str)
@ -286,7 +291,7 @@ ui_screen_settings_menu :: proc( captures : rawptr = nil ) -> ( should_raise : b
// input_box
{
ui_parent(input_box)
value_txt := ui_text("settings_menu.engine_refresh.refresh_value", to_str_runes_pair(value_str))
value_txt := ui_text("settings_menu.engine_refresh.refresh_value", to_str_runes_pair(array_to_slice(value_str)))
value_txt.layout.text_alignment = vec2(1, 0.5)
}

View File

@ -103,7 +103,7 @@ startup :: proc( prof : ^SpallProfiler, persistent_mem, frame_mem, transient_mem
for & input in input_data {
using input
error : AllocatorError
keyboard_events.keys_pressed, error = array_init_reserve(KeyboardKey, persistent_slab_allocator(), Kilo)
keyboard_events.keys_pressed, error = array_init_reserve(KeyCode, persistent_slab_allocator(), Kilo)
ensure(error == AllocatorError.None, "Failed to allocate input.keyboard_events.keys_pressed array")
keyboard_events.chars_pressed, error = array_init_reserve(rune, persistent_slab_allocator(), Kilo)
ensure(error == AllocatorError.None, "Failed to allocate input.keyboard_events.chars_pressed array")
@ -346,7 +346,7 @@ tick :: proc( host_delta_time : f64, host_delta_ns : Duration ) -> b32
// Timing
{
// profile("Client tick timing processing")
config.engine_refresh_hz = uint(monitor_refresh_hz)
// config.engine_refresh_hz = uint(monitor_refresh_hz)
// config.engine_refresh_hz = 6
frametime_target_ms = 1.0 / f64(config.engine_refresh_hz) * S_To_MS
sub_ms_granularity_required := frametime_target_ms <= Frametime_High_Perf_Threshold_MS

View File

@ -75,6 +75,10 @@ import "core:os"
file_write :: os.write
import "core:path/filepath"
file_name_from_path :: filepath.short_stem
import "core:strconv"
parse_f32 :: strconv.parse_f32
parse_u64 :: strconv.parse_u64
parse_uint :: strconv.parse_uint
import str "core:strings"
StringBuilder :: str.Builder
str_builder_from_bytes :: str.builder_from_bytes
@ -261,6 +265,11 @@ to_string :: proc {
str_builder_to_string,
}
to_str_runes_pair :: proc {
to_str_runes_pair_via_runes,
to_str_runes_pair_via_string,
}
vec3 :: proc {
vec3_via_f32s,
bivec3_to_vec3,
@ -283,7 +292,6 @@ to_ui_layout_side :: proc {
}
ui_compute_layout :: proc {
ui_core_compute_layout,
ui_box_compute_layout,
}

View File

@ -23,9 +23,8 @@ StrRunesPair :: struct {
str : string,
runes : []rune,
}
to_str_runes_pair :: proc ( content : string ) -> StrRunesPair {
return { content, to_runes(content) }
}
to_str_runes_pair_via_string :: #force_inline proc ( content : string ) -> StrRunesPair { return { content, to_runes(content) } }
to_str_runes_pair_via_runes :: #force_inline proc ( content : []rune ) -> StrRunesPair { return { to_string(content), content } }
StringCache :: struct {
slab : Slab,

View File

@ -21,233 +21,6 @@ btn_released :: proc ( btn : DigitalBtn ) -> b32 {
return btn.ended_down == false && btn.half_transitions > 0
}
MaxKeyboardKeys :: 256
KeyboardKey :: enum u32 {
null = 0x00,
enter = 0x01,
tab = 0x02,
space = 0x03,
bracket_open = 0x04,
bracket_close = 0x05,
semicolon = 0x06,
apostrophe = 0x07,
comma = 0x08,
period = 0x09,
// 0x0A
// 0x0B
// 0x0C
// 0x0D
// 0x0E
// 0x0F
caps_lock = 0x10,
scroll_lock = 0x11,
num_lock = 0x12,
left_alt = 0x13,
left_shit = 0x14,
left_control = 0x15,
right_alt = 0x16,
right_shift = 0x17,
right_control = 0x18,
// 0x19
// 0x1A
// 0x1B
// 0x1C
// 0x1D
// 0x1C
// 0x1D
escape = 0x1F,
F1 = 0x20,
F2 = 0x21,
F3 = 0x22,
F4 = 0x23,
F5 = 0x24,
F6 = 0x25,
F7 = 0x26,
F8 = 0x27,
F9 = 0x28,
F10 = 0x29,
F11 = 0x2A,
F12 = 0x2B,
print_screen = 0x2C,
pause = 0x2D,
// = 0x2E,
backtick = 0x2F,
nrow_0 = 0x30,
nrow_1 = 0x31,
nrow_2 = 0x32,
nrow_3 = 0x33,
nrow_4 = 0x34,
nrow_5 = 0x35,
nrow_6 = 0x36,
nrow_7 = 0x37,
nrow_8 = 0x38,
nrow_9 = 0x39,
hyphen = 0x3A,
equals = 0x3B,
backspace = 0x3C,
backslash = 0x3D,
slash = 0x3E,
// = 0x3F,
// = 0x40,
A = 0x41,
B = 0x42,
C = 0x43,
D = 0x44,
E = 0x45,
F = 0x46,
G = 0x47,
H = 0x48,
I = 0x49,
J = 0x4A,
K = 0x4B,
L = 0x4C,
M = 0x4D,
N = 0x4E,
O = 0x4F,
P = 0x50,
Q = 0x51,
R = 0x52,
S = 0x53,
T = 0x54,
U = 0x55,
V = 0x56,
W = 0x57,
X = 0x58,
Y = 0x59,
Z = 0x5A,
insert = 0x5B,
delete = 0x5C,
home = 0x5D,
end = 0x5E,
page_up = 0x5F,
page_down = 0x60,
npad_0 = 0x61,
npad_1 = 0x62,
npad_2 = 0x63,
npad_3 = 0x64,
npad_4 = 0x65,
npad_5 = 0x66,
npad_6 = 0x67,
npad_7 = 0x68,
npad_8 = 0x69,
npad_9 = 0x6A,
npad_decimal = 0x6B,
npad_equals = 0x6C,
npad_plus = 0x6D,
npad_minus = 0x6E,
npad_multiply = 0x6F,
npad_divide = 0x70,
npad_enter = 0x71,
count = 0x72
}
KeyboardState :: struct #raw_union {
keys : [MaxKeyboardKeys] DigitalBtn,
using individual : struct {
enter,
tab,
space,
bracket_open,
bracket_close,
semicolon,
apostrophe,
comma,
period : DigitalBtn,
__0x0A_0x0F_Unassigned__ : [ 6 * size_of( DigitalBtn )] u8,
caps_lock,
scroll_lock,
num_lock,
left_alt,
left_shift,
left_control,
right_alt,
right_shift,
right_control : DigitalBtn,
__0x19_0x1D_Unassigned__ : [ 6 * size_of( DigitalBtn )] u8,
escape,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12 : DigitalBtn,
print_screen,
pause : DigitalBtn,
__0x2E_Unassigned__ : [size_of(DigitalBtn)] u8,
backtick,
nrow_0,
nrow_1,
nrow_2,
nrow_3,
nrow_4,
nrow_5,
nrow_6,
nrow_7,
nrow_8,
nrow_9,
hyphen,
equals,
backspace : DigitalBtn,
backslash,
slash : DigitalBtn,
__0x3F_0x40_Unassigned__ : [ 2 * size_of(DigitalBtn)] u8,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z : DigitalBtn,
insert,
delete,
home,
end,
page_up,
page_down : DigitalBtn,
npad_0,
npad_1,
npad_2,
npad_3,
npad_4,
npad_5,
npad_6,
npad_7,
npad_8,
npad_9,
npad_decimal,
npad_equals,
npad_plus,
npad_minus,
npad_multiply,
npad_divide,
npad_enter : DigitalBtn
}
}
MaxMouseBtns :: 16
MouseBtn :: enum u32 {
Left = 0x0,
@ -261,6 +34,111 @@ MouseBtn :: enum u32 {
count
}
KeyboardState :: struct #raw_union {
keys : [KeyCode.count] DigitalBtn,
using individual : struct {
ignored : DigitalBtn,
__0x02_0x07_Unassigned__ : [ 6 * size_of( DigitalBtn)] u8,
tab, backspace : DigitalBtn,
right, left, up, down : DigitalBtn,
enter : DigitalBtn,
__0x0F_Unassigned__ : [ 1 * size_of( DigitalBtn)] u8,
caps_lock,
scroll_lock,
num_lock : DigitalBtn,
left_alt,
left_shift,
left_control,
right_alt,
right_shift,
right_control : DigitalBtn,
__0x19_Unassigned__ : [ 1 * size_of( DigitalBtn )] u8,
pause,
escape,
home,
end,
page_up,
page_down,
space : DigitalBtn,
exlamation,
quote_dbl,
hash,
dollar,
percent,
ampersand,
quote,
paren_open,
paren_close,
asterisk,
plus,
comma,
minus,
period,
slash : DigitalBtn,
nrow_0,
nrow_1,
nrow_2,
nrow_3,
nrow_4,
nrow_5,
nrow_6,
nrow_7,
nrow_8,
nrow_9,
__0x3A_Unassigned__ : [ 1 * size_of(DigitalBtn)] u8,
semicolon,
less,
equals,
greater,
question,
at : DigitalBtn,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z : DigitalBtn,
bracket_open,
backslash,
bracket_close,
underscore,
backtick : DigitalBtn,
kpad_0,
kpad_1,
kpad_2,
kpad_3,
kpad_4,
kpad_5,
kpad_6,
kpad_7,
kpad_8,
kpad_9,
kpad_decimal,
kpad_equals,
kpad_plus,
kpad_minus,
kpad_multiply,
kpad_divide,
kpad_enter : DigitalBtn,
F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12 : DigitalBtn,
insert, delete : DigitalBtn,
}
}
MouseState :: struct {
using _ : struct #raw_union {
btns : [16] DigitalBtn,
@ -288,6 +166,6 @@ InputState :: struct {
// TODO(Ed): Whats the lifetime of these events? (So far we're picking per full-frame)
KeyboardEvents :: struct {
keys_pressed : Array(KeyboardKey),
keys_pressed : Array(KeyCode),
chars_pressed : Array(rune),
}

View File

@ -31,22 +31,21 @@ poll_input :: proc( old, new : ^ InputState )
entry_old := & old.keyboard.keys[id - 1]
entry_new := & new.keyboard.keys[id - 1]
key_id := cast(KeyboardKey) id
key_id := cast(KeyCode) id
is_down := cast(b32) rl.IsKeyDown( to_raylib_key(id) )
input_process_digital_btn( entry_old, entry_new, is_down )
}
}
DeadBound_1 :: 0x0A
DeadBound_2 :: 0x2E
DeadBound_1 :: 0x02
DeadBound_2 :: 0x0F
DeadBound_3 :: 0x19
DeadBound_4 :: 0x3F
check_range( old, new, cast(i32) KeyboardKey.enter, DeadBound_1 )
check_range( old, new, cast(i32) KeyboardKey.caps_lock, DeadBound_2 )
check_range( old, new, cast(i32) KeyboardKey.escape, DeadBound_3 )
check_range( old, new, cast(i32) KeyboardKey.backtick, DeadBound_4 )
check_range( old, new, cast(i32) KeyboardKey.A, cast(i32) KeyboardKey.count )
DeadBound_4 :: 0x3A
check_range( old, new, cast(i32) KeyCode.backspace, DeadBound_2 )
check_range( old, new, cast(i32) KeyCode.caps_lock, DeadBound_3 )
check_range( old, new, cast(i32) KeyCode.pause, DeadBound_4 )
check_range( old, new, cast(i32) KeyCode.semicolon, cast(i32) KeyCode.count )
swap( & old.keyboard_events.keys_pressed, & new.keyboard_events.keys_pressed )
swap( & old.keyboard_events.chars_pressed, & new.keyboard_events.chars_pressed )
@ -98,242 +97,157 @@ play_input :: proc( replay_file : os.Handle, input : ^ InputState ) {
}
}
to_key_from_raylib :: proc( key : rl.KeyboardKey ) -> KeyboardKey {
@static lookup_table := [?] KeyboardKey {
KeyboardKey.null,
KeyboardKey.enter,
KeyboardKey.tab,
KeyboardKey.space,
KeyboardKey.bracket_open,
KeyboardKey.bracket_close,
KeyboardKey.semicolon,
KeyboardKey.apostrophe,
KeyboardKey.comma,
KeyboardKey.period,
cast(KeyboardKey) 0, // 0x0A
cast(KeyboardKey) 0, // 0x0B
cast(KeyboardKey) 0, // 0x0C
cast(KeyboardKey) 0, // 0x0D
cast(KeyboardKey) 0, // 0x0E
cast(KeyboardKey) 0, // 0x0F
KeyboardKey.caps_lock,
KeyboardKey.scroll_lock,
KeyboardKey.num_lock,
KeyboardKey.left_alt,
KeyboardKey.left_shit,
KeyboardKey.left_control,
KeyboardKey.right_alt,
KeyboardKey.right_shift,
KeyboardKey.right_control,
cast(KeyboardKey) 0, // 0x0F
cast(KeyboardKey) 0, // 0x0F
cast(KeyboardKey) 0, // 0x0F
cast(KeyboardKey) 0, // 0x0F
cast(KeyboardKey) 0, // 0x0F
cast(KeyboardKey) 0, // 0x0F
cast(KeyboardKey) 0, // 0x0F
KeyboardKey.escape,
KeyboardKey.F1,
KeyboardKey.F2,
KeyboardKey.F3,
KeyboardKey.F4,
KeyboardKey.F5,
KeyboardKey.F7,
KeyboardKey.F8,
KeyboardKey.F9,
KeyboardKey.F10,
KeyboardKey.F11,
KeyboardKey.F12,
KeyboardKey.print_screen,
KeyboardKey.pause,
cast(KeyboardKey) 0, // 0x2E
KeyboardKey.backtick,
KeyboardKey.nrow_0,
KeyboardKey.nrow_1,
KeyboardKey.nrow_2,
KeyboardKey.nrow_3,
KeyboardKey.nrow_4,
KeyboardKey.nrow_5,
KeyboardKey.nrow_6,
KeyboardKey.nrow_7,
KeyboardKey.nrow_8,
KeyboardKey.nrow_9,
KeyboardKey.hyphen,
KeyboardKey.equals,
KeyboardKey.backspace,
KeyboardKey.backslash,
KeyboardKey.slash,
cast(KeyboardKey) 0, // 0x3F
cast(KeyboardKey) 0, // 0x40
KeyboardKey.A,
KeyboardKey.B,
KeyboardKey.C,
KeyboardKey.D,
KeyboardKey.E,
KeyboardKey.F,
KeyboardKey.G,
KeyboardKey.H,
KeyboardKey.I,
KeyboardKey.J,
KeyboardKey.K,
KeyboardKey.L,
KeyboardKey.M,
KeyboardKey.N,
KeyboardKey.O,
KeyboardKey.P,
KeyboardKey.Q,
KeyboardKey.R,
KeyboardKey.S,
KeyboardKey.T,
KeyboardKey.U,
KeyboardKey.V,
KeyboardKey.W,
KeyboardKey.X,
KeyboardKey.Y,
KeyboardKey.Z,
KeyboardKey.insert,
KeyboardKey.delete,
KeyboardKey.home,
KeyboardKey.end,
KeyboardKey.page_up,
KeyboardKey.page_down,
KeyboardKey.npad_0,
KeyboardKey.npad_1,
KeyboardKey.npad_2,
KeyboardKey.npad_3,
KeyboardKey.npad_4,
KeyboardKey.npad_5,
KeyboardKey.npad_6,
KeyboardKey.npad_7,
KeyboardKey.npad_8,
KeyboardKey.npad_9,
KeyboardKey.npad_decimal,
KeyboardKey.npad_equals,
KeyboardKey.npad_plus,
KeyboardKey.npad_minus,
KeyboardKey.npad_multiply,
KeyboardKey.npad_divide,
KeyboardKey.npad_enter, }
return lookup_table[key]
}
to_raylib_key :: proc( key : i32 ) -> rl.KeyboardKey
{
@static raylib_key_lookup_table := [?] rl.KeyboardKey {
rl.KeyboardKey.KEY_NULL,
rl.KeyboardKey.ENTER,
rl.KeyboardKey.TAB,
rl.KeyboardKey.SPACE,
rl.KeyboardKey.LEFT_BRACKET,
rl.KeyboardKey.RIGHT_BRACKET,
rl.KeyboardKey.SEMICOLON,
rl.KeyboardKey.APOSTROPHE,
rl.KeyboardKey.COMMA,
rl.KeyboardKey.PERIOD,
cast(rl.KeyboardKey) 0, // 0x0A
cast(rl.KeyboardKey) 0, // 0x0B
cast(rl.KeyboardKey) 0, // 0x0C
cast(rl.KeyboardKey) 0, // 0x0D
cast(rl.KeyboardKey) 0, // 0x0E
cast(rl.KeyboardKey) 0, // 0x0F
rl.KeyboardKey.CAPS_LOCK,
rl.KeyboardKey.SCROLL_LOCK,
rl.KeyboardKey.NUM_LOCK,
rl.KeyboardKey.LEFT_ALT,
rl.KeyboardKey.LEFT_SHIFT,
rl.KeyboardKey.LEFT_CONTROL,
rl.KeyboardKey.RIGHT_ALT,
rl.KeyboardKey.RIGHT_SHIFT,
rl.KeyboardKey.RIGHT_CONTROL,
cast(rl.KeyboardKey) 0, // 0x0F
cast(rl.KeyboardKey) 0, // 0x0F
cast(rl.KeyboardKey) 0, // 0x0F
cast(rl.KeyboardKey) 0, // 0x0F
cast(rl.KeyboardKey) 0, // 0x0F
cast(rl.KeyboardKey) 0, // 0x0F
cast(rl.KeyboardKey) 0, // 0x0F
rl.KeyboardKey.ESCAPE,
rl.KeyboardKey.F1,
rl.KeyboardKey.F2,
rl.KeyboardKey.F3,
rl.KeyboardKey.F4,
rl.KeyboardKey.F5,
rl.KeyboardKey.F7,
rl.KeyboardKey.F8,
rl.KeyboardKey.F9,
rl.KeyboardKey.F10,
rl.KeyboardKey.F11,
rl.KeyboardKey.F12,
rl.KeyboardKey.PRINT_SCREEN,
rl.KeyboardKey.PAUSE,
cast(rl.KeyboardKey) 0, // 0x2E
rl.KeyboardKey.GRAVE,
cast(rl.KeyboardKey) '0',
cast(rl.KeyboardKey) '1',
cast(rl.KeyboardKey) '2',
cast(rl.KeyboardKey) '3',
cast(rl.KeyboardKey) '4',
cast(rl.KeyboardKey) '5',
cast(rl.KeyboardKey) '6',
cast(rl.KeyboardKey) '7',
cast(rl.KeyboardKey) '8',
cast(rl.KeyboardKey) '9',
rl.KeyboardKey.MINUS,
rl.KeyboardKey.EQUAL,
rl.KeyboardKey.BACKSPACE,
rl.KeyboardKey.BACKSLASH,
rl.KeyboardKey.SLASH,
cast(rl.KeyboardKey) 0, // 0x3F
cast(rl.KeyboardKey) 0, // 0x40
rl.KeyboardKey.A,
rl.KeyboardKey.B,
rl.KeyboardKey.C,
rl.KeyboardKey.D,
rl.KeyboardKey.E,
rl.KeyboardKey.F,
rl.KeyboardKey.G,
rl.KeyboardKey.H,
rl.KeyboardKey.I,
rl.KeyboardKey.J,
rl.KeyboardKey.K,
rl.KeyboardKey.L,
rl.KeyboardKey.M,
rl.KeyboardKey.N,
rl.KeyboardKey.O,
rl.KeyboardKey.P,
rl.KeyboardKey.Q,
rl.KeyboardKey.R,
rl.KeyboardKey.S,
rl.KeyboardKey.T,
rl.KeyboardKey.U,
rl.KeyboardKey.V,
rl.KeyboardKey.W,
rl.KeyboardKey.X,
rl.KeyboardKey.Y,
rl.KeyboardKey.Z,
rl.KeyboardKey.INSERT,
rl.KeyboardKey.DELETE,
rl.KeyboardKey.HOME,
rl.KeyboardKey.END,
rl.KeyboardKey.PAGE_UP,
rl.KeyboardKey.PAGE_DOWN,
rl.KeyboardKey.KP_0,
rl.KeyboardKey.KP_1,
rl.KeyboardKey.KP_2,
rl.KeyboardKey.KP_3,
rl.KeyboardKey.KP_4,
rl.KeyboardKey.KP_5,
rl.KeyboardKey.KP_6,
rl.KeyboardKey.KP_7,
rl.KeyboardKey.KP_8,
rl.KeyboardKey.KP_9,
rl.KeyboardKey.KP_DECIMAL,
rl.KeyboardKey.KP_EQUAL,
rl.KeyboardKey.KP_ADD,
rl.KeyboardKey.KP_SUBTRACT,
rl.KeyboardKey.KP_MULTIPLY,
rl.KeyboardKey.KP_DIVIDE,
rl.KeyboardKey.KP_ENTER, }
@static raylib_key_lookup_table := [KeyCode.count] rl.KeyboardKey {
rl.KeyboardKey.KEY_NULL, // 0x00
cast(rl.KeyboardKey) 0, // 0x01
cast(rl.KeyboardKey) 0, // 0x02
cast(rl.KeyboardKey) 0, // 0x03
cast(rl.KeyboardKey) 0, // 0x04
cast(rl.KeyboardKey) 0, // 0x05
cast(rl.KeyboardKey) 0, // 0x06
cast(rl.KeyboardKey) 0, // 0x07
rl.KeyboardKey.BACKSPACE, // 0x08
rl.KeyboardKey.TAB, // 0x09
rl.KeyboardKey.RIGHT, // 0x0A
rl.KeyboardKey.LEFT, // 0x0B
rl.KeyboardKey.DOWN, // 0x0C
rl.KeyboardKey.UP, // 0x0D
rl.KeyboardKey.ENTER, // 0x0E
cast(rl.KeyboardKey) 0, // 0x0F
rl.KeyboardKey.CAPS_LOCK, // 0x10
rl.KeyboardKey.SCROLL_LOCK, // 0x11
rl.KeyboardKey.NUM_LOCK, // 0x12
rl.KeyboardKey.LEFT_ALT, // 0x13
rl.KeyboardKey.LEFT_SHIFT, // 0x14
rl.KeyboardKey.LEFT_CONTROL, // 0x15
rl.KeyboardKey.RIGHT_ALT, // 0x16
rl.KeyboardKey.RIGHT_SHIFT, // 0x17
rl.KeyboardKey.RIGHT_CONTROL, // 0x18
cast(rl.KeyboardKey) 0, // 0x19
rl.KeyboardKey.PAUSE, // 0x1A
rl.KeyboardKey.ESCAPE, // 0x1B
rl.KeyboardKey.HOME, // 0x1C
rl.KeyboardKey.END, // 0x1D
rl.KeyboardKey.PAGE_UP, // 0x1E
rl.KeyboardKey.PAGE_DOWN, // 0x1F
rl.KeyboardKey.SPACE, // 0x20
cast(rl.KeyboardKey) '!', // 0x21
cast(rl.KeyboardKey) '"', // 0x22
cast(rl.KeyboardKey) '#', // 0x23
cast(rl.KeyboardKey) '$', // 0x24
cast(rl.KeyboardKey) '%', // 0x25
cast(rl.KeyboardKey) '&', // 0x26
cast(rl.KeyboardKey) '\'', // 0x27
cast(rl.KeyboardKey) '(', // 0x28
cast(rl.KeyboardKey) ')', // 0x29
cast(rl.KeyboardKey) '*', // 0x2A
cast(rl.KeyboardKey) '+', // 0x2B
cast(rl.KeyboardKey) ',', // 0x2C
cast(rl.KeyboardKey) '-', // 0x2D
cast(rl.KeyboardKey) '.', // 0x2E
cast(rl.KeyboardKey) '/', // 0x2F
cast(rl.KeyboardKey) '0', // 0x30
cast(rl.KeyboardKey) '1', // 0x31
cast(rl.KeyboardKey) '2', // 0x32
cast(rl.KeyboardKey) '3', // 0x33
cast(rl.KeyboardKey) '4', // 0x34
cast(rl.KeyboardKey) '5', // 0x35
cast(rl.KeyboardKey) '6', // 0x36
cast(rl.KeyboardKey) '7', // 0x37
cast(rl.KeyboardKey) '8', // 0x38
cast(rl.KeyboardKey) '9', // 0x39
cast(rl.KeyboardKey) 0, // 0x3A
cast(rl.KeyboardKey) ';', // 0x3B
cast(rl.KeyboardKey) '<', // 0x3C
cast(rl.KeyboardKey) '=', // 0x3D
cast(rl.KeyboardKey) '>', // 0x3E
cast(rl.KeyboardKey) '?', // 0x3F
cast(rl.KeyboardKey) '@', // 0x40
rl.KeyboardKey.A, // 0x41
rl.KeyboardKey.B, // 0x42
rl.KeyboardKey.C, // 0x43
rl.KeyboardKey.D, // 0x44
rl.KeyboardKey.E, // 0x45
rl.KeyboardKey.F, // 0x46
rl.KeyboardKey.G, // 0x47
rl.KeyboardKey.H, // 0x48
rl.KeyboardKey.I, // 0x49
rl.KeyboardKey.J, // 0x4A
rl.KeyboardKey.K, // 0x4B
rl.KeyboardKey.L, // 0x4C
rl.KeyboardKey.M, // 0x4D
rl.KeyboardKey.N, // 0x4E
rl.KeyboardKey.O, // 0x4F
rl.KeyboardKey.P, // 0x50
rl.KeyboardKey.Q, // 0x51
rl.KeyboardKey.R, // 0x52
rl.KeyboardKey.S, // 0x53
rl.KeyboardKey.T, // 0x54
rl.KeyboardKey.U, // 0x55
rl.KeyboardKey.V, // 0x56
rl.KeyboardKey.W, // 0x57
rl.KeyboardKey.X, // 0x58
rl.KeyboardKey.Y, // 0x59
rl.KeyboardKey.Z, // 0x5A
rl.KeyboardKey.LEFT_BRACKET, // 0x5B
rl.KeyboardKey.BACKSLASH, // 0x5C
rl.KeyboardKey.RIGHT_BRACKET, // 0x5D
cast(rl.KeyboardKey) '^', // 0x5E
rl.KeyboardKey.GRAVE, // 0x5F
cast(rl.KeyboardKey) '`', // 0x60
rl.KeyboardKey.KP_0, // 0x61
rl.KeyboardKey.KP_1, // 0x62
rl.KeyboardKey.KP_2, // 0x63
rl.KeyboardKey.KP_3, // 0x64
rl.KeyboardKey.KP_4, // 0x65
rl.KeyboardKey.KP_5, // 0x66
rl.KeyboardKey.KP_6, // 0x67
rl.KeyboardKey.KP_7, // 0x68
rl.KeyboardKey.KP_8, // 0x69
rl.KeyboardKey.KP_9, // 0x6A
rl.KeyboardKey.KP_DECIMAL, // 0x6B
rl.KeyboardKey.KP_EQUAL, // 0x6C
rl.KeyboardKey.KP_ADD, // 0x6D
rl.KeyboardKey.KP_SUBTRACT, // 0x6E
rl.KeyboardKey.KP_MULTIPLY, // 0x6F
rl.KeyboardKey.KP_DIVIDE, // 0x70
rl.KeyboardKey.KP_ENTER, // 0x71
rl.KeyboardKey.F1, // 0x72
rl.KeyboardKey.F2, // 0x73
rl.KeyboardKey.F3, // 0x74
rl.KeyboardKey.F4, // 0x75
rl.KeyboardKey.F5, // 0x76
rl.KeyboardKey.F6, // 0x77
rl.KeyboardKey.F7, // 0x78
rl.KeyboardKey.F8, // 0x79
rl.KeyboardKey.F9, // 0x7A
rl.KeyboardKey.F10, // 0x7B
rl.KeyboardKey.F11, // 0x7C
rl.KeyboardKey.F12, // 0x7D
rl.KeyboardKey.INSERT, // 0x7E
rl.KeyboardKey.DELETE, // 0x7F
}
return raylib_key_lookup_table[ key ]
}
@ -348,3 +262,99 @@ to_raylib_mouse_btn :: proc( btn : i32 ) -> rl.MouseButton {
rl.MouseButton.EXTRA, }
return raylib_mouse_btn_lookup_table[ btn ]
}
to_key_from_raylib :: proc( ray_key : rl.KeyboardKey ) -> (key : KeyCode) {
switch (ray_key) {
case .KEY_NULL : key = cast(KeyCode) ray_key
case .SPACE,
cast(rl.KeyboardKey) '!',
cast(rl.KeyboardKey) '"',
cast(rl.KeyboardKey) '#',
cast(rl.KeyboardKey) '$',
cast(rl.KeyboardKey) '%',
cast(rl.KeyboardKey) '&',
.APOSTROPHE,
cast(rl.KeyboardKey) '(',
cast(rl.KeyboardKey) ')',
cast(rl.KeyboardKey) '*',
cast(rl.KeyboardKey) '+',
.COMMA, .MINUS, .PERIOD, .SLASH,
.ZERO, .ONE, .TWO, .THREE, .FOUR, .FIVE, .SIX, .SEVEN, .EIGHT, .NINE,
.SEMICOLON,.EQUAL,
.A, .B, .C, .D, .E, .F, .G, .H, .I, .J, .K, .L, .M, .N, .O, .P, .Q, .R, .S, .T, .U, .V, .W, .X, .Y, .Z,
.LEFT_BRACKET, .BACKSLASH, .RIGHT_BRACKET, cast(rl.KeyboardKey) '_', .GRAVE :
key = cast(KeyCode) ray_key
case .ESCAPE : key = KeyCode.escape
case .ENTER : key = KeyCode.enter
case .TAB : key = KeyCode.tab
case .BACKSPACE : key = KeyCode.backspace
case .INSERT : key = KeyCode.insert
case .DELETE : key = KeyCode.delete
case .RIGHT : key = KeyCode.right
case .LEFT : key = KeyCode.left
case .UP : key = KeyCode.up
case .DOWN : key = KeyCode.down
case .PAGE_UP : key = KeyCode.page_up
case .PAGE_DOWN : key = KeyCode.page_down
case .HOME : key = KeyCode.home
case .END : key = KeyCode.end
case .CAPS_LOCK : key = KeyCode.caps_lock
case .SCROLL_LOCK : key = KeyCode.scroll_lock
case .NUM_LOCK : key = KeyCode.num_lock
case .PRINT_SCREEN : key = KeyCode.ignored
case .PAUSE : key = KeyCode.pause
case .F1 : key = KeyCode.F1
case .F2 : key = KeyCode.F2
case .F3 : key = KeyCode.F3
case .F4 : key = KeyCode.F4
case .F5 : key = KeyCode.F5
case .F6 : key = KeyCode.F6
case .F7 : key = KeyCode.F7
case .F8 : key = KeyCode.F8
case .F9 : key = KeyCode.F9
case .F10 : key = KeyCode.F10
case .F11 : key = KeyCode.F11
case .F12 : key = KeyCode.F12
case .LEFT_SHIFT : key = KeyCode.left_shift
case .LEFT_CONTROL : key = KeyCode.left_control
case .LEFT_ALT : key = KeyCode.left_alt
case .LEFT_SUPER : key = KeyCode.ignored
case .RIGHT_SHIFT : key = KeyCode.right_shift
case .RIGHT_CONTROL : key = KeyCode.right_control
case .RIGHT_ALT : key = KeyCode.right_alt
case .RIGHT_SUPER : key = KeyCode.ignored
case .KB_MENU : key = KeyCode.ignored
case .KP_0 : key = KeyCode.kpad_0
case .KP_1 : key = KeyCode.kpad_1
case .KP_2 : key = KeyCode.kpad_2
case .KP_3 : key = KeyCode.kpad_3
case .KP_4 : key = KeyCode.kpad_4
case .KP_5 : key = KeyCode.kpad_5
case .KP_6 : key = KeyCode.kpad_6
case .KP_7 : key = KeyCode.kpad_7
case .KP_8 : key = KeyCode.kpad_8
case .KP_9 : key = KeyCode.kpad_9
case .KP_DECIMAL : key = KeyCode.kpad_decimal
case .KP_DIVIDE : key = KeyCode.kpad_divide
case .KP_MULTIPLY : key = KeyCode.kpad_multiply
case .KP_SUBTRACT : key = KeyCode.kpad_minus
case .KP_ADD : key = KeyCode.kpad_plus
case .KP_ENTER : key = KeyCode.kpad_enter
case .KP_EQUAL : key = KeyCode.kpad_equals
case .BACK : key = KeyCode.ignored
case .VOLUME_UP : key = KeyCode.ignored
case .VOLUME_DOWN : key = KeyCode.ignored
}
return
}

View File

View File

@ -0,0 +1,239 @@
package sectr
// Based off of SDL2's Scancode; which is based off of:
// https://usb.org/sites/default/files/hut1_12.pdf
// I gutted values I would never use
QeurtyCode :: enum u32 {
unknown = 0,
A = 4,
B = 5,
C = 6,
D = 7,
E = 8,
F = 9,
G = 10,
H = 11,
I = 12,
J = 13,
K = 14,
L = 15,
M = 16,
N = 17,
O = 18,
P = 19,
Q = 20,
R = 21,
S = 22,
T = 23,
U = 24,
V = 25,
W = 26,
X = 27,
Y = 28,
Z = 29,
nrow_1 = 30,
nrow_2 = 31,
nrow_3 = 32,
nrow_4 = 33,
nrow_5 = 34,
nrow_6 = 35,
nrow_7 = 36,
nrow_8 = 37,
nrow_9 = 38,
nrow_0 = 39,
enter = 40,
escape = 41,
backspace = 42,
tab = 43,
space = 44,
minus = 45,
equals = 46,
bracket_open = 47,
bracket_close = 48,
backslash = 49,
NONUSHASH = 50,
semicolon = 51,
apostrophe = 52,
grave = 53,
comma = 54,
period = 55,
slash = 56,
capslock = 57,
F1 = 58,
F2 = 59,
F3 = 60,
F4 = 61,
F5 = 62,
F6 = 63,
F7 = 64,
F8 = 65,
F9 = 66,
F10 = 67,
F11 = 68,
F12 = 69,
// print_screen = 70,
// scroll_lock = 71,
pause = 72,
insert = 73,
home = 74,
page_up = 75,
delete = 76,
end = 77,
page_down = 78,
right = 79,
left = 80,
down = 81,
up = 82,
numlock_clear = 83,
kpad_divide = 84,
kpad_multiply = 85,
kpad_minus = 86,
kpad_plus = 87,
kpad_enter = 88,
kpad_1 = 89,
kpad_2 = 90,
kpad_3 = 91,
kpad_4 = 92,
kpad_5 = 93,
kpad_6 = 94,
kpad_7 = 95,
kpad_8 = 96,
kpad_9 = 97,
kpad_0 = 98,
kpad_period = 99,
// NONUSBACKSLASH = 100,
// OS_Compose = 101,
// power = 102,
kpad_equals = 103,
// F13 = 104,
// F14 = 105,
// F15 = 106,
// F16 = 107,
// F17 = 108,
// F18 = 109,
// F19 = 110,
// F20 = 111,
// F21 = 112,
// F22 = 113,
// F23 = 114,
// F24 = 115,
// execute = 116,
// help = 117,
// menu = 118,
// select = 119,
// stop = 120,
// again = 121,
// undo = 122,
// cut = 123,
// copy = 124,
// paste = 125,
// find = 126,
// mute = 127,
// volume_up = 128,
// volume_down = 129,
/* LOCKINGCAPSLOCK = 130, */
/* LOCKINGNUMLOCK = 131, */
/* LOCKINGSCROLLLOCK = 132, */
// kpad_comma = 133,
// kpad_equals_AS400 = 134,
// international_1 = 135,
// international_2 = 136,
// international_3 = 137,
// international_4 = 138,
// international_5 = 139,
// international_6 = 140,
// international_7 = 141,
// international_8 = 142,
// international_9 = 143,
// lang_1 = 144,
// lang_2 = 145,
// lang_3 = 146,
// lang_4 = 147,
// lang_5 = 148,
// lang_6 = 149,
// lang_7 = 150,
// lang_8 = 151,
// lang_9 = 152,
// alt_erase = 153,
// sysreq = 154,
// cancel = 155,
// clear = 156,
// prior = 157,
// return_2 = 158,
// separator = 159,
// out = 160,
// OPER = 161,
// clear_again = 162,
// CRSEL = 163,
// EXSEL = 164,
// KP_00 = 176,
// KP_000 = 177,
// THOUSANDSSEPARATOR = 178,
// DECIMALSEPARATOR = 179,
// CURRENCYUNIT = 180,
// CURRENCYSUBUNIT = 181,
// KP_LEFTPAREN = 182,
// KP_RIGHTPAREN = 183,
// KP_LEFTBRACE = 184,
// KP_RIGHTBRACE = 185,
// KP_TAB = 186,
// KP_BACKSPACE = 187,
// KP_A = 188,
// KP_B = 189,
// KP_C = 190,
// KP_D = 191,
// KP_E = 192,
// KP_F = 193,
// KP_XOR = 194,
// KP_POWER = 195,
// KP_PERCENT = 196,
// KP_LESS = 197,
// KP_GREATER = 198,
// KP_AMPERSAND = 199,
// KP_DBLAMPERSAND = 200,
// KP_VERTICALBAR = 201,
// KP_DBLVERTICALBAR = 202,
// KP_COLON = 203,
// KP_HASH = 204,
// KP_SPACE = 205,
// KP_AT = 206,
// KP_EXCLAM = 207,
// KP_MEMSTORE = 208,
// KP_MEMRECALL = 209,
// KP_MEMCLEAR = 210,
// KP_MEMADD = 211,
// KP_MEMSUBTRACT = 212,
// KP_MEMMULTIPLY = 213,
// KP_MEMDIVIDE = 214,
// KP_PLUSMINUS = 215,
// KP_CLEAR = 216,
// KP_CLEARENTRY = 217,
// KP_BINARY = 218,
// KP_OCTAL = 219,
// KP_DECIMAL = 220,
// KP_HEXADECIMAL = 221,
left_control = 224,
left_shift = 225,
left_alt = 226,
// LGUI = 227,
right_control = 228,
right_shift = 229,
right_alt = 230,
count = 512,
}

View File

@ -0,0 +1,154 @@
package sectr
MaxKeyboardKeys :: 512
KeyCode :: enum u32 {
null = 0x00,
ignored = 0x01,
// 0x02
// 0x03
// 0x04
// 0x05
// 0x06
// 0x07
backspace = '\b', // 0x08
tab = '\t', // 0x09
right = 0x0A,
left = 0x0B,
down = 0x0C,
up = 0x0D,
enter = '\r', // 0x0E
// 0x0F
caps_lock = 0x10,
scroll_lock = 0x11,
num_lock = 0x12,
left_alt = 0x13,
left_shift = 0x14,
left_control = 0x15,
right_alt = 0x16,
right_shift = 0x17,
right_control = 0x18,
// 0x19
pause = 0x1A,
escape = '\x1B', // 0x1B
home = 0x1C,
end = 0x1D,
page_up = 0x1E,
page_down = 0x1F,
space = ' ', // 0x20
exclamation = '!', // 0x21
quote_dbl = '"', // 0x22
hash = '#', // 0x23
dollar = '$', // 0x24
percent = '%', // 0x25
ampersand = '&', // 0x26
quote = '\'', // 0x27
paren_open = '(', // 0x28
paren_close = ')', // 0x29
asterisk = '*', // 0x2A
plus = '+', // 0x2B
comma = ',', // 0x2C
minus = '-', // 0x2D
period = '.', // 0x2E
slash = '/', // 0x2F
nrow_0 = '0', // 0x30
nrow_1 = '1', // 0x31
nrow_2 = '2', // 0x32
nrow_3 = '3', // 0x33
nrow_4 = '4', // 0x34
nrow_5 = '5', // 0x35
nrow_6 = '6', // 0x36
nrow_7 = '7', // 0x37
nrow_8 = '8', // 0x38
nrow_9 = '9', // 0x39
// 0x3A
semicolon = ';', // 0x3B
less = '<', // 0x3C
equals = '=', // 0x3D
greater = '>', // 0x3E
question = '?', // 0x3F
at = '@', // 0x40
A = 'A', // 0x41
B = 'B', // 0x42
C = 'C', // 0x43
D = 'D', // 0x44
E = 'E', // 0x45
F = 'F', // 0x46
G = 'G', // 0x47
H = 'H', // 0x48
I = 'I', // 0x49
J = 'J', // 0x4A
K = 'K', // 0x4B
L = 'L', // 0x4C
M = 'M', // 0x4D
N = 'N', // 0x4E
O = 'O', // 0x4F
P = 'P', // 0x50
Q = 'Q', // 0x51
R = 'R', // 0x52
S = 'S', // 0x53
T = 'T', // 0x54
U = 'U', // 0x55
V = 'V', // 0x56
W = 'W', // 0x57
X = 'X', // 0x58
Y = 'Y', // 0x59
Z = 'Z', // 0x5A
bracket_open = '[', // 0x5B
backslash = '\\', // 0x5C
bracket_close = ']', // 0x5D
caret = '^', // 0x5E
underscore = '_', // 0x5F
backtick = '`', // 0x60
kpad_0 = 0x61,
kpad_1 = 0x62,
kpad_2 = 0x63,
kpad_3 = 0x64,
kpad_4 = 0x65,
kpad_5 = 0x66,
kpad_6 = 0x67,
kpad_7 = 0x68,
kpad_8 = 0x69,
kpad_9 = 0x6A,
kpad_decimal = 0x6B,
kpad_equals = 0x6C,
kpad_plus = 0x6D,
kpad_minus = 0x6E,
kpad_multiply = 0x6F,
kpad_divide = 0x70,
kpad_enter = 0x71,
F1 = 0x72,
F2 = 0x73,
F3 = 0x74,
F4 = 0x75,
F5 = 0x76,
F6 = 0x77,
F7 = 0x78,
F8 = 0x79,
F9 = 0x7A,
F10 = 0x7B,
F11 = 0x7C,
F12 = 0x7D,
insert = 0x7E,
delete = 0x7F,
count = 0x80,
}

View File

@ -3,5 +3,5 @@
Eventually want to generalize this core UI as its own library.
This will keep track of here whats needed for it to work wihtout the rest of this codebase.
* Provide UI input state in its own data stucture at the beginning of `ui_build_graph`:
* Provide UI input state or "events" in its own data stucture at the beginning of `ui_build_graph`:
*

View File

@ -128,6 +128,8 @@ ui_box_make :: proc( flags : UI_BoxFlags, label : string ) -> (^ UI_Box)
return curr_box
}
ui_prev_cached_box :: #force_inline proc( box : ^UI_Box ) -> ^UI_Box { return zpl_hmap_get( ui_context().prev_cache, cast(u64) box.key ) }
ui_box_tranverse_next :: proc "contextless" ( box : ^ UI_Box ) -> (^ UI_Box)
{
using state := get_state()

View File

@ -36,6 +36,8 @@ ui_signal_from_box :: proc ( box : ^ UI_Box, update_style := true, update_deltas
frame_delta := frametime_delta32()
prev_box := ui_prev_cached_box(box)
signal := UI_Signal {}
// Cursor Collision
@ -72,8 +74,8 @@ ui_signal_from_box :: proc ( box : ^ UI_Box, update_style := true, update_deltas
keyboard_clickable := UI_BoxFlag.Keyboard_Clickable in box.flags
is_focusable := .Focusable in box.flags
was_active := (ui.active == box.key) && (box.active_delta > 0)
was_hot := (box.hot_delta > 0)
was_active := box.active_delta > 0
was_hot := box.hot_delta > 0
was_disabled := box.disabled_delta > 0
is_focused_locked := is_focusable ? was_active : false

View File

@ -206,17 +206,6 @@ ui_graph_build_begin :: proc( ui : ^ UI_State, bounds : Vec2 = {} )
ui_parent_push(root)
}
ui_core_compute_layout :: proc( ui : ^UI_State )
{
profile(#procedure)
state := get_state()
}
ui_graph_build_end :: proc( ui : ^UI_State )
{
profile(#procedure)
@ -239,8 +228,6 @@ ui_graph_build_end :: proc( ui : ^UI_State )
}
for current := root.first; current != nil; current = ui_box_tranverse_next( current )
{
if ! current.computed.fresh {
ui_box_compute_layout( current )
}
@ -290,8 +277,6 @@ ui_parent_pop :: #force_inline proc() { stack_pop( & get_state(
@(deferred_none = ui_parent_pop)
ui_parent :: #force_inline proc( ui : ^UI_Box) { ui_parent_push( ui ) }
ui_prev_cached_box :: #force_inline proc( box : ^UI_Box ) -> ^UI_Box { return zpl_hmap_get( ui_context().prev_cache, cast(u64) box.key ) }
// Topmost ancestor that is not the root
ui_top_ancestor :: #force_inline proc "contextless" ( box : ^UI_Box ) -> (^UI_Box) {
using ui := get_state().ui_context