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.
306 lines
5.1 KiB
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
|