openmohaa/code/uilib/uibutton.cpp
smallmodel 6fe1e86b31
Automatically scale UI elements for high resolutions
This fixes UI elements being tiny on high resolutions like 4K. Now most UI elements will scale automatically with resolutions above 1920x1080.
2024-11-30 22:40:00 +01:00

417 lines
6.6 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"
#include "../qcommon/localization.h"
Event W_Button_Pressed
(
"button_pressed",
EV_DEFAULT,
NULL,
NULL,
"Signal that the button was pressed"
);
Event W_Button_HoverSound
(
"hoversound",
EV_DEFAULT,
"s",
"soundName",
"Set the sound to play when this button is hovered over"
);
Event W_Button_HoverCommand
(
"hovercommand",
EV_DEFAULT,
"s",
"string",
"Set the command to execute when this button is hovered over"
);
Event W_Button_MouseAwayCommand
(
"mouseawaycommand",
EV_DEFAULT,
"s",
"string",
"Set the command to execute when the mouse exits this button"
);
CLASS_DECLARATION( UIWidget, UIButtonBase, NULL )
{
{ &W_LeftMouseDown, &UIButtonBase::Pressed },
{ &W_LeftMouseUp, &UIButtonBase::Released },
{ &W_LeftMouseDragged, &UIButtonBase::Dragged },
{ &W_MouseEntered, &UIButtonBase::MouseEntered },
{ &W_MouseExited, &UIButtonBase::MouseExited },
{ &W_Button_HoverSound, &UIButtonBase::SetHoverSound },
{ &W_Button_HoverCommand, &UIButtonBase::SetHoverCommand },
{ &W_Button_MouseAwayCommand, &UIButtonBase::SetMouseExitedCommand },
{ NULL, NULL }
};
UIButtonBase::UIButtonBase()
{
m_mouseState = M_NONE;
AllowActivate(true);
}
void UIButtonBase::Pressed
(
Event *ev
)
{
m_mouseState = M_DRAGGING;
m_hovermaterial_active = qtrue;
m_pressedmaterial_active = qtrue;
uWinMan.setFirstResponder(this);
}
void UIButtonBase::Released
(
Event *ev
)
{
if (m_mouseState != M_DRAGGING)
{
m_mouseState = M_NONE;
return;
}
if (uWinMan.getFirstResponder() == this) {
// make sure to not respond multiple times
uWinMan.setFirstResponder(NULL);
}
m_mouseState = M_NONE;
if (ev)
{
if (!getClientFrame().contains(MouseEventToClientPoint(ev)))
{
// not in the frame anymore
m_hovermaterial_active = false;
m_pressedmaterial_active = false;
return;
}
}
Action();
if (ev)
{
if (getClientFrame().contains(MouseEventToClientPoint(ev)))
{
// handle the button click
SendSignal(W_Button_Pressed);
}
}
}
void UIButtonBase::MouseEntered
(
Event *ev
)
{
m_hovermaterial_active = qtrue;
uWinMan.ActivateControl(this);
if (m_hoverSound.length()) {
uii.Snd_PlaySound(m_hoverSound.c_str());
}
if (m_hoverCommand.length()) {
str stuff = m_hoverCommand + "\n";
uii.Cmd_Stuff(stuff.c_str());
}
}
void UIButtonBase::MouseExited
(
Event *ev
)
{
SetHovermaterialActive(false);
if (m_mouseExitedCommand.length()) {
str stuff = m_mouseExitedCommand + "\n";
uii.Cmd_Stuff(stuff.c_str());
}
}
void UIButtonBase::Dragged
(
Event *ev
)
{
SetHovermaterialActive(getClientFrame().contains(MouseEventToClientPoint(ev)));
}
void UIButtonBase::SetHoverSound
(
Event *ev
)
{
m_hoverSound = ev->GetString(1);
}
void UIButtonBase::SetHoverCommand
(
Event *ev
)
{
m_hoverCommand = ev->GetString(1);
}
void UIButtonBase::SetMouseExitedCommand(Event* ev)
{
m_mouseExitedCommand = ev->GetString(1);
}
void UIButtonBase::Action
(
void
)
{
if (m_clicksound.length()) {
uii.Snd_PlaySound(m_clicksound.c_str());
}
if (m_command.length()) {
str stuff = m_command + "\n";
uii.Cmd_Stuff(stuff.c_str());
}
}
CLASS_DECLARATION( UIButtonBase, UIButton, NULL )
{
{ NULL, NULL }
};
UIButton::UIButton()
{
setBorderStyle(border_none);
}
void UIButton::Draw
(
void
)
{
if (m_mouseState == M_DRAGGING && m_screenframe.contains(uid.mouseX, uid.mouseY)) {
DrawPressed();
} else {
DrawUnpressed();
}
}
void UIButton::DrawPressed
(
void
)
{
UIRect2D clientFrame = getClientFrame();
if (m_borderStyle != border_none) {
Draw3DBox(clientFrame, true, m_border_color, m_local_alpha);
}
m_font->setColor(m_foreground_color);
clientFrame.pos.x += 1;
clientFrame.pos.y += 1;
m_font->PrintJustified(
clientFrame,
m_iFontAlignmentHorizontal,
m_iFontAlignmentVertical,
Sys_LV_CL_ConvertString(m_title.c_str()),
getVirtualScale()
);
}
void UIButton::DrawUnpressed
(
void
)
{
m_font->setColor(m_foreground_color);
m_font->setAlpha(m_local_alpha);
UIRect2D clientFrame = getClientFrame();
m_font->PrintJustified(
clientFrame,
m_iFontAlignmentHorizontal,
m_iFontAlignmentVertical,
Sys_LV_CL_ConvertString(m_title.c_str()),
getVirtualScale()
);
}
qboolean UIButton::KeyEvent
(
int key,
unsigned int time
)
{
if (key != K_ENTER && key != K_KP_ENTER) {
return false;
}
UIButtonBase::Action();
return true;
}
CLASS_DECLARATION( USignal, ToggleCVar, NULL )
{
{ NULL, NULL }
};
ToggleCVar::ToggleCVar()
{
m_button = 0;
}
ToggleCVar::ToggleCVar
(
UIButton *button,
const char *cvar
) : ToggleCVar()
{
setButton(button);
if (cvar) {
setCVar(cvar);
}
}
void ToggleCVar::Press
(
Event *ev
)
{
if (m_cvarname.length())
{
UI_SetCvarInt(m_cvarname.c_str(), UI_GetCvarInt(m_cvarname.c_str(), 0));
}
}
void ToggleCVar::setCVar
(
const char *cvar
)
{
m_cvarname = cvar;
}
void ToggleCVar::setButton
(
UIButton *button
)
{
if (m_button) {
m_button->Disconnect(this, W_Button_Pressed);
}
m_button = button;
if (m_button) {
m_button->Connect(this, W_Button_Pressed, W_Button_Pressed);
}
}
CLASS_DECLARATION( USignal, ExecCmd, NULL )
{
{ NULL, NULL }
};
ExecCmd::ExecCmd()
{
m_button = NULL;
}
ExecCmd::ExecCmd
(
UIButton *button,
const char *cmd
) : ExecCmd()
{
setButton(button);
setCommand(cmd);
}
void ExecCmd::Press
(
Event *ev
)
{
if (m_cmd.length()) {
str stuff = m_cmd + "\n";
uii.Cmd_Stuff(stuff.c_str());
}
}
void ExecCmd::setCommand
(
const char *cmd
)
{
m_cmd = cmd;
}
void ExecCmd::setButton
(
UIButton *button
)
{
if (m_button) {
m_button->Disconnect(this, W_Button_Pressed);
}
m_button = button;
if (m_button) {
m_button->Connect(this, W_Button_Pressed, W_Button_Pressed);
}
}