#include "StdAfx.h" #include "RadioButton.h" #include "UIManager.h" #include "UISkinLexer.h" #include "Token.h" #include "Parser.h" #include "UIImage.h" #include "UIContainer.h" #include "FontAgent.h" #include "SoundSystem.h" cRadioButton::cRadioButton( eUINodeType type ) : cButton( type ) , mGroupNum(0) { mpPrev = NULL; mpNext = NULL; mDownSoundIdx = (unsigned long)-1; mProcessEnable = false; } cRadioButton::~cRadioButton() { } void cRadioButton::Hide() { cUINode::Hide(); } bool cRadioButton::OnCreate( cUINodeProperty* pproperty ) { if( cUINode::OnCreate( pproperty ) == false ) return false; mpParent->AddRadio( mGroupNum, this ); return true; } /// ÁÖÀÇ»çÇ× : bool cRadioButton::SetSkin( const cUINodeSkin* pskin ) { if( pskin->IsKindof( eUINODE_RADIOBUTTON ) == false ) { assert( 0 && "not radio button skin type" ); return false; } if( cUINode::SetSkin( pskin ) == false ) { return false; } cRadioButtonSkin* p = (cRadioButtonSkin*)pskin; if( p->mText.IsEmpty() == false ) mText = p->mText; mOriginalTexWidth = mpImage->GetWidth(); mOriginalTexHeight = mpImage->GetHeight(); mGroupNum = p->mGroupNum; /// ¹öưÀÇ À̹ÌÁö º¯È¯ÁÂÇ¥ ÀúÀå mUpPos = p->mUpPos; mDownPos = p->mDownPos; if( p->mUpOverPos.mX == 0 && p->mUpOverPos.mY == 0 ) mUpOverPos = p->mUpPos; else mUpOverPos = p->mUpOverPos; /// ¹öư »óÅÂ ÅØ½ºÆ® Ä÷¯ mUpColor = p->mUpColor; mDownColor = p->mDownColor; /// mDownSoundIdx = p->mDownSoundIdx; /// ÅØ½ºÆ® ÁÂÇ¥ ¾÷µ¥ÀÌÆ® UpdateText(); /// Ãʱâ»óŰ¡ ´­·ÈÀÖ´Ù¸é Àû¿ë SetPress( mPressed ); return true; } /// ÁÖÀÇ»çÇ× : void cRadioButton::OnRender( cUIFontItemKeeper* pKeeper ) { /// À̹ÌÁö ·»´õ¸µ if( mpImage ) mpImage->Draw(); if( mPressed && mText.IsEmpty() == false ) pKeeper->AddFontItem( cFontAgent::eFont_UI, const_cast(mText.Cstr()), mTextPosX, mTextPosY+1, mDownColor, mOutLine ); else pKeeper->AddFontItem( cFontAgent::eFont_UI, const_cast(mText.Cstr()), mTextPosX, mTextPosY, mUpColor, mOutLine ); } /// ÁÖÀÇ»çÇ× : void cRadioButton::OnLButtonDown( const cUIPos&, bool, bool, bool ) { if( !mEnabled || mPressed ) return; /// ºÎ¸ðÀ©µµ¿ì ¾ÕÀ¸·Î ³»º¸³»±â UIMAN->GotoFrontNode( this ); SetPress( true ); SOUNDSYS->Play2DSound( mDownSoundIdx ); } /// ÁÖÀÇ»çÇ× : ¾îµð¼±°¡ SetPress À̺¥Æ®°¡ ¿À¸é, void cRadioButton::SetPress( bool press, bool onsound, bool exceptEnable ) { if( !exceptEnable && !mEnabled ) return; mPressed = press; /// ´­¸²À» Àû¿ë AdjustPress(); if( mPressed == false ) return; if( onsound ) SOUNDSYS->Play2DSound( mDownSoundIdx ); /// ¿¬°á ±×·ì¿¡ Àü´Þ UpdateGroup(); /// À̺¥Æ® ¹ß»ý cUIEvent event; event.mType = eUIEVENT_RADIO_PRESSED; event.mpCaller = this; event.mID = mID; mpParent->HandleEvent( event ); } /// ¶óµð¿À ¹öư °»½ÅÀ» À§ÇÔ void cRadioButton::SetPressNoEvent( bool press, bool onsound ) { if( mEnabled == false ) return; mPressed = press; /// ´­¸²À» Àû¿ë AdjustPress(); if( mPressed == false ) return; if( onsound ) SOUNDSYS->Play2DSound( mDownSoundIdx ); /// ¿¬°á ±×·ì¿¡ Àü´Þ UpdateGroup(); } /// ÁÖÀÇ»çÇ× : void cRadioButton::SetEnabled( bool enabled ) { cUINode::SetEnabled( enabled ); } /// ÁÖÀÇ»çÇ× : void cRadioButton::AdjustPress() { /// À̹ÌÁö °»½Å if( mPressed == true ) { /// ¶óµð¿À ¹öưÀÌ ´­·ÈÀ¸¸é À̹ÌÁö¸¦ °»½ÅÇÑ´Ù mpImage->SetTextureRect( (unsigned short)(mDownPos.mX), (unsigned short)(mDownPos.mY), (unsigned short)(mDownPos.mX + mOriginalTexWidth), (unsigned short)(mDownPos.mY + mOriginalTexHeight) ); } else if( mPressed == false ) { /// ¶óµð¿À ¹öưÀÌ ¾È ´­¸° À̹ÌÁö¸¦ °»½ÅÇÑ´Ù mpImage->SetTextureRect( (unsigned short)(mUpPos.mX), (unsigned short)(mUpPos.mY), (unsigned short)(mUpPos.mX + mOriginalTexWidth), (unsigned short)(mUpPos.mY + mOriginalTexHeight) ); } } /// ÁÖÀÇ»çÇ× : void cRadioButton::UpdateGroup() { /// ¿¬°á ±×·ì¿¡ Àü´Þ cRadioButton* tempNode = this; bool findNode = false; /// prev ¶óµð¿À¹öư °Ë»ç while( tempNode->mpPrev ) { tempNode = tempNode->mpPrev; if( tempNode->IsPress() == true ) { tempNode->SetPress( false ); findNode = true; return; } } /// trueÀΰÍÀÌ ÀÖ¾úÀ¸¸é ¾÷µ¥ÀÌÆ® ÇßÀ¸¹Ç·Î /// next´Â °Ë»çÇÒ ÇÊ¿ä ¾ø´Ù if( findNode ) return; tempNode = this; /// next ¶óµð¿À¹öư °Ë»ç while( tempNode->mpNext ) { tempNode = tempNode->mpNext; if( tempNode->IsPress() == true ) { tempNode->SetPress( false ); return; } } } /// ÁÖÀÇ»çÇ× : ±×·ì³¢¸® ÀÌÁß¿¬°á¸®½ºÆ®·Î ¹­À½ void cRadioButton::Link( cUINode* node ) { if( node == 0 ) return; cRadioButton* addNode = (cRadioButton*)node; cRadioButton* tempNode = this; /// next°¡ null ÀÎ ¶óµð¿À¸¦ ã¾Æ¼­ ¿¬°á while( tempNode->mpNext ) { tempNode = tempNode->mpNext; } addNode->mpNext = tempNode->mpNext; tempNode->mpNext = addNode; addNode->mpPrev = tempNode; } /// ÁÖÀÇ»çÇ× : void cRadioButton::UpdateText() { if( mText ) { /// ÅØ½ºÆ®°¡ »Ñ·ÁÁú À§Ä¡ °è»ê cUIRect rc = GetAbsoluteRect(); /// »Ñ·ÁÁú ÁÂÇ¥ °è»ê mTextPosX = rc.mLeft + (int)((rc.GetWidth() - FONTAGENT->GetTextExtent( cFontAgent::eFont_UI, mText.Cstr(), mText.GetLength()) ) * 0.5f); mTextPosY = rc.mTop + (int)((rc.GetHeight() - FONTAGENT->GetTextHeight(cFontAgent::eFont_UI) ) * 0.5f); } } /// LPCTSTR cRadioButton::GetText() { return ( mText.IsEmpty() ) ? 0 : (LPCTSTR)mText.Cstr(); } /// ÁÖÀÇ»çÇ× : È£¹ö ³ëµå À̺¥Æ® ¹ÞÀ½ void cRadioButton::OnMouseLeft( const cUIPos& pos ) { cUINode::OnMouseLeft( pos ); // ¼Ò½º À̹ÌÁö ¹Ù²Ù±â if( !mPressed && mEnabled == true ) { mpImage->SetTextureRect( (unsigned short)mUpPos.mX, (unsigned short)mUpPos.mY, (unsigned short)(mUpPos.mX + mOriginalTexWidth), (unsigned short)(mUpPos.mY + mOriginalTexHeight) ); } } /// ÁÖÀÇ»çÇ× : È£¹ö ³ëµå À̺¥Æ® ¹ÞÀ½ void cRadioButton::OnMouseHovered( const cUIPos& pos ) { cUINode::OnMouseHovered( pos ); // ¼Ò½º À̹ÌÁö ¹Ù²Ù±â if( !mPressed && mEnabled == true ) { mpImage->SetTextureRect( (unsigned short)mUpOverPos.mX, (unsigned short)mUpOverPos.mY, (unsigned short)(mUpOverPos.mX + mOriginalTexWidth), (unsigned short)(mUpOverPos.mY + mOriginalTexHeight) ); } } ////////////////////////////////////////////////////////////////////////////// cRadioButtonSkin::cRadioButtonSkin( eUINodeType type ) : cUINodeSkin( type ) , mGroupNum(0) , mUpPos(0, 0) , mDownPos(0, 0) , mUpOverPos(0, 0) { mUpColor = mDefaultColor; mDownColor = mDefaultColor; mDownSoundIdx = (unsigned long)-1; } cRadioButtonSkin::~cRadioButtonSkin() { } /// ÁÖÀÇ»çÇ× : ¶óµð¿À ¹öư¿¡¼­ ÇÊ¿äÇÑ ³»¿ë µû·Î ÆÄ½Ì bool cRadioButtonSkin::Load( cParser& parser ) { if( parser.ExpectTokenString( "{" ) == false ) { return false; } cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) { /// ºí·Ï Å»Ãâ ^^ break; } switch( token.mType ) { case eTOKEN_DOWNSOUND: { mDownSoundIdx = parser.ParseInt(); } break; case eTOKEN_UPCOLOR: { /// ´ÙÀ½ ÅäÅ«Àº "(" À̹ǷΠ³Ñ¾î°£´Ù if( parser.ExpectTokenString( "(" ) == false ) return false; unsigned char r = (unsigned char)parser.ParseInt(); unsigned char g = (unsigned char)parser.ParseInt(); unsigned char b = (unsigned char)parser.ParseInt(); if( parser.ExpectTokenString( ")" ) == false ) return false; /// º¯È¯ ( R,G,B ¼ø¼­·Î ) unsigned long color = (unsigned long)( (DWORD)((BYTE)r << 16) | (WORD)((BYTE)g << 8) | (BYTE)b ); /// down Ä÷¯´Â ±âº»À¸·Î up Ä÷¯¶û µ¿ÀÏÇÏ°Ô ÇÑ´Ù mUpColor = mDownColor = color | 0xff000000; } break; case eTOKEN_DOWNCOLOR: { /// ´ÙÀ½ ÅäÅ«Àº "(" À̹ǷΠ³Ñ¾î°£´Ù if( parser.ExpectTokenString( "(" ) == false ) return false; unsigned char r = (unsigned char)parser.ParseInt(); unsigned char g = (unsigned char)parser.ParseInt(); unsigned char b = (unsigned char)parser.ParseInt(); if( parser.ExpectTokenString( ")" ) == false ) return false; /// º¯È¯ ( R,G,B ¼ø¼­·Î ) unsigned long color = (unsigned long)( (DWORD)((BYTE)r << 16) | (WORD)((BYTE)g << 8) | (BYTE)b ); mDownColor = color | 0xff000000; } break; case eTOKEN_GROUPNUM: { mGroupNum = parser.ParseInt(); } break; case eTOKEN_TEXT: { int i = parser.ParseInt(); if( UIMAN->GetUIText( &mText, i ) == false ) { return false; } } break; case eTOKEN_UPPOS: { mUpPos.mX = parser.ParseInt(); mUpPos.mY = parser.ParseInt(); } break; case eTOKEN_DOWNPOS: { mDownPos.mX = parser.ParseInt(); mDownPos.mY = parser.ParseInt(); } break; case eTOKEN_UPOVERPOS: { mUpOverPos.mX = parser.ParseInt(); mUpOverPos.mY = parser.ParseInt(); } break; default: if( cUINodeSkin::ParseLine( parser, token ) == false ) { return false; } break; } } return true; }