mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 01:24:18 +00:00
more new gui
This commit is contained in:
parent
a338708456
commit
5ae7db0c54
|
@ -27,7 +27,7 @@ def get_nick():
|
|||
return nicks[inick].replace("`", "\`")
|
||||
|
||||
for s in xrange(0, 150):
|
||||
cmd = "./fake_server_d_d "
|
||||
cmd = "./fake_server_d "
|
||||
cmd += '-n "%s" ' % (random.choice(servernames) % get_nick())
|
||||
for m in masterservers:
|
||||
cmd += '-m %s '%m
|
||||
|
|
|
@ -68,7 +68,6 @@ enum
|
|||
static TEXTURE textures[MAX_TEXTURES];
|
||||
static int first_free_texture;
|
||||
static int memory_usage = 0;
|
||||
static float scale = 1.0f;
|
||||
|
||||
static const unsigned char null_texture_data[] = {
|
||||
0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff,
|
||||
|
@ -121,198 +120,6 @@ static void draw_quad()
|
|||
flush();
|
||||
}
|
||||
|
||||
struct node
|
||||
{
|
||||
struct node *left_child, *right_child;
|
||||
struct rect *rect;
|
||||
};
|
||||
|
||||
#define TREE_SIZE 128
|
||||
static struct node memory[TREE_SIZE];
|
||||
static int memory_used;
|
||||
static struct rect screen = { 0.0f, 0.0f, 800.0f, 600.0f };
|
||||
static struct node root;
|
||||
|
||||
static struct node *allocate_node()
|
||||
{
|
||||
if (memory_used >= TREE_SIZE)
|
||||
{
|
||||
dbg_msg("GUI tree error", "all tree nodes are taken. =(");
|
||||
return 0x0;
|
||||
}
|
||||
else
|
||||
return &memory[memory_used++];
|
||||
}
|
||||
|
||||
static void clear_node(struct node *n)
|
||||
{
|
||||
n->left_child = 0x0;
|
||||
n->right_child = 0x0;
|
||||
n->rect = 0x0;
|
||||
}
|
||||
|
||||
static struct node *find(struct node *n, struct rect *r)
|
||||
{
|
||||
if (!n)
|
||||
return 0x0;
|
||||
else if (n->rect == r)
|
||||
return n;
|
||||
else
|
||||
{
|
||||
struct node *result = find(n->left_child, r);
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
else
|
||||
return find(n->right_child, r);
|
||||
}
|
||||
}
|
||||
|
||||
static struct node *find_node(struct rect *rect)
|
||||
{
|
||||
return find(&root, rect);
|
||||
}
|
||||
|
||||
static void set_children(struct rect *parent, struct rect *child1, struct rect *child2)
|
||||
{
|
||||
struct node *n = find_node(parent);
|
||||
struct node *c1 = allocate_node();
|
||||
struct node *c2 = allocate_node();
|
||||
|
||||
if (!n)
|
||||
dbg_msg("GUI tree error", "could not find parent in tree.");
|
||||
|
||||
if (n->left_child || n->right_child)
|
||||
dbg_msg("GUI tree error", "node already has children.");
|
||||
|
||||
clear_node(c1);
|
||||
clear_node(c2);
|
||||
|
||||
c1->rect = child1;
|
||||
c2->rect = child2;
|
||||
|
||||
n->left_child = c1;
|
||||
n->right_child = c2;
|
||||
}
|
||||
|
||||
static void foreach_leaf(struct node *n, rect_fun fun)
|
||||
{
|
||||
if (n->left_child && n->right_child)
|
||||
{
|
||||
foreach_leaf(n->left_child, fun);
|
||||
foreach_leaf(n->right_child, fun);
|
||||
}
|
||||
else
|
||||
fun(n->rect);
|
||||
}
|
||||
|
||||
void ui_foreach_rect(rect_fun fun)
|
||||
{
|
||||
foreach_leaf(&root, fun);
|
||||
}
|
||||
|
||||
struct rect *ui_screen()
|
||||
{
|
||||
if (config.debug)
|
||||
{
|
||||
memory_used = 0;
|
||||
clear_node(&root);
|
||||
root.rect = &screen;
|
||||
}
|
||||
|
||||
return &screen;
|
||||
}
|
||||
|
||||
void ui_scale(float s)
|
||||
{
|
||||
scale = s;
|
||||
}
|
||||
|
||||
void ui_hsplit_t(struct rect *original, int pixels, struct rect *top, struct rect *bottom)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
top->x = r.x;
|
||||
top->y = r.y;
|
||||
top->w = r.w;
|
||||
top->h = pixels;
|
||||
|
||||
bottom->x = r.x;
|
||||
bottom->y = r.y + pixels;
|
||||
bottom->w = r.w;
|
||||
bottom->h = r.h - pixels;
|
||||
|
||||
set_children(original, top, bottom);
|
||||
}
|
||||
|
||||
void ui_hsplit_b(struct rect *original, int pixels, struct rect *top, struct rect *bottom)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
top->x = r.x;
|
||||
top->y = r.y;
|
||||
top->w = r.w;
|
||||
top->h = r.h - pixels;
|
||||
|
||||
bottom->x = r.x;
|
||||
bottom->y = r.y + r.h - pixels;
|
||||
bottom->w = r.w;
|
||||
bottom->h = pixels;
|
||||
|
||||
if (config.debug)
|
||||
set_children(original, top, bottom);
|
||||
}
|
||||
|
||||
void ui_vsplit_l(struct rect *original, int pixels, struct rect *left, struct rect *right)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
left->x = r.x;
|
||||
left->y = r.y;
|
||||
left->w = pixels;
|
||||
left->h = r.h;
|
||||
|
||||
right->x = r.x + pixels;
|
||||
right->y = r.y;
|
||||
right->w = r.w - pixels;
|
||||
right->h = r.h;
|
||||
|
||||
if (config.debug)
|
||||
set_children(original, left, right);
|
||||
}
|
||||
|
||||
void ui_vsplit_r(struct rect *original, int pixels, struct rect *left, struct rect *right)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
left->x = r.x;
|
||||
left->y = r.y;
|
||||
left->w = r.w - pixels;
|
||||
left->h = r.h;
|
||||
|
||||
right->x = r.x + r.w - pixels;
|
||||
right->y = r.y;
|
||||
right->w = pixels;
|
||||
right->h = r.h;
|
||||
|
||||
if (config.debug)
|
||||
set_children(original, left, right);
|
||||
}
|
||||
|
||||
void ui_margin(struct rect *original, int pixels, struct rect *other_rect)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
other_rect->x = r.x + pixels;
|
||||
other_rect->y = r.y + pixels;
|
||||
other_rect->w = r.w - 2*pixels;
|
||||
other_rect->h = r.h - 2*pixels;
|
||||
}
|
||||
|
||||
int gfx_init()
|
||||
{
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <engine/system.h>
|
||||
#include <engine/interface.h>
|
||||
#include <engine/config.h>
|
||||
#include "ui.h"
|
||||
|
||||
/********************************************************
|
||||
|
@ -107,3 +108,169 @@ int ui_do_button(void *id, const char *text, int checked, float x, float y, floa
|
|||
return r;
|
||||
}
|
||||
|
||||
static float scale = 1.0f;
|
||||
#define MEMORY_SIZE 10*1024
|
||||
static struct rect memory[MEMORY_SIZE];
|
||||
static int memory_used = 0;
|
||||
static struct rect screen = { 0.0f, 0.0f, 800.0f, 600.0f };
|
||||
|
||||
void ui_foreach_rect(rect_fun fun)
|
||||
{
|
||||
int hrm;
|
||||
for (hrm = 0; hrm < memory_used; hrm++)
|
||||
fun(&memory[hrm]);
|
||||
}
|
||||
|
||||
static void add_rect(struct rect *r)
|
||||
{
|
||||
if (memory_used < MEMORY_SIZE)
|
||||
memory[memory_used++] = *r;
|
||||
else
|
||||
dbg_msg("ui", "rect memory full.");
|
||||
}
|
||||
|
||||
struct rect *ui_screen()
|
||||
{
|
||||
if (config.debug)
|
||||
{
|
||||
memory_used = 0;
|
||||
}
|
||||
|
||||
return &screen;
|
||||
}
|
||||
|
||||
void ui_scale(float s)
|
||||
{
|
||||
scale = s;
|
||||
}
|
||||
|
||||
void ui_hsplit_t(const struct rect *original, int pixels, struct rect *top, struct rect *bottom)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
if (top)
|
||||
{
|
||||
top->x = r.x;
|
||||
top->y = r.y;
|
||||
top->w = r.w;
|
||||
top->h = pixels;
|
||||
}
|
||||
|
||||
if (bottom)
|
||||
{
|
||||
bottom->x = r.x;
|
||||
bottom->y = r.y + pixels;
|
||||
bottom->w = r.w;
|
||||
bottom->h = r.h - pixels;
|
||||
}
|
||||
|
||||
if (config.debug)
|
||||
{
|
||||
if (top)
|
||||
add_rect(top);
|
||||
if (bottom)
|
||||
add_rect(bottom);
|
||||
}
|
||||
}
|
||||
|
||||
void ui_hsplit_b(const struct rect *original, int pixels, struct rect *top, struct rect *bottom)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
if (top)
|
||||
{
|
||||
top->x = r.x;
|
||||
top->y = r.y;
|
||||
top->w = r.w;
|
||||
top->h = r.h - pixels;
|
||||
}
|
||||
|
||||
if (bottom)
|
||||
{
|
||||
bottom->x = r.x;
|
||||
bottom->y = r.y + r.h - pixels;
|
||||
bottom->w = r.w;
|
||||
bottom->h = pixels;
|
||||
}
|
||||
|
||||
if (config.debug)
|
||||
{
|
||||
if (top)
|
||||
add_rect(top);
|
||||
if (bottom)
|
||||
add_rect(bottom);
|
||||
}
|
||||
}
|
||||
|
||||
void ui_vsplit_l(const struct rect *original, int pixels, struct rect *left, struct rect *right)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
if (left)
|
||||
{
|
||||
left->x = r.x;
|
||||
left->y = r.y;
|
||||
left->w = pixels;
|
||||
left->h = r.h;
|
||||
}
|
||||
|
||||
if (right)
|
||||
{
|
||||
right->x = r.x + pixels;
|
||||
right->y = r.y;
|
||||
right->w = r.w - pixels;
|
||||
right->h = r.h;
|
||||
}
|
||||
|
||||
if (config.debug)
|
||||
{
|
||||
if (left)
|
||||
add_rect(left);
|
||||
if (right)
|
||||
add_rect(right);
|
||||
}
|
||||
}
|
||||
|
||||
void ui_vsplit_r(const struct rect *original, int pixels, struct rect *left, struct rect *right)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
if (left)
|
||||
{
|
||||
left->x = r.x;
|
||||
left->y = r.y;
|
||||
left->w = r.w - pixels;
|
||||
left->h = r.h;
|
||||
}
|
||||
|
||||
if (right)
|
||||
{
|
||||
right->x = r.x + r.w - pixels;
|
||||
right->y = r.y;
|
||||
right->w = pixels;
|
||||
right->h = r.h;
|
||||
}
|
||||
|
||||
if (config.debug)
|
||||
{
|
||||
if (left)
|
||||
add_rect(left);
|
||||
if (right)
|
||||
add_rect(right);
|
||||
}
|
||||
}
|
||||
|
||||
void ui_margin(const struct rect *original, int pixels, struct rect *other_rect)
|
||||
{
|
||||
struct rect r = *original;
|
||||
pixels *= scale;
|
||||
|
||||
other_rect->x = r.x + pixels;
|
||||
other_rect->y = r.y + pixels;
|
||||
other_rect->w = r.w - 2*pixels;
|
||||
other_rect->h = r.h - 2*pixels;
|
||||
}
|
||||
|
|
|
@ -89,23 +89,21 @@ typedef struct
|
|||
struct rect
|
||||
{
|
||||
float x, y, w, h;
|
||||
|
||||
};
|
||||
|
||||
struct rect *ui_screen();
|
||||
typedef void (*rect_fun)(struct rect *r);
|
||||
typedef void (*rect_fun)(const struct rect *r);
|
||||
void ui_foreach_rect(rect_fun fun);
|
||||
void ui_scale(float scale);
|
||||
void ui_hsplit_t(struct rect *original, int pixels, struct rect *top, struct rect *bottom);
|
||||
void ui_hsplit_b(struct rect *original, int pixels, struct rect *top, struct rect *bottom);
|
||||
void ui_vsplit_l(struct rect *original, int pixels, struct rect *left, struct rect *right);
|
||||
void ui_vsplit_r(struct rect *original, int pixels, struct rect *left, struct rect *right);
|
||||
void ui_margin(struct rect *original, int pixels, struct rect *new_rect);
|
||||
void ui_hsplit_t(const struct rect *original, int pixels, struct rect *top, struct rect *bottom);
|
||||
void ui_hsplit_b(const struct rect *original, int pixels, struct rect *top, struct rect *bottom);
|
||||
void ui_vsplit_l(const struct rect *original, int pixels, struct rect *left, struct rect *right);
|
||||
void ui_vsplit_r(const struct rect *original, int pixels, struct rect *left, struct rect *right);
|
||||
void ui_margin(const struct rect *original, int pixels, struct rect *new_rect);
|
||||
|
||||
/* image loaders */
|
||||
int gfx_load_png(IMAGE_INFO *img, const char *filename);
|
||||
|
||||
|
||||
/*
|
||||
Group: Graphics
|
||||
*/
|
||||
|
|
|
@ -520,16 +520,6 @@ int ui_do_check_box(void *id, float x, float y, float w, float h, int value)
|
|||
return r;
|
||||
}
|
||||
|
||||
int ui_do_button_rect(void *id, const char *text, int checked, struct rect *r, draw_button_callback draw_func, void *extra)
|
||||
{
|
||||
return ui_do_button(id, text, checked, r->x, r->y, r->w, r->h, draw_func, extra);
|
||||
}
|
||||
|
||||
void ui_do_label_rect(struct rect *r, char *str, float size)
|
||||
{
|
||||
ui_do_label(r->x + 3, r->y + r->h/2 - size/2, str, size);
|
||||
}
|
||||
|
||||
int do_scroll_bar_horiz(void *id, float x, float y, float width, int steps, int last_index)
|
||||
{
|
||||
int r = last_index;
|
||||
|
@ -638,6 +628,39 @@ int do_scroll_bar_vert(void *id, float x, float y, float height, int steps, int
|
|||
return r;
|
||||
}
|
||||
|
||||
int ui_do_button_rect(const void *id, const char *text, int checked, const struct rect *r, draw_button_callback draw_func, void *extra)
|
||||
{
|
||||
return ui_do_button((void *)id, text, checked, r->x, r->y, r->w, r->h, draw_func, extra);
|
||||
}
|
||||
|
||||
void ui_do_label_rect(const struct rect *r, char *str)
|
||||
{
|
||||
float size = r->h;
|
||||
ui_do_label(r->x + 3, r->y + r->h/2 - size/2, str, size);
|
||||
}
|
||||
|
||||
void ui_do_edit_box_rect(const void *id, const struct rect *r, char *buffer, int bufferSize)
|
||||
{
|
||||
ui_do_edit_box((void *)id, r->x, r->y, r->w, r->h, buffer, bufferSize);
|
||||
}
|
||||
|
||||
int ui_do_check_box_rect(const void *id, const struct rect *r, int checked)
|
||||
{
|
||||
return ui_do_check_box((void *)id, r->x, r->y, 32, 32, checked);
|
||||
}
|
||||
|
||||
int ui_do_key_reader_rect(const void *id, const struct rect *r, int key)
|
||||
{
|
||||
return ui_do_key_reader((void *)id, r->x, r->y, r->w, r->h, key);
|
||||
}
|
||||
|
||||
int do_scroll_bar_horiz_rect(const void *id, const struct rect *r, int steps, int last_index)
|
||||
{
|
||||
return do_scroll_bar_horiz((void *)id, r->x, r->y, r->w, steps, last_index);
|
||||
//return do_scroll_bar_horiz((void *)id, r->x, r->y, r->w, r->h, steps, last_index);
|
||||
}
|
||||
|
||||
|
||||
static int do_server_list(float x, float y, int *scroll_index, int *selected_index, int visible_items)
|
||||
{
|
||||
const float spacing = 3.f;
|
||||
|
@ -686,7 +709,9 @@ static int do_server_list(float x, float y, int *scroll_index, int *selected_ind
|
|||
|
||||
enum
|
||||
{
|
||||
SCREEN_MAIN,
|
||||
SCREEN_SERVERS,
|
||||
SCREEN_NEWS,
|
||||
SCREEN_HOST,
|
||||
SCREEN_DISCONNECTED,
|
||||
SCREEN_CONNECTING,
|
||||
SCREEN_SETTINGS_GENERAL,
|
||||
|
@ -698,7 +723,7 @@ enum
|
|||
SCREEN_KERNING
|
||||
};
|
||||
|
||||
static int screen = SCREEN_MAIN;
|
||||
static int screen = SCREEN_SERVERS;
|
||||
static CONFIGURATION config_copy;
|
||||
|
||||
const float column1_x = 250;
|
||||
|
@ -725,7 +750,7 @@ static float colors[7][3] =
|
|||
{ 1, 1, 1 },
|
||||
};
|
||||
|
||||
static void draw_rect(struct rect *r)
|
||||
static void draw_rect(const struct rect *r)
|
||||
{
|
||||
float *color = colors[rand()%7];
|
||||
gfx_setcolor(color[0], color[1], color[2], 1);
|
||||
|
@ -736,84 +761,175 @@ static void draw_rect(struct rect *r)
|
|||
gfx_lines_draw(r->x, r->y+r->h, r->x, r->y);
|
||||
}
|
||||
|
||||
static void draw_rects(struct rect *rects, int count)
|
||||
void ui_settings_general_render(const struct rect *r)
|
||||
{
|
||||
gfx_texture_set(-1);
|
||||
gfx_lines_begin();
|
||||
static struct rect row1;
|
||||
static struct rect row2;
|
||||
static struct rect rest;
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
struct rect *r = &rects[i];
|
||||
static struct rect cells[4];
|
||||
|
||||
float *color = colors[i%7];
|
||||
ui_hsplit_t(r, 50, &row1, &rest);
|
||||
ui_hsplit_t(&rest, 50, &row2, &rest);
|
||||
|
||||
gfx_setcolor(color[0], color[1], color[2], 1);
|
||||
ui_vsplit_l(&row1, 100, &cells[0], &cells[1]);
|
||||
ui_vsplit_l(&row2, 100, &cells[2], &cells[3]);
|
||||
|
||||
gfx_lines_draw(r->x, r->y, r->x+r->w, r->y);
|
||||
gfx_lines_draw(r->x+r->w, r->y, r->x+r->w, r->y+r->h);
|
||||
gfx_lines_draw(r->x+r->w, r->y+r->h, r->x, r->y+r->h);
|
||||
gfx_lines_draw(r->x, r->y+r->h, r->x, r->y);
|
||||
}
|
||||
// NAME
|
||||
ui_do_label_rect(&cells[0], "Name:");
|
||||
ui_do_edit_box_rect(config_copy.player_name, &cells[1], config_copy.player_name, sizeof(config_copy.player_name));
|
||||
|
||||
gfx_lines_end();
|
||||
// Dynamic camera
|
||||
ui_do_label_rect(&cells[2], "Dynamic Camera:");
|
||||
config_set_dynamic_camera(&config_copy, ui_do_check_box_rect(&config_copy.dynamic_camera, &cells[3], config_copy.dynamic_camera));
|
||||
}
|
||||
|
||||
static void print_rect(struct rect *r)
|
||||
typedef void (*assign_func_callback)(CONFIGURATION *config, int value);
|
||||
|
||||
struct key_thing
|
||||
{
|
||||
printf("x: %f y: %f w: %f h: %f\n", r->x, r->y, r->w, r->h);
|
||||
char name[32];
|
||||
int *key;
|
||||
assign_func_callback assign_func;
|
||||
};
|
||||
|
||||
static void ui_settings_controls_render(const struct rect *r)
|
||||
{
|
||||
static int scroll_index = 0;
|
||||
|
||||
const key_thing keys[] =
|
||||
{
|
||||
{ "Move Left:", &config_copy.key_move_left, config_set_key_move_left },
|
||||
{ "Move Right:", &config_copy.key_move_right, config_set_key_move_right },
|
||||
{ "Jump:", &config_copy.key_jump, config_set_key_jump },
|
||||
{ "Fire:", &config_copy.key_fire, config_set_key_fire },
|
||||
{ "Hook:", &config_copy.key_hook, config_set_key_hook },
|
||||
{ "Hammer:", &config_copy.key_weapon1, config_set_key_weapon1 },
|
||||
{ "Pistol:", &config_copy.key_weapon2, config_set_key_weapon2 },
|
||||
{ "Shotgun:", &config_copy.key_weapon3, config_set_key_weapon3 },
|
||||
{ "Grenade:", &config_copy.key_weapon4, config_set_key_weapon4 },
|
||||
{ "Next Weapon:", &config_copy.key_next_weapon, config_set_key_next_weapon },
|
||||
{ "Prev. Weapon:", &config_copy.key_prev_weapon, config_set_key_prev_weapon },
|
||||
{ "Emoticon:", &config_copy.key_emoticon, config_set_key_emoticon },
|
||||
{ "Screenshot:", &config_copy.key_screenshot, config_set_key_screenshot },
|
||||
};
|
||||
|
||||
const int key_count = sizeof(keys) / sizeof(key_thing);
|
||||
|
||||
struct rect rest = *r;
|
||||
|
||||
for (int i = 0; i < key_count; i++)
|
||||
{
|
||||
struct rect row;
|
||||
struct rect left, right;
|
||||
|
||||
ui_hsplit_t(&rest, 32, &row, &rest);
|
||||
ui_vsplit_l(&row, 128, &left, &right);
|
||||
|
||||
key_thing key = keys[i + scroll_index];
|
||||
|
||||
ui_do_label_rect(&left, key.name);
|
||||
key.assign_func(&config_copy, ui_do_key_reader_rect(key.key, &right, *key.key));
|
||||
}
|
||||
}
|
||||
|
||||
static void tab_menu_render(struct rect *r)
|
||||
void ui_settings_video_render(const struct rect *r)
|
||||
{
|
||||
static struct rect button1;
|
||||
static struct rect button2;
|
||||
static struct rect button3;
|
||||
static struct rect rest1;
|
||||
static struct rect rest2;
|
||||
static struct rect rest3;
|
||||
|
||||
ui_vsplit_l(r, 160, &button1, &rest1);
|
||||
ui_vsplit_l(&rest1, 160, &button2, &rest2);
|
||||
ui_vsplit_l(&rest2, 160, &button3, &rest3);
|
||||
|
||||
if (ui_do_button_rect(&button1, "Browser", 0, &button1, draw_teewars_button, 0))
|
||||
{
|
||||
screen = SCREEN_MAIN;
|
||||
}
|
||||
|
||||
if (ui_do_button_rect(&button2, "Settings", 0, &button2, draw_teewars_button, 0))
|
||||
{
|
||||
screen = SCREEN_SETTINGS_GENERAL;
|
||||
}
|
||||
|
||||
ui_do_label_rect(&rest3, "Name:", 36);
|
||||
}
|
||||
|
||||
static void ui_settings_render(struct rect *r)
|
||||
void ui_settings_video_render_select_mode(const struct rect *r)
|
||||
{
|
||||
}
|
||||
|
||||
void ui_settings_video_render_custom(const struct rect *r)
|
||||
{
|
||||
}
|
||||
|
||||
void ui_settings_sound_render(const struct rect *r)
|
||||
{
|
||||
struct rect row;
|
||||
struct rect left, right;
|
||||
|
||||
ui_hsplit_t(r, 32, &row, 0x0);
|
||||
ui_vsplit_l(&row, 128, &left, &right);
|
||||
|
||||
ui_do_label_rect(&left, "Volume:");
|
||||
|
||||
config_set_volume(&config_copy, do_scroll_bar_horiz_rect(&config_copy.volume, &right, 256, config_copy.volume));
|
||||
snd_set_master_volume(config_copy.volume / 255.0f);
|
||||
}
|
||||
|
||||
static void tab_menu_button_render(const struct rect *r, char *name, int s)
|
||||
{
|
||||
if (ui_do_button_rect(r, name, 0, r, draw_teewars_button, 0))
|
||||
screen = s;
|
||||
}
|
||||
|
||||
static void tab_menu_render(const struct rect *r)
|
||||
{
|
||||
static struct rect button_news;
|
||||
static struct rect button_servers;
|
||||
static struct rect button_host;
|
||||
static struct rect button_settings;
|
||||
static struct rect rest;
|
||||
|
||||
ui_vsplit_l(r, 130, &button_news, &rest);
|
||||
ui_vsplit_l(&rest, 130, &button_servers, &rest);
|
||||
ui_vsplit_l(&rest, 130, &button_host, &rest);
|
||||
ui_vsplit_l(&rest, 130, &button_settings, &rest);
|
||||
|
||||
tab_menu_button_render(&button_news, "News", SCREEN_NEWS);
|
||||
tab_menu_button_render(&button_servers, "Servers", SCREEN_SERVERS);
|
||||
tab_menu_button_render(&button_host, "Host", SCREEN_HOST);
|
||||
tab_menu_button_render(&button_settings, "Settings", SCREEN_SETTINGS_GENERAL);
|
||||
}
|
||||
|
||||
static void settings_tab_menu_render(const struct rect *r)
|
||||
{
|
||||
static struct rect button_general;
|
||||
static struct rect button_controls;
|
||||
static struct rect button_video;
|
||||
static struct rect button_sound;
|
||||
static struct rect rest;
|
||||
|
||||
ui_hsplit_t(r, 60, &button_general, &rest);
|
||||
ui_hsplit_t(&rest, 60, &button_controls, &rest);
|
||||
ui_hsplit_t(&rest, 60, &button_video, &rest);
|
||||
ui_hsplit_t(&rest, 60, &button_sound, &rest);
|
||||
|
||||
tab_menu_button_render(&button_general, "General", SCREEN_SETTINGS_GENERAL);
|
||||
tab_menu_button_render(&button_controls, "Controls", SCREEN_SETTINGS_CONTROLS);
|
||||
tab_menu_button_render(&button_video, "Video", SCREEN_SETTINGS_VIDEO);
|
||||
tab_menu_button_render(&button_sound, "Sound", SCREEN_SETTINGS_SOUND);
|
||||
}
|
||||
|
||||
static void ui_settings_render(const struct rect *r)
|
||||
{
|
||||
static struct rect sub_menu_selector;
|
||||
static struct rect center;
|
||||
|
||||
ui_vsplit_l(r, 100, &sub_menu_selector, ¢er);
|
||||
|
||||
settings_tab_menu_render(&sub_menu_selector);
|
||||
|
||||
switch (screen)
|
||||
{
|
||||
/*case SCREEN_SETTINGS_GENERAL: settings_general_render(); break;
|
||||
case SCREEN_SETTINGS_CONTROLS: settings_controls_render(); break;
|
||||
case SCREEN_SETTINGS_VIDEO: settings_video_render(); break;
|
||||
case SCREEN_SETTINGS_VIDEO_SELECT_MODE: settings_video_render_select_mode(); break;
|
||||
case SCREEN_SETTINGS_VIDEO_CUSTOM: settings_video_render_custom(); break;
|
||||
case SCREEN_SETTINGS_SOUND: settings_sound_render(); break;*/
|
||||
case SCREEN_SETTINGS_GENERAL: ui_settings_general_render(¢er); break;
|
||||
case SCREEN_SETTINGS_CONTROLS: ui_settings_controls_render(¢er); break;
|
||||
case SCREEN_SETTINGS_VIDEO: ui_settings_video_render(¢er); break;
|
||||
case SCREEN_SETTINGS_VIDEO_SELECT_MODE: ui_settings_video_render_select_mode(¢er); break;
|
||||
case SCREEN_SETTINGS_VIDEO_CUSTOM: ui_settings_video_render_custom(¢er); break;
|
||||
case SCREEN_SETTINGS_SOUND: ui_settings_sound_render(¢er); break;
|
||||
}
|
||||
}
|
||||
|
||||
static void middle_render(struct rect *r)
|
||||
static void middle_render(const struct rect *r)
|
||||
{
|
||||
bool ingame = false;
|
||||
|
||||
switch (screen)
|
||||
{
|
||||
case SCREEN_MAIN:
|
||||
case SCREEN_SERVERS:
|
||||
{
|
||||
if (ingame)
|
||||
{}
|
||||
|
@ -821,12 +937,61 @@ static void middle_render(struct rect *r)
|
|||
else
|
||||
{
|
||||
static struct rect browser;
|
||||
static bool inited = false;
|
||||
ui_margin(r, 5, &browser);
|
||||
ui_do_button_rect(&browser, "b", 0, &browser, draw_teewars_button, 0);
|
||||
|
||||
if (!inited)
|
||||
{
|
||||
client_serverbrowse_refresh(0);
|
||||
inited = true;
|
||||
}
|
||||
|
||||
{
|
||||
int server_count = client_serverbrowse_sorted_num();
|
||||
int i;
|
||||
|
||||
struct rect rest = *r;
|
||||
|
||||
for (i = 0; i < server_count; i++)
|
||||
{
|
||||
SERVER_INFO *info = client_serverbrowse_sorted_get(i);
|
||||
struct rect row;
|
||||
struct rect col_name, col_players, col_players_max, col_map, col_latency, col_progression;
|
||||
char temp[16];
|
||||
|
||||
ui_hsplit_t(&rest, 32, &row, &rest);
|
||||
ui_margin(&row, 1, &row);
|
||||
|
||||
ui_vsplit_l(&row, 400, &col_name, &row);
|
||||
ui_vsplit_l(&row, 40, &col_players, &row);
|
||||
ui_vsplit_l(&row, 40, &col_players_max, &row);
|
||||
ui_vsplit_l(&row, 80, &col_map, &row);
|
||||
ui_vsplit_l(&row, 40, &col_latency, &row);
|
||||
ui_vsplit_l(&row, 40, &col_progression, &row);
|
||||
|
||||
ui_do_label_rect(&col_name, info->name);
|
||||
|
||||
sprintf(temp, "%i", info->num_players);
|
||||
ui_do_label_rect(&col_players, temp);
|
||||
sprintf(temp, "%i", info->max_players);
|
||||
ui_do_label_rect(&col_players_max, temp);
|
||||
ui_do_label_rect(&col_map, info->map);
|
||||
|
||||
sprintf(temp, "%i", info->latency);
|
||||
ui_do_label_rect(&col_latency, temp);
|
||||
sprintf(temp, "%i", info->progression);
|
||||
ui_do_label_rect(&col_progression, temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SCREEN_DISCONNECTED:
|
||||
case SCREEN_NEWS:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case SCREEN_HOST:
|
||||
{
|
||||
break;
|
||||
//return disconnected_render();
|
||||
|
@ -844,26 +1009,24 @@ static void middle_render(struct rect *r)
|
|||
case SCREEN_SETTINGS_SOUND:
|
||||
{
|
||||
ui_settings_render(r);
|
||||
//return settings_render(ingame);
|
||||
break;
|
||||
}
|
||||
case SCREEN_KERNING:
|
||||
{
|
||||
break;
|
||||
//return kerning_render();
|
||||
}
|
||||
default: dbg_msg("menu", "invalid screen selected..."); break;
|
||||
}
|
||||
}
|
||||
|
||||
static int ui_menu_render(struct rect *r)
|
||||
static int ui_menu_render(const struct rect *r)
|
||||
{
|
||||
static struct rect top;
|
||||
static struct rect temp;
|
||||
static struct rect middle;
|
||||
static struct rect bottom;
|
||||
|
||||
ui_hsplit_t(r, 48, &top, &temp);
|
||||
ui_hsplit_b(&temp, 32, &middle, &bottom);
|
||||
ui_hsplit_t(r, 48, &top, &middle);
|
||||
ui_hsplit_b(&middle, 32, &middle, &bottom);
|
||||
tab_menu_render(&top);
|
||||
middle_render(&middle);
|
||||
|
||||
|
@ -961,15 +1124,6 @@ static int settings_general_render()
|
|||
return 0;
|
||||
}
|
||||
|
||||
typedef void (*assign_func_callback)(CONFIGURATION *config, int value);
|
||||
|
||||
struct key_thing
|
||||
{
|
||||
char name[32];
|
||||
int *key;
|
||||
assign_func_callback assign_func;
|
||||
};
|
||||
|
||||
static int settings_controls_render()
|
||||
{
|
||||
static int scroll_index = 0;
|
||||
|
@ -1199,7 +1353,7 @@ static int settings_render(bool ingame)
|
|||
#else
|
||||
config_save("default.cfg");
|
||||
#endif
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
}
|
||||
|
||||
// CANCEL BUTTON
|
||||
|
@ -1207,7 +1361,7 @@ static int settings_render(bool ingame)
|
|||
if (ui_do_button(&cancel_button, "Cancel", 0, 620, 490, 150, 48, draw_teewars_button, 0))
|
||||
{
|
||||
snd_set_master_volume(config.volume / 255.0f);
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1438,7 +1592,7 @@ static int kerning_render()
|
|||
// CANCEL BUTTON
|
||||
static int cancel_button;
|
||||
if (ui_do_button(&cancel_button, "Cancel", 0, 620, 520, 150, 48, draw_teewars_button, 0))
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1482,11 +1636,11 @@ int render_popup(const char *caption, const char *text, const char *button_text)
|
|||
static int disconnected_render()
|
||||
{
|
||||
if(strlen(client_error_string()) == 0)
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
else
|
||||
{
|
||||
if(render_popup("Disconnected", client_error_string(), "Back"))
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1498,7 +1652,7 @@ static int connecting_render()
|
|||
if(render_popup("Connecting", buf, "Abort"))
|
||||
{
|
||||
client_disconnect();
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1517,7 +1671,7 @@ void menu_do_connecting()
|
|||
|
||||
void menu_do_connected()
|
||||
{
|
||||
screen = SCREEN_MAIN;
|
||||
screen = SCREEN_SERVERS;
|
||||
}
|
||||
|
||||
static int menu_render(bool ingame)
|
||||
|
@ -1562,8 +1716,6 @@ static int menu_render(bool ingame)
|
|||
if (inp_key_pressed('O'))
|
||||
scale -= 0.01;
|
||||
|
||||
dbg_msg("year", "%f", scale);
|
||||
|
||||
ui_scale(scale);
|
||||
int retn = ui_menu_render(screen);
|
||||
|
||||
|
@ -1578,7 +1730,7 @@ static int menu_render(bool ingame)
|
|||
{
|
||||
switch (screen)
|
||||
{
|
||||
case SCREEN_MAIN: return ingame ? ingame_main_render() : main_render();
|
||||
case SCREEN_SERVERS: return ingame ? ingame_main_render() : main_render();
|
||||
case SCREEN_DISCONNECTED: return disconnected_render();
|
||||
case SCREEN_CONNECTING: return connecting_render();
|
||||
case SCREEN_SETTINGS_GENERAL:
|
||||
|
|
Loading…
Reference in a new issue