reorganize files and add btgui
This commit is contained in:
114
btgui/Gwen/Controls/Text.cpp
Normal file
114
btgui/Gwen/Controls/Text.cpp
Normal file
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user