openmohaa/code/uilib/uipulldownmenucontainer.cpp

367 lines
8.4 KiB
C++

/*
===========================================================================
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);
}