00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "Common/Time.h"
00012 #include "Render/Render.h"
00013 #include "Render/Font.h"
00014 #include "Interface/Interface.h"
00015 #include "Interface/Edit.h"
00016
00017
00018 KEdit::KEdit( KWin* pFather, KFPt& Pos, KFPt& Size, KInterface* pInterface, char* pText, bool bPassword )
00019 : KWin( pFather, Pos, Size, pInterface, 0, pText )
00020 {
00021 m_bEditing = false;
00022 m_bPassword = bPassword;
00023
00024 m_ShaderId = KSHADER_NO;
00025 }
00026
00027
00028 KEdit::~KEdit()
00029 {
00030 }
00031
00032
00033 void KEdit::Display()
00034 {
00035 u8 FadeAlpha = (u8)(255.0f * GetFade());
00036
00037 KCOLOR Color = KRGBA( 255, 255, 200, FadeAlpha );
00038 float pTU[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
00039 float pTV[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
00040 KPt TextOffset( 0, 0 );
00041
00042 if( IsInside( GetMousePos() ) )
00043 {
00044 Color = KRGBA( 255, 200, 200, FadeAlpha );
00045 if( m_pInterface->GetpMouse()->IsLButtonDown() )
00046 {
00047 m_pInterface->SetpFocus( this );
00048 }
00049 }
00050
00051 float dtexelu = 0.5f / 64.0f;
00052 float dtexelv = 0.5f / 64.0f;
00053 KFPt TexSize = GetFloatPoint( KPt( 32, 32 ) );
00054
00055
00056 pTU[0] = 0.0f + dtexelu; pTV[0] = 0.5f + dtexelv;
00057 pTU[1] = 0.5f + dtexelu; pTV[1] = 0.5f + dtexelv;
00058 pTU[2] = 0.0f + dtexelu; pTV[2] = 0.0f + dtexelv;
00059 pTU[3] = 0.5f + dtexelu; pTV[3] = 0.0f + dtexelv;
00060 DrawQuad( m_Pos.x, m_Pos.y, TexSize.x, TexSize.y, m_ShaderId, KRGBA( 255, 255, 255, FadeAlpha ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00061
00062 pTU[0] = 0.5f + dtexelu; pTV[0] = 0.5f + dtexelv;
00063 pTU[1] = 1.0f + dtexelu; pTV[1] = 0.5f + dtexelv;
00064 pTU[2] = 0.5f + dtexelu; pTV[2] = 0.0f + dtexelv;
00065 pTU[3] = 1.0f + dtexelu; pTV[3] = 0.0f + dtexelv;
00066 DrawQuad( m_Pos.x + m_Size.x - TexSize.x, m_Pos.y, TexSize.x, TexSize.y, m_ShaderId, KRGBA( 255, 255, 255, FadeAlpha ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00067
00068 pTU[0] = 0.0f + dtexelu; pTV[0] = 1.0f + dtexelv;
00069 pTU[1] = 1.0f + dtexelu; pTV[1] = 1.0f + dtexelv;
00070 pTU[2] = 0.0f + dtexelu; pTV[2] = 0.5f + dtexelv;
00071 pTU[3] = 1.0f + dtexelu; pTV[3] = 0.5f + dtexelv;
00072 DrawQuad( m_Pos.x + TexSize.x, m_Pos.y, m_Size.x - TexSize.x * 2.0f, TexSize.y, m_ShaderId, KRGBA( 255, 255, 255, FadeAlpha ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00073
00074 char pNewText[1024];
00075 KASSERT( strlen( m_pText ) < sizeof( pNewText ) );
00076
00077 strcpy( pNewText, m_pText );
00078
00079 if( m_bPassword )
00080 {
00081 for( u32 i = 0; i < strlen( pNewText ); i ++ )
00082 {
00083 pNewText[i] = '*';
00084 }
00085 }
00086
00087 if( m_bEditing )
00088 {
00089 Color = KRGBA( 255, 200, 200, FadeAlpha );
00090 if( ( (g_Time.GetTime() / 500) % 2 ) )
00091 {
00092 strcat( pNewText, "_" );
00093 }
00094 }
00095
00096 KFPt Border = GetFloatPoint( KPt( 16, 10 ) );
00097 KFPt TextSize = GetFloatPoint( m_pRender->GetpFont()->GetTextSize( pNewText ) );
00098
00099 m_pRender->DrawText( GetIntPoint( KFPt( m_Pos.x + Border.x, m_Pos.y + Border.y ) ), pNewText, Color );
00100 }
00101
00102
00103 void KEdit::OnSetFocus()
00104 {
00105 m_bEditing = true;
00106 }
00107
00108
00109 void KEdit::OnLostFocus()
00110 {
00111 m_bEditing = false;
00112 }
00113
00114
00115 bool KEdit::OnKeyDown( u32 VirtKey, u32 KeyData )
00116 {
00117 if( m_bEditing )
00118 {
00119 switch( VirtKey )
00120 {
00121 case VK_RETURN:
00122 m_bEditing = false;
00123 break;
00124 case VK_BACK:
00125 {
00126 if( strlen( m_pText ) < 1 )
00127 break;
00128
00129 char* pTmpText = (char*)malloc( strlen( m_pText ) );
00130
00131 strncpy( pTmpText, m_pText, strlen( m_pText ) - 1 );
00132 pTmpText[strlen( m_pText ) - 1] = '\0';
00133 Freep( m_pText );
00134 m_pText = pTmpText;
00135 break;
00136 }
00137 default:
00138 if( ( KeyData >= 0x20 ) && ( KeyData <= 0xff ) )
00139 {
00140 char* pTmpText = (char*)malloc( strlen( m_pText ) + 2 );
00141
00142 sprintf( pTmpText, "%s%c", m_pText, (unsigned char)KeyData );
00143 Freep( m_pText );
00144 m_pText = pTmpText;
00145 break;
00146 }
00147 }
00148
00149 return true;
00150 }
00151
00152 return false;
00153 }
00154
00155
00156 void KEdit::Load()
00157 {
00158 KWin::Load();
00159
00160 m_ShaderId = m_pRender->GetpShaderBank()->LoadShader( "GUI/Edit" );
00161 }
00162
00163
00164 void KEdit::Unload()
00165 {
00166 KWin::Unload();
00167
00168 m_pRender->GetpShaderBank()->UnloadShader( m_ShaderId );
00169 }