Skip to content

Commit

Permalink
Implement UICheckBox (#77)
Browse files Browse the repository at this point in the history
* Implement UICheckBox

* Remove UICheckBox destructor and unnecessary `str` initializations
  • Loading branch information
pryon authored Oct 8, 2023
1 parent d757fa6 commit 7280ace
Show file tree
Hide file tree
Showing 2 changed files with 151 additions and 80 deletions.
226 changes: 146 additions & 80 deletions code/uilib/uicheckbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,129 +22,195 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

#include "ui_local.h"

Event EV_UICheckBox_SetCheckedCommand
(
"checked_command",
EV_DEFAULT,
"s",
"command",
"Command to execute when checkbox is checked"
);

Event EV_UICheckBox_SetUncheckedCommand
(
"unchecked_command",
EV_DEFAULT,
"s",
"command",
"Command to execute when checkbox is unchecked" // text not present in original executable
);

Event EV_UICheckBox_SetCheckedShader
(
"checked_shader",
EV_DEFAULT,
"s",
"shader",
"Set the shader of the small button when it is checked"
);

Event EV_UICheckBox_SetUncheckedShader
(
"unchecked_shader",
EV_DEFAULT,
"s",
"shader",
"Set the shader of the small button when it is unchecked"
);

CLASS_DECLARATION( UIWidget, UICheckBox, NULL )
{
{ NULL, NULL }
{&W_LeftMouseDown, &UICheckBox::Pressed },
{&W_LeftMouseUp, &UICheckBox::Released },
{&W_MouseEntered, &UICheckBox::MouseEntered },
{&W_MouseExited, &UICheckBox::MouseExited },
{&EV_UICheckBox_SetCheckedCommand, &UICheckBox::SetCheckedCommand },
{&EV_UICheckBox_SetUncheckedCommand, &UICheckBox::SetUncheckedCommand},
{&EV_UICheckBox_SetCheckedShader, &UICheckBox::SetCheckedShader },
{&EV_UICheckBox_SetUncheckedShader, &UICheckBox::SetUncheckedShader },
{NULL, NULL }
};

UICheckBox::UICheckBox()
{
// FIXME: stub
AllowActivate(qtrue);
m_check_height = 14.0;
m_check_width = 14.0;
m_indent = 8.0;
m_depressed = qfalse;
m_checked_material = NULL;
m_unchecked_material = NULL;
}

void UICheckBox::Draw
(
void
)

void UICheckBox::Draw()
{
// FIXME: stub
if (!m_depressed)
{
Draw3DBox(0.0f, 0.0f, m_frame.size.width, m_frame.size.height, 0, m_border_color, m_local_alpha);
}

SetColor(m_foreground_color, m_local_alpha);

UColor color = m_checked ? UBlue : UBlack;
UIReggedMaterial* material = m_checked ? m_checked_material : m_unchecked_material;

float width = m_check_width * m_vVirtualScale[0];
float height = m_check_height * m_vVirtualScale[1];
float x = m_vVirtualScale[0] * m_indent;
float y = (m_frame.size.height - height) * 0.5f;
if (material)
{
material->ReregisterMaterial();
uii.Rend_DrawPicStretched(x, y, width, height, 0.0f, 0.0f, 1.0f, 1.0f, material->GetMaterial());
}
else
{
DrawBox(x, y, width, height, color, m_local_alpha);
}

float titleX = m_indent * 1.5f + m_check_width;
float titleY = (m_frame.size.height / m_vVirtualScale[1] - getTitleHeight()) * 0.5f - 1.0f;
return DrawTitle(titleX, titleY);
}

void UICheckBox::CharEvent
(
int ch
)

void UICheckBox::CharEvent(int ch)
{
// FIXME: stub
// Support ticking checkboxes with spacebar
if (ch == ' ')
{
m_checked = !m_checked;
UpdateCvar();
}
}

void UICheckBox::Pressed
(
Event *ev
)

void UICheckBox::Pressed(Event *ev)
{
// FIXME: stub
m_depressed = qtrue;
}

void UICheckBox::Released
(
Event *ev
)

void UICheckBox::Released(Event *ev)
{
// FIXME: stub
m_checked = !m_checked;

// Handle additional commands:
// this is for checkboxes that either change multiple cvars,
// or that set a cvar with a non-bool value.
// e.g.: the Invert Mouse checkbox originally flips cvar m_invert_pitch,
// but also does ("set m_pitch -0.022" : "set m_pitch 0.022") commands using this
str command = m_checked ? m_checked_command : m_unchecked_command;
Cbuf_AddText(command.c_str());

m_depressed = qfalse;
UpdateCvar();
}

void UICheckBox::UpdateCvar
(
void
)
void UICheckBox::UpdateCvar()
{
// FIXME: stub
if (m_cvarname.length())
{
UI_SetCvarInt(m_cvarname, m_checked);
}

if (m_command.length()) // always seems to be NULL, could be remnant code
{
const char* text_to_append = m_checked ? " 1\n" : " 0\n";
m_command.append(text_to_append);
Cbuf_AddText(m_command.c_str());
}

if (m_commandhandler) // always seems to be NULL, could be remnant code
{
const char *checkedInt = va("%d", m_checked);
m_commandhandler(checkedInt, NULL);
}
}

void UICheckBox::MouseEntered
(
Event *ev
)

void UICheckBox::MouseEntered(Event *ev)
{
// FIXME: stub
auto num = ev->GetInteger(3);
uWinMan.ActivateControl(this);
if (num)
{
m_depressed = qtrue;
}
}

void UICheckBox::MouseExited
(
Event *ev
)

void UICheckBox::MouseExited(Event *ev)
{
// FIXME: stub
m_depressed = qfalse;
}

void UICheckBox::SetCheckedCommand
(
Event *ev
)

void UICheckBox::SetCheckedCommand(Event *ev)
{
// FIXME: stub
m_checked_command = ev->GetString(1);
}

void UICheckBox::SetUncheckedCommand
(
Event *ev
)

void UICheckBox::SetUncheckedCommand(Event *ev)
{
// FIXME: stub
m_unchecked_command = ev->GetString(1);
}

void UICheckBox::SetCheckedShader
(
Event *ev
)

void UICheckBox::SetCheckedShader(Event *ev)
{
// FIXME: stub
str shader = ev->GetString(1);
m_checked_material = uWinMan.RegisterShader(shader);
}

void UICheckBox::SetUncheckedShader
(
Event *ev
)

void UICheckBox::SetUncheckedShader(Event *ev)
{
// FIXME: stub
str shader = ev->GetString(1);
m_unchecked_material = uWinMan.RegisterShader(shader);
}

void UICheckBox::UpdateData
(
void
)

void UICheckBox::UpdateData(void)
{
// FIXME: stub
if (m_cvarname.length())
{
m_checked = UI_GetCvarInt(m_cvarname.c_str(), 0);
}
}

bool UICheckBox::isChecked
(
void
)

bool UICheckBox::isChecked()
{
// FIXME: stub
return false;
return m_checked;
}
5 changes: 5 additions & 0 deletions code/uilib/uicheckbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,10 @@ class UICheckBox : public UIWidget {
bool isChecked( void );
};

extern Event EV_UICheckBox_SetCheckedCommand;
extern Event EV_UICheckBox_SetUncheckedCommand;
extern Event EV_UICheckBox_SetCheckedShader;
extern Event EV_UICheckBox_SetUncheckedShader;

#endif

0 comments on commit 7280ace

Please sign in to comment.