#include "StdAfx.h" #include "SkillStepListBox.h" #include "SkillManager.h" #include "SkillIcon.h" #include "FontAgent.h" #include "UIManager.h" #include "InputSystem.h" #include "TipWindow.h" #include "ScrollBar.h" #include "GameUIManager.h" #include "SkillWindow.h" #include "SkillSheetWindow.h" // ½ºÅ³ ´Ü°èº° ¸®½ºÆ® ¹Ú½º Á¤·Ä ÇÔ¼ö bool SkillCompare( const void* arg1, const void* arg2 ) { sRowData* lhs = (sRowData*)arg1; sRowData* rhs = (sRowData*)arg2; sSkillInfoEx* plhsExtraData = (sSkillInfoEx*)lhs->mExtraData; sSkillInfoEx* prhsExtraData = (sSkillInfoEx*)rhs->mExtraData; if( ((sPlayerSkillBaseInfo*)(plhsExtraData->mpSkillInfo))->mSkillIdx > ((sPlayerSkillBaseInfo*)(prhsExtraData->mpSkillInfo))->mSkillIdx ) { return false; } else if( ((sPlayerSkillBaseInfo*)(plhsExtraData->mpSkillInfo))->mSkillIdx == ((sPlayerSkillBaseInfo*)(prhsExtraData->mpSkillInfo))->mSkillIdx ) { if( plhsExtraData->mSkillStep > prhsExtraData->mSkillStep ) { return false; } else return true; } else { return true; } } cSkillStepListBox::cSkillStepListBox( eUINodeType type ) : cListBox( type ) , mSplitSize(200) , mCurrentSplitIndex(0) { mSplitInfo.PushBack(0); } cSkillStepListBox::~cSkillStepListBox() { Clear(); mSkillIconArr.Clear(); mSplitInfo.Clear(); } // ¸®½ºÆ® ¹Ú½º Àüü ¿µ¿ª »èÁ¦ void cSkillStepListBox::Clear() { for( unsigned char i = 0; i < mSkillIconArr.GetSize(); i++ ) { cSkillIcon* pIcon = (cSkillIcon*)mSkillIconArr[i]; if( pIcon ) { pIcon->SetUsedFlag( false ); pIcon->ChangeImage( 0 ); pIcon->SetAniParam( 0 ); pIcon->StopDelay(); } } // °¢ ºÐÇÒ ¿µ¿ª¿¡ ¿ø¼Ò Á¦°Å for( unsigned char iSplit = 0; iSplit < mSplitInfo.GetSize(); iSplit++ ) { ClearSplitRange( iSplit ); } mRows.Clear(); mCurrentSplitIndex = 0; mTopRowIdx = 0; mSelectedRowIdx = 0; mShowImage = true; } unsigned int cSkillStepListBox::GetRowCount() { if( mCurrentSplitIndex >= mSplitInfo.GetSize() ) { assert(0); return 0; } if( mSplitInfo.IsEmpty() ) return 0; unsigned int i = mSplitInfo[ mCurrentSplitIndex ]; return i; } // ¸®½ºÆ®ÀÇ Æ¯Á¤ ±¸°£¸¸ Clear void cSkillStepListBox::ClearSplitRange( unsigned char nSplitIndex ) { // ½ºÅ³ ¾ÆÀÌÄÜ ÃʱâÈ­ for( unsigned char i = 0; i < mSkillIconArr.GetSize(); i++ ) { cSkillIcon* pIcon = (cSkillIcon*)mSkillIconArr[i]; if( pIcon ) { pIcon->SetUsedFlag( false ); pIcon->ChangeImage( 0 ); pIcon->SetAniParam( 0 ); pIcon->StopDelay(); } } // À妽º°¡ ºÐÇÒ °¹¼öº¸´Ù Ŭ¶§ if( mSplitInfo.GetSize() <= nSplitIndex ) { assert(0); return; } mSelectedRowIdx = 0; mTopRowIdx = 0; mHoveredRowIdx = -1; mImageHoveredIdx = -1; mShowImage = true; UpdateScrollBar(); /// ¼±Åù٠if( mpSelectImage ) UpdateSelectImage(); unsigned int nSize = mSplitInfo[ nSplitIndex ]; // ÇØ´ç ¿µ¿ª¿¡ °¹¼ö°¡ 0º¸°¡ À۰ųª if( nSize == 0 ) return; unsigned int startIndex = nSplitIndex * mSplitSize; sRowData* pRowData = NULL; sData* pData = NULL; for( unsigned int i = startIndex; i < startIndex + nSize; i++ ) { pRowData = (sRowData*)mRows[ i ]; if( pRowData != NULL ) { for( unsigned int iData = 0; iData < pRowData->mColumes.GetSize(); iData++ ) { pData = (sData*)pRowData->mColumes[ iData ]; if( pData != NULL ) { SAFE_DELETE( pData ); } } SAFE_DELETE( pRowData->mExtraData ); SAFE_DELETE( pRowData ); } } mSplitInfo[ nSplitIndex ] = 0; } // ºÐÇÒ °³¼ö, °¢ ºÐÇÒ ¿µ¿ª Å©±â void cSkillStepListBox::CreateSplitSize( unsigned char nSplitCnt, unsigned int nSplitSize ) { mRows.Resize( nSplitCnt * nSplitSize ); mSplitInfo.Resize( nSplitCnt ); for( int i = 0; i < nSplitCnt; i++ ) mSplitInfo[i] = 0; mSplitSize = nSplitSize; // ºÐÇÒ ¿µ¿ª Å©±â } /// ½ºÅ³ ¾ÆÀÌÄÜ N°³ »ý¼º void cSkillStepListBox::CreateSkillICon( unsigned char nCount ) { cListBoxSkin* pStepListSkin = (cListBoxSkin*)mpSkin; if( !pStepListSkin ) { assert(0); return; } int nIconPos = pStepListSkin->mpImgParam->mColumnX; int nRowHeight = pStepListSkin->mRowHeight; for( unsigned char i = 0; i < nCount; ++i ) { cSkillIcon *pIcon = new cSkillIcon; if( pIcon->CreateBySkinName( "SkillIcon", this, i ) == false ) return; pIcon->SetRelativePos( cUIPos( nIconPos, ( nRowHeight ) * i + 4 ) ); pIcon->ChangeImage( 0 ); pIcon->SetUsedFlag(false); mSkillIconArr.PushBack( pIcon ); } } // ·»´õ µ¥ÀÌŸ( ½ºÅ³ ½ºÆ®¸µ Á¤º¸ ) ¼³Á¤ void cSkillStepListBox::RenderData( cUIFontItemKeeper* pKeeper ) { if( mCurrentSplitIndex >= mSplitInfo.GetSize() ) { assert(0); return; } // ÇöÀç ¿µ¿ª¿¡ »çÀÌÁî°¡ 0º¸´Ù ÀÛ´Ù¸é! if( mSplitInfo[ mCurrentSplitIndex ] <= 0 ) return; /// ½ºÅ² ¹Þ¾Æ¿À±â cListBoxSkin* pListSkin = (cListBoxSkin*)mpSkin; if( !pListSkin ) return; sListCtrlParam* pParam = pListSkin->GetCtrlParam( 0 ); if( !pParam ) return; int textposX = 0; int textPosY = 0; unsigned int tX = pParam->mColumnX; unsigned int tW = pParam->mColumnW; eText_Align align = pParam->mAlign; unsigned int nCurrentSplitSize = mSplitInfo[ mCurrentSplitIndex ]; unsigned int nStartIndex = mCurrentSplitIndex * mSplitSize; for( unsigned int i = 0;i= nStartIndex+nCurrentSplitSize ) break; cSkillIcon *pSkillIcon = (cSkillIcon*)mSkillIconArr[i]; if( pSkillIcon == 0 ) { assert(0); continue; } sRowData* rData = (sRowData*)mRows[ row ]; if( rData == 0 ) { assert(0); pSkillIcon->ChangeImage( 0 ); continue; } sSkillInfoEx *pSkillInfo = (sSkillInfoEx*)rData->mExtraData; if( pSkillInfo == 0 ) { assert(0); pSkillIcon->ChangeImage( 0 ); continue; } /// ½ºÅ³ À̸§ ¹× ÇÊ¿ä ½Àµæ ·¹º§, °­È­ ´Ü°è Ç¥½Ã ÅØ½ºÆ® Ç¥½Ã unsigned int colCount = rData->mColumes.GetSize(); for( unsigned int col = 0; col< colCount; ++col ) { sData* data = rData->mColumes[col]; if( !data ) continue; const cUIRect& rect = pSkillIcon->GetAbsoluteRect(); unsigned int strWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_UI, (LPTSTR)data->mText.Cstr(), data->mText.GetLength() ); textposX = UpdateTextPos( align, strWidth, tX, tW ); textPosY = rect.mTop; textPosY += (FONTAGENT->GetTextHeight(cFontAgent::eFont_System) * col + 2); /// Hover µÈ ¾ÆÀÌÅÛÀº ´Ù¸¥ »öÀ¸·Î Ç¥½Ã unsigned long color = data->mTextColor; if( mHoveredRowIdx != -1 && row - mTopRowIdx == (unsigned int)mHoveredRowIdx ) color = COLOR_RED; pKeeper->AddFontItem( cFontAgent::eFont_System, (LPTSTR)data->mText.Cstr(), textposX, textPosY, color ); } } } // ¸®½ºÆ® ¹Ú½º Row º¯°æ½Ã ½ºÅ³ ¾ÆÀÌÄÜ Àç ¼³Á¤ void cSkillStepListBox::UpdateIConListInfo() { if( mCurrentSplitIndex >= mSplitInfo.GetSize() ) { assert(0); return; } cSkillWindow *pSkillWin = GAMEUI->GetSkillWindow(); if( !pSkillWin ) return; cSkillSheetWindow* pSheetWin = (cSkillSheetWindow*)pSkillWin->GetCurrentSheet(); if( !pSheetWin ) return; if( pSheetWin->GetJobIdx() == 0 ) return; unsigned int nCurrentSplitSize = mSplitInfo[ mCurrentSplitIndex ]; unsigned int nStartIndex = mCurrentSplitIndex * mSplitSize; for( unsigned int i = 0; i< mSkillIconArr.GetSize(); i++ ) { cSkillIcon *pSkillIcon = (cSkillIcon*)mSkillIconArr[i]; if( pSkillIcon == 0 ) { assert(0); continue; } unsigned int row = nStartIndex + mTopRowIdx + i; if( row >= nStartIndex+nCurrentSplitSize ) { pSkillIcon->ChangeImage( 0 ); continue; } sRowData* rData = (sRowData*)mRows[ row ]; if( rData == 0 ) { assert(0); pSkillIcon->ChangeImage( 0 ); continue; } sSkillInfoEx *pSkillInfo = (sSkillInfoEx*)rData->mExtraData; if( pSkillInfo == 0 ) { assert(0); pSkillIcon->ChangeImage( 0 ); continue; } cIconParam* pIconParam = UIMAN->GetIconParam( pSkillInfo->mpSkillInfo->mIconIdx ); if( pIconParam ) { pSkillIcon->SetSkillInfo( pSkillInfo->mpSkillInfo->mSkillIdx, pSkillInfo->mSkillStep, pSheetWin->GetJobIdx(), eTIP_SKILL ); pSkillIcon->ChangeImage( pIconParam ); pSkillIcon->SetUsedFlag( true ); pSkillIcon->SetColor( NiColorA::WHITE ); } cSkillIcon *pSkillIconAtSheetWin = pSheetWin->GetSkillIcon( pSkillInfo->mpSkillInfo->mSkillIdx ); if( pSkillIconAtSheetWin ) { pSkillIcon->ChangeGauge( pSkillIconAtSheetWin->GetGauge() ); pSkillIcon->SetAniParam( pSkillIconAtSheetWin->GetAniParam() ); } } } // ÇØ»óµµ º¯°æ½Ã ¾ÆÀÌÄÜ À§Ä¡ °ª Àç ¼³Á¤ void cSkillStepListBox::UpdateSkin() { cListBox::UpdateSkin(); cListBoxSkin* pStepListSkin = (cListBoxSkin*)mpSkin; if( !pStepListSkin ) { assert(0); return; } int nIconPos = pStepListSkin->mpImgParam->mColumnX; int nRowHeight = pStepListSkin->mRowHeight; // ½ºÅ³ ¾ÆÀÌÄÜ 10°³ »ý¼º for( u_int i = 0; i < mSkillIconArr.GetSize(); ++i ) { cSkillIcon* pSkillIcon = (cSkillIcon*)mSkillIconArr[i]; if( !pSkillIcon ) continue; pSkillIcon->SetRelativePos( cUIPos( nIconPos, ( nRowHeight ) * i + 4 ) ); } } //=========================================================== // ƯÁ¤ ¿µ¿ª¿¡ °¡Àå ¸¶Áö¸· À§Ä¡¿¡ ¿ø¼Ò »ðÀÔ // // nSplitIndex (ºÐÇÒ ¿µ¿ª À妽º) //=========================================================== int cSkillStepListBox::AddRowAt( unsigned char nSplitIndex, LPCTSTR str, unsigned long color, void* pExtraData ) { // ºÐÇÒ Àε¥½º°¡ À߸ø µÇ¾ú°Å³ª if( nSplitIndex >= mSplitInfo.GetSize() ) { assert(0); return -1; } // ÇöÀç ¿µ¿ª ¿ø¼Ò °¹¼ö unsigned int nCurrentSplitCnt = mSplitInfo[nSplitIndex]; // ºÐÇÒ ¿µ¿ªÀÇ ¿ø¼Ò °¹¼ö°¡ ºÐÇÒ »çÀÌÁî º¸´Ù Ŭ¶§ if( nCurrentSplitCnt >= mSplitSize ) { return -1; } // Data »ý¼º sData* colData = new sData; colData->mText = str; colData->mTextColor = color; /// ¶óÀÎ Á¤º¸ »ý¼º sRowData* rowData = new sRowData; rowData->mColumes.PushBack( colData ); if( pExtraData ) { rowData->mExtraData = pExtraData; } // ƯÁ¤ À§Ä¡¿¡ »ðÀÔ unsigned int nStartIndex = nSplitIndex * mSplitSize; mRows[ nStartIndex + nCurrentSplitCnt ] = rowData; mSplitInfo[ nSplitIndex ]++; UpdateScrollBar(); if( mpSelectImage ) UpdateSelectImage(); return (nStartIndex + nCurrentSplitCnt); } void cSkillStepListBox::Sort() { if( mCurrentSplitIndex >= mSplitInfo.GetSize() ) { assert(0); return; } //ÁöÁ¤ÇÑ ºÐÇÒ ¿µ¿ªÀÇ ¿ø¼Ò °¹¼ö if( GetRowCount() > 1) { unsigned int nStartIndex = mCurrentSplitIndex * mSplitSize; unsigned int nEndIndex = nStartIndex + mSplitInfo[ mCurrentSplitIndex ]; cRowDataArray::cIterator iStart = mRows.Begin(); cRowDataArray::cIterator iEnd = mRows.Begin(); iStart += nStartIndex; iEnd += nEndIndex; ::Sort( iStart, iEnd, SkillCompare ); } } void cSkillStepListBox::OnIconDragged( cUINode* caller, unsigned int id, const cUIPos& pos, bool shift ) { SendEvent( mpParent, eUIEVENT_ICON_DRAGGED, caller, id, shift ); } void cSkillStepListBox::OnIconDoubleClicked( cUINode* caller, unsigned int id ) { SendEvent( mpParent, eUIEVENT_ICON_DOUBLECLICKED, caller, id ); } void cSkillStepListBox::OnIconClicked( cUINode* caller, unsigned int id) { OnLButtonDown( cUIPos(MOUSE->GetMouseX(), MOUSE->GetMouseY()), false, false, false ); } void cSkillStepListBox::OnMouseWheel( const cUIPos& pos, int wheel ) { cListBox::OnMouseWheel( pos, wheel ); // ¸®½ºÆ® ¹Ú½º Row°ª º¯°æÀ¸·Î ¾ÆÀÌÄÜ Àç ¼³Á¤ UpdateIConListInfo(); } void cSkillStepListBox::OnScrollbarMoved( const cUIPos& pos ) { cListBox::OnScrollbarMoved( pos ); // ¸®½ºÆ® ¹Ú½º Row°ª º¯°æÀ¸·Î ¾ÆÀÌÄÜ Àç ¼³Á¤ UpdateIConListInfo(); } void cSkillStepListBox::CheckButtonEvent( unsigned int id ) { cListBox::CheckButtonEvent( id ); // ¸®½ºÆ® ¹Ú½º Row°ª º¯°æÀ¸·Î ¾ÆÀÌÄÜ Àç ¼³Á¤ UpdateIConListInfo(); } void cSkillStepListBox::OnLButtonDoubleClick( const cUIPos& pos ) { cUINode::OnLButtonDoubleClick( pos ); if( mCurrentSplitIndex >= mSplitInfo.GetSize() ) { assert(0); return; } unsigned int nStartIndex = mCurrentSplitIndex * mSplitSize; unsigned int row = (pos.mY - GetAbsoluteRect().mTop) / mRowHeight + mTopRowIdx + nStartIndex; if( row >= GetRowCount() ) return; mSelectedRowIdx = row; mHoveredRowIdx = row - mTopRowIdx; if( mHoveredRowIdx < 0 || mHoveredRowIdx >= (int)mSkillIconArr.GetSize() ) { assert(0); return; } cSkillIcon* pIcon = (cSkillIcon*)mSkillIconArr[mHoveredRowIdx]; if( pIcon != NULL ) { /// À̺¥Æ® º¸³»±â cUIEvent event; event.mType = eUIEVENT_LISTBOX_SELECTED; event.mpCaller = pIcon; event.mID = mID; mpParent->HandleEvent( event ); } /// ¸¶¿ì½º¸¦ ´­·¯ ¼±ÅÃÇÑ ºÎºÐÀº ´Ù¸£°Ô Ä¥ÇÑ´Ù if( mpSelectImage ) { UpdateSelectImage(); CheckShowImage(); } }