diff --git a/menu.h b/menu.h index fe268eb..30be8b8 100644 --- a/menu.h +++ b/menu.h @@ -6,14 +6,31 @@ class Menu { public: - Menu(std::string text, char trigger) + Menu(std::string text, char trigger, std::string *items, int num_items) { this->text = text; this->trigger = trigger; + this->items = items; + this->num_items = num_items; + this->selected_item = 0; } int start_x; std::string text; char trigger; + std::string *items; + int num_items; + int selected_item; + + void selectNextItem(){ + selected_item++; + if (selected_item >= num_items) + selected_item = 0; + } + void selectPrevItem(){ + selected_item--; + if (selected_item < 0) + selected_item = num_items - 1; + } }; class MenuBar { public: @@ -23,7 +40,13 @@ class MenuBar { this->menus = menus; this->num_menus = num_menus; this->selected_menu = -1; - + + int yMax,xMax,yBeg,xBeg; + getmaxyx(win,yMax,xMax); + getbegyx(win,yBeg,xBeg); + menuwin = newwin(yMax-2,xMax-2,yBeg+1,xBeg+1); + wrefresh(menuwin); + int current_pos = 2; for (int i = 0; i < num_menus; i++) @@ -33,28 +56,85 @@ class MenuBar { } } - void draw() + void reset() { for (int i = 0; i < num_menus; i++) { int start_x = this->menus[i].start_x; std::string text = this->menus[i].text; - if(selected_menu == i) - { - wattron(win, A_STANDOUT); - } - mvwprintw(win,0,start_x,text.c_str()); - if(selected_menu == i) - { - wattroff(win, A_STANDOUT); - } + mvwprintw(win,0,start_x,"%s",text.c_str()); } wrefresh(win); } + + void draw() + { + for (int i = 0; i < num_menus; i++) + { + drawMenu(menus[i],selected_menu == i); + } + selected_menu = -1; + wrefresh(win); + } + void drawMenu(Menu menu, bool is_selected) + { + int start_x = menu.start_x; + std::string text = menu.text; + if(is_selected) + { + wattron(win, A_STANDOUT); + } + mvwprintw(win,0,start_x,"%s",text.c_str()); + if(is_selected) + { + wattroff(win, A_STANDOUT); + } + wrefresh(win); + + char ch; + drawMenuItems(menu); + wrefresh(menuwin); + while(is_selected && (ch = wgetch(menuwin))) + { + switch(ch) + { + case 'k': + menu.selectNextItem(); + break; + case 'j': + menu.selectPrevItem(); + break; + default: + is_selected = false; + } + drawMenuItems(menu); + } + werase(menuwin); + wrefresh(menuwin); + reset(); + } + + void drawMenuItems(Menu menu) + { + int yMax,xMax; + getmaxyx(menuwin,yMax,xMax); + for (int i = 0; i