#include "on_screen_keyboard.h" // Constructor OnScreenKeyboard::OnScreenKeyboard(SDL_Renderer *renderer, Input *input, string iconFile, string bitmapFile, string textFile, options_t *options, int width, int height, color_t color) { // Inicializa variables this->renderer = renderer; this->options = options; this->input = input; this->width = width; this->height = height; // Crea objetos iconTexture = new Texture(renderer, iconFile); text = new Text(textFile, bitmapFile, renderer); texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height); // Inicializa variables char_upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char_lower = "abcdefghijklmnopqrstuvwxyz"; char_numbers = "0123456789"; char_symbol = " !\"#$%&'()*+,-./:;<=>?@[]"; use_char_upper = true; use_char_lower = false; use_char_numbers = false; use_char_symbol = false; totalChars = getTotalChars(); columns = getColumns(); rows = getRows(); setLayout(); caption = ""; dest = {(options->screen.nativeWidth - width) / 2, (options->screen.nativeHeight - height) / 2, width, height}; // Rellena la textura de fondo con el color y el texto fillTexture(); } // Destructor OnScreenKeyboard::~OnScreenKeyboard() { // Libera la memoria de los objetos if (iconTexture != nullptr) { delete iconTexture; } if (text != nullptr) { delete text; } if (texture != nullptr) { SDL_DestroyTexture(texture); } } // Rellena la textura de fondo con el color y el texto void OnScreenKeyboard::fillTexture() { // Empieza a dibujar en la textura SDL_SetRenderTarget(renderer, texture); // Establece el color de fondo SDL_SetRenderDrawColor(renderer, bgColor.r, bgColor.g, bgColor.b, 255); SDL_RenderClear(renderer); // Escribe el texto que aparece en el objeto text->write(text->getCharacterSize(), text->getCharacterSize(), caption); // Dibuja el cuadro donde va el texto que se escribirá const color_t darkColor = darkenColor(bgColor, 10); SDL_SetRenderDrawColor(renderer, darkColor.r, darkColor.g, darkColor.b, 255); const int x_rect = (text->getCharacterSize() * 2) + text->lenght(caption); const int y_rect = text->getCharacterSize(); const int w_rect = width - text->getCharacterSize() - x_rect; const int h_rect = text->getCharacterSize(); SDL_Rect rect = {x_rect, y_rect, w_rect, h_rect}; SDL_RenderFillRect(renderer, &rect); // Dibuja los caracteres que conformaran el teclado int dist = text->getCharacterSize() * 2; for (int i = 0; i < columns; ++i) for (int j = 0; j < rows; ++j) { int pos = i + (j * columns); if (pos < (int)layout.size()) text->write(i * dist, j * dist, layout.at(i + (j * columns))); } // Deja de dibujar en la textura SDL_SetRenderTarget(renderer, nullptr); } // Calcula cuantos caracteres se utilizaran para crear el teclado int OnScreenKeyboard::getTotalChars() { int total = 0; total += use_char_upper ? char_upper.length() : 0; total += use_char_lower ? char_lower.length() : 0; total += use_char_numbers ? char_numbers.length() : 0; total += use_char_symbol ? char_symbol.length() : 0; return total; } // Calcula cuantas columnas necesita el teclado int OnScreenKeyboard::getColumns() { const int charSize = text->getCharacterSize(); int w = width - (charSize * 2); int total = 0; while (w > 0) { w -= (charSize * 2); ++total; } return total; } // Calcula cuantas filas necesita el teclado int OnScreenKeyboard::getRows() { return totalChars / getColumns(); } // Establece la disposición del teclado void OnScreenKeyboard::setLayout() { totalChars = getTotalChars(); columns = getColumns(); rows = getRows(); layout.clear(); if (use_char_upper) for (int i = 0; i < char_upper.length(); ++i) layout.push_back(char_upper.substr(i, 1)); if (use_char_lower) for (int i = 0; i < char_lower.length(); ++i) layout.push_back(char_lower.substr(i, 1)); if (use_char_numbers) for (int i = 0; i < char_numbers.length(); ++i) layout.push_back(char_numbers.substr(i, 1)); if (use_char_symbol) for (int i = 0; i < char_symbol.length(); ++i) layout.push_back(char_symbol.substr(i, 1)); } // Actualiza la lógica del objeto void OnScreenKeyboard::update() { } // Dibuja el objeto en pantalla void OnScreenKeyboard::render() { SDL_RenderCopy(renderer, texture, nullptr, &dest); } // Establece el color de fondo void OnScreenKeyboard::setBgColor(color_t color) { bgColor = color; fillTexture(); } // Establece el texto a mostrar junto al texto a introducir void OnScreenKeyboard::setCaption(string text) { caption = text; fillTexture(); } // Establece qué caracteres ofrecerá el objeto void OnScreenKeyboard::setChars(Uint8 mode) { use_char_upper = ((mode & USE_UPPER) == USE_UPPER); use_char_lower = ((mode & USE_LOWER) == USE_LOWER); use_char_numbers = ((mode & USE_NUMBER) == USE_NUMBER); use_char_symbol = ((mode & USE_SYMBOL) == USE_SYMBOL); setLayout(); fillTexture(); }