From 093f489520f9024c5f6a88682f7c809021d6a8b8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 13 Apr 2013 13:07:02 -0700 Subject: [PATCH] make menu columns render properly for menu items wider than 100 pixels --- interface/src/MenuColumn.cpp | 33 ++++++++++++++++++++++++--------- interface/src/MenuColumn.h | 1 + 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/interface/src/MenuColumn.cpp b/interface/src/MenuColumn.cpp index d3780b5710..8c8548ea05 100644 --- a/interface/src/MenuColumn.cpp +++ b/interface/src/MenuColumn.cpp @@ -41,7 +41,7 @@ void MenuColumn::mouseClickRow(int numberOfRowsIndex) { } bool MenuColumn::mouseClick(int x, int y, int leftPosition, int menuHeight, int lineHeight) { - int rightPosition = leftPosition + 200; + int rightPosition = leftPosition + 200; // XXXBHG - this looks like a hack? int topPosition = menuHeight; int bottomPosition = menuHeight; int columnWidth = 0; @@ -67,13 +67,14 @@ void MenuColumn::setMouseOver(int leftPosition, int rightPosition, int topPositi } bool MenuColumn::mouseOver(int x, int y, int leftPosition, int menuHeight, int lineHeight) { - int rightPosition = leftPosition + 100; + + int maxColumnWidth = this->getMaxRowWidth(); + + int rightPosition = leftPosition + maxColumnWidth; int topPosition = menuHeight; int bottomPosition = menuHeight; - int columnWidth = 0; bool overMenu = false; for (unsigned int i = 0; i < rows.size(); ++i) { - columnWidth = rows[i].getWidth(); topPosition = bottomPosition + lineHeight ; if (x > leftPosition && x < rightPosition && y > bottomPosition && y < topPosition) { setMouseOver(leftPosition, rightPosition, bottomPosition, topPosition); @@ -116,26 +117,40 @@ int MenuColumn::addRow(const char* rowName, MenuRowCallback callback) { return 0; } +int MenuColumn::getMaxRowWidth() { + float scale = 0.09; + int mono = 0; + int maxColumnWidth = 100 - (SPACE_BEFORE_ROW_NAME*2); // the minimum size we want + for (unsigned int i = 0; i < rows.size(); ++i) { + maxColumnWidth = std::max(maxColumnWidth,rows[i].getWidth(scale, mono, 0)); + } + + maxColumnWidth += SPACE_BEFORE_ROW_NAME*2; // space before and after!! + return maxColumnWidth; +} + void MenuColumn::render(int yOffset, int menuHeight, int lineHeight) { + float scale = 0.09; + int mono = 0; int numberOfRows = rows.size(); if (numberOfRows > 0) { + + int maxColumnWidth = this->getMaxRowWidth(); + glColor3f(0.9,0.9,0.9); glBegin(GL_QUADS); { glVertex2f(leftPosition, yOffset + menuHeight); - glVertex2f(leftPosition+100, yOffset + menuHeight); - glVertex2f(leftPosition+100, yOffset + menuHeight + numberOfRows*lineHeight); + glVertex2f(leftPosition+maxColumnWidth, yOffset + menuHeight); + glVertex2f(leftPosition+maxColumnWidth, yOffset + menuHeight + numberOfRows*lineHeight); glVertex2f(leftPosition , yOffset + menuHeight + numberOfRows* lineHeight); } glEnd(); } - float scale = 0.09; - int mono = 0; int y = menuHeight + lineHeight / 2 ; char* rowName; int columnWidth = 0; for (unsigned int i = 0; i < rows.size(); ++i) { rowName = rows[i].getName(); - columnWidth = rows[i].getWidth(scale, mono, 0); drawtext(leftPosition + SPACE_BEFORE_ROW_NAME, y+5 + yOffset, scale, 0, 1.0, mono, rowName, 0, 0, 0); y += lineHeight; } diff --git a/interface/src/MenuColumn.h b/interface/src/MenuColumn.h index 71c42eed7f..c712ac64a1 100644 --- a/interface/src/MenuColumn.h +++ b/interface/src/MenuColumn.h @@ -27,6 +27,7 @@ public: void render(int yOffset, int menuHeight, int lineHeight); void renderMouseOver(int yOffset); int addRow(const char* rowName, MenuRowCallback callback); + int getMaxRowWidth(); private: char columnName[MAX_COLUMN_NAME]; int columnWidth;