/* =========================================================================== Copyright (C) 2015 the OpenMoHAA team This file is part of OpenMoHAA source code. OpenMoHAA source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenMoHAA source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenMoHAA source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ #include "ui_local.h" Event EV_UIPulldownMenuContainer_AddPopup ( "addpopup", EV_DEFAULT, "ssss", "menuname title type string", "Adds a popup to the list box.\n" "menuname - the name of the menu to add this to\n" "title - the string to display\n" "type - type of item this is (command,cvar,event_name)\n" "string - the data that corresponds to the correct type\n" ); Event EV_UIPulldownMenuContainer_MenuShader ( "menushader", EV_DEFAULT, "ss", "menuname shader", "Adds a menu to the container and sets the shader.\n" "menuname - the name of the menu to add this to\n" "shader - the string to display" ); Event EV_UIPulldownMenuContainer_SelectedMenuShader ( "selmenushader", EV_DEFAULT, "ss", "menuname shader", "Adds a menu to the container and sets the shader when it's selected.\n" "menuname - the name of the menu to add this to\n" "shader - the string to display" ); Event EV_UIPulldownMenuContainer_PopupHighlightFGColor ( "popup_highlight_fgcolor", EV_DEFAULT, "sffff", "menu r g b a", "Set the highlight background color of the popup menu\n" "menu - the name of the popup menu to color\n" ); Event EV_UIPulldownMenuContainer_HighlightBGColor ( "highlight_bgcolor", EV_DEFAULT, "sffff", "menu r g b a", "Set the highlight foreground color of the pulldown menu\n" "menu - the name of the popup menu to color\n" ); Event EV_UIPulldownMenuContainer_HighlightFGColor ( "highlight_fgcolor", EV_DEFAULT, "sffff", "menu r g b a", "Set the highlight background color of the pulldown menu\n" "menu - the name of the popup menu to color\n" ); Event EV_UIPulldownMenuContainer_PopupHighlightBGColor ( "popup_highlight_bgcolor", EV_DEFAULT, "sffff", "menu r g b a", "Set the highlight foreground color of the popup menu\n" "menu - the name of the popup menu to color\n" ); Event EV_UIPulldownMenuContainer_PopupFGColor ( "popup_fgcolor", EV_DEFAULT, "sffff", "menu r g b a", "Set the background color of the popup menu\n" "menu - the name of the popup menu to color\n" ); Event EV_UIPulldownMenuContainer_PopupBGColor ( "popup_bgcolor", EV_DEFAULT, "sffff", "menu r g b a", "Set the foreground color of the popup menu\n" "menu - the name of the popup menu to color\n" ); CLASS_DECLARATION( UIWidget, UIPulldownMenuContainer, NULL ) { { &EV_UIPulldownMenuContainer_AddPopup, &UIPulldownMenuContainer::AddPopup }, { &EV_UIPulldownMenuContainer_MenuShader, &UIPulldownMenuContainer::SetMenuShader }, { &EV_UIPulldownMenuContainer_SelectedMenuShader, &UIPulldownMenuContainer::SetSelectedMenuShader }, { &EV_UIPulldownMenuContainer_PopupHighlightFGColor, &UIPulldownMenuContainer::SetPopupHighlightFGColor }, { &EV_UIPulldownMenuContainer_PopupHighlightBGColor, &UIPulldownMenuContainer::SetPopupHighlightBGColor }, { &EV_UIPulldownMenuContainer_PopupFGColor, &UIPulldownMenuContainer::SetPopupFGColor }, { &EV_UIPulldownMenuContainer_PopupBGColor, &UIPulldownMenuContainer::SetPopupBGColor }, { &EV_UIPulldownMenuContainer_HighlightFGColor, &UIPulldownMenuContainer::SetHighlightFGColor }, { &EV_UIPulldownMenuContainer_HighlightBGColor, &UIPulldownMenuContainer::SetHighlightBGColor }, { &EV_Layout_VirtualRes, &UIPulldownMenuContainer::PulldownVirtualRes }, { NULL, NULL } }; UIPulldownMenuContainer::UIPulldownMenuContainer() { m_menu = new UIPulldownMenu(); m_menu->CreateAligned(this, this); } UIPulldownMenuContainer::~UIPulldownMenuContainer() { for (int i = m_popups.NumObjects(); i > 0; i--) { uipopup_describe* uipd = m_popups.ObjectAt(i); m_popups.RemoveObjectAt(i); delete uipd; } for (int i = m_dataContainer.NumObjects(); i > 0; i--) { char* data = m_dataContainer.ObjectAt(i); m_dataContainer.RemoveObjectAt(i); delete data; } // FIXME: m_menu isn't deleted, possible memory leak! } void UIPulldownMenuContainer::FrameInitialized ( void ) { AllowActivate(qfalse); m_menu->setBackgroundColor(m_background_color, qtrue); m_menu->setForegroundColor(m_foreground_color); } void UIPulldownMenuContainer::setBackgroundAlpha ( float f ) { m_alpha = f; m_menu->setBackgroundAlpha(f); } void UIPulldownMenuContainer::setBackgroundColor ( const UColor& color, bool setbordercolor ) { UIWidget::setBackgroundColor(color, setbordercolor); m_menu->setBackgroundColor(color, setbordercolor); } void UIPulldownMenuContainer::setForegroundColor ( const UColor& color ) { UIWidget::setForegroundColor(color); m_menu->setForegroundColor(color); } void UIPulldownMenuContainer::SetPopupHighlightFGColor ( Event *ev ) { str menu = ev->GetString(1); float r = ev->GetFloat(2); float g = ev->GetFloat(3); float b = ev->GetFloat(4); float a = ev->GetFloat(5); m_menu->setPopupHighlightFGColor(menu, UColor(r, g, b, a)); } void UIPulldownMenuContainer::SetPopupHighlightBGColor ( Event *ev ) { str menu = ev->GetString(1); float r = ev->GetFloat(2); float g = ev->GetFloat(3); float b = ev->GetFloat(4); float a = ev->GetFloat(5); m_menu->setPopupHighlightBGColor(menu, UColor(r, g, b, a)); } void UIPulldownMenuContainer::SetPopupFGColor ( Event *ev ) { str menu = ev->GetString(1); float r = ev->GetFloat(2); float g = ev->GetFloat(3); float b = ev->GetFloat(4); float a = ev->GetFloat(5); m_menu->setPopupFGColor(menu, UColor(r, g, b, a)); } void UIPulldownMenuContainer::SetPopupBGColor ( Event *ev ) { str menu = ev->GetString(1); float r = ev->GetFloat(2); float g = ev->GetFloat(3); float b = ev->GetFloat(4); float a = ev->GetFloat(5); m_menu->setPopupBGColor(menu, UColor(r, g, b, a)); } void UIPulldownMenuContainer::SetHighlightFGColor ( Event *ev ) { // original game goes 1-4 for some reason float r = ev->GetFloat(2); float g = ev->GetFloat(3); float b = ev->GetFloat(4); float a = ev->GetFloat(5); m_menu->setHighlightFGColor(UColor(r, g, b, a)); } void UIPulldownMenuContainer::SetHighlightBGColor ( Event *ev ) { // original game goes 1-4 for some reason float r = ev->GetFloat(2); float g = ev->GetFloat(3); float b = ev->GetFloat(4); float a = ev->GetFloat(5); m_menu->setHighlightBGColor(UColor(r, g, b, a)); } void UIPulldownMenuContainer::SetMenuShader ( Event *ev ) { str menu = ev->GetString(1); str shader = ev->GetString(2); UIReggedMaterial *mat = uWinMan.RegisterShader(shader); m_menu->setPulldownShader(menu, mat); } void UIPulldownMenuContainer::SetSelectedMenuShader ( Event *ev ) { str menu = ev->GetString(1); str shader = ev->GetString(2); UIReggedMaterial *mat = uWinMan.RegisterShader(shader); m_menu->setSelectedPulldownShader(menu, mat); } void UIPulldownMenuContainer::Realign ( void ) { UIWidget::Realign(); m_menu->Realign(); } void UIPulldownMenuContainer::PulldownVirtualRes ( Event *ev ) { LayoutVirtualRes(ev); if (m_bVirtual) { Event *newEv = new Event(EV_Layout_VirtualRes); newEv->AddInteger(1); m_menu->ProcessEvent(newEv); } } void UIPulldownMenuContainer::AddPopup ( Event *ev ) { str menu = ev->GetString(1); str title = ev->GetString(2); str t = ev->GetString(3); str d = ev->GetString(4); uipopup_type type = UI_PopupTypeStringToInt(t); // Make sure to create a duplicate of the original string, // otherwise `data` will point to junk when `d` is destroyed. // This only seems to run for each popup menu during game startup, // so it doesn't appear to leak memory continuously, // but it's being cleaned up in uipopup_describe's dtor anyway. void* data = strdup(d); uipopup_describe* uipd = new uipopup_describe(title, type, data, NULL); m_popups.AddObject(uipd); m_menu->AddUIPopupDescribe(menu, uipd); }