From a5404ad2164266917fc1e4ace75bcea70d487c3f Mon Sep 17 00:00:00 2001 From: Areloch Date: Sat, 11 Jul 2020 15:57:13 -0500 Subject: [PATCH] Adds ability to utilize bitmap arrays and set entry indexes for popup menus Also enables the ability to fetch the text of a popup menu item --- Engine/source/gui/editor/guiPopupMenuCtrl.cpp | 12 +++++++---- Engine/source/gui/editor/popupMenu.cpp | 21 ++++++++++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Engine/source/gui/editor/guiPopupMenuCtrl.cpp b/Engine/source/gui/editor/guiPopupMenuCtrl.cpp index e405864cf..9b1c9fc66 100644 --- a/Engine/source/gui/editor/guiPopupMenuCtrl.cpp +++ b/Engine/source/gui/editor/guiPopupMenuCtrl.cpp @@ -125,11 +125,13 @@ void GuiPopupMenuTextListCtrl::onRenderCell(Point2I offset, Point2I cell, bool s if (idx != 1) { // there's a bitmap... - U32 index = U32(idx - 2) * 3; + U32 index = U32(idx - 2) * 4; if (!mList[cell.y].active) - index += 2; - else if (selected || mouseOver) + index += 3; + else if (selected) index++; + else if (mouseOver) + index += 2; if (mProfile->mBitmapArrayRects.size() > index) { @@ -137,8 +139,10 @@ void GuiPopupMenuTextListCtrl::onRenderCell(Point2I offset, Point2I cell, bool s Point2I off = maxBitmapSize - rect.extent; off /= 2; + Point2I bitPos = Point2I(offset.x + mCellSize.y / 2, offset.y + mCellSize.y / 2); + GFX->getDrawUtil()->clearBitmapModulation(); - GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject, offset + off, rect); + GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject, bitPos + off, rect); } } diff --git a/Engine/source/gui/editor/popupMenu.cpp b/Engine/source/gui/editor/popupMenu.cpp index b2ba122a7..2f250ece7 100644 --- a/Engine/source/gui/editor/popupMenu.cpp +++ b/Engine/source/gui/editor/popupMenu.cpp @@ -139,7 +139,7 @@ GuiMenuBar* PopupMenu::getMenuBarCtrl() ////////////////////////////////////////////////////////////////////////// // Public Methods ////////////////////////////////////////////////////////////////////////// -S32 PopupMenu::insertItem(S32 pos, const char *title, const char* accelerator, const char* cmd) +S32 PopupMenu::insertItem(S32 pos, const char *title, const char* accelerator, const char* cmd, S32 bitmapIndex) { String titleString = title; @@ -147,6 +147,7 @@ S32 PopupMenu::insertItem(S32 pos, const char *title, const char* accelerator, c newItem.mID = pos; newItem.mText = titleString; newItem.mCMD = cmd; + newItem.mBitmapIndex = bitmapIndex; if (titleString.isEmpty() || titleString == String("-")) newItem.mIsSpacer = true; @@ -269,6 +270,14 @@ void PopupMenu::clearItems() mMenuItems.clear(); } +String PopupMenu::getItemText(S32 pos) +{ + if (mMenuItems.empty() || mMenuItems.size() < pos || pos < 0) + return String::EmptyString; + + return mMenuItems[pos].mText; +} + ////////////////////////////////////////////////////////////////////////// bool PopupMenu::canHandleID(U32 id) { @@ -468,9 +477,9 @@ void PopupMenu::hidePopupSubmenus() //----------------------------------------------------------------------------- // Console Methods //----------------------------------------------------------------------------- -DefineEngineMethod(PopupMenu, insertItem, S32, (S32 pos, const char * title, const char * accelerator, const char* cmd), ("", "", ""), "(pos[, title][, accelerator][, cmd])") +DefineEngineMethod(PopupMenu, insertItem, S32, (S32 pos, const char * title, const char * accelerator, const char* cmd, S32 bitmapIndex), ("", "", "", -1), "(pos[, title][, accelerator][, cmd][, bitmapIndex])") { - return object->insertItem(pos, title, accelerator, cmd); + return object->insertItem(pos, title, accelerator, cmd, bitmapIndex); } DefineEngineMethod(PopupMenu, removeItem, void, (S32 pos), , "(pos)") @@ -506,6 +515,12 @@ DefineEngineMethod(PopupMenu, checkItem, void, (S32 pos, bool checked), , "(pos, object->checkItem(pos, checked); } +DefineEngineMethod(PopupMenu, getItemText, const char*, (S32 pos), , "(pos)") +{ + return object->getItemText(pos).c_str(); +} + + DefineEngineMethod(PopupMenu, checkRadioItem, void, (S32 firstPos, S32 lastPos, S32 checkPos), , "(firstPos, lastPos, checkPos)") { object->checkRadioItem(firstPos, lastPos, checkPos);