You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KED/ked/ncurses/menu.h

306 lines
5.1 KiB

#include "main.h"
#include "item.h"
#ifndef _MENU_H_
#define _MENU_H_
#define BRD_SPC 1
class Menu
{
public:
Menu( std::string name,
Item *items,
int level, int no, int link,
int orientation,
int xBeg, int yBeg,
int itemCount);
~Menu();
//Functions
void initBox(); // Inits the box dimentions and sets it up with basic parameters
void drawBox();
void deleteMenu();
void startDraw();
void endDraw();
void update();
void printItems();
void selectItem();
void findTheLongestItem();
void printMenu();
void handleTrigger(char ch);
bool isActive();
//Getters
int getSizeX();
int getSizeY();
int getBegX();
int getBegY();
int getLongestItem();
int getSelectedItem();
int getOrientation();
char getKey();
//Setters
void setBegX(int x);
void setBegY(int y);
void setTopLine(char ch);
void setBottomLine(char ch);
void setLeftLine(char ch);
void setRightLine(char ch);
void setActive();
void setInactive();
private:
WINDOW *menuWin; // window fo this menu
std::string name; // Name of the menu
Item *items; // Items plresent for this menu
int orientation = 0; // 0 = Horizontal 1 = Vertical
int level = 0; // Hierarchical level of the menu 0 is the top one
int no = 0; // To be able to track echa menu indvidualy
int xBeg, yBeg = 0; // Beginning coordinates of the menu window
int xSize, ySize = 0; // Size of the menu window
int itemCount = 0; // Number of elents in this menu
int selectedItem = 0; // Currenlty selected Item on the menu
int link = 0; //If this menu is linked to anothar one // level 0 menus can not be linked
int longestItem = 0; //Lenght Of the Longest item
int i, pos = 0;
bool activeMenu = false;
};
Menu::Menu( std::string name,
Item *items,
int level, int no, int link,
int orientation,
int xBeg, int yBeg,
int itemCount)
{
this->name = name;
this->items = items;
this->level = level;
this->no = no;
this->link = link;
this->orientation = orientation;
this->xBeg = xBeg;
this->yBeg = yBeg;
this->itemCount = itemCount;
longestItem = 0;
xSize = 0;
ySize = 0;
selectedItem = - 1;
activeMenu = false;
initBox();
}
//TODO: The correct way to end or erase s window is still unclear
Menu::~Menu()
{
deleteMenu();
werase(menuWin);
}
void Menu::initBox()
{
pos = 1; // So that it doesn write over the border
findTheLongestItem();
// if Horizontal aligment else vertical
if(orientation)
{
xSize = longestItem + 2;
for(i = 0; i < itemCount ; i ++)
{
this->items[i].setPosY(pos);
this->items[i].setPosX(1); // So tha it write in the middle
pos ++;
}
ySize = itemCount + 2;
}
else
{
for(i = 0; i < itemCount ; i ++)
{
items[i].setPosX(pos);
items[i].setPosY(1);
pos += this->items[i].getLength() + 1;
}
xSize = pos;
ySize = 3;
}
// Creates a box with caclulated dimention xSize & ySize and user given position
menuWin = newwin(ySize, xSize, yBeg, xBeg);
}
//Functions
void Menu::drawBox()
{
//menuWin = newwin(5, 5, 5, 5);
box(menuWin,0,0); //Here we can define other cahr insterad of 0,0
wrefresh(menuWin); //Refresh so that we can see it
}
//TODO: The correct way to end or erase s window is still unclear
void Menu::deleteMenu()
{
wclear(menuWin);
endDraw();
}
void Menu::startDraw()
{
}
void Menu::endDraw()
{
wrefresh(menuWin); //Refresh so that we can see it
}
void Menu::update()
{
}
void Menu::printItems()
{
for(i=0 ; i < itemCount; i++)
{
if(i == selectedItem)
{
wattron(menuWin, A_STANDOUT);
mvwprintw(menuWin, items[i].getPosY(),items[i].getPosX(), items[i].getName().c_str());
wattroff(menuWin, A_STANDOUT);
}
else
{
mvwprintw(menuWin, items[i].getPosY(),items[i].getPosX(), items[i].getName().c_str());
}
}
selectedItem = -1; // Deselcting the item
}
void Menu::selectItem()
{
}
void Menu::findTheLongestItem()
{
for(i=0; i < itemCount; i++)
{
if(longestItem < items[i].getLength())
{
longestItem = items[i].getLength();
}
}
}
void Menu::printMenu()
{
drawBox();
printItems();
wrefresh(menuWin); //Refresh so that we can see it
}
// Handles user input but there shoud be a way to register the selection.
void Menu::handleTrigger(char ch)
{
for(i=0; i < itemCount; i++)
{
if(ch == items[i].getTrigger())
{
selectedItem = i;
activeMenu = true;
}
else
{
activeMenu = false;
}
}
}
bool Menu::isActive()
{
return activeMenu;
}
//Getters
int Menu::getSizeX()
{
return xSize;
}
int Menu::getSizeY()
{
return ySize;
}
int Menu::getBegX()
{
return xBeg;
}
int Menu::getBegY()
{
return yBeg;
}
int Menu::getLongestItem()
{
return longestItem;
}
int Menu::getSelectedItem()
{
return selectedItem;
}
int Menu::getOrientation()
{
return orientation;
}
//Setters
void Menu::setBegX(int x)
{
this-> xBeg = x;
}
void Menu::setBegY(int y)
{
this-> yBeg = y;
}
void Menu::setTopLine(char ch)
{
}
void Menu::setBottomLine(char ch)
{
}
void Menu::setLeftLine(char ch)
{
}
void Menu::setRightLine(char ch)
{
}
char Menu::getKey()
{
return wgetch(menuWin);
}
#endif