cleanup; added tabbing between textboxes
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 4 Apr 2022 22:39:06 +0000 (17:39 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 4 Apr 2022 22:39:06 +0000 (17:39 -0500)
src/client/connect_menu.onyx
src/client/gfx/ui.onyx
src/server/server.onyx

index ffa1ba4f46369d8e926af836c16a145abd534309..7ae101a891a42e1d9bf6dcaa0794b927d017686a 100644 (file)
@@ -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) {
index 985fc66eed862704c4d5b8b2b5a8dcd9e52cf836..8ee8ab235d3d526baa5aaabae0665e9fc96254c7 100644 (file)
@@ -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
index 90246826ecfe0f695d94057eec05454b5dbc24cf..7d429ce93c661b092796e77479c5a2fe051022ed 100644 (file)
@@ -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 {