From 225871dba4c908b890386f78381a316312c84b54 Mon Sep 17 00:00:00 2001 From: key Date: Thu, 16 Jun 2022 16:53:51 +0200 Subject: [PATCH] Making our menu from scratch with ncurses --- ked/ncurses/compile_run.sh | 4 + ked/ncurses/main.cpp | 72 ++--- ked/ncurses/main.h | 4 + ked/ncurses/menu | Bin 23984 -> 34256 bytes ked/ncurses/menu.h | 268 +++++++++--------- ked/ncurses/menuBar.h | 174 ++++++++++++ ked/ncurses/terminal.h | 110 +++++++ .../{ => training}/basics/compile_run.sh | 0 ked/ncurses/{ => training}/basics/main.c | 0 .../ctrl_and_sprecial_var/compile_run.sh | 0 .../ctrl_and_sprecial_var/main.cpp | 0 .../{ => training}/ctrl_and_sprecial_var/menu | Bin .../training/first_menu/compile_run.sh | 7 + ked/ncurses/training/first_menu/main.cpp | 58 ++++ ked/ncurses/training/first_menu/menu.h | 180 ++++++++++++ .../{ => training}/game/compile_run.sh | 0 ked/ncurses/{ => training}/game/main.cpp | 0 ked/ncurses/{ => training}/game/player.hpp | 0 ked/ncurses/training/menuEx/compile_run.sh | 7 + ked/ncurses/training/menuEx/main.c | 108 +++++++ ked/ncurses/training/menuEx/menu | Bin 0 -> 17864 bytes ked/ncurses/training/menuEx/player.hpp | 102 +++++++ 22 files changed, 922 insertions(+), 172 deletions(-) create mode 100644 ked/ncurses/main.h create mode 100644 ked/ncurses/menuBar.h create mode 100644 ked/ncurses/terminal.h rename ked/ncurses/{ => training}/basics/compile_run.sh (100%) rename ked/ncurses/{ => training}/basics/main.c (100%) rename ked/ncurses/{ => training}/ctrl_and_sprecial_var/compile_run.sh (100%) rename ked/ncurses/{ => training}/ctrl_and_sprecial_var/main.cpp (100%) rename ked/ncurses/{ => training}/ctrl_and_sprecial_var/menu (100%) create mode 100755 ked/ncurses/training/first_menu/compile_run.sh create mode 100644 ked/ncurses/training/first_menu/main.cpp create mode 100644 ked/ncurses/training/first_menu/menu.h rename ked/ncurses/{ => training}/game/compile_run.sh (100%) rename ked/ncurses/{ => training}/game/main.cpp (100%) rename ked/ncurses/{ => training}/game/player.hpp (100%) create mode 100755 ked/ncurses/training/menuEx/compile_run.sh create mode 100644 ked/ncurses/training/menuEx/main.c create mode 100755 ked/ncurses/training/menuEx/menu create mode 100644 ked/ncurses/training/menuEx/player.hpp diff --git a/ked/ncurses/compile_run.sh b/ked/ncurses/compile_run.sh index eb5da6e..5245972 100755 --- a/ked/ncurses/compile_run.sh +++ b/ked/ncurses/compile_run.sh @@ -1,5 +1,9 @@ #!/bin/bash +clear + +rm menu + g++ main.cpp -o menu -lncurses ./menu diff --git a/ked/ncurses/main.cpp b/ked/ncurses/main.cpp index a91830f..902cd1b 100644 --- a/ked/ncurses/main.cpp +++ b/ked/ncurses/main.cpp @@ -1,58 +1,60 @@ -#include -#include "menu.h" +#include "main.h" -#define ctrl(x) (x & 0x1F) // Detection of ctrl+x presses please do not forget that in unix ctrl+c and ctrl+z are special commands. +#include "terminal.h" +#include "menuBar.h" // INFO: wgetch(win); or getch(); // getch will make a refresh for us. int main(int argv, char ** argc) { //Variables - int xMax, yMax = 0; + int xMax, yMax, xMouse, yMouse= 0; char pressed; - - - //Init Ncurses - initscr(); - - if(has_colors() == false) // If the terminal does have colors - { - printf("This menu is not supported by terminals without colors\n"); - return -1; - } - - start_color(); - - noecho(); - curs_set(0); // Cursor won't show up - getmaxyx(stdscr, yMax, xMax); - // size y size x pos y pos x - WINDOW *win = newwin(yMax/2, xMax/2, yMax/4, xMax/4); - box(win,0,0); - - //Setc colors - init_pair(1, COLOR_WHITE, COLOR_BLUE); - + std::string menu1[4]={"New","Open","Save","Exit"}; std::string menu2[3]={"Copy","Cut","Paste"}; std::string menu3[5]={"Terminal","Help","Info","Update","Manual"}; // Second stage declarations Menu menus[3]={ // init the menus - Menu("File", 'f', menu1, 4), - Menu("Edit", 'e', menu2, 3), - Menu("Options", 'o', menu3, 5), + Menu("File", 0, 0, 'f', menu1, 4), + Menu("Edit", 1, 0, 'e', menu2, 3), + Menu("Options", 2, 0, 'o', menu3, 5), }; - MenuBar menuBar = MenuBar(win, menus, 3); // init the menu bar - menuBar.draw(); + Terminal terminal; + MenuBar menuBar = MenuBar(menus,1,5,5,3); - while(pressed = wgetch(win)) + xMax = terminal.getXMax(); + yMax = terminal.getYMax(); + + std::string termToPrint = "Terminal with "; + termToPrint += std::to_string(xMax); + termToPrint += "x"; + termToPrint += std::to_string(yMax); + termToPrint += " is drawn"; + + terminal.draw(1,1,termToPrint); + terminal.draw(1,3,"Press f For Files e For Edit and o for Options"); + terminal.draw(1,2,"Press K to kill the menu"); + + refresh(); + menuBar.drawBox(); + menuBar.drawMenus(); + + while(pressed != 'k') { + pressed = menuBar.getKey(); menuBar.handleTrigger(pressed); - menuBar.draw(); + menuBar.drawMenus(); } + menuBar.~MenuBar(); + + refresh(); - endwin(); + terminal.draw(1,2,"Press any key to exit the application"); + terminal.getKey(); + terminal.tearDown(); + return 0; } diff --git a/ked/ncurses/main.h b/ked/ncurses/main.h new file mode 100644 index 0000000..da83032 --- /dev/null +++ b/ked/ncurses/main.h @@ -0,0 +1,4 @@ +#include +#include + +#define ctrl(x) (x & 0x1F) // Detection of ctrl+x presses please do not forget that in unix ctrl+c and ctrl+z are special commands. diff --git a/ked/ncurses/menu b/ked/ncurses/menu index 742aeb6b6f1c78389ea4f26d3a32ce3b7283c17f..eb095fb65b9140ab096452a6c02749dac08adf60 100755 GIT binary patch literal 34256 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 literal 23984 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 LI5k5d0~P-Ro<6p- diff --git a/ked/ncurses/menu.h b/ked/ncurses/menu.h index 95a7ff4..ca9af38 100644 --- a/ked/ncurses/menu.h +++ b/ked/ncurses/menu.h @@ -1,180 +1,174 @@ -#include -#include - +#include "main.h" #ifndef _MENU_H_ #define _MENU_H_ class Menu { public: - Menu(std::string name, char trigger, std::string *items, int itemCount); - void selectNextItem(); - void selectPrevItem(); - - int startX, startY; - std::string name; - char trigger; - int selectedItem = 0; // alyas have the first one selected - std::string *items; - int itemCount=0; + Menu(std::string name, int menuNo, int direction, char trigger, std::string *items, int itemCount); + ~Menu(); + void draw(); + void nextItem(); + void prevItem(); + int getSelectedItem(); + void setSelectedItem(); + void setPosX(int x); + void setPosY(int y); + int getPosX(); + int getPosY(); + void setMenuBarBegX(int x); // it must be indicated from menu bar so that we can print the box on the right place + void setMenuBarBegY(int y); // it must be indicated from menu bar so that we can print the box on the right place + void setMenuBarSizeX(int x); // it must be indicated from menu bar so that we can print the box on the right place + std::string getName(); + int getNameLenght(); + int getLongestItemLenght(); + char getTrigger(); + void drawBox(); + void drawItems(); + int getBoxBegY(); + int getBoxBegX(); + void eraseBox(); + + private: + WINDOW * menuItemsWin; + std::string name; + std::string *items; + int menuNo, currPos, direction= 0; + int posX, xSize, menuBarBegX = 0; + int posY, ySize, menuBarBegY = 0; + int menuBarSizeX = 0; + int selected_item = 0; + int itemCount = 0; + int itemLenght = 0; + char trigger; }; -Menu::Menu(std::string name, char trigger, std::string *items, int itemCount) +Menu::Menu(std::string name, int menuNo, int direction, char trigger, std::string *items, int itemCount) { - this->name = name; - this->trigger = trigger; - this->items = items; - this->itemCount = itemCount; + this->name = name; //Name of the menu + this->menuNo = menuNo; //No of the menu so that we can index it with the menuBar.handdleTrigger option. + this->direction = direction; //Direction o the menu Bar Horizontal = 0, vertical = 1 + this->trigger = trigger; //The trigger for the given menu + this->items = items; //Items present in thei menu + this->itemCount = itemCount; //Nouber of item present in this menu + + //To be sure + xSize = 0; + ySize = 0; + selected_item = -1; // No menus are selected a the beggining + + // Vertical Alignment + if(direction) + { + } + else // Horizontal Alignment -> The Deffault + { + } + } -void Menu::selectNextItem() +Menu::~Menu() { - selectedItem ++; - if(selectedItem >= itemCount) - { - selectedItem = 0; - } + werase(menuItemsWin); + wrefresh(menuItemsWin); } -void Menu::selectPrevItem() +void Menu::eraseBox() { - selectedItem--; - if(selectedItem < 0) - { - selectedItem = itemCount-1; - } + werase(menuItemsWin); + wrefresh(menuItemsWin); } -class MenuBar -{ - public: - MenuBar(WINDOW * win, Menu * menus, int menuCnt); - void draw(); - void handleTrigger(char trigger); - void reset(); - void drawMenu(Menu menu, int currIndex); - void drawMenuItems(Menu menu); - - WINDOW * win; - WINDOW * menuwin; - Menu * menus; - int menuCnt; - int i =0; - int selected_menu = 90; - int start_pos = 0; - std::string name; -}; +void Menu::setPosX(int x) +{ + this->posX = x; +} + +void Menu::setPosY(int y) +{ + this->posY = y; +} -MenuBar::MenuBar(WINDOW * win, Menu * menus, int menuCnt) +int Menu::getPosX() { - this->win = win; - this->menus = menus; - this->menuCnt = menuCnt; - int currPos = 2; + return posX; +} + +int Menu::getPosY() +{ + return posY; +} - //Initialize the menu window - int xMax, yMax, xBeg, yBeg = 0; - getmaxyx(win, yMax, xMax); - getbegyx(win, yBeg, xBeg); - - menuwin = newwin(yMax-2, xMax-2, yBeg+1, xBeg+1); - keypad(menuwin, true); - wrefresh(menuwin); +void Menu::setMenuBarBegX(int x) +{ + this->menuBarBegX = x; +} - for(i = 0; i < menuCnt ; i ++) - { - this->menus[i].startX = currPos; - currPos += this->menus[i].name.length() + 1; - } +void Menu::setMenuBarBegY(int y) +{ + this->menuBarBegY = y; } -void MenuBar::draw() +void Menu::setMenuBarSizeX(int x) { - for(i = 0; i < menuCnt ; i ++) - { - drawMenu(menus[i], i); - } - selected_menu = -1; + this->menuBarSizeX = x; +} +std::string Menu::getName() +{ + return name; } -void MenuBar::drawMenu(Menu menu,int currIndex) +int Menu::getNameLenght() { - start_pos = menu.startX; - name = menu.name; - if(currIndex == selected_menu) - { - wattron(win, A_STANDOUT); - } - mvwprintw(win, 0, start_pos, name.c_str()); - wattroff(win, A_STANDOUT); - wrefresh(win); + return name.length(); +} - int ch = 0; - - drawMenuItems(menu); - - while(currIndex == selected_menu && (ch = wgetch(menuwin))) - { - switch(ch) - { - case KEY_UP: - menu.selectPrevItem(); - break; - case KEY_DOWN: - menu.selectNextItem(); - break; - default: - currIndex = -1; - break; - } - drawMenuItems(menu); - } - werase(menuwin); - wrefresh(menuwin); - reset(); +int Menu::getLongestItemLenght() +{ + return xSize; } -void MenuBar::drawMenuItems(Menu menu) +char Menu::getTrigger() { - int yMax, xMax; - getmaxyx(menuwin, yMax, xMax); + return trigger; +} - for(i=0; i < menu.itemCount ; i ++) - { - mvwprintw(menuwin,i,0,menu.items[i].c_str()); - if(menu.selectedItem == i) - { - //if selected change to color pair 1 - mvwchgat(menuwin,i,0,xMax,A_NORMAL,1, NULL); - } - else - { - // Not selected but we still want it to be reversed - mvwchgat(menuwin,i,0,xMax,A_STANDOUT,0, NULL); - } +int Menu::getBoxBegX() +{ + // Vertical Alignment + if(direction) + { } + else // Horizontal Alignment -> The Deffault + { + return menuBarSizeX+posX+menuBarBegX-1; + } } -void MenuBar::reset() +int Menu::getBoxBegY() { - for(i = 0; i < menuCnt ; i ++) - { - start_pos = this->menus[i].startX; - name = this->menus[i].name; - mvwprintw(win, 0, start_pos, name.c_str()); + // Vertical Alignment + if(direction) + { } - wrefresh(win); + else // Horizontal Alignment -> The Deffault + { + return posY+menuBarBegY-1; + } } -void MenuBar::handleTrigger(char trigger) +void Menu::drawBox() { - for(i = 0; i < menuCnt ; i ++) - { - if(trigger == this->menus[i].trigger) - { - selected_menu = i; - } - } + // Creates a box with caclulated dimention xSize & ySize and user given position + menuItemsWin = newwin(20, 20, getBoxBegY(), getBoxBegX()); + box(menuItemsWin ,0,0); //Here we can define other cahr insterad of 0,0 + mvwprintw(menuItemsWin,1,1,"PosY:%d PosX:%d",getBoxBegY(), getBoxBegX()); + wrefresh(menuItemsWin); //Refresh so that we can see it +} + +void Menu::drawItems() +{ + } #endif diff --git a/ked/ncurses/menuBar.h b/ked/ncurses/menuBar.h new file mode 100644 index 0000000..449c1dc --- /dev/null +++ b/ked/ncurses/menuBar.h @@ -0,0 +1,174 @@ +#include "main.h" +#include "menu.h" + +#ifndef _MENU_BAR_H_ +#define _MENU_BAR_H_ + +class MenuBar +{ + public: + MenuBar(Menu *menus, int direction, int xBeg, int yBeg, int menuCount); + ~MenuBar(); + void drawBox(); + void drawMenus(); + void handleTrigger(char trig); + char getKey(); + void reset(); + int getPosX(); + int getPosY(); + int getSizeX(); + int getSizeY(); + private: + int i, xSize, ySize, xBeg, yBeg, menuCount, direction, currPos = 0; + int selected_menu = -1; + int prevSelected_menu = -1; + char currIndex; + Menu *menus; + WINDOW *menuBarWin; +}; + +MenuBar::MenuBar(Menu *menus, int direction, int xBeg, int yBeg, int menuCount) +{ + this->menus = menus; // All the menu class + this->direction = direction; // Direction o the menu Bar Horizontal = 0, vertical = 1 + this->xSize = xSize; // Size x of the menuBar box + this->ySize = ySize; // Size y of the menuBar box + this->xBeg = xBeg; // beginnin x Coordinate for the menuBar Box + this->yBeg = yBeg; // beginnin y Coordinate for the menuBar Box + this->menuCount = menuCount; // Total Menu class element count + + // Jsut to be sure + xSize = 0; + ySize = 0; + selected_menu = -1; // No menus are selected a the beggining + + + // Vertical Alignment + if(direction) + { + currPos = 1; // So that it doesn write the first item on the top border + // Finding the longest word between the disponible menus + for(i = 0; i < menuCount ; i ++) + { + if(xSize < this->menus[i].getNameLenght()) + { + xSize = this->menus[i].getNameLenght()+2; // +1 for left +1 lor right = +2 + } + } + + // Defining vertical separations + for(i = 0; i < menuCount ; i ++) + { + this->menus[i].setPosY(currPos); + this->menus[i].setPosX(1); // So tha it write in the middle + currPos ++; + + this->menus[i].setMenuBarBegX(xBeg); + this->menus[i].setMenuBarBegY(yBeg); + this->menus[i].setMenuBarSizeX(xSize); + } + ySize = menuCount + 2; + } + else // Horizontal Alignment -> The Deffault + { + currPos = 1; // So that it doesn write the first item on the left border + for(i = 0; i < menuCount ; i ++) // Defining horizontal distances + { + this->menus[i].setPosX(currPos); + this->menus[i].setPosY(1); // So tha it write in the middle + currPos += this->menus[i].getNameLenght() + 1; + + this->menus[i].setMenuBarBegX(xBeg); + this->menus[i].setMenuBarBegY(yBeg); + this->menus[i].setMenuBarSizeX(xSize); + } + xSize = currPos; + ySize = 3; + } +} + +MenuBar::~MenuBar() +{ + werase(menuBarWin); + wrefresh(menuBarWin); +} + +void MenuBar::drawBox() +{ + // Creates a box with caclulated dimention xSize & ySize and user given position + menuBarWin = newwin(ySize, xSize, yBeg, xBeg); + box(menuBarWin,0,0); //Here we can define other cahr insterad of 0,0 + wrefresh(menuBarWin); //Refresh so that we can see it +} + +// Draws menus and highlight the selected one selection in made on the handdleTrigger() Function +void MenuBar::drawMenus() +{ + for(i = 0; i < menuCount ; i ++) + { + if(i == selected_menu) // If the iterration come to the selected menu than it will highlight it + { + prevSelected_menu = i; + wattron(menuBarWin, A_STANDOUT); + mvwprintw(menuBarWin, menus[i].getPosY(),menus[i].getPosX(), menus[i].getName().c_str()); + wattroff(menuBarWin, A_STANDOUT); + menus[i].drawBox(); // Draws the lesefted Menus Items + } + else // Otherwise do not hightlight + { + mvwprintw(menuBarWin, menus[i].getPosY(),menus[i].getPosX(), menus[i].getName().c_str()); + } + } + selected_menu = - 1; // Deselect for the next itteration. (unless handleTrigger has a new trigger) + wrefresh(menuBarWin); // so we can see it +} + +// recieves a char an checks it fo ot corrensponds to a Menu Trigger +void MenuBar::handleTrigger(char trig) +{ + for(i = 0; i < menuCount ; i ++) + { + if(trig == this->menus[i].getTrigger()) // If the recieved trigger matches the one from a menu + { + selected_menu = i; + } + } +} + +char MenuBar::getKey() +{ + return wgetch(menuBarWin); +} + +// Will draw the menu as for the first time +void MenuBar::reset() +{ + for(i = 0; i < menuCount ; i ++) + { + mvwprintw(menuBarWin, menus[i].getPosY(),menus[i].getPosX(), menus[i].getName().c_str()); + } + selected_menu = - 1; // Deselect for the next itteration. (unless handleTrigger has a new trigger) + wrefresh(menuBarWin); // so we can see it +} + +int MenuBar::getPosX() +{ + return xBeg; +} + +int MenuBar::getPosY() +{ + return yBeg; +} + +int MenuBar::getSizeX() +{ + return xSize; +} + +int MenuBar::getSizeY() +{ + return ySize; +} + +#endif diff --git a/ked/ncurses/terminal.h b/ked/ncurses/terminal.h new file mode 100644 index 0000000..66caa33 --- /dev/null +++ b/ked/ncurses/terminal.h @@ -0,0 +1,110 @@ +#include "main.h" + +#ifndef _TEMINAL_H_ +#define _TEMINAL_H_ + + +// This calls is used to initilaize ncurses terminal the correct way depending of the terminalk +class Terminal +{ + public: + // Constuctor & Destructor + Terminal(); + ~Terminal(); + + //Functions + int setup(); + void tearDown(); + int getKey(); + int getXMax(); + int getYMax(); + void startDraw(); + void endDraw(); + bool isDone(); + void quit(); + void draw(int x, int y, const std::string& toDraw); + + private: + int xMax, yMax, mouseX, mouseY = 0; + bool m_done = false; +}; + + +Terminal::Terminal() +{ + setup(); +} + +Terminal::~Terminal() +{ + tearDown(); +} + +int Terminal::setup() +{ + initscr(); // Inits ncurses screen in memory + raw(); // raw input sor ctrl-c and ctrl-z wont work + noecho(); // don't show the user inputs + curs_set(0); // Cursor won't show up + getmaxyx(stdscr, yMax, xMax); + box(stdscr,0,0); + if(!has_colors()) // If the terminal doesn't have colors + { + tearDown(); // Destroys the mains window + printf("This menu is not supported by terminals without colors\n"); + return -1; // Return an error. + } + + getyx(stdscr, mouseY, mouseX); + start_color(); // Otherwise init colors + return 0; +} + +void Terminal::tearDown() +{ + endwin(); +} + + +int Terminal::getKey() +{ + return getch(); +} + +int Terminal::getXMax() +{ + return xMax; +} + +int Terminal::getYMax() +{ + return yMax; +} + +void Terminal::startDraw() +{ + clear(); +} + +void Terminal::endDraw() +{ + refresh(); +} + +bool Terminal::isDone() +{ + return m_done; +} + +void Terminal::quit() +{ + m_done = true; +} + +void Terminal::draw(int x, int y, const std::string& toDraw) +{ + mvprintw(y,x,toDraw.c_str()); +} + + +#endif diff --git a/ked/ncurses/basics/compile_run.sh b/ked/ncurses/training/basics/compile_run.sh similarity index 100% rename from ked/ncurses/basics/compile_run.sh rename to ked/ncurses/training/basics/compile_run.sh diff --git a/ked/ncurses/basics/main.c b/ked/ncurses/training/basics/main.c similarity index 100% rename from ked/ncurses/basics/main.c rename to ked/ncurses/training/basics/main.c diff --git a/ked/ncurses/ctrl_and_sprecial_var/compile_run.sh b/ked/ncurses/training/ctrl_and_sprecial_var/compile_run.sh similarity index 100% rename from ked/ncurses/ctrl_and_sprecial_var/compile_run.sh rename to ked/ncurses/training/ctrl_and_sprecial_var/compile_run.sh diff --git a/ked/ncurses/ctrl_and_sprecial_var/main.cpp b/ked/ncurses/training/ctrl_and_sprecial_var/main.cpp similarity index 100% rename from ked/ncurses/ctrl_and_sprecial_var/main.cpp rename to ked/ncurses/training/ctrl_and_sprecial_var/main.cpp diff --git a/ked/ncurses/ctrl_and_sprecial_var/menu b/ked/ncurses/training/ctrl_and_sprecial_var/menu similarity index 100% rename from ked/ncurses/ctrl_and_sprecial_var/menu rename to ked/ncurses/training/ctrl_and_sprecial_var/menu diff --git a/ked/ncurses/training/first_menu/compile_run.sh b/ked/ncurses/training/first_menu/compile_run.sh new file mode 100755 index 0000000..363db51 --- /dev/null +++ b/ked/ncurses/training/first_menu/compile_run.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +rm menu + +g++ main.cpp -o menu -lncurses + +./menu diff --git a/ked/ncurses/training/first_menu/main.cpp b/ked/ncurses/training/first_menu/main.cpp new file mode 100644 index 0000000..e9c876d --- /dev/null +++ b/ked/ncurses/training/first_menu/main.cpp @@ -0,0 +1,58 @@ +#include +#include "menu.h" + +#define ctrl(x) (x & 0x1F) // Detection of ctrl+x presses please do not forget that in unix ctrl+c and ctrl+z are special commands. + +// INFO: wgetch(win); or getch(); // getch will make a refresh for us. + +int main(int argv, char ** argc) +{ + //Variables + int xMax, yMax = 0; + char pressed; + + j + //Init Ncurses + initscr(); + + if(has_colors() == false) // If the terminal does have colors + { + printf("This menu is not supported by terminals without colors\n"); + return -1; + } + + start_color(); + + noecho(); + curs_set(0); // Cursor won't show up + getmaxyx(stdscr, yMax, xMax); + // size y size x pos y pos x + WINDOW *win = newwin(yMax/2, xMax/2, yMax/4, xMax/4); + box(win,0,0); + + //Setc colors + init_pair(1, COLOR_WHITE, COLOR_BLUE); + + std::string menu1[4]={"New","Open","Save","Exit"}; + std::string menu2[3]={"Copy","Cut","Paste"}; + std::string menu3[5]={"Terminal","Help","Info","Update","Manual"}; + + // Second stage declarations + Menu menus[3]={ // init the menus + Menu("File", 'f', menu1, 4), + Menu("Edit", 'e', menu2, 3), + Menu("Options", 'o', menu3, 5), + }; + + MenuBar menuBar = MenuBar(win, menus, 3); // init the menu bar + menuBar.draw(); + + while(pressed = wgetch(win)) + { + menuBar.handleTrigger(pressed); + menuBar.draw(); + } + + endwin(); + return 0; +} diff --git a/ked/ncurses/training/first_menu/menu.h b/ked/ncurses/training/first_menu/menu.h new file mode 100644 index 0000000..95a7ff4 --- /dev/null +++ b/ked/ncurses/training/first_menu/menu.h @@ -0,0 +1,180 @@ +#include +#include + +#ifndef _MENU_H_ +#define _MENU_H_ + +class Menu +{ + public: + Menu(std::string name, char trigger, std::string *items, int itemCount); + void selectNextItem(); + void selectPrevItem(); + + int startX, startY; + std::string name; + char trigger; + int selectedItem = 0; // alyas have the first one selected + std::string *items; + int itemCount=0; +}; + +Menu::Menu(std::string name, char trigger, std::string *items, int itemCount) +{ + this->name = name; + this->trigger = trigger; + this->items = items; + this->itemCount = itemCount; +} + +void Menu::selectNextItem() +{ + selectedItem ++; + if(selectedItem >= itemCount) + { + selectedItem = 0; + } +} + +void Menu::selectPrevItem() +{ + selectedItem--; + if(selectedItem < 0) + { + selectedItem = itemCount-1; + } +} + +class MenuBar +{ + public: + MenuBar(WINDOW * win, Menu * menus, int menuCnt); + void draw(); + void handleTrigger(char trigger); + void reset(); + void drawMenu(Menu menu, int currIndex); + void drawMenuItems(Menu menu); + + WINDOW * win; + WINDOW * menuwin; + Menu * menus; + int menuCnt; + int i =0; + int selected_menu = 90; + int start_pos = 0; + std::string name; +}; + +MenuBar::MenuBar(WINDOW * win, Menu * menus, int menuCnt) +{ + this->win = win; + this->menus = menus; + this->menuCnt = menuCnt; + int currPos = 2; + + //Initialize the menu window + int xMax, yMax, xBeg, yBeg = 0; + getmaxyx(win, yMax, xMax); + getbegyx(win, yBeg, xBeg); + + menuwin = newwin(yMax-2, xMax-2, yBeg+1, xBeg+1); + keypad(menuwin, true); + wrefresh(menuwin); + + for(i = 0; i < menuCnt ; i ++) + { + this->menus[i].startX = currPos; + currPos += this->menus[i].name.length() + 1; + } +} + +void MenuBar::draw() +{ + for(i = 0; i < menuCnt ; i ++) + { + drawMenu(menus[i], i); + } + selected_menu = -1; +} + +void MenuBar::drawMenu(Menu menu,int currIndex) +{ + start_pos = menu.startX; + name = menu.name; + if(currIndex == selected_menu) + { + wattron(win, A_STANDOUT); + } + mvwprintw(win, 0, start_pos, name.c_str()); + wattroff(win, A_STANDOUT); + wrefresh(win); + + int ch = 0; + + drawMenuItems(menu); + + while(currIndex == selected_menu && (ch = wgetch(menuwin))) + { + switch(ch) + { + case KEY_UP: + menu.selectPrevItem(); + break; + case KEY_DOWN: + menu.selectNextItem(); + break; + default: + currIndex = -1; + break; + } + drawMenuItems(menu); + } + werase(menuwin); + wrefresh(menuwin); + reset(); +} + +void MenuBar::drawMenuItems(Menu menu) +{ + int yMax, xMax; + getmaxyx(menuwin, yMax, xMax); + + for(i=0; i < menu.itemCount ; i ++) + { + mvwprintw(menuwin,i,0,menu.items[i].c_str()); + if(menu.selectedItem == i) + { + //if selected change to color pair 1 + mvwchgat(menuwin,i,0,xMax,A_NORMAL,1, NULL); + } + else + { + // Not selected but we still want it to be reversed + mvwchgat(menuwin,i,0,xMax,A_STANDOUT,0, NULL); + } + } +} + +void MenuBar::reset() +{ + for(i = 0; i < menuCnt ; i ++) + { + start_pos = this->menus[i].startX; + name = this->menus[i].name; + mvwprintw(win, 0, start_pos, name.c_str()); + } + wrefresh(win); +} + +void MenuBar::handleTrigger(char trigger) +{ + for(i = 0; i < menuCnt ; i ++) + { + if(trigger == this->menus[i].trigger) + { + selected_menu = i; + } + } +} + +#endif diff --git a/ked/ncurses/game/compile_run.sh b/ked/ncurses/training/game/compile_run.sh similarity index 100% rename from ked/ncurses/game/compile_run.sh rename to ked/ncurses/training/game/compile_run.sh diff --git a/ked/ncurses/game/main.cpp b/ked/ncurses/training/game/main.cpp similarity index 100% rename from ked/ncurses/game/main.cpp rename to ked/ncurses/training/game/main.cpp diff --git a/ked/ncurses/game/player.hpp b/ked/ncurses/training/game/player.hpp similarity index 100% rename from ked/ncurses/game/player.hpp rename to ked/ncurses/training/game/player.hpp diff --git a/ked/ncurses/training/menuEx/compile_run.sh b/ked/ncurses/training/menuEx/compile_run.sh new file mode 100755 index 0000000..e1e0892 --- /dev/null +++ b/ked/ncurses/training/menuEx/compile_run.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +rm ./menu + +gcc main.c -o menu -lncurses + +./menu diff --git a/ked/ncurses/training/menuEx/main.c b/ked/ncurses/training/menuEx/main.c new file mode 100644 index 0000000..e06985e --- /dev/null +++ b/ked/ncurses/training/menuEx/main.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#define WIDTH 30 +#define HEIGHT 10 + +int startx = 0; +int starty = 0; + +char *choices[] = { "Choice 1", + "Choice 2", + "Choice 3", + "Choice 4", + "Exit", + }; + +int n_choices = sizeof(choices) / sizeof(char *); + +void print_menu(WINDOW *menu_win, int highlight); +void report_choice(int mouse_x, int mouse_y, int *p_choice); + +int main() +{ int c, choice = 0; + WINDOW *menu_win; + MEVENT event; + + /* Initialize curses */ + initscr(); + clear(); + noecho(); + cbreak(); //Line buffering disabled. pass on everything + + /* Try to put the window in the middle of screen */ + startx = (80 - WIDTH) / 2; + starty = (24 - HEIGHT) / 2; + + attron(A_REVERSE); + mvprintw(23, 1, "Click on Exit to quit (Works best in a virtual console)"); + refresh(); + attroff(A_REVERSE); + + /* Print the menu for the first time */ + menu_win = newwin(HEIGHT, WIDTH, starty, startx); + print_menu(menu_win, 1); + /* Get all the mouse events */ + mousemask(ALL_MOUSE_EVENTS, NULL); + + while(1) + { c = wgetch(menu_win); + switch(c) + { case KEY_MOUSE: + if(getmouse(&event) == OK) + { /* When the user clicks left mouse button */ + if(event.bstate & BUTTON1_PRESSED) + { report_choice(event.x + 1, event.y + 1, &choice); + if(choice == -1) //Exit chosen + goto end; + mvprintw(22, 1, "Choice made is : %d String Chosen is \"%10s\"", choice, choices[choice - 1]); + refresh(); + } + } + print_menu(menu_win, choice); + break; + } + } +end: + endwin(); + return 0; +} + + +void print_menu(WINDOW *menu_win, int highlight) +{ + int x, y, i; + + x = 2; + y = 2; + box(menu_win, 0, 0); + for(i = 0; i < n_choices; ++i) + { if(highlight == i + 1) + { wattron(menu_win, A_REVERSE); + mvwprintw(menu_win, y, x, "%s", choices[i]); + wattroff(menu_win, A_REVERSE); + } + else + mvwprintw(menu_win, y, x, "%s", choices[i]); + ++y; + } + wrefresh(menu_win); +} + +/* Report the choice according to mouse position */ +void report_choice(int mouse_x, int mouse_y, int *p_choice) +{ int i,j, choice; + + i = startx + 2; + j = starty + 3; + + for(choice = 0; choice < n_choices; ++choice) + if(mouse_y == j + choice && mouse_x >= i && mouse_x <= i + strlen(choices[choice])) + { if(choice == n_choices - 1) + *p_choice = -1; + else + *p_choice = choice + 1; + break; + } +} diff --git a/ked/ncurses/training/menuEx/menu b/ked/ncurses/training/menuEx/menu new file mode 100755 index 0000000000000000000000000000000000000000..05b4741f07ec03d7e8ea26a8fb424abd96e270a3 GIT binary patch literal 17864 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 yMax-2) + { + yLoc = yMax-2; + } +} + +void Player::mvLeft() +{ + mvwaddch(curWin,yLoc, xLoc, '.'); + xLoc --; + if(xLoc < 1) + { + xLoc = 1; + } +} + +void Player::mvRight() +{ + mvwaddch(curWin,yLoc, xLoc, '.'); + xLoc ++; + if(xLoc > xMax-2) + { + xLoc = xMax-2; + } +} + +int Player::getMv() +{ + int choice = wgetch(curWin); + switch(choice) + { + case KEY_UP: + mvUp(); + break; + case KEY_DOWN: + mvDown(); + break; + case KEY_LEFT: + mvLeft(); + break; + case KEY_RIGHT: + mvRight(); + break; + default: + break; + } + return choice; +} + +void Player::display() +{ + mvwaddch(curWin,yLoc, xLoc, playerChar); +} + + + +#endif