Added Menu Items
This commit is contained in:
@@ -6,14 +6,31 @@
|
|||||||
|
|
||||||
class Menu {
|
class Menu {
|
||||||
public:
|
public:
|
||||||
Menu(std::string text, char trigger)
|
Menu(std::string text, char trigger, std::string *items, int num_items)
|
||||||
{
|
{
|
||||||
this->text = text;
|
this->text = text;
|
||||||
this->trigger = trigger;
|
this->trigger = trigger;
|
||||||
|
this->items = items;
|
||||||
|
this->num_items = num_items;
|
||||||
|
this->selected_item = 0;
|
||||||
}
|
}
|
||||||
int start_x;
|
int start_x;
|
||||||
std::string text;
|
std::string text;
|
||||||
char trigger;
|
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 {
|
class MenuBar {
|
||||||
public:
|
public:
|
||||||
@@ -23,7 +40,13 @@ class MenuBar {
|
|||||||
this->menus = menus;
|
this->menus = menus;
|
||||||
this->num_menus = num_menus;
|
this->num_menus = num_menus;
|
||||||
this->selected_menu = -1;
|
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;
|
int current_pos = 2;
|
||||||
|
|
||||||
for (int i = 0; i < num_menus; i++)
|
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++)
|
for (int i = 0; i < num_menus; i++)
|
||||||
{
|
{
|
||||||
int start_x = this->menus[i].start_x;
|
int start_x = this->menus[i].start_x;
|
||||||
std::string text = this->menus[i].text;
|
std::string text = this->menus[i].text;
|
||||||
if(selected_menu == i)
|
mvwprintw(win,0,start_x,"%s",text.c_str());
|
||||||
{
|
|
||||||
wattron(win, A_STANDOUT);
|
|
||||||
}
|
|
||||||
mvwprintw(win,0,start_x,text.c_str());
|
|
||||||
if(selected_menu == i)
|
|
||||||
{
|
|
||||||
wattroff(win, A_STANDOUT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
wrefresh(win);
|
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<menu.num_items; i++)
|
||||||
|
{
|
||||||
|
mvwprintw(menuwin,i,0,"%s",menu.items[i].c_str());
|
||||||
|
if(menu.selected_item == i)
|
||||||
|
{
|
||||||
|
mvwchgat(menuwin,i,0,xMax,A_NORMAL,1,NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mvwchgat(menuwin,i,0,xMax,A_STANDOUT,0,NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void handleTrigger(char trigger)
|
void handleTrigger(char trigger)
|
||||||
{
|
{
|
||||||
selected_menu = -1;
|
|
||||||
for (int i = 0; i < num_menus; i++)
|
for (int i = 0; i < num_menus; i++)
|
||||||
{
|
{
|
||||||
if(trigger == this->menus[i].trigger)
|
if(trigger == this->menus[i].trigger)
|
||||||
@@ -65,6 +145,7 @@ class MenuBar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WINDOW *menuwin;
|
||||||
WINDOW *win;
|
WINDOW *win;
|
||||||
Menu *menus;
|
Menu *menus;
|
||||||
int num_menus;
|
int num_menus;
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
#include <string>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <curses.h>
|
#include <curses.h>
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
|
|
||||||
@@ -11,23 +9,35 @@ int main(int argc, char **argv){
|
|||||||
noecho();
|
noecho();
|
||||||
curs_set(0);
|
curs_set(0);
|
||||||
|
|
||||||
|
if(!has_colors())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
start_color();
|
||||||
|
init_pair(1, COLOR_WHITE,COLOR_BLUE);
|
||||||
|
|
||||||
int yMax,xMax;
|
int yMax,xMax;
|
||||||
getmaxyx(stdscr,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);
|
box(win,0,0);
|
||||||
|
|
||||||
|
string menu1[] = {"New","Open","Save","Exit"};
|
||||||
|
string menu2[] = {"Copy","Cut","Paste"};
|
||||||
|
string menu3[] = {"Sidebar","Terminal"};
|
||||||
|
|
||||||
Menu menus[3] = {
|
Menu menus[3] = {
|
||||||
Menu("File",'f'),
|
Menu("File",'f',menu1,4),
|
||||||
Menu("Edit",'e'),
|
Menu("Edit",'e',menu2,3),
|
||||||
Menu("Options",'o'),
|
Menu("View",'v',menu3,2),
|
||||||
};
|
};
|
||||||
|
|
||||||
MenuBar menubar = MenuBar(win,menus,3);
|
MenuBar menubar = MenuBar(win,menus,3);
|
||||||
menubar.draw();
|
menubar.draw();
|
||||||
|
|
||||||
char ch;
|
char ch;
|
||||||
while(ch = wgetch(win)){
|
while((ch = wgetch(win))){
|
||||||
menubar.handleTrigger(ch);
|
menubar.handleTrigger(ch);
|
||||||
menubar.draw();
|
menubar.draw();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user