From: Brendan Hansen Date: Mon, 4 Apr 2022 22:39:06 +0000 (-0500) Subject: cleanup; added tabbing between textboxes X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=74621a65b073560d4d0c228d6e75b5102720d2ed;p=voxel-shooter.git cleanup; added tabbing between textboxes --- diff --git a/src/client/connect_menu.onyx b/src/client/connect_menu.onyx index ffa1ba4..7ae101a 100644 --- a/src/client/connect_menu.onyx +++ b/src/client/connect_menu.onyx @@ -16,11 +16,6 @@ Connect_Menu :: struct { string.concat(^port, conv.format(port_buffer, "{}", (package runtime.vars).Game_Port)); } - leave :: (_: rawptr) { - array.free(^ip_addr); - array.free(^port); - } - join :: (_: rawptr) { net_connect(ip_addr, ~~ conv.str_to_i64(port)); @@ -41,9 +36,11 @@ Connect_Menu :: struct { tx := (ww - 200) / 2; ty := (wh - 160) / 2; + textbox_list_start(); draw_textbox(.{tx, ty+0, 200, 40}, ^ip_addr, "IP Address"); draw_textbox(.{tx, ty+40, 200, 40}, ^port, "Port"); draw_textbox(.{tx, ty+80, 200, 40}, ^name, "Name"); + textbox_list_end(); if draw_button(.{tx, ty+120, 200, 40}, "Join") { join(_); @@ -54,20 +51,34 @@ Connect_Menu :: struct { Connecting_Menu :: struct { - #persist font: Font + #persist font: Font; + #persist connection_timeout: f32; init :: (_: rawptr) { font = font_lookup(.{"./assets/fonts/calibri.ttf", 32}); net_set_on_connect_callback(.{ _, on_connect }); + + connection_timeout = 10.0f; // 10 second timeout } on_connect :: (_: rawptr) { net_send_connect(name); - array.free(^name); @HACK // This feels gross to free this down here. + } + + leave :: (_: rawptr) { + array.free(^ip_addr); + array.free(^port); + array.free(^name); } update :: (_: rawptr, dt: f32) { net_pulse(); + + connection_timeout -= dt; + if connection_timeout < 0 { + pop_game_state(); + push_game_state(Connect_Menu, null); + } } draw :: (_: rawptr) { diff --git a/src/client/gfx/ui.onyx b/src/client/gfx/ui.onyx index 985fc66..8ee8ab2 100644 --- a/src/client/gfx/ui.onyx +++ b/src/client/gfx/ui.onyx @@ -242,6 +242,8 @@ draw_textbox :: (use r: Rect, text_buffer: ^[..] u8, placeholder := null_str, th animation_state := get_animation(hash); mx, my := mouse_get_position(); + textbox_tab_list << .{ hash, text_buffer.count }; + border_width := theme.border_width; text_color := theme.text_color; text := str.{text_buffer.data, text_buffer.count}; @@ -317,6 +319,11 @@ draw_textbox :: (use r: Rect, text_buffer: ^[..] u8, placeholder := null_str, th case GLFW_KEY_ENTER { result = .Enter_Pressed; } + + case GLFW_KEY_TAB { + if !inside_textbox_list do continue; + textbox_tab_pressed = true; + } } } @@ -408,6 +415,47 @@ draw_textbox :: (use r: Rect, text_buffer: ^[..] u8, placeholder := null_str, th +// +// Textbox-list (enables tabbing between textboxes) +// +#local { + inside_textbox_list := false; + + Textbox_Tab_Field :: struct { + id: UI_Id; + char_count: u32; + } + #operator == macro (t1, t2: Textbox_Tab_Field) => t1.id == t2.id; + + textbox_tab_list: [..] Textbox_Tab_Field; + + textbox_tab_list_size: u32; + textbox_tab_pressed := false; +} + +textbox_list_start :: () { + if inside_textbox_list do return; + inside_textbox_list = true; + array.clear(^textbox_tab_list); +} + +textbox_list_end :: () { + inside_textbox_list = false; + + if textbox_tab_pressed { + active_index := array.find(textbox_tab_list, .{active_item, 0}); + new_index := (active_index + 1) % textbox_tab_list.count; + + field := textbox_tab_list[new_index]; + set_active_item(field.id); + textbox_editing_state.hash = field.id; + textbox_editing_state.cursor_position = field.char_count; + textbox_tab_pressed = false; + } +} + + + // // Checkboxes diff --git a/src/server/server.onyx b/src/server/server.onyx index 9024682..7d429ce 100644 --- a/src/server/server.onyx +++ b/src/server/server.onyx @@ -63,6 +63,7 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) { send_chat_message(0, msg); } + // Send a verify connect packet msg := new(packets.Verify_Connect); msg.type = .Verify_Connect; msg.player_id = ~~next_player_id; @@ -129,6 +130,13 @@ loop :: () { if it.type == .Disconnection { printf("Disconnection from {}:{}\n", net.ipv4_to_str(it.peer.addr.addr), it.peer.addr.port); + + for ^player: connected_players.entries { + if player.value.peer == it.peer { + map.delete(^connected_players, player.key); + break; + } + } } if it.type == .Message {