1301 lines
37 KiB
C++
1301 lines
37 KiB
C++
#include "StdAfx.h"
|
|
#include <wx/wx.h>
|
|
#include "cwxTimeLineCtrl.h"
|
|
|
|
//IMPLEMENT_DYNAMIC_CLASS( cwxTimeLineCtrl, wxControl );
|
|
|
|
const int DEFAULT_ITEM_VERTICAL_LINE = 150;
|
|
const int DEFAULT_TIME_LINE_WIDTH = 300;
|
|
const int DEFAULT_TIME_LINE_HEIGHT = 200;
|
|
const float DEFAULT_PIXEL_STEP = 10.0f;
|
|
const int SCROLL_PIXEL_PER_UNIT_X = 10;
|
|
const int SCROLL_PIXEL_PER_UNIT_Y = 10;
|
|
const int DEFAULT_FONT_SIZE = 7;
|
|
const int HORIZON_RULER_LINE_Y_OFFSET = 15;
|
|
const int HORIZON_RULER_LONG_GRADUATE_SIZE = 10; // ÀÚÀÇ ±ä ´«±Ý »çÀÌÁî
|
|
const int HORIZON_RULER_SHORT_GRADUATE_SIZE = 5;
|
|
const int DEFAULT_TIME_BAR_BOX_WIDTH = 50;
|
|
const int DEFAULT_TIME_BAR_BOX_HEIGHT = 16;
|
|
const int DEFAULT_OBJECT_BOX_HEIGHT = 20;
|
|
|
|
|
|
|
|
BEGIN_EVENT_TABLE( cwxTimeLineCtrl, wxScrolledWindow )
|
|
EVT_PAINT( cwxTimeLineCtrl::OnPaint )
|
|
EVT_SCROLLWIN( cwxTimeLineCtrl::OnScroll )
|
|
EVT_SIZE( cwxTimeLineCtrl::OnResize )
|
|
EVT_MOUSE_EVENTS( cwxTimeLineCtrl::OnMouseEvent )
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
cwxTimeLineCtrl::cwxTimeLineCtrl( void )
|
|
{
|
|
SetBackgroundColour(wxColour(wxT("WHITE")));
|
|
}
|
|
|
|
|
|
cwxTimeLineCtrl::cwxTimeLineCtrl( wxWindow* pParent, wxWindowID id ) : wxScrolledWindow( pParent, id, wxDefaultPosition, wxDefaultSize,
|
|
wxSUNKEN_BORDER |
|
|
wxNO_FULL_REPAINT_ON_RESIZE |
|
|
wxVSCROLL | wxHSCROLL ),
|
|
m_dwWidth( DEFAULT_TIME_LINE_WIDTH ),
|
|
m_dwHeight( DEFAULT_TIME_LINE_HEIGHT ),
|
|
m_fOriRulerPixelStep( DEFAULT_PIXEL_STEP ),
|
|
m_fViewSize( 1.0f ),
|
|
m_dwItemVerticalOffset( DEFAULT_ITEM_VERTICAL_LINE ),
|
|
m_pSelectedObjectInfo( NULL ),
|
|
m_iLastClkXPos( 0 ),
|
|
m_bIsLBtnDown( false ),
|
|
m_iSelectedObjectPart( OBJECT_NOT_SELECTED ),
|
|
m_fScale( 1.0f ),
|
|
//m_dwNowTimeBarPosByUnit( 0 ),
|
|
m_fNowTimeBarPosByPixel( 0 ),
|
|
m_bTimeBarClked( false ),
|
|
m_bShowTimeLineAsFloat( false ),
|
|
m_bEnable( true ),
|
|
m_dwObjectDrawStyle( TL_SHOW_OBJECT_TIME_LENGTH | TL_SHOW_OBJECT_NAME ),
|
|
m_dwLastPaintTime( timeGetTime() ),
|
|
m_bMoved( false ),
|
|
m_iOnOverYLineIndex( 0 ),
|
|
m_fMousePosTime( 0.0f ),
|
|
m_iXScrollOffset( 0 ),
|
|
m_iYScrollOffset( 0 ),
|
|
m_bNeedUpdateOffset( false )
|
|
{
|
|
SetBackgroundStyle( wxBG_STYLE_CUSTOM );
|
|
SetBackgroundColour(wxColour(wxT("WHITE")));
|
|
|
|
// ½ºÅ©·Ñ ¹Ù °è»ê
|
|
//_UpdateScrollBar();
|
|
|
|
// for testing..
|
|
//SetViewScale( 1.5f );
|
|
_UpdateViewScale();
|
|
|
|
// À¯´Ö »çÀÌÁ ÁöÁ¤ÇÏ´Â ÇÔ¼ö´Â ¾×¼ÇÀÌ Ãß°¡µÇ±â Àü¿¡ ¹Ýµå½Ã ¸ÕÀú È£ÃâµÇ¾î¾ß ÇÔ.
|
|
//SetScale( 10 );
|
|
|
|
//AddActorObject( wxString(wxT("Test Object")), wxColour(wxT("BLUE")) );
|
|
//AddObject( wxString(wxT("Test Object")), wxString(wxT("Some Object")), 10 );
|
|
//AddObject( wxString(wxT("Test Object")), wxString(wxT("Some Object1")), 2 );
|
|
|
|
//DelObject( wxString(wxT("Test Object")), wxString(wxT("Some Object")) );
|
|
|
|
//AddActorObject( wxString(wxT("Test Object 1")), wxColour(wxT("BLUE")) );
|
|
//AddObject( wxString(wxT("Test Object 1")), wxString(wxT("Some Object2")), 13 );
|
|
|
|
//AddActorObject( wxString(wxT("Test Object 2")), wxColour(wxT("BLUE")) );
|
|
//AddObject( wxString(wxT("Test Object 2")), wxString(wxT("Some Object3")), 5 );
|
|
|
|
//AddActorObject( wxString(wxT("Test Object 3")), wxColour(wxT("BLUE")) );
|
|
//AddObject( wxString(wxT("Test Object 3")), wxString(wxT("Some Object4")), 20 );
|
|
|
|
//UpdateTimeBar( 8 );
|
|
}
|
|
|
|
cwxTimeLineCtrl::~cwxTimeLineCtrl(void)
|
|
{
|
|
for_each( m_vlpItemInfo.begin(), m_vlpItemInfo.end(),
|
|
DeleteData<S_ITEM_INFO*>() );
|
|
}
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::SetStyle( DWORD dwStyle )
|
|
{
|
|
m_dwObjectDrawStyle = dwStyle;
|
|
}
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::Clear( void )
|
|
{
|
|
m_dwWidth = DEFAULT_TIME_LINE_WIDTH;
|
|
m_dwHeight = DEFAULT_TIME_LINE_HEIGHT;
|
|
//m_dwRulerPixelStep = DEFAULT_PIXEL_STEP;
|
|
//m_fViewSize = 1.0f;
|
|
m_dwItemVerticalOffset = DEFAULT_ITEM_VERTICAL_LINE;
|
|
m_pSelectedObjectInfo = NULL;
|
|
m_iLastClkXPos = 0;
|
|
m_bIsLBtnDown = false;
|
|
m_iSelectedObjectPart = OBJECT_NOT_SELECTED;
|
|
m_fScale = 1.0f;
|
|
//m_dwNowTimeBarPosByUnit = 0;
|
|
m_fNowTimeBarPosByPixel = 0.0f;
|
|
m_bTimeBarClked = false;
|
|
m_bShowTimeLineAsFloat = false;
|
|
m_strUnitName.clear();
|
|
|
|
for_each( m_vlpItemInfo.begin(), m_vlpItemInfo.end(),
|
|
DeleteData<S_ITEM_INFO*>() );
|
|
|
|
m_mapItemInfo.clear();
|
|
m_vlpItemInfo.clear();
|
|
m_vlpObjects.clear();
|
|
}
|
|
|
|
|
|
bool cwxTimeLineCtrl::Enable(bool bEnable /* = true */)
|
|
{
|
|
m_bEnable = bEnable;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void cwxTimeLineCtrl::OnResize( wxSizeEvent& SizeEvent )
|
|
{
|
|
_UpdateScrollBar();
|
|
}
|
|
|
|
|
|
|
|
float cwxTimeLineCtrl::GetNextObjectStartTime( const wxChar* pActorName )
|
|
{
|
|
float fResult = 0.0f;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( wxString(pActorName) );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
vector<S_OBJECT_INFO*>& vlObjects = iter->second->m_vlObjectInfo;
|
|
int iNumObject = (int)vlObjects.size();
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pObjectInfo = vlObjects.at( iObject );
|
|
|
|
if( fResult < pObjectInfo->fEndTime )
|
|
fResult = pObjectInfo->fEndTime;
|
|
}
|
|
}
|
|
|
|
return fResult;
|
|
}
|
|
|
|
|
|
float cwxTimeLineCtrl::GetPrevObjectEndTime( const wxChar* pActorName, int iID )
|
|
{
|
|
float fResult = 0.0f;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( wxString(pActorName) );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
vector<S_OBJECT_INFO*>& vlObjects = iter->second->m_vlObjectInfo;
|
|
S_OBJECT_INFO* pDestObject = NULL;
|
|
int iNumObject = (int)vlObjects.size();
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pObjectInfo = vlObjects.at( iObject );
|
|
if( pObjectInfo->iID == iID )
|
|
{
|
|
pDestObject = pObjectInfo;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( pDestObject )
|
|
{
|
|
float fNearestEndTime = 0.0f;
|
|
float fNearestDistance = 999999999.0f;
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pNowObject = vlObjects.at( iObject );
|
|
if( pDestObject != pNowObject )
|
|
{
|
|
float fDistance = pDestObject->fEndTime - pNowObject->fEndTime;
|
|
if( fDistance > 0.0f && fDistance < fNearestDistance )
|
|
{
|
|
fNearestEndTime = pNowObject->fEndTime;
|
|
fNearestDistance = fDistance;
|
|
}
|
|
}
|
|
}
|
|
|
|
fResult = fNearestEndTime;
|
|
}
|
|
}
|
|
|
|
return fResult;
|
|
}
|
|
|
|
|
|
|
|
|
|
int cwxTimeLineCtrl::GetPrevObjectID( const wxChar* pActorName, int iID )
|
|
{
|
|
int iFindedID = -1;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( wxString(pActorName) );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
vector<S_OBJECT_INFO*>& vlObjects = iter->second->m_vlObjectInfo;
|
|
S_OBJECT_INFO* pDestObject = NULL;
|
|
int iNumObject = (int)vlObjects.size();
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pObjectInfo = vlObjects.at( iObject );
|
|
if( pObjectInfo->iID == iID )
|
|
{
|
|
pDestObject = pObjectInfo;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( pDestObject )
|
|
{
|
|
int iNearestDistActID = -1;
|
|
float fNearestDistance = 999999999.0f;
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pNowObject = vlObjects.at( iObject );
|
|
if( pDestObject != pNowObject )
|
|
{
|
|
float fDistance = pDestObject->fEndTime - pNowObject->fEndTime;
|
|
if( fDistance > 0.0f && fDistance < fNearestDistance )
|
|
{
|
|
iNearestDistActID = pNowObject->iID;
|
|
fNearestDistance = fDistance;
|
|
}
|
|
}
|
|
}
|
|
|
|
iFindedID = iNearestDistActID;
|
|
}
|
|
}
|
|
|
|
return iFindedID;
|
|
}
|
|
|
|
|
|
|
|
|
|
// Àüü ŸÀÓ ½ÃÄö½ºÀÇ ±æÀ̰¡ ´Þ¶óÁö¸é ÀÌ ÇÔ¼ö°¡ È£ÃâµÇ¾î ¾÷µ¥ÀÌÆ® µÇ¾î¾ß ÇÕ´Ï´Ù.
|
|
void cwxTimeLineCtrl::_UpdateScrollBar( void )
|
|
{
|
|
int iClientWidth = 0;
|
|
int iClientHeight = 0;
|
|
|
|
// ÇöÀç ³Êºñ, ³ôÀÌ Àüü ±æÀÌ¿Í ¶° ÀÖ´Â À©µµ¿ì »çÀÌÁ °®°í ½ºÅ©·Ñ¹Ù ºñ·Ê¸¦ ¸ÂÃçÁØ´Ù.
|
|
DWORD dwWholeWidth = m_dwWidth*DWORD(m_fOriRulerPixelStep * m_fViewSize) + m_dwItemVerticalOffset;
|
|
m_dwHeight = DEFAULT_TIME_LINE_HEIGHT + DWORD(m_vlpItemInfo.size() * DEFAULT_OBJECT_BOX_HEIGHT);
|
|
DWORD dwWholeHeight = m_dwHeight;
|
|
|
|
SetScrollbars( SCROLL_PIXEL_PER_UNIT_X, SCROLL_PIXEL_PER_UNIT_Y,
|
|
dwWholeWidth/SCROLL_PIXEL_PER_UNIT_X, dwWholeHeight/SCROLL_PIXEL_PER_UNIT_Y,
|
|
m_iXScrollOffset/SCROLL_PIXEL_PER_UNIT_X,
|
|
m_iYScrollOffset/SCROLL_PIXEL_PER_UNIT_Y );
|
|
|
|
m_bNeedUpdateOffset = true;
|
|
}
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::_DrawTimeBar( wxAutoBufferedPaintDC &BufferedDC, DWORD dwDrawLineYOffset, DWORD dwWholeHeight )
|
|
{
|
|
wxString strBuf;
|
|
wxPen ActorPen;
|
|
ActorPen.SetColour( wxColour( 0, 0, 0 ) );
|
|
|
|
if( false == m_bShowTimeLineAsFloat )
|
|
strBuf = strBuf.Format( wxT("%d %s"), DWORD((m_fNowTimeBarPosByPixel*1000/m_iRulerDivideFactor)/m_fRulerStep), m_strUnitName );
|
|
else
|
|
strBuf = strBuf.Format( wxT("%.2f %s"), m_fNowTimeBarPosByPixel / float(m_iRulerDivideFactor) / float(m_fRulerStep), m_strUnitName );
|
|
|
|
wxFont TimeLineFont;
|
|
TimeLineFont.SetPointSize( 7 );
|
|
TimeLineFont.SetWeight( wxFONTWEIGHT_BOLD );
|
|
BufferedDC.SetFont( TimeLineFont );
|
|
|
|
DWORD dwTimeBarLabelSize = BufferedDC.GetTextExtent( strBuf ).GetWidth();
|
|
|
|
// ¸¶Áö¸·À¸·Î ÇöÀç ŸÀÓ ¹Ù µå·Î¿ì
|
|
BufferedDC.SetPen( ActorPen );
|
|
BufferedDC.SetBrush( wxBrush( wxColour(0, 255, 255) ) );
|
|
|
|
DWORD dwNowTimePos = (DWORD)m_fNowTimeBarPosByPixel;
|
|
BufferedDC.DrawRectangle( m_dwItemVerticalOffset+dwNowTimePos, dwDrawLineYOffset,
|
|
/*DEFAULT_TIME_BAR_BOX_WIDTH*/dwTimeBarLabelSize+10, DEFAULT_TIME_BAR_BOX_HEIGHT );
|
|
|
|
BufferedDC.SetFont( TimeLineFont );
|
|
BufferedDC.DrawText( strBuf, m_dwItemVerticalOffset+dwNowTimePos+3, dwDrawLineYOffset+2 );
|
|
|
|
wxPen wxTimeLinePen( wxColour(0, 0, 255), 2, wxSHORT_DASH );
|
|
BufferedDC.SetPen( wxTimeLinePen );
|
|
BufferedDC.DrawLine( m_dwItemVerticalOffset+dwNowTimePos, dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET+10,
|
|
m_dwItemVerticalOffset+dwNowTimePos, dwWholeHeight );
|
|
}
|
|
|
|
|
|
void cwxTimeLineCtrl::_DrawObjects( wxAutoBufferedPaintDC &BufferedDC, DWORD dwDrawLineXOffset,
|
|
DWORD dwDrawLineYOffset, wxSize &ClientSize )
|
|
{
|
|
// ¾×ÅÍ ¿ÀºêÁ§Æ®¸¦ µå·Î¿ì
|
|
wxString strBuf;
|
|
wxFont ActorFont;
|
|
wxFont ObjectFont;
|
|
wxPen ActorPen;
|
|
wxPen ObjectPen;
|
|
wxBrush ObjectBrush;
|
|
|
|
ObjectPen = *wxRED_PEN;
|
|
ObjectPen.SetWidth( 3 );
|
|
|
|
int iCount = 0;
|
|
vector<S_ITEM_INFO*>::iterator iter = m_vlpItemInfo.begin();
|
|
vector<S_ITEM_INFO*>::iterator iterEnd = m_vlpItemInfo.end();
|
|
for( iter; iter != iterEnd; ++iter )
|
|
{
|
|
//// ¿ì¼± Ç׸ñ ¸ÕÀú µå·Î¿ì
|
|
S_ITEM_INFO* pActor = *iter;
|
|
|
|
DWORD dwYOffset = dwDrawLineYOffset+10 + iCount*20;
|
|
|
|
// ¾×¼Ç µå·Î¿ì
|
|
ObjectFont.SetPointSize( 8 );
|
|
ObjectFont.SetFaceName( wxT("Arial") );
|
|
BufferedDC.SetFont( ObjectFont );
|
|
|
|
int iNumObject = (int)pActor->m_vlObjectInfo.size();
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pObject = pActor->m_vlObjectInfo.at( iObject );
|
|
|
|
if( m_pSelectedObjectInfo == pObject )
|
|
{
|
|
|
|
ObjectFont.SetWeight( wxFONTWEIGHT_BOLD );
|
|
BufferedDC.SetFont( ObjectFont );
|
|
BufferedDC.SetPen( ObjectPen );
|
|
}
|
|
else
|
|
{
|
|
ObjectFont.SetWeight( wxFONTWEIGHT_NORMAL );
|
|
BufferedDC.SetFont( ObjectFont );
|
|
BufferedDC.SetPen( ActorPen );
|
|
}
|
|
|
|
ObjectBrush.SetColour( pObject->Color );
|
|
BufferedDC.SetBrush( ObjectBrush );
|
|
|
|
DWORD dwSize = pObject->dwEndXPixel-pObject->dwStartXPixel;
|
|
float fTimeLength = pObject->fEndTime - pObject->fStartTime;
|
|
BufferedDC.DrawRectangle( m_dwItemVerticalOffset + pObject->dwStartXPixel, dwYOffset, dwSize+1, 21 );
|
|
|
|
strBuf.Clear();
|
|
|
|
if( (m_dwObjectDrawStyle & TL_SHOW_OBJECT_TIME_LENGTH) &&
|
|
!(m_dwObjectDrawStyle & TL_SHOW_OBJECT_NAME) )
|
|
{
|
|
//if( false == m_bShowTimeLineAsFloat )
|
|
// strBuf = strBuf.Format( wxT("%d %s"), int(fTimeLength*1000), m_strUnitName );
|
|
//else
|
|
strBuf = strBuf.Format( wxT("%.2f %s"), fTimeLength, m_strUnitName );
|
|
}
|
|
else
|
|
if( (m_dwObjectDrawStyle & TL_SHOW_OBJECT_NAME) &&
|
|
!(m_dwObjectDrawStyle & TL_SHOW_OBJECT_TIME_LENGTH) )
|
|
{
|
|
strBuf = strBuf.Format( wxT("%s"), pObject->Name );
|
|
}
|
|
else
|
|
if( (m_dwObjectDrawStyle & TL_SHOW_OBJECT_TIME_LENGTH) &&
|
|
(m_dwObjectDrawStyle & TL_SHOW_OBJECT_NAME) )
|
|
{
|
|
//if( false == m_bShowTimeLineAsFloat )
|
|
// strBuf = strBuf.Format( wxT("%s (%d %s)"), pObject->Name, int(fTimeLength*1000), m_strUnitName );
|
|
//else
|
|
strBuf = strBuf.Format( wxT("%s (%.2f %s)"), pObject->Name, fTimeLength, m_strUnitName );
|
|
}
|
|
|
|
DWORD dwTextCenterPos = (dwSize - BufferedDC.GetTextExtent( strBuf ).GetWidth()) / 2;
|
|
BufferedDC.DrawText( strBuf, m_dwItemVerticalOffset + pObject->dwStartXPixel + dwTextCenterPos,
|
|
dwDrawLineYOffset+12 + iCount*DEFAULT_OBJECT_BOX_HEIGHT );
|
|
}
|
|
|
|
++iCount;
|
|
}
|
|
}
|
|
|
|
|
|
//void cwxTimeLineCtrl::_DrawGraduation( wxAutoBufferedPaintDC& BufferedDC, DWORD dwDrawLineYOffset, DWORD dwGraduationStep, DWORD dwStartPixel, DWORD dwEndPixel )
|
|
//{
|
|
// wxString strBuf;
|
|
// DWORD dwStartIndex = dwStartPixel / dwGraduationStep;
|
|
// DWORD dwEndIndex = dwEndPixel / dwGraduationStep; // ³ª´²Á®¼ ¹ö·ÁÁú °æ¿ì°¡ »ý±â¹Ç·Î ÇÑ ½ºÅܾ¿ ¿©À¯¸¦ µÐ´Ù.
|
|
// //DWORD dwEndIndex = (dwDrawLineXOffset+ClientSize.GetX()+m_dwActorVerticalOffset)/dwGraduationStep; // ³ª´²Á®¼ ¹ö·ÁÁú °æ¿ì°¡ »ý±â¹Ç·Î ÇÑ ½ºÅܾ¿ ¿©À¯¸¦ µÐ´Ù.
|
|
// //DWORD dwNumGraduationCountToDraw = (dwEndPixel - dwStartPixel) / dwGraduationStep;
|
|
//
|
|
// //// ¿ÞÂÊ ºÎºÐµµ ¿©À¯¸¦ µÎ±â À§ÇØ Á» ´õ µå·Î¿ì ½Ã۵µ·Ï ÇÑ´Ù.
|
|
// //// ½ºÅ©·Ñ ¹öưÀ» ´·¶À» ¶§ dirty ¿µ¿ª¸¸ ¾÷µ¥ÀÌÆ® µÇ±â ¶§¹®ÀÌ´Ù..
|
|
// //if( dwStartIndex < 5 )
|
|
// // dwStartIndex = 0;
|
|
//
|
|
// ////
|
|
//
|
|
// // 5¹øÂ° ¸¶´Ù ±æ°Ô ±×·ÁÁÜ.
|
|
// for( DWORD i = dwStartIndex; i < dwEndIndex; ++i )
|
|
// {
|
|
// DWORD dwGraduationSize = HORIZON_RULER_SHORT_GRADUATE_SIZE;
|
|
// bool bIsFifth = (i % 5 == 0);
|
|
//
|
|
// if( bIsFifth )
|
|
// {
|
|
// strBuf.Clear();
|
|
// if( m_bShowTimeLineAsFloat )
|
|
// strBuf = strBuf.Format( wxT("%.2f %s"), (float)i, m_strUnitName.c_str() );
|
|
// else
|
|
// {
|
|
// // ms ´ÜÀ§À̹ǷΠ1000 °öÇØÁØ´Ù.
|
|
// strBuf = strBuf.Format( wxT("%d %s"), i*1000, m_strUnitName.c_str() );
|
|
// }
|
|
// BufferedDC.DrawText( strBuf, m_dwItemVerticalOffset + dwStartPixel + i*dwGraduationStep, dwDrawLineYOffset+2 );
|
|
//
|
|
// dwGraduationSize = HORIZON_RULER_LONG_GRADUATE_SIZE;
|
|
// }
|
|
//
|
|
// BufferedDC.DrawLine( m_dwItemVerticalOffset + dwStartPixel + i*dwGraduationStep, dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET+1,
|
|
// m_dwItemVerticalOffset + dwStartPixel + i*dwGraduationStep, dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET+1 + dwGraduationSize );
|
|
//
|
|
// if( dwGraduationStep > 100 )
|
|
// {
|
|
// _DrawGraduation( BufferedDC, dwDrawLineYOffset, dwGraduationStep/5, dwStartPixel + i*dwGraduationStep,
|
|
// dwStartPixel + (i+1)*dwGraduationStep );
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
|
|
void cwxTimeLineCtrl::_DrawRuler( wxAutoBufferedPaintDC &BufferedDC, DWORD dwDrawLineXOffset, DWORD dwDrawLineYOffset, wxSize &ClientSize )
|
|
{
|
|
wxPen Pen( *wxBLACK, 1 );
|
|
wxBrush Brush( *wxWHITE_BRUSH );
|
|
|
|
BufferedDC.SetPen( Pen );
|
|
BufferedDC.SetBrush( Brush );
|
|
|
|
// Ŭ¶óÀÌ¾ðÆ® ¿µ¿ª¿¡¼ »ó´ëÀûÀ¸·Î ´«±ÝÀ» ´ÜÀ§ ¹øÈ£¸¦ ÂïÀ» x offset ºÎºÐÀ» ¿¬»ê
|
|
DWORD dwRulerXOffset = 0;
|
|
if( m_dwItemVerticalOffset < dwDrawLineXOffset )
|
|
dwRulerXOffset = dwDrawLineXOffset - m_dwItemVerticalOffset;
|
|
else
|
|
dwRulerXOffset = 0;
|
|
|
|
// Ŭ¸®¾î ¿ªÇÒÀÇ Ä¿´Ù¶õ ÇÏ¾á »ç°¢Çü ¸ÕÀú µå·Î¿ì.
|
|
BufferedDC.DrawRectangle( dwDrawLineXOffset, dwDrawLineYOffset, dwDrawLineXOffset+ClientSize.GetX(),
|
|
HORIZON_RULER_LINE_Y_OFFSET+HORIZON_RULER_LONG_GRADUATE_SIZE+1 );
|
|
|
|
// ÁÙ ÀÚÀÇ ±¸ºÐ¼±ÀÌ µÇ´Â °¡·Î ¶óÀÎ µå·Î¿ì.
|
|
BufferedDC.DrawLine( dwDrawLineXOffset, dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET,
|
|
dwDrawLineXOffset+ClientSize.GetX()+m_dwItemVerticalOffset, dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET );
|
|
|
|
//DWORD dwGraduationStep = m_fRulerStep;
|
|
//_DrawGraduation( BufferedDC, dwDrawLineYOffset, dwGraduationStep, dwRulerXOffset, dwDrawLineXOffset+ClientSize.GetX()+m_dwItemVerticalOffset );
|
|
|
|
DWORD dwStartIndex = DWORD((float)dwRulerXOffset / m_fRulerStep);
|
|
DWORD dwEndPoint = DWORD(float(dwDrawLineXOffset+ClientSize.GetX()+m_dwItemVerticalOffset)/m_fRulerStep); // ³ª´²Á®¼ ¹ö·ÁÁú °æ¿ì°¡ »ý±â¹Ç·Î ÇÑ ½ºÅܾ¿ ¿©À¯¸¦ µÐ´Ù.
|
|
|
|
// ¿ÞÂÊ ºÎºÐµµ ¿©À¯¸¦ µÎ±â À§ÇØ Á» ´õ µå·Î¿ì ½Ã۵µ·Ï ÇÑ´Ù.
|
|
// ½ºÅ©·Ñ ¹öưÀ» ´·¶À» ¶§ dirty ¿µ¿ª¸¸ ¾÷µ¥ÀÌÆ® µÇ±â ¶§¹®ÀÌ´Ù..
|
|
if( dwStartIndex < 5 )
|
|
dwStartIndex = 0;
|
|
|
|
//
|
|
|
|
// 5¹øÂ° ¸¶´Ù ±æ°Ô ±×·ÁÁÜ.
|
|
wxString strBuf;
|
|
for( DWORD i = dwStartIndex; i < dwEndPoint; ++i )
|
|
{
|
|
DWORD dwVerticalUnitLength = 5;
|
|
|
|
bool bIsFifth = (i % 5 == 0);
|
|
|
|
if( bIsFifth )
|
|
{
|
|
strBuf.Clear();
|
|
if( m_bShowTimeLineAsFloat )
|
|
strBuf = strBuf.Format( wxT("%.2f %s"), (float)i / m_iRulerDivideFactor, m_strUnitName.c_str() );
|
|
else
|
|
{
|
|
// ms ´ÜÀ§À̹ǷΠ1000 °öÇØÁØ´Ù.
|
|
strBuf = strBuf.Format( wxT("%d %s"), i*1000 / m_iRulerDivideFactor, m_strUnitName.c_str() );
|
|
}
|
|
BufferedDC.DrawText( strBuf, m_dwItemVerticalOffset + DWORD((float)i*m_fRulerStep), dwDrawLineYOffset+2 );
|
|
|
|
dwVerticalUnitLength = HORIZON_RULER_LONG_GRADUATE_SIZE;
|
|
}
|
|
|
|
BufferedDC.DrawLine( m_dwItemVerticalOffset + DWORD((float)i*m_fRulerStep), dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET+1,
|
|
m_dwItemVerticalOffset + DWORD((float)i*m_fRulerStep), dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET+1 + dwVerticalUnitLength );
|
|
}
|
|
}
|
|
|
|
|
|
void cwxTimeLineCtrl::_DrawBaseLine( wxDC &BufferedDC, DWORD dwDrawLineXOffset, DWORD dwDrawLineYOffset, wxSize &ClientSize )
|
|
{
|
|
wxPen Pen( *wxBLACK, 1 );
|
|
wxBrush Brush( *wxWHITE_BRUSH );
|
|
wxFont ItemFont;
|
|
wxPen ItemPen;
|
|
|
|
BufferedDC.SetPen( Pen );
|
|
BufferedDC.SetBrush( Brush );
|
|
|
|
// ¸ÕÀú ÇÏ¾á »ç°¢ÇüÀ» ±×·ÁÁÜÀ¸·Î½á Ŭ¸®¾î ÇØÁØ´Ù.
|
|
BufferedDC.DrawRectangle( dwDrawLineXOffset, dwDrawLineYOffset, DEFAULT_ITEM_VERTICAL_LINE, m_dwHeight );
|
|
|
|
int iCount = 0;
|
|
vector<S_ITEM_INFO*>::iterator iter = m_vlpItemInfo.begin();
|
|
vector<S_ITEM_INFO*>::iterator iterEnd = m_vlpItemInfo.end();
|
|
for( iter; iter != iterEnd; ++iter )
|
|
{
|
|
// Ç׸ñ µå·Î¿ì
|
|
S_ITEM_INFO* pActor = *iter;
|
|
ItemFont.SetPointSize( 9 );
|
|
ItemFont.SetWeight( wxFONTWEIGHT_BOLD );
|
|
ItemFont.SetFaceName( wxT("Arial") );
|
|
BufferedDC.SetFont( ItemFont );
|
|
|
|
ItemPen.SetColour( pActor->Color );
|
|
BufferedDC.SetPen( ItemPen );
|
|
|
|
int iYOffset = HORIZON_RULER_LINE_Y_OFFSET+HORIZON_RULER_LONG_GRADUATE_SIZE + iCount*20;
|
|
if( (DWORD)iYOffset >= dwDrawLineYOffset+HORIZON_RULER_LINE_Y_OFFSET+HORIZON_RULER_LONG_GRADUATE_SIZE )
|
|
{
|
|
BufferedDC.DrawLine( dwDrawLineXOffset, iYOffset,
|
|
dwDrawLineXOffset+ClientSize.GetX()+m_dwItemVerticalOffset, HORIZON_RULER_LINE_Y_OFFSET+10 + iCount*20 );
|
|
|
|
BufferedDC.DrawText( pActor->Name, dwDrawLineXOffset+5, iYOffset+2 );
|
|
}
|
|
|
|
++iCount;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::OnPaint( wxPaintEvent& PaintEvent )
|
|
{
|
|
if( m_bNeedUpdateOffset )
|
|
{
|
|
GetViewStart( &m_iXScrollOffset, &m_iYScrollOffset );
|
|
m_iXScrollOffset *= SCROLL_PIXEL_PER_UNIT_X;
|
|
m_iYScrollOffset *= SCROLL_PIXEL_PER_UNIT_Y;
|
|
}
|
|
|
|
wxAutoBufferedPaintDC BufferedDC( this );
|
|
PrepareDC(BufferedDC);
|
|
|
|
DWORD dwWholeWidth = DWORD((float)m_dwWidth*m_fRulerStep) + m_dwItemVerticalOffset;
|
|
DWORD dwWholeHeight = m_dwHeight;
|
|
|
|
BufferedDC.SetBackground( wxBrush(GetBackgroundColour(), wxSOLID) );
|
|
BufferedDC.Clear();
|
|
|
|
// Ŭ¶óÀÌ¾ðÆ® »çÀÌÁŸ¸ µå·Î¿ìÇÏ¸ç ½ºÅ©·Ñ¹Ù¿¡ µû¶ó dirty ¿µ¿ª¸¸ °»½ÅÇÏ°Ô µÊ.
|
|
wxSize ClientSize = GetClientSize();
|
|
|
|
// ¸ÕÀú ´«±ÝÀ» ±×·Áº¸ÀÚ... ±æÀÌ´Â ²Ï ±æ°Ô.
|
|
BufferedDC.SetPen( *wxBLACK_PEN );
|
|
|
|
wxFont Font = *wxSWISS_FONT;
|
|
Font.SetPointSize( DEFAULT_FONT_SIZE );
|
|
BufferedDC.SetFont( Font );
|
|
|
|
DWORD dwDrawLineXOffset = (DWORD)m_iXScrollOffset;
|
|
DWORD dwDrawLineYOffset = (DWORD)m_iYScrollOffset;
|
|
|
|
_DrawObjects( BufferedDC, dwDrawLineXOffset, HORIZON_RULER_LINE_Y_OFFSET, ClientSize );
|
|
_DrawRuler( BufferedDC, dwDrawLineXOffset, dwDrawLineYOffset, ClientSize );
|
|
_DrawTimeBar( BufferedDC, dwDrawLineYOffset, dwWholeHeight );
|
|
_DrawBaseLine( BufferedDC, dwDrawLineXOffset, dwDrawLineYOffset, ClientSize );
|
|
|
|
}
|
|
|
|
|
|
void cwxTimeLineCtrl::OnScroll( wxScrollWinEvent& ScrollEvent )
|
|
{
|
|
int iOffset = 0;
|
|
|
|
wxEventType eEvent = ScrollEvent.GetEventType();
|
|
|
|
m_bNeedUpdateOffset = true;
|
|
if( wxEVT_SCROLLWIN_THUMBTRACK == eEvent || wxEVT_SCROLLWIN_THUMBRELEASE == eEvent )
|
|
{
|
|
if( wxHORIZONTAL == ScrollEvent.GetOrientation() )
|
|
m_iXScrollOffset = ScrollEvent.GetPosition() * SCROLL_PIXEL_PER_UNIT_X;
|
|
else
|
|
if( wxVERTICAL == ScrollEvent.GetOrientation() )
|
|
m_iYScrollOffset = ScrollEvent.GetPosition() * SCROLL_PIXEL_PER_UNIT_Y;
|
|
|
|
m_bNeedUpdateOffset = false;
|
|
}
|
|
|
|
Refresh();
|
|
|
|
ScrollEvent.Skip();
|
|
}
|
|
|
|
|
|
void cwxTimeLineCtrl::_NotifyEvent( int iEvent )
|
|
{
|
|
if( iEvent == wxEVT_TIMELINE_OBJECT_SELECT )
|
|
{
|
|
cwxTLObjectSelectEvent SelectEvent( wxEVT_TIMELINE_OBJECT_SELECT, GetId(), m_pSelectedObjectInfo->Actor,
|
|
m_pSelectedObjectInfo->iID, m_pSelectedObjectInfo->iUseType, m_pSelectedObjectInfo->fStartTime );
|
|
wxPostEvent( GetParent(), SelectEvent );
|
|
}
|
|
else
|
|
if( iEvent == wxEVT_TIMELINE_OBJECT_MOVE )
|
|
{
|
|
cwxTLObjectMoveEvent MoveEvent( wxEVT_TIMELINE_OBJECT_MOVE, GetId(), m_pSelectedObjectInfo->Actor,
|
|
m_pSelectedObjectInfo->iID, m_pSelectedObjectInfo->fStartTime );
|
|
wxPostEvent( GetParent(), MoveEvent );
|
|
}
|
|
else
|
|
if( iEvent == wxEVT_TIMELINE_OBJECT_RESIZE )
|
|
{
|
|
cwxTLObjectResizeEvent ResizeEvent( wxEVT_TIMELINE_OBJECT_RESIZE, GetId(), m_pSelectedObjectInfo->Actor,
|
|
m_pSelectedObjectInfo->iID, m_pSelectedObjectInfo->fStartTime,
|
|
m_pSelectedObjectInfo->fEndTime - m_pSelectedObjectInfo->fStartTime );
|
|
wxPostEvent( GetParent(), ResizeEvent );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::OnMouseEvent( wxMouseEvent& MouseEvent )
|
|
{
|
|
int iViewStartX = 0;
|
|
int iViewStartY = 0;
|
|
GetViewStart( &iViewStartX, &iViewStartY );
|
|
wxPoint Pos = MouseEvent.GetPosition();
|
|
Pos.x += iViewStartX * SCROLL_PIXEL_PER_UNIT_X;
|
|
Pos.y += iViewStartY * SCROLL_PIXEL_PER_UNIT_Y;
|
|
|
|
int iYIndex = Pos.y - HORIZON_RULER_LINE_Y_OFFSET+10;
|
|
m_iOnOverYLineIndex = iYIndex / 20;
|
|
if( m_iOnOverYLineIndex > 0 )
|
|
m_iOnOverYLineIndex -= 1;
|
|
|
|
m_fMousePosTime = (MouseEvent.GetPosition().x - (int)m_dwItemVerticalOffset) / (m_fOriRulerPixelStep * m_fViewSize);
|
|
if( m_fMousePosTime < 0.0f )
|
|
m_fMousePosTime = 0.0f;
|
|
|
|
if( MouseEvent.LeftDown() )
|
|
{
|
|
bool bSelected = false;
|
|
|
|
m_LastClkMousePos = MouseEvent.GetPosition();
|
|
|
|
if( m_bEnable &&
|
|
Pos.y > m_iYScrollOffset + HORIZON_RULER_LINE_Y_OFFSET+HORIZON_RULER_LONG_GRADUATE_SIZE )
|
|
{
|
|
DWORD dwYIndex = DWORD(Pos.y) - HORIZON_RULER_LINE_Y_OFFSET+HORIZON_RULER_LONG_GRADUATE_SIZE;
|
|
dwYIndex /= 20;
|
|
|
|
if( dwYIndex > 0 )
|
|
dwYIndex -= 1;
|
|
|
|
DWORD dwMouseXPos = (DWORD)Pos.x - m_dwItemVerticalOffset;
|
|
|
|
if( dwYIndex < (DWORD)m_vlpItemInfo.size() )
|
|
{
|
|
S_ITEM_INFO* pActorObject = m_vlpItemInfo.at( dwYIndex );
|
|
|
|
int iNumObject = (int)pActorObject->m_vlObjectInfo.size();
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pObject = pActorObject->m_vlObjectInfo.at( iObject );
|
|
|
|
DWORD dwObjectStartPos = pObject->dwStartXPixel;
|
|
DWORD dwObjectEndPos = pObject->dwEndXPixel;
|
|
|
|
// ¾çÂÊ ³¡ºÎºÐ 2Çȼ¿ Á¤µµ¿¡¼ ¿òÁ÷Àδٸé ÇØ´ç ºÎºÐ¸¸ »çÀÌÁî ¹Ù²ãÁÜ
|
|
if( (dwObjectStartPos-3 < dwMouseXPos) && (dwMouseXPos < dwObjectStartPos+3) )
|
|
{
|
|
m_iSelectedObjectPart = OBJECT_BEGIN;
|
|
|
|
m_iLastClkXPos = Pos.x;
|
|
m_bIsLBtnDown = true;
|
|
bSelected = true;
|
|
|
|
if( m_pSelectedObjectInfo != pObject )
|
|
{
|
|
m_pSelectedObjectInfo = pObject;
|
|
_NotifyEvent( wxEVT_TIMELINE_OBJECT_SELECT );
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
if( (dwObjectEndPos-3 < dwMouseXPos) && (dwMouseXPos < dwObjectEndPos+3) )
|
|
{
|
|
m_iSelectedObjectPart = OBJECT_END;
|
|
|
|
m_iLastClkXPos = Pos.x;
|
|
m_bIsLBtnDown = true;
|
|
bSelected = true;
|
|
|
|
if( m_pSelectedObjectInfo != pObject )
|
|
{
|
|
m_pSelectedObjectInfo = pObject;
|
|
_NotifyEvent( wxEVT_TIMELINE_OBJECT_SELECT );
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
if( ( dwObjectStartPos < dwMouseXPos ) && ( dwMouseXPos < dwObjectEndPos) )
|
|
{
|
|
m_iSelectedObjectPart = OBJECT_CENTER;
|
|
|
|
m_iLastClkXPos = Pos.x;
|
|
m_bIsLBtnDown = true;
|
|
bSelected = true;
|
|
|
|
if( m_pSelectedObjectInfo != pObject )
|
|
{
|
|
m_pSelectedObjectInfo = pObject;
|
|
_NotifyEvent( wxEVT_TIMELINE_OBJECT_SELECT );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// ŸÀÓ ¹ÙÀÇ ÅÇÀ» ´·¶´ÂÁö.
|
|
DWORD dwMouseXPos = (DWORD)Pos.x - m_dwItemVerticalOffset;
|
|
|
|
if( (DWORD)m_fNowTimeBarPosByPixel < dwMouseXPos && dwMouseXPos < (DWORD)m_fNowTimeBarPosByPixel+DEFAULT_TIME_BAR_BOX_WIDTH &&
|
|
m_iYScrollOffset < Pos.y && Pos.y < m_iYScrollOffset + DEFAULT_TIME_BAR_BOX_HEIGHT )
|
|
{
|
|
m_bTimeBarClked = true;
|
|
m_iLastClkXPos = Pos.x;
|
|
|
|
cwxTLAxisEvent AxisEvent( wxEVT_TIMELINE_AXIS_EVENT, GetId() );
|
|
AxisEvent.SetOnLBDown( true );
|
|
wxPostEvent( GetParent(), AxisEvent );
|
|
}
|
|
}
|
|
|
|
if( false == bSelected )
|
|
m_pSelectedObjectInfo = NULL;
|
|
else
|
|
m_PrevObjectInfo = *m_pSelectedObjectInfo;
|
|
|
|
Refresh( true, &GetClientRect() );
|
|
}
|
|
|
|
if( MouseEvent.Dragging() )
|
|
{
|
|
//wxPoint Pos = MouseEvent.GetPosition();
|
|
|
|
// ÀÌÀü À§Ä¡¿Í ºñ±³Çؼ 3Çȼ¿ ÀÌ»ó ¿òÁ÷ÀÎ °Å ¾Æ´Ï¸é ¿òÁ÷ÀÌÁö ¸¶¶ó~
|
|
if( m_bMoved || 3 < abs( m_LastClkMousePos.x - MouseEvent.GetPosition().x ) )
|
|
{
|
|
m_bMoved = true;
|
|
|
|
int iDelta = Pos.x - m_iLastClkXPos;
|
|
m_iLastClkXPos = Pos.x;
|
|
|
|
if( m_bTimeBarClked )
|
|
{
|
|
float fResult = m_fNowTimeBarPosByPixel + (float)iDelta;
|
|
if( fResult > 0.0f )
|
|
{
|
|
m_fNowTimeBarPosByPixel = fResult;
|
|
//m_dwNowTimeBarPosByUnit = m_fNowTimeBarPosByPixel / m_dwRulerStepPixel;
|
|
}
|
|
else
|
|
{
|
|
m_fNowTimeBarPosByPixel = 0;
|
|
//m_dwNowTimeBarPosByUnit = 0;
|
|
}
|
|
|
|
cwxTLAxisEvent AxisEvent( wxEVT_TIMELINE_AXIS_EVENT, GetId() );
|
|
AxisEvent.SetAxisMove( true );
|
|
AxisEvent.SetLBIsDown( true );
|
|
float fNowTime = m_fNowTimeBarPosByPixel / (m_fOriRulerPixelStep * m_fViewSize);
|
|
AxisEvent.SetNowTime( fNowTime );
|
|
wxPostEvent( GetParent(), AxisEvent );
|
|
|
|
Refresh( true, &GetClientRect() );
|
|
}
|
|
else
|
|
if( m_bEnable &&
|
|
m_pSelectedObjectInfo && m_bIsLBtnDown )
|
|
{
|
|
DWORD dwObjectStartPos = m_pSelectedObjectInfo->dwStartXPixel;
|
|
DWORD dwObjectEndPos = m_pSelectedObjectInfo->dwEndXPixel;
|
|
|
|
switch( m_iSelectedObjectPart )
|
|
{
|
|
case OBJECT_BEGIN:
|
|
{
|
|
if( false == m_pSelectedObjectInfo->bSizeFixed )
|
|
{
|
|
if( 0 < int(dwObjectStartPos) + iDelta)
|
|
{
|
|
if( (20 < int(dwObjectEndPos) - int(dwObjectStartPos)) || (iDelta < 0) )
|
|
{
|
|
int iResult = (int)m_pSelectedObjectInfo->dwStartXPixel + iDelta;
|
|
if( iResult >= 0 )
|
|
{
|
|
m_pSelectedObjectInfo->dwStartXPixel = iResult;
|
|
m_pSelectedObjectInfo->fStartTime = (float)m_pSelectedObjectInfo->dwStartXPixel / (m_fOriRulerPixelStep * m_fViewSize);
|
|
}
|
|
else
|
|
{
|
|
m_pSelectedObjectInfo->fStartTime = 0.0f;
|
|
}
|
|
|
|
//SetCursor(wxCursor(wxCURSOR_MAGNIFIER));
|
|
Refresh( true, &GetClientRect() );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OBJECT_END:
|
|
{
|
|
if( false == m_pSelectedObjectInfo->bSizeFixed )
|
|
{
|
|
if( 20 < int(dwObjectEndPos) - int(dwObjectStartPos) || (iDelta > 0) )
|
|
{
|
|
m_pSelectedObjectInfo->dwEndXPixel = (int)dwObjectEndPos + iDelta;
|
|
m_pSelectedObjectInfo->fEndTime = (float)m_pSelectedObjectInfo->dwEndXPixel / (m_fOriRulerPixelStep * m_fViewSize);
|
|
//SetCursor(wxCursor(wxCURSOR_MAGNIFIER));
|
|
Refresh( true, &GetClientRect() );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OBJECT_CENTER:
|
|
{
|
|
if( 0 < int(dwObjectStartPos) + iDelta)
|
|
{
|
|
//int iResult = (int)m_pSelectedObjectInfo->dwStartTimeInUnit + (iDelta/(int)m_dwUnit);
|
|
//DWORD dwOriStartPosInUnit = m_pSelectedObjectInfo->dwStartTimeInUnit;
|
|
int iResult = m_pSelectedObjectInfo->dwStartXPixel = (int)dwObjectStartPos + iDelta;
|
|
if( iResult >= 0 )
|
|
{
|
|
m_pSelectedObjectInfo->dwStartXPixel = (int)dwObjectStartPos + iDelta;
|
|
m_pSelectedObjectInfo->fStartTime = (float)m_pSelectedObjectInfo->dwStartXPixel / (m_fOriRulerPixelStep * m_fViewSize);
|
|
|
|
m_pSelectedObjectInfo->dwEndXPixel = (int)dwObjectEndPos + iDelta;
|
|
m_pSelectedObjectInfo->fEndTime = (float)m_pSelectedObjectInfo->dwEndXPixel / (m_fOriRulerPixelStep * m_fViewSize);
|
|
}
|
|
//else
|
|
//{
|
|
// m_pSelectedObjectInfo->dwStartTimeInUnit = (int)m_pSelectedObjectInfo->dwStartTimeInUnit + (iDelta/m_dwUnit);
|
|
// m_pSelectedObjectInfo->dwEndTimeInUnit = (int)m_pSelectedObjectInfo->dwEndTimeInUnit + (iDelta/m_dwUnit);
|
|
//}
|
|
Refresh( true, &GetClientRect() );
|
|
}
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// Á¶Á¤µÈ dwStartXPixel, dwEndXPixel À» ¿øº» ÁÂÇ¥¿¡µµ ¹Ý¿µÇØÁØ´Ù.
|
|
if( m_pSelectedObjectInfo )
|
|
{
|
|
m_pSelectedObjectInfo->fOriStartXPixel = (float)m_pSelectedObjectInfo->dwStartXPixel / m_fViewSize;
|
|
m_pSelectedObjectInfo->fOriEndXPixel = (float)m_pSelectedObjectInfo->dwEndXPixel / m_fViewSize;
|
|
}
|
|
|
|
if( MouseEvent.LeftUp() )
|
|
{
|
|
if( m_bEnable && m_bMoved && m_pSelectedObjectInfo )
|
|
{
|
|
if( m_PrevObjectInfo != *m_pSelectedObjectInfo )
|
|
{
|
|
switch( m_iSelectedObjectPart )
|
|
{
|
|
case OBJECT_BEGIN:
|
|
_NotifyEvent( wxEVT_TIMELINE_OBJECT_RESIZE );
|
|
break;
|
|
|
|
case OBJECT_END:
|
|
_NotifyEvent( wxEVT_TIMELINE_OBJECT_RESIZE );
|
|
break;
|
|
|
|
case OBJECT_CENTER:
|
|
_NotifyEvent( wxEVT_TIMELINE_OBJECT_MOVE );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( m_bTimeBarClked )
|
|
{
|
|
cwxTLAxisEvent AxisEvent( wxEVT_TIMELINE_AXIS_EVENT, GetId() );
|
|
AxisEvent.SetOnLBUp( true );
|
|
wxPostEvent( GetParent(), AxisEvent );
|
|
}
|
|
|
|
m_bIsLBtnDown = false;
|
|
m_bTimeBarClked = false;
|
|
m_bMoved = false;
|
|
m_iSelectedObjectPart = OBJECT_NOT_SELECTED;
|
|
m_iLastClkXPos = 0;
|
|
//SetCursor(wxCursor(wxCURSOR_ARROW));
|
|
}
|
|
|
|
if( MouseEvent.GetWheelRotation() != 0 )
|
|
{
|
|
m_fViewSize += float(MouseEvent.GetWheelRotation()) / 100.0f;
|
|
if( m_fViewSize < 1.0f )
|
|
m_fViewSize = 1.0f;
|
|
_UpdateViewScale();
|
|
Refresh();
|
|
}
|
|
else
|
|
MouseEvent.Skip( true );
|
|
MouseEvent.ResumePropagation( 2 );
|
|
}
|
|
|
|
|
|
|
|
bool cwxTimeLineCtrl::AddItem( const wxString& Name, const wxColour& Color )
|
|
{
|
|
bool bResult = false;
|
|
|
|
// Áߺ¹µÈ À̸§Àº ³ÖÁö ¾Ê´Â´Ù.
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( Name );
|
|
if( m_mapItemInfo.end() == iter )
|
|
{
|
|
S_ITEM_INFO* pNewActorObject = new S_ITEM_INFO;
|
|
pNewActorObject->Name = Name;
|
|
m_mapItemInfo.insert( make_pair(Name, pNewActorObject) );
|
|
m_vlpItemInfo.push_back( pNewActorObject );
|
|
|
|
bResult = true;
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
bool cwxTimeLineCtrl::DelItem( const wxString& Name )
|
|
{
|
|
bool bResult = false;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( Name );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
m_mapItemInfo.erase( iter );
|
|
|
|
vector<S_ITEM_INFO*>::iterator iterVec = find( m_vlpItemInfo.begin(),
|
|
m_vlpItemInfo.end(), iter->second );
|
|
m_vlpItemInfo.erase( iterVec );
|
|
|
|
bResult = true;
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
bool cwxTimeLineCtrl::AddObject( const wxString& ActorName, const wxString& ObjectName, int iObjectID,
|
|
int iUseType, bool bSizeFixed, float fStartTime /*= 0.0f*/, float fLength /*= 20.0f */,
|
|
const wxColour& Color/* = wxColour(wxT("LIGHT_GREY"))*/ )
|
|
{
|
|
bool bResult = false;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( ActorName );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
S_ITEM_INFO* pActorObject = iter->second;
|
|
S_OBJECT_INFO* pNewObject = new S_OBJECT_INFO;
|
|
|
|
pNewObject->Actor = iter->second->Name;
|
|
pNewObject->Name = ObjectName;
|
|
pNewObject->iID = iObjectID;
|
|
pNewObject->fStartTime = fStartTime;
|
|
pNewObject->fEndTime = fStartTime+fLength;
|
|
pNewObject->iUseType = iUseType;
|
|
pNewObject->bSizeFixed = bSizeFixed;
|
|
pNewObject->Color = Color;
|
|
|
|
pNewObject->fOriStartXPixel = fStartTime * m_fOriRulerPixelStep;
|
|
pNewObject->fOriEndXPixel = (fStartTime+fLength) * m_fOriRulerPixelStep;
|
|
|
|
pActorObject->m_vlObjectInfo.push_back( pNewObject );
|
|
m_vlpObjects.push_back( pNewObject );
|
|
|
|
_UpdateViewScale();
|
|
_UpdateScrollBar();
|
|
|
|
bResult = true;
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
|
|
bool cwxTimeLineCtrl::ModifyObject( const wxString& ActorName, const wxString& ObjectName, int iObjectID,
|
|
int iUseType, bool bSizeFixed, float fStartTime/* = 0.0f*/, float fLength/* = 20.0f*/,
|
|
const wxColour& Color/* = wxColour(200, 200, 200)*/ )
|
|
{
|
|
bool bResult = false;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( ActorName );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
S_ITEM_INFO* pActorObject = iter->second;
|
|
|
|
vector<S_OBJECT_INFO*>::iterator iterVec = pActorObject->m_vlObjectInfo.begin();
|
|
vector<S_OBJECT_INFO*>::iterator iterEnd = pActorObject->m_vlObjectInfo.end();
|
|
for( iterVec; iterVec != iterEnd; ++iterVec )
|
|
{
|
|
if( (*iterVec)->iID == iObjectID )
|
|
{
|
|
S_OBJECT_INFO* pObject = (*iterVec);
|
|
pObject->Actor = ActorName;
|
|
pObject->Name = ObjectName;
|
|
pObject->iID = iObjectID;
|
|
pObject->fStartTime = fStartTime;
|
|
pObject->fEndTime = fStartTime+fLength;
|
|
pObject->iUseType = iUseType;
|
|
pObject->bSizeFixed = bSizeFixed;
|
|
pObject->Color = Color;
|
|
|
|
pObject->fOriStartXPixel = fStartTime * m_fOriRulerPixelStep;
|
|
pObject->fOriEndXPixel = (fStartTime+fLength) * m_fOriRulerPixelStep;
|
|
//vector<S_ACT_UNIT_INFO*>::iterator iterObjects = find( m_vlpObjects.begin(), m_vlpObjects.end(), *iterVec );
|
|
//m_vlpObjects.erase( iterObjects );
|
|
_UpdateViewScale();
|
|
|
|
//delete (*iterVec);
|
|
//pActorObject->m_vlObjectInfo.erase( iterVec );
|
|
bResult = true;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
|
|
bool cwxTimeLineCtrl::DelObject( const wxString& ActorName, int iObjectID )
|
|
{
|
|
bool bResult = false;
|
|
|
|
map<wxString, S_ITEM_INFO*>::iterator iter = m_mapItemInfo.find( ActorName );
|
|
if( m_mapItemInfo.end() != iter )
|
|
{
|
|
S_ITEM_INFO* pActorObject = iter->second;
|
|
|
|
//// ¾×¼Ç À̸§À¸·Î ¾×¼ÇÀ» ã¾ÆÁÖ´Â ÇÔ¼ö °´Ã¼
|
|
//struct FindByObjectName : public unary_function<const S_Object_INFO*, bool>
|
|
//{
|
|
// private:
|
|
// wxString m_ObjectNameToFind;
|
|
|
|
// public:
|
|
// FindByObjectName( const wxString& ObjectNameToFind ) : m_ObjectNameToFind( ObjectNameToFind ) {};
|
|
|
|
// bool operator () ( const S_Object_INFO* pObjectInfo )
|
|
// {
|
|
// return (pObjectInfo->Name == m_ObjectNameToFind);
|
|
// }
|
|
|
|
//};
|
|
|
|
// ... ÀÌ ÄÚµå ¿Ö ÄÄÆÄÀÏ·¯°¡ »¶³ª¹ö¸®Áö. -_-
|
|
//vector<S_Object_INFO*>::iterator iterVec = find_if( pActorObject->m_vlObjectInfo.begin(),
|
|
// pActorObject->m_vlObjectInfo.end(),
|
|
// FindByObjectName( ActorName ) );
|
|
|
|
vector<S_OBJECT_INFO*>::iterator iterVec = pActorObject->m_vlObjectInfo.begin();
|
|
vector<S_OBJECT_INFO*>::iterator iterEnd = pActorObject->m_vlObjectInfo.end();
|
|
for( iterVec; iterVec != iterEnd; ++iterVec )
|
|
{
|
|
if( (*iterVec)->iID == iObjectID )
|
|
{
|
|
vector<S_OBJECT_INFO*>::iterator iterObjects = find( m_vlpObjects.begin(), m_vlpObjects.end(), *iterVec );
|
|
m_vlpObjects.erase( iterObjects );
|
|
|
|
delete (*iterVec);
|
|
pActorObject->m_vlObjectInfo.erase( iterVec );
|
|
bResult = true;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
bool cwxTimeLineCtrl::FixObjectSize( int iObjectID, bool bFix )
|
|
{
|
|
bool bResult = false;
|
|
|
|
vector<S_OBJECT_INFO*>::iterator iterVec = m_vlpObjects.begin();
|
|
vector<S_OBJECT_INFO*>::iterator iterEnd = m_vlpObjects.end();
|
|
for( iterVec; iterVec != iterEnd; ++iterVec )
|
|
{
|
|
if( (*iterVec)->iID == iObjectID )
|
|
{
|
|
m_vlpObjects.at( iObjectID )->bSizeFixed = bFix;
|
|
bResult = true;
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
int cwxTimeLineCtrl::GetSelectedObjectID( void )
|
|
{
|
|
if( m_pSelectedObjectInfo )
|
|
return m_pSelectedObjectInfo->iID;
|
|
else
|
|
return wxNOT_FOUND;
|
|
}
|
|
|
|
|
|
|
|
|
|
int cwxTimeLineCtrl::GetSelectedObjectUseType( void )
|
|
{
|
|
if( m_pSelectedObjectInfo )
|
|
return m_pSelectedObjectInfo->iUseType;
|
|
else
|
|
return wxNOT_FOUND;
|
|
}
|
|
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::SelectObject( int iObjectID )
|
|
{
|
|
if( wxNOT_FOUND != iObjectID )
|
|
{
|
|
vector<S_OBJECT_INFO*>::iterator iterVec = m_vlpObjects.begin();
|
|
vector<S_OBJECT_INFO*>::iterator iterEnd = m_vlpObjects.end();
|
|
for( iterVec; iterVec != iterEnd; ++iterVec )
|
|
{
|
|
if( (*iterVec)->iID == iObjectID )
|
|
{
|
|
m_pSelectedObjectInfo = *iterVec;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Refresh( true, &GetClientRect() );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::_UpdateViewScale( void )
|
|
{
|
|
//m_dwRulerStepPixel = DWORD(m_fOriRulerPixelStep * m_fViewSize);
|
|
//m_dwNowTimeBarPosByPixel = (DWORD)((float)m_dwNowOriTimeBarPosByPixel * m_fViewSize);
|
|
|
|
float fScaleFactor = m_fViewSize;
|
|
m_iRulerDivideFactor = 1;
|
|
while( fScaleFactor > 5.0f )
|
|
{
|
|
fScaleFactor /= 5.0f;
|
|
m_iRulerDivideFactor *= 5;
|
|
}
|
|
|
|
m_fRulerStep = m_fOriRulerPixelStep * fScaleFactor;
|
|
|
|
int iNumObject = (int)m_vlpObjects.size();
|
|
for( int iObject = 0; iObject < iNumObject; ++iObject )
|
|
{
|
|
S_OBJECT_INFO* pNowObject = m_vlpObjects.at( iObject );
|
|
|
|
pNowObject->dwStartXPixel = (DWORD)((float)pNowObject->fOriStartXPixel * m_fViewSize);
|
|
pNowObject->dwEndXPixel = (DWORD)((float)pNowObject->fOriEndXPixel * m_fViewSize );
|
|
}
|
|
|
|
// ´ÜÀ§ °»½Å
|
|
//if( m_fRulerStep < 50 )
|
|
//{
|
|
m_strUnitName.assign( wxT("sec") );
|
|
m_bShowTimeLineAsFloat = true;
|
|
//}
|
|
//else
|
|
//{
|
|
// m_strUnitName.assign( wxT("ms") );
|
|
// m_bShowTimeLineAsFloat = false;
|
|
//}
|
|
|
|
_UpdateScrollBar();
|
|
}
|
|
|
|
|
|
|
|
//void cwxTimeLineCtrl::SetUnitName( wxString& strUnitName )
|
|
//{
|
|
// m_strUnitName = strUnitName;
|
|
//}
|
|
|
|
|
|
//void cwxTimeLineCtrl::SetScale( float fScale )
|
|
//{
|
|
// m_fScale = fScale;
|
|
//}
|
|
|
|
|
|
void cwxTimeLineCtrl::SetViewScale( float fScaleSize )
|
|
{
|
|
m_fViewSize = fScaleSize;
|
|
|
|
_UpdateViewScale();
|
|
}
|
|
|
|
|
|
|
|
void cwxTimeLineCtrl::UpdateTimeBar( float fTime )
|
|
{
|
|
//if( m_bShowTimeLineAsFloat )
|
|
//{
|
|
// m_dwNowTimeBarPosByUnit = (DWORD)fUnitTime;
|
|
// m_dwNowTimeBarPosByPixel = DWORD(fUnitTime * m_dwRulerPixelStep);
|
|
//}
|
|
//else
|
|
//{
|
|
//m_dwNowTimeBarPosByUnit = (DWORD)fUnitTime;
|
|
|
|
m_fNowTimeBarPosByPixel = fTime * (m_fOriRulerPixelStep * m_fViewSize);
|
|
Refresh( true, &GetClientRect() );
|
|
//}
|
|
}
|
|
|
|
|
|
void cwxTimeLineCtrl::ResetTimeBar( void )
|
|
{
|
|
//m_dwNowTimeBarPosByUnit = 0;
|
|
}
|
|
|
|
|
|
float cwxTimeLineCtrl::GetNowTime( void )
|
|
{
|
|
float fNowTimeByUnit = (float)(m_fNowTimeBarPosByPixel) / (m_fOriRulerPixelStep * m_fViewSize);
|
|
|
|
return fNowTimeByUnit;
|
|
}
|