Showing the changes to interface/src/MenuColumn.cpp (1 of 7 files). Show all
Unified · Split
| @@ -0,0 +1,150 @@ | ||
| 1 | + | |
| 2 | +#include <algorithm> | |
| 3 | +#include "InterfaceConfig.h" | |
| 4 | +#include "MenuRow.h" | |
| 5 | +#include "MenuColumn.h" | |
| 6 | +#include "Menu.h" | |
| 7 | +#include "Util.h" | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | +MenuColumn::MenuColumn() | |
| 12 | +{ | |
| 13 | +} | |
| 14 | +MenuColumn::MenuColumn(char * columnName) | |
| 15 | +{ | |
| 16 | + int length = std::min(MAX_COLUMN_NAME - 1,(int) strlen(columnName)); | |
| 17 | + strncpy(this->columnName, columnName, length); | |
| 18 | + this->columnName[length] = '\0'; | |
| 19 | + columnWidth = 0; | |
| 20 | + leftPosition = 0; | |
| 21 | + xLeftMouseOver = 0; | |
| 22 | + xRightMouseOver = 0; | |
| 23 | + yTopMouseOver = 0; | |
| 24 | + yBottomMouseOver = 0; | |
| 25 | +} | |
| 26 | + | |
| 27 | +MenuColumn::~MenuColumn() | |
| 28 | +{ | |
| 29 | +} | |
| 30 | + | |
| 31 | +void MenuColumn::mouseClickRow(int iRowIndex) { | |
| 32 | + rows[iRowIndex].call(); | |
| 33 | +} | |
| 34 | + | |
| 35 | +bool MenuColumn::mouseClick(int x, int y, int xLeft, int menuHeight, int lineHeight) { | |
| 36 | + int xRight = xLeft + 200; | |
| 37 | + int yTop = menuHeight; | |
| 38 | + int yBottom = menuHeight; | |
| 39 | + int columnWidth; | |
| 40 | + bool bRet = false; | |
| 41 | + for (unsigned int i = 0; i < rows.size(); ++i) { | |
| 42 | + columnWidth = rows[i].getWidth(); | |
| 43 | + yTop = yBottom + lineHeight; | |
| 44 | + if (x > xLeft && x < xRight && y > yBottom && y < yTop) { | |
| 45 | + mouseClickRow(i); | |
| 46 | + bRet = true; | |
| 47 | + break; | |
| 48 | + } | |
| 49 | + yBottom = yTop; | |
| 50 | + } | |
| 51 | + return bRet; | |
| 52 | +} | |
| 53 | + | |
| 54 | +void MenuColumn::setMouseOver(int xLeft, int xRight, int yTop, int yBottom) { | |
| 55 | + xLeftMouseOver = xLeft; | |
| 56 | + xRightMouseOver = xRight; | |
| 57 | + yTopMouseOver = yTop; | |
| 58 | + yBottomMouseOver = yBottom; | |
| 59 | +} | |
| 60 | + | |
| 61 | +bool MenuColumn::mouseOver(int x, int y, int xLeft, int menuHeight, int lineHeight) { | |
| 62 | + int xRight = xLeft + 100; | |
| 63 | + int yTop = menuHeight; | |
| 64 | + int yBottom = menuHeight; | |
| 65 | + int columnWidth; | |
| 66 | + bool bRet = false; | |
| 67 | + for (unsigned int i = 0; i < rows.size(); ++i) { | |
| 68 | + columnWidth = rows[i].getWidth(); | |
| 69 | + yTop = yBottom + lineHeight ; | |
| 70 | + if (x > xLeft && x < xRight && y > yBottom && y < yTop) { | |
| 71 | + setMouseOver(xLeft, xRight, yBottom, yTop); | |
| 72 | + bRet = true; | |
| 73 | + break; | |
| 74 | + } | |
| 75 | + yBottom = yTop; | |
| 76 | + } | |
| 77 | + if (!bRet) { | |
| 78 | + setMouseOver(0, 0, 0, 0); | |
| 79 | + } | |
| 80 | + return bRet; | |
| 81 | +} | |
| 82 | + | |
| 83 | +char * MenuColumn::getName() { | |
| 84 | + return this->columnName; | |
| 85 | +} | |
| 86 | + | |
| 87 | +int MenuColumn::getWidth(float scale, int mono, int leftPosition){ | |
| 88 | + if (columnWidth == 0) { | |
| 89 | + columnWidth = widthText( scale, mono, this->columnName); | |
| 90 | + this->leftPosition = leftPosition; | |
| 91 | + } | |
| 92 | + return columnWidth; | |
| 93 | +} | |
| 94 | + | |
| 95 | +int MenuColumn::getWidth(){ | |
| 96 | + return columnWidth; | |
| 97 | +} | |
| 98 | + | |
| 99 | +int MenuColumn::getLeftPosition(){ | |
| 100 | + return leftPosition; | |
| 101 | +} | |
| 102 | + | |
| 103 | +int MenuColumn::addRow(char * rowName, PFNRowCallback callback){ | |
| 104 | + MenuRow * pRow; | |
| 105 | + pRow = new MenuRow(rowName, callback); | |
| 106 | + rows.push_back(*pRow); | |
| 107 | + delete pRow; | |
| 108 | + return 0; | |
| 109 | + | |
| 110 | +} | |
| 111 | + | |
| 112 | +void MenuColumn::render(int yOffset, int menuHeight, int lineHeight) { | |
| 113 | + int iRow = rows.size(); | |
| 114 | + if (iRow > 0) { | |
| 115 | + glColor3f(0.9,0.9,0.9); | |
| 116 | + glBegin(GL_QUADS); { | |
| 117 | + glVertex2f(leftPosition, yOffset + menuHeight); | |
| 118 | + glVertex2f(leftPosition+100, yOffset + menuHeight); | |
| 119 | + glVertex2f(leftPosition+100, yOffset + menuHeight + iRow*lineHeight); | |
| 120 | + glVertex2f(leftPosition , yOffset + menuHeight + iRow* lineHeight); | |
| 121 | + } | |
| 122 | + glEnd(); | |
| 123 | + } | |
| 124 | + float scale = 0.10; | |
| 125 | + int mono = 0; | |
| 126 | + int y = menuHeight + lineHeight / 2 ; | |
| 127 | + char * rowName; | |
| 128 | + int columnWidth; | |
| 129 | + for (unsigned int i = 0; i < rows.size(); ++i) | |
| 130 | + { | |
| 131 | + rowName = rows[i].getName(); | |
| 132 | + columnWidth = rows[i].getWidth(scale, mono, 0); | |
| 133 | + drawtext(leftPosition + SPACE_BEFORE_ROW_NAME, y+5 + yOffset, scale, 0, 1.0, mono, rowName, 0, 0, 0); | |
| 134 | + y += lineHeight; | |
| 135 | + } | |
| 136 | + renderMouseOver(yOffset); | |
| 137 | +} | |
| 138 | + | |
| 139 | +void MenuColumn::renderMouseOver(int yOffset) { | |
| 140 | + if (xLeftMouseOver != 0 || yTopMouseOver != 0 || xRightMouseOver != 0 ||& yBottomMouseOver != 0){ | |
| 141 | + glColor4f(0,0,0,0.1); | |
| 142 | + glBegin(GL_QUADS); { | |
| 143 | + glVertex2f(xLeftMouseOver, yOffset + yTopMouseOver); | |
| 144 | + glVertex2f(xRightMouseOver, yOffset + yTopMouseOver); | |
| 145 | + glVertex2f(xRightMouseOver, yOffset + yBottomMouseOver); | |
| 146 | + glVertex2f(xLeftMouseOver , yOffset + yBottomMouseOver); | |
| 147 | + } | |
| 148 | + glEnd(); | |
| 149 | + } | |
| 150 | +} | |