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/bakcup/menuBar.h

181 lines
4.7 KiB

#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
prevSelected_menu = - 1; // Deselect for the next itteration. (unless handleTrigger has a new trigger)
// 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
{
if(menus[i].isBoxCreated())
{
//menus[i].eraseBox(); // Draws the lesefted Menus Items
}
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)
prevSelected_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