[f809ae6] | 1 | #ifndef _UI_VALUE_HPP
|
---|
| 2 | #define _UI_VALUE_HPP
|
---|
| 3 |
|
---|
| 4 | #include <sstream>
|
---|
| 5 | #include <stdint.h>
|
---|
| 6 | #include <string>
|
---|
| 7 |
|
---|
| 8 | #include <SDL2/SDL.h>
|
---|
| 9 | #include <SDL2/SDL_ttf.h>
|
---|
| 10 |
|
---|
| 11 | #include "ui-element.hpp"
|
---|
| 12 |
|
---|
| 13 | template<class T>
|
---|
| 14 | class UIValue : public UIElement {
|
---|
| 15 | public:
|
---|
| 16 | UIValue(int x, int y, string label, T& value, TTF_Font* font, uint32_t textColor,
|
---|
| 17 | SDL_Renderer& renderer);
|
---|
| 18 | ~UIValue() override;
|
---|
| 19 |
|
---|
| 20 | void render(int x, int y) override;
|
---|
| 21 |
|
---|
| 22 | private:
|
---|
| 23 | string label;
|
---|
| 24 | T* value;
|
---|
| 25 | T oldValue;
|
---|
| 26 |
|
---|
| 27 | TTF_Font* font;
|
---|
| 28 | SDL_Color textColor;
|
---|
| 29 |
|
---|
| 30 | SDL_Texture* texture;
|
---|
| 31 |
|
---|
| 32 | void createTexture();
|
---|
| 33 | };
|
---|
| 34 |
|
---|
| 35 | template<class T>
|
---|
| 36 | UIValue<T>::UIValue(int x, int y, string label, T& value, TTF_Font* font, uint32_t textColor,
|
---|
| 37 | SDL_Renderer& renderer) :
|
---|
| 38 | UIElement(x, y, 0, 0, renderer, nullptr, nullptr, nullptr),
|
---|
| 39 | label(label), value(&value), oldValue(value), font(font), texture(nullptr) {
|
---|
| 40 | this->textColor = {
|
---|
| 41 | static_cast<Uint8>((textColor >> 24) & 0xFF),
|
---|
| 42 | static_cast<Uint8>((textColor >> 16) & 0xFF),
|
---|
| 43 | static_cast<Uint8>((textColor >> 8) & 0xFF),
|
---|
| 44 | static_cast<Uint8>(textColor & 0xFF)
|
---|
| 45 | };
|
---|
| 46 |
|
---|
| 47 | this->createTexture();
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | template<class T>
|
---|
| 51 | UIValue<T>::~UIValue() {
|
---|
| 52 | if (this->texture != nullptr) {
|
---|
| 53 | SDL_DestroyTexture(this->texture);
|
---|
| 54 | this->texture = nullptr;
|
---|
| 55 | }
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | template<class T>
|
---|
| 59 | void UIValue<T>::createTexture() {
|
---|
| 60 | // destroy the old texture before re-creating it
|
---|
| 61 | if (this->texture != nullptr) {
|
---|
| 62 | SDL_DestroyTexture(this->texture);
|
---|
| 63 | this->texture = nullptr;
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | ostringstream oss;
|
---|
| 67 | oss << label << *this->value;
|
---|
| 68 |
|
---|
| 69 | string text = oss.str();
|
---|
| 70 |
|
---|
| 71 | SDL_Surface* surface = TTF_RenderText_Blended(this->font, text.c_str(),
|
---|
| 72 | this->textColor);
|
---|
| 73 | if (surface == nullptr) {
|
---|
| 74 | cout << "Unable to render text surface! SDL_ttf Error: " << TTF_GetError() << endl;
|
---|
| 75 | }
|
---|
| 76 |
|
---|
| 77 | this->texture = SDL_CreateTextureFromSurface(&this->renderer, surface);
|
---|
| 78 | if (this->texture == nullptr) {
|
---|
| 79 | cout << "Unable to create texture from rendered text! SDL Error: " << SDL_GetError() << endl;
|
---|
| 80 | // SDL_FreeSurface(surface);
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | SDL_FreeSurface(surface);
|
---|
| 84 |
|
---|
| 85 | TTF_SizeText(this->font, text.c_str(), &this->width, &this->height);
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | template<class T>
|
---|
| 89 | void UIValue<T>::render(int x, int y) {
|
---|
| 90 | if (this->oldValue != *this->value) {
|
---|
| 91 | this->createTexture();
|
---|
| 92 | this->oldValue = *this->value;
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | SDL_Rect rect = {
|
---|
| 96 | this->x + x,
|
---|
| 97 | this->y + y,
|
---|
| 98 | this->width,
|
---|
| 99 | this->height
|
---|
| 100 | };
|
---|
| 101 |
|
---|
| 102 | SDL_RenderCopy(&this->renderer, this->texture, nullptr, &rect);
|
---|
| 103 | }
|
---|
| 104 |
|
---|
| 105 | #endif // _UI_VALUE_HPP
|
---|