From 73ad55c774b120d4c9b594f15f498fc43edda37e Mon Sep 17 00:00:00 2001 From: "simon.kagstrom" Date: Fri, 20 Nov 2009 17:09:06 +0000 Subject: [PATCH] Some drawing stuff (unfinished) --- menu.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++----- menu.hh | 16 ++++++----- 2 files changed, 85 insertions(+), 12 deletions(-) diff --git a/menu.cpp b/menu.cpp index f13e5c7..6b83d1f 100644 --- a/menu.cpp +++ b/menu.cpp @@ -150,7 +150,7 @@ static void menu_draw(SDL_Surface *screen, menu_t *p_menu, int sel) default: menu_print_font(screen, 0x40,0x40,0x40, x_start, y_start + y, msg); - break; + break; } } else /* Otherwise white */ @@ -202,9 +202,69 @@ static void menu_draw(SDL_Surface *screen, menu_t *p_menu, int sel) } -void Menu::draw(SDL_Surface *where, int x, int y) +void Menu::draw(SDL_Surface *where, int x, int y, int w, int h) { + int font_height = TTF_FontHeight(this->p_font); + int line_height = (font_height + font_height / 4); + int x_start = x; + int y_start = y + line_height; + SDL_Rect r; + int entries_visible = h / line_height - 2; + if (this->cur_sel - this->start_entry_visible > entries_visible) + { + while (this->cur_sel - this->start_entry_visible > entries_visible) + { + this->start_entry_visible++; + if (this->start_entry_visible > this->n_entries) + { + this->start_entry_visible = 0; + break; + } + } + } + else if ( this->cur_sel < this->start_entry_visible ) + this->start_entry_visible = this->cur_sel; + + for (i = this->start_entry_visible; + i <= this->start_entry_visible + entries_visible; i++) + { + const char *msg = this->pp_msgs[i]; + + if (i >= this->n_entries) + break; + + y = (i - this->start_entry_visible) * line_height; + + if (sel < 0) + this->printText(msg, this->text_color, + x_start, y_start + y, w); + else if (p_menu->cur_sel == i) /* Selected - color */ + menu_print_font(screen, 0,255,0, + x_start, y_start + y, msg); + else if (IS_SUBMENU(msg)) + { + if (p_menu->cur_sel == i-1) + menu_print_font(screen, 0x80,0xff,0x80, + x_start, y_start + y, msg); + else + menu_print_font(screen, 0x40,0x40,0x40, + x_start, y_start + y, msg); + } + else /* Otherwise white */ + menu_print_font(screen, 0x40,0x40,0x40, + x_start, y_start + y, msg); + if (IS_SUBMENU(msg)) + { + submenu_t *p_submenu = this->findSubmenu(i); + int n_pipe = 0; + int n; + + for (n = 0; msg[n] != '\0'; n++) + { + } + } + } } @@ -425,12 +485,11 @@ void Menu::setText(const char *messages) this->selectOne(0); } -Menu::Menu(TTF_Font *font, SDL_Color clr, int w, int h) +Menu::Menu(TTF_Font *font) { - this->text_color = clr; + this->setSelectedColor((SDL_Color){0x0,0xff,0xff,0}); + this->setTextColor((SDL_Color){0xff,0xff,0xff,0}); this->font = font; - this->w = w; - this->h = h; this->pp_msgs = NULL; this->n_entries = 0; @@ -445,6 +504,16 @@ Menu::Menu(TTF_Font *font, SDL_Color clr, int w, int h) this->ev_head = this->ev_tail = 0; } +void Menu::setSelectedColor(SDL_Color clr) +{ + this->text_selected_color = clr; +} + +void Menu::setTextColor(SDL_Color clr) +{ + this->text_selected_color = clr; +} + Menu::~Menu() { free(this->pp_msgs); diff --git a/menu.hh b/menu.hh index 6836f24..4039eba 100644 --- a/menu.hh +++ b/menu.hh @@ -42,7 +42,11 @@ typedef int event_t; class Menu { public: - Menu(TTF_Font *font, SDL_Color clr, int w, int h); + Menu(TTF_Font *font); + + void setTextColor(SDL_Color clr); + + void setSelectedColor(SDL_Color clr); void setText(const char **messages); @@ -51,11 +55,13 @@ public: void runLogic(); void draw(SDL_Surface *where, - int x, int y); + int x, int y, int w, int h); ~Menu(); protected: + void printText(const char *msg, SDL_Color clr, int x, int y); + virtual void selectCallback(int which); virtual void escapeCallback(int which); @@ -78,12 +84,10 @@ protected: const char **pp_msgs; TTF_Font *font; SDL_Color text_color; - - /* Width and height */ - int w, h; + SDL_Color text_selected_color; /* Relative to this menu */ - int mouse_x, mouse_y; + int mouse_x, mouse_y; int n_submenus; submenu_t *p_submenus;