1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-03 03:23:33 +02:00
VVVVVV/desktop_version/src/Textbox.cpp

155 lines
2.9 KiB
C++
Raw Normal View History

2020-01-01 21:29:24 +01:00
#include "Textbox.h"
#include <SDL.h>
#include <utf8/unchecked.h>
2020-01-01 21:29:24 +01:00
textboxclass::textboxclass(void)
2020-01-01 21:29:24 +01:00
{
w = 0;
h = 0;
tl = 0;
prev_tl = 0;
2020-01-01 21:29:24 +01:00
tm = 0;
timer = 0;
xp = 0;
yp = 0;
r = 0;
g = 0;
b = 0;
flipme = false;
rand = 0;
2020-01-01 21:29:24 +01:00
}
void textboxclass::centerx(void)
2020-01-01 21:29:24 +01:00
{
resize();
xp = 160 - (w / 2);
resize();
}
void textboxclass::centery(void)
2020-01-01 21:29:24 +01:00
{
resize();
yp = 120 - (h / 2);
resize();
}
void textboxclass::adjust(void)
2020-01-01 21:29:24 +01:00
{
resize();
if (xp < 10) xp = 10;
if (yp < 10) yp = 10;
if (xp + w > 310) xp = 310 - w;
if (yp + h > 230) yp = 230 - h;
resize();
}
void textboxclass::initcol(int rr, int gg, int bb)
{
r = rr;
g = gg;
b = bb;
tl = 0.5;
2020-01-01 21:29:24 +01:00
}
void textboxclass::update(void)
2020-01-01 21:29:24 +01:00
{
prev_tl = tl;
2020-01-01 21:29:24 +01:00
if (tm == 0)
{
tl += .1f;
if (tl >= 1)
{
tl = 1;
tm = 1;
}
}
else if (tm == 2)
{
tl -= .1f;
if (tl <= 0.5)
{
tl = 0.5;
//this textbox will be removed by updatetextboxes() later
2020-01-01 21:29:24 +01:00
}
}
if (timer > 0)
{
timer--;
if (timer == 0) tm = 2;
}
}
void textboxclass::remove(void)
2020-01-01 21:29:24 +01:00
{
tm = 2;
tl = 1.0f; //Remove mode
}
void textboxclass::removefast(void)
2020-01-01 21:29:24 +01:00
{
tm = 2;
tl = 0.4f; //Remove mode
}
void textboxclass::resize(void)
2020-01-01 21:29:24 +01:00
{
//Set the width and height to the correct sizes
int max = 0;
for (size_t iter = 0; iter < lines.size(); iter++)
2020-01-01 21:29:24 +01:00
{
unsigned int len = utf8::unchecked::distance(lines[iter].begin(), lines[iter].end());
if (len > (unsigned int)max) max = len;
2020-01-01 21:29:24 +01:00
}
// 16 for the borders
w = max*8 + 16;
h = lines.size()*8 + 16;
2020-01-01 21:29:24 +01:00
}
void textboxclass::addline(const std::string& t)
2020-01-01 21:29:24 +01:00
{
lines.push_back(t);
2020-01-01 21:29:24 +01:00
resize();
if ((int) lines.size() >= 12) lines.clear();
2020-01-01 21:29:24 +01:00
}
void textboxclass::pad(size_t left_pad, size_t right_pad)
{
// Pad the current text with a certain number of spaces on the left and right
for (size_t iter = 0; iter < lines.size(); iter++)
{
lines[iter] = std::string(left_pad, ' ') + lines[iter] + std::string(right_pad, ' ');
}
resize();
}
void textboxclass::padtowidth(size_t new_w)
{
/* Pad the current text so that each line is new_w pixels wide.
* Each existing line is centered in that width. */
resize();
size_t chars_w = SDL_max(w-16, new_w) / 8;
for (size_t iter = 0; iter < lines.size(); iter++)
{
size_t n_glyphs = utf8::unchecked::distance(lines[iter].begin(), lines[iter].end());
signed int padding_needed = chars_w - n_glyphs;
if (padding_needed < 0)
{
continue;
}
size_t left_pad = padding_needed / 2;
size_t right_pad = padding_needed - left_pad;
lines[iter] = std::string(left_pad, ' ') + lines[iter] + std::string(right_pad, ' ');
}
resize();
}
void textboxclass::centertext()
{
padtowidth(w-16);
}