/****************************************************************************
* Copyright (C) 2015 Dimok
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
****************************************************************************/
#ifndef GUI_TEXT_H_
#define GUI_TEXT_H_
#include "GuiElement.h"
//!Forward declaration
class FreeTypeGX;
//!Display, manage, and manipulate text in the GUI
class GuiText : public GuiElement
{
public:
//!Constructor
GuiText();
//!\param t Text
//!\param s Font size
//!\param c Font color
GuiText(const char * t, s32 s, const glm::vec4 & c);
//!\overload
//!\param t Text
//!\param s Font size
//!\param c Font color
GuiText(const wchar_t * t, s32 s, const glm::vec4 & c);
//!\overload
//!\Assumes SetPresets() has been called to setup preferred text attributes
//!\param t Text
GuiText(const char * t);
//!Destructor
virtual ~GuiText();
//!Sets the text of the GuiText element
//!\param t Text
virtual void setText(const char * t);
virtual void setText(const wchar_t * t);
virtual void setTextf(const char *format, ...) __attribute__((format(printf,2,3)));
//!Sets up preset values to be used by GuiText(t)
//!Useful when printing multiple text elements, all with the same attributes set
//!\param sz Font size
//!\param c Font color
//!\param w Maximum width of texture image (for text wrapping)
//!\param wrap Wrapmode when w>0
//!\param a Text alignment
static void setPresets(s32 sz, const glm::vec4 & c, s32 w, s32 a);
static void setPresetFont(FreeTypeGX *font);
//!Sets the font size
//!\param s Font size
void setFontSize(s32 s);
//!Sets the maximum width of the drawn texture image
//!If the text exceeds this, it is wrapped to the next line
//!\param w Maximum width
//!\param m WrapMode
void setMaxWidth(s32 w = 0, s32 m = WRAP);
//!Sets the font color
//!\param c Font color
void setColor(const glm::vec4 & c);
void setBlurGlowColor(float blurIntensity, const glm::vec4 & c);
void setTextBlur(float blur) { defaultBlur = blur; }
//!Get the original text as char
virtual const wchar_t * getText() const { return text; }
virtual std::string toUTF8(void) const;
//!Get the Horizontal Size of Text
s32 getTextWidth() { return textWidth; }
s32 getTextWidth(s32 ind);
//!Get the max textwidth
s32 getTextMaxWidth() { return maxWidth; }
//!Get fontsize
s32 getFontSize() { return size; };
//!Set max lines to draw
void setLinesToDraw(s32 l) { linestodraw = l; }
//!Get current Textline (for position calculation)
const wchar_t * getDynText(s32 ind = 0);
virtual const wchar_t * getTextLine(s32 ind) { return getDynText(ind); };
//!Change the font
bool setFont(FreeTypeGX *font);
//! virtual function used in child classes
virtual s32 getStartWidth() { return 0; };
//!Constantly called to draw the text
void draw(CVideo *pVideo);
//! text enums
enum
{
WRAP,
DOTTED,
SCROLL_HORIZONTAL,
SCROLL_NONE
};
protected:
static FreeTypeGX * presentFont;
static s32 presetSize;
static s32 presetMaxWidth;
static float presetInternalRenderingScale;
static s32 presetAlignment;
static GX2ColorF32 presetColor;
//!Clear the dynamic text
void clearDynamicText();
//!Create a dynamic dotted text if the text is too long
void makeDottedText();
//!Scroll the text once
void scrollText(u32 frameCount);
//!Wrap the text to several lines
void wrapText();
wchar_t * text;
std::vector textDyn;
std::vector textDynWidth;
s32 wrapMode; //!< Wrapping toggle
s32 textScrollPos; //!< Current starting index of text string for scrolling
s32 textScrollInitialDelay; //!< Delay to wait before starting to scroll
s32 textScrollDelay; //!< Scrolling speed
s32 size; //!< Font size
s32 maxWidth; //!< Maximum width of the generated text object (for text wrapping)
FreeTypeGX *font;
s32 textWidth;
s32 currentSize;
s32 linestodraw;
glm::vec4 color;
float defaultBlur;
float blurGlowIntensity;
float blurAlpha;
glm::vec4 blurGlowColor;
float internalRenderingScale;
};
#endif