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