/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Gwen.h" #include "Gwen/Controls/Text.h" #include "Gwen/Skin.h" #include "Gwen/Utility.h" using namespace Gwen; using namespace Gwen::ControlsInternal; GWEN_CONTROL_CONSTRUCTOR(Text) { m_Font = NULL; m_Color = Gwen::Colors::Black; // TODO: From skin somehow.. SetMouseInputEnabled(false); } Text::~Text() { // NOTE: This font doesn't need to be released // Because it's a pointer to another font somewhere. } void Text::RefreshSize() { if (!GetFont()) { Debug::AssertCheck(0, "Text::RefreshSize() - No Font!!\n"); return; } Gwen::Point p(1, GetFont()->size); if (Length() > 0) { p = GetSkin()->GetRender()->MeasureText(GetFont(), m_String); } if (p.x == Width() && p.y == Height()) return; SetSize(p.x, p.y); InvalidateParent(); Invalidate(); } Gwen::Font* Text::GetFont() { return m_Font; } void Text::SetString(const UnicodeString& str) { m_String = str; Invalidate(); } void Text::SetString(const String& str) { SetString(Gwen::Utility::StringToUnicode(str)); } void Text::Render(Skin::Base* skin) { if (Length() == 0 || !GetFont()) return; skin->GetRender()->SetDrawColor(m_Color); skin->GetRender()->RenderText(GetFont(), Gwen::Point(0, 0), m_String); } void Text::Layout(Skin::Base* /*skin*/) { RefreshSize(); } Gwen::Point Text::GetCharacterPosition(int iChar) { if (Length() == 0 || iChar == 0) { return Gwen::Point(1, 0); } UnicodeString sub = m_String.substr(0, iChar); Gwen::Point p = GetSkin()->GetRender()->MeasureText(GetFont(), sub); if (p.y >= m_Font->size) p.y -= m_Font->size; return p; } int Text::GetClosestCharacter(Gwen::Point p) { int iDistance = 4096; int iChar = 0; for (size_t i = 0; i < m_String.length() + 1; i++) { Gwen::Point cp = GetCharacterPosition(i); int iDist = abs(cp.x - p.x) + abs(cp.y - p.y); // this isn't proper if (iDist > iDistance) continue; iDistance = iDist; iChar = i; } return iChar; } void Text::OnScaleChanged() { Invalidate(); }