From a4f0f0e1f95e6f47e6b0a8b6e1dd0c0a7269b945 Mon Sep 17 00:00:00 2001 From: Harsh Virdi Date: Fri, 27 Mar 2026 16:58:21 +0530 Subject: [PATCH] Added Menu Items --- menu.h | 107 +++++++++++++++++++++++++++++++++++++++++++++++++------- tui.cpp | 24 +++++++++---- 2 files changed, 111 insertions(+), 20 deletions(-) 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; imenus[i].trigger) @@ -65,6 +145,7 @@ class MenuBar { } } + WINDOW *menuwin; WINDOW *win; Menu *menus; int num_menus; diff --git a/tui.cpp b/tui.cpp index e93cd6c..0767ac4 100644 --- a/tui.cpp +++ b/tui.cpp @@ -1,6 +1,4 @@ -#include #include -#include #include #include "menu.h" @@ -11,23 +9,35 @@ int main(int argc, char **argv){ noecho(); curs_set(0); + if(!has_colors()) + { + return -1; + } + + start_color(); + init_pair(1, COLOR_WHITE,COLOR_BLUE); + int yMax,xMax; getmaxyx(stdscr,yMax,xMax); - WINDOW *win = newwin(yMax/2,xMax/2,yMax/4,xMax/4); + WINDOW *win = newwin(yMax-1,xMax-1,yMax-yMax+1,xMax-xMax+1); box(win,0,0); + string menu1[] = {"New","Open","Save","Exit"}; + string menu2[] = {"Copy","Cut","Paste"}; + string menu3[] = {"Sidebar","Terminal"}; + Menu menus[3] = { - Menu("File",'f'), - Menu("Edit",'e'), - Menu("Options",'o'), + Menu("File",'f',menu1,4), + Menu("Edit",'e',menu2,3), + Menu("View",'v',menu3,2), }; MenuBar menubar = MenuBar(win,menus,3); menubar.draw(); char ch; - while(ch = wgetch(win)){ + while((ch = wgetch(win))){ menubar.handleTrigger(ch); menubar.draw(); }