void fgui::textbox::draw() {
// get the current position of the window
fgui::point a = fgui::element::get_absolute_position();
// get the window style
fgui::style style = handler::get_style();
// get the control area
fgui::rect area = { a.x, a.y, m_width, m_height };
// textbox title text size
fgui::dimension text_size = fgui::render.get_text_size(fgui::textbox::get_font(), m_title);
// textbox body
fgui::render.outline(area.left, area.top, area.right, area.bottom, fgui::color(style.textbox.at(0)));
if (fgui::input_system::mouse_in_area(area) || m_is_getting_key)
fgui::render.outline(area.left + 2, area.top + 2, area.right - 4, area.bottom - 4, fgui::color(style.textbox.at(3)));
else
fgui::render.outline(area.left + 1, area.top + 1, area.right - 2, area.bottom - 2, fgui::color(style.textbox.at(2)));
fgui::render.colored_gradient(area.left + 3, area.top + 3, area.right - 6, area.bottom - 6, fgui::color(style.textbox.at(1)), fgui::color(style.textbox.at(2)), false);
// textbox label
fgui::render.text(area.left, (area.top - text_size.height) - 2, fgui::color(style.text.at(0)), fgui::textbox::get_font(), m_title);
if (m_text.empty())
return;
// typed text size
fgui::dimension typed_text_size = fgui::render.get_text_size(fgui::textbox::get_font(), m_text);
//The text won't fit in the box
int number_errased = 0;
std::string to_write = m_text;
while (typed_text_size.width + 7 > m_width)
{
if (m_text_input_pos >= number_errased && m_text_input_pos > 1)
{
to_write.erase(to_write.begin());
number_errased++;
}
else
{
to_write.pop_back();
}
typed_text_size = fgui::render.get_text_size(fgui::textbox::get_font(), to_write);
}
// draw custom text
if (m_text_flag & static_cast<int>(fgui::text_flags::SECRET))
{
fgui::render.text(area.left + 5, area.top + (area.bottom / 2) - (typed_text_size.height / 2) - 1, fgui::color(style.text.at(0)), fgui::textbox::get_font(), std::string(to_write.length(), '*'));
}
else if (m_text_flag & static_cast<int>(fgui::text_flags::UPPERCASE))
{
// transform the text into uppercase
std::string upper_case_display = to_write;
std::transform(upper_case_display.begin(), upper_case_display.end(),upper_case_display.begin(), ::toupper);
fgui::render.text(area.left + 5, area.top + (area.bottom / 2) - (typed_text_size.height / 2) - 1, fgui::color(style.text.at(0)), fgui::textbox::get_font(), upper_case_display);
}
else
{
fgui::render.text(area.left + 5, area.top + (area.bottom / 2) - (typed_text_size.height / 2) - 1, fgui::color(style.text.at(0)), fgui::textbox::get_font(), to_write);
}
// if the textbox is ready to receive text
if (m_is_getting_key) {
// caret
std::string caret = to_write;
if (m_text_input_pos - number_errased <= 0)
{
number_errased = 0;
m_text_input_pos = 1;
}
if (m_text_input_pos - number_errased >= caret.size())
{
m_text_input_pos = caret.size();
number_errased = 0;
}
caret.erase(m_text_input_pos - number_errased, caret.size());
// caret size
fgui::dimension caret_text_size = fgui::render.get_text_size(fgui::textbox::get_font(), caret);
// draw the caret
fgui::render.line(area.left + caret_text_size.width + 7, area.top + 5, area.left + caret_text_size.width + 7, (area.top + area.bottom) - 5, fgui::color(style.text.at(0)));
}
// selected text rectangle
if (m_text_selected)
fgui::render.rect(area.left + 5, area.top + (area.bottom / 2) - (typed_text_size.height / 2) - 1, typed_text_size.width, typed_text_size.height, fgui::color(style.textbox.at(3), 100));
}