diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-06-15 10:12:16 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-06-15 10:12:16 +0000 |
| commit | d023c72256f766cfa6d283c2781b3c90cb00aa8c (patch) | |
| tree | d5a966662fe967aef2713286f40e5b0870c2be32 /src/game | |
| parent | b31243d271ec276551f3e56e1fef15224355a6ed (diff) | |
| download | zcatch-d023c72256f766cfa6d283c2781b3c90cb00aa8c.tar.gz zcatch-d023c72256f766cfa6d283c2781b3c90cb00aa8c.zip | |
fixed demo browser so it's ordered and shows all files
Diffstat (limited to 'src/game')
| -rw-r--r-- | src/game/client/components/menus.cpp | 3 | ||||
| -rw-r--r-- | src/game/client/components/menus.hpp | 6 | ||||
| -rw-r--r-- | src/game/client/components/menus_demo.cpp | 51 |
3 files changed, 35 insertions, 25 deletions
diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 74234a52..1748fe18 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -91,9 +91,6 @@ MENUS::MENUS() enter_pressed = false; num_inputevents = 0; - demos = 0; - num_demos = 0; - last_input = time_get(); } diff --git a/src/game/client/components/menus.hpp b/src/game/client/components/menus.hpp index 7523cf8d..3ca3ee43 100644 --- a/src/game/client/components/menus.hpp +++ b/src/game/client/components/menus.hpp @@ -1,4 +1,5 @@ #include <base/vmath.hpp> +#include <base/tl/sorted_array.hpp> #include <game/client/component.hpp> #include <game/client/ui.hpp> @@ -122,10 +123,11 @@ class MENUS : public COMPONENT { char filename[512]; char name[256]; + + bool operator<(const DEMOITEM &other) { return str_comp(name, other.name) < 0; } }; - DEMOITEM *demos; - int num_demos; + sorted_array<DEMOITEM> demos; void demolist_populate(); static void demolist_count_callback(const char *name, int is_dir, void *user); diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index cfd5f568..3a22fde2 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -212,8 +212,12 @@ void MENUS::ui_do_listbox_start(void *id, const RECT *rect, float row_height, co // do the scrollbar ui_hsplit_t(&view, listbox_rowheight, &row, 0); - - int num = (int)(listbox_originalview.h/row.h); + + int num_viewable = (int)(listbox_originalview.h/row.h) + 1; + int num = num_items-num_viewable+1; + if(num < 0) + num = 0; + static float scrollvalue = 0; ui_hmargin(&scroll, 5.0f, &scroll); scrollvalue = ui_do_scrollbar_v(id, &scroll, scrollvalue); @@ -233,8 +237,8 @@ MENUS::LISTBOXITEM MENUS::ui_do_listbox_nextitem(void *id) { RECT row; LISTBOXITEM item = {0}; - ui_hsplit_t(&listbox_view, listbox_rowheight-2.0f, &row, &listbox_view); - ui_hsplit_t(&listbox_view, 2.0f, 0, &listbox_view); + ui_hsplit_t(&listbox_view, listbox_rowheight /*-2.0f*/, &row, &listbox_view); + //ui_hsplit_t(&listbox_view, 2.0f, 0, &listbox_view); RECT select_hit_box = row; @@ -300,12 +304,12 @@ void MENUS::demolist_listdir_callback(const char *name, int is_dir, void *user) int num_demos; */ -void MENUS::demolist_count_callback(const char *name, int is_dir, void *user) +/*void MENUS::demolist_count_callback(const char *name, int is_dir, void *user) { if(is_dir || name[0] == '.') return; (*(int *)user)++; -} +}*/ struct FETCH_CALLBACKINFO { @@ -321,29 +325,36 @@ void MENUS::demolist_fetch_callback(const char *name, int is_dir, void *user) FETCH_CALLBACKINFO *info = (FETCH_CALLBACKINFO *)user; + DEMOITEM item; + str_format(item.filename, sizeof(item.filename), "%s/%s", info->prefix, name); + str_copy(item.name, name, sizeof(item.name)); + info->self->demos.add(item); + + /* if(info->count == info->self->num_demos) return; - str_format(info->self->demos[info->count].filename, sizeof(info->self->demos[info->count].filename), "%s/%s", info->prefix, name); - str_copy(info->self->demos[info->count].name, name, sizeof(info->self->demos[info->count].name)); info->count++; + */ } void MENUS::demolist_populate() { - if(demos) + demos.clear(); + + /*if(demos) mem_free(demos); demos = 0; - num_demos = 0; + num_demos = 0;*/ char buf[512]; str_format(buf, sizeof(buf), "%s/demos", client_user_directory()); - fs_listdir(buf, demolist_count_callback, &num_demos); - fs_listdir("demos", demolist_count_callback, &num_demos); + //fs_listdir(buf, demolist_count_callback, &num_demos); + //fs_listdir("demos", demolist_count_callback, &num_demos); - demos = (DEMOITEM *)mem_alloc(sizeof(DEMOITEM)*num_demos, 1); - mem_zero(demos, sizeof(DEMOITEM)*num_demos); + //demos = (DEMOITEM *)mem_alloc(sizeof(DEMOITEM)*num_demos, 1); + //mem_zero(demos, sizeof(DEMOITEM)*num_demos); FETCH_CALLBACKINFO info = {this, buf, 0}; fs_listdir(buf, demolist_fetch_callback, &info); @@ -368,15 +379,15 @@ void MENUS::render_demolist(RECT main_view) ui_hsplit_t(&buttonbar, 5.0f, 0, &buttonbar); static int selected_item = -1; - static int num_items = 0; static int demolist_id = 0; - ui_do_listbox_start(&demolist_id, &main_view, 17.0f, localize("Demos"), num_items, selected_item); - for(int i = 0; i < num_demos; i++) + ui_do_listbox_start(&demolist_id, &main_view, 17.0f, localize("Demos"), demos.size(), selected_item); + //for(int i = 0; i < num_demos; i++) + for(sorted_array<DEMOITEM>::range r = demos.all(); !r.empty(); r.pop_front()) { - LISTBOXITEM item = ui_do_listbox_nextitem((void*)(10+i)); + LISTBOXITEM item = ui_do_listbox_nextitem((void*)(&r.front())); if(item.visible) - ui_do_label(&item.rect, demos[i].name, item.rect.h*fontmod_height, -1); + ui_do_label(&item.rect, r.front().name, item.rect.h*fontmod_height, -1); } selected_item = ui_do_listbox_end(); @@ -394,7 +405,7 @@ void MENUS::render_demolist(RECT main_view) static int play_button = 0; if(ui_do_button(&play_button, localize("Play"), 0, &play_rect, ui_draw_menu_button, 0)) { - if(selected_item >= 0 && selected_item < num_demos) + if(selected_item >= 0 && selected_item < demos.size()) client_demoplayer_play(demos[selected_item].filename); } |