Files
AccompanyCube/CompletePanelUnit.cpp
2026-06-13 00:10:11 +08:00

355 lines
9.5 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "GlobalUnit.h"
#include "CompletePanelUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall CompletePanelUnit::TPanel::TPanel(TComponent* AOwner)
: TShowBarsPanel(AOwner)
{
m_iModifyBeginBar = m_iModifyBeginPoint =
m_iModifyEndBar = m_iModifyEndPoint = -1;
m_bShowModifyPos = false;
m_imgBeginPos = m_imgEndPos = NULL;
m_nChordWidth = 40;
m_nChordHeight = 20;
}
//---------------------------------------------------------------------------
__fastcall CompletePanelUnit::TPanel::~TPanel()
{
if( m_imgBeginPos )
delete m_imgBeginPos;
if( m_imgEndPos )
delete m_imgEndPos;
}
//---------------------------------------------------------------------------
void CompletePanelUnit::TPanel::InitialVars()
{
//计算总小节数
int nTotalBarCount = 0;
for( int i=0; i<g_lstComposeStages.size(); i++ ){
COMPOSESTAGE* pCStage = g_lstComposeStages[i];
nTotalBarCount += pCStage->nStageBars;
}
TShowBarsPanel::InitialVars( nTotalBarCount );
}
//---------------------------------------------------------------------------
void __fastcall CompletePanelUnit::TPanel::CreateWnd(void)
{
TShowBarsPanel::CreateWnd();
if( !ParentBackground ){
m_imgBeginPos = new TPngImage();
m_imgBeginPos->LoadFromResourceName(int(HInstance), L"RecordBeginPos");
m_imgEndPos = new TPngImage();
m_imgEndPos->LoadFromResourceName(int(HInstance), L"RecordEndPos");
m_nModifyFlagWidth = m_imgBeginPos->Width;
m_nModifyFlagHeight = m_imgBeginPos->Height;
}
}
//---------------------------------------------------------------------------
void __fastcall CompletePanelUnit::TPanel::SetBarTitle( int iBar, String& strText )
{
//
}
//---------------------------------------------------------------------------
void __fastcall CompletePanelUnit::TPanel::DrawBarOperation( int iBar, int leftDraw, int topDraw )
{
if( m_bShowModifyPos ){
//绘制重录起止标志
if( m_iModifyBeginBar==iBar ){
int X = leftDraw + m_iModifyBeginPoint - m_nModifyFlagWidth/2;
int Y = topDraw + 2;
Canvas->Draw(X, Y, m_imgBeginPos);
}
if( m_iModifyEndBar==iBar ){
int X = leftDraw + m_iModifyEndPoint - m_nModifyFlagWidth/2;
int Y = topDraw + 2;
Canvas->Draw(X, Y, m_imgEndPos);
}
}
}
//---------------------------------------------------------------------------
void __fastcall CompletePanelUnit::TPanel::DrawBarBkgnd( int iBar, int leftDraw, int topDraw )
{
TRect rectBar;
rectBar.left = leftDraw;
rectBar.right = rectBar.left + m_nDataWidth;
rectBar.top = topDraw;
rectBar.bottom = rectBar.top + m_nDataHeight;
int iFirstBar, iStage = FindStage( iBar, &iFirstBar );
if( iStage<0 ) return;
COMPOSESTAGE* pStage = g_lstComposeStages[iStage];
COLORREF clrNormal, clrDisable;
if( pStage->iMelodyStage>=COMPOSE_ENDING_1 ){
clrNormal = g_clrEnding[pStage->iMelodyStage - COMPOSE_ENDING_1];
clrDisable = g_clrEndingDisable[pStage->iMelodyStage - COMPOSE_ENDING_1];
}
else if( pStage->iMelodyStage>=COMPOSE_INTRO_1 ){
clrNormal = g_clrIntro[pStage->iMelodyStage - COMPOSE_INTRO_1];
clrDisable = g_clrIntroDisable[pStage->iMelodyStage - COMPOSE_INTRO_1];
}
else{
clrNormal = g_clrStage[pStage->iVar % STAGE_VAR_NUM];
clrDisable = g_clrStageDisable[pStage->iVar % STAGE_VAR_NUM];
}
if( !m_bShowModifyPos || m_iModifyBeginBar<0 && m_iModifyEndBar<0 ||
( m_iModifyEndBar<0 || iBar<m_iModifyEndBar ) && iBar>m_iModifyBeginBar){
Canvas->Brush->Color = clrNormal;
Canvas->FillRect( rectBar );
}
else if( iBar<m_iModifyBeginBar || m_iModifyEndBar>=0 && iBar>m_iModifyEndBar ){
Canvas->Brush->Color = clrDisable;
Canvas->FillRect( rectBar );
}
else{
if( iBar==m_iModifyBeginBar && iBar==m_iModifyEndBar ){
if( m_iModifyBeginPoint>0 ){
Canvas->Brush->Color = clrDisable;
rectBar.right = leftDraw + m_iModifyBeginPoint;
Canvas->FillRect( rectBar );
}
Canvas->Brush->Color = clrNormal;
rectBar.left = leftDraw + m_iModifyBeginPoint;
rectBar.right = leftDraw + m_iModifyEndPoint;
Canvas->FillRect( rectBar );
if( m_iModifyEndPoint<m_nDataWidth-1 ){
Canvas->Brush->Color = clrDisable;
rectBar.left = leftDraw + m_iModifyEndPoint;
rectBar.right = leftDraw + m_nDataWidth;
Canvas->FillRect( rectBar );
}
}
else if( iBar==m_iModifyBeginBar ){
if( m_iModifyBeginPoint>0 ){
Canvas->Brush->Color = clrDisable;
rectBar.right = leftDraw + m_iModifyBeginPoint;
Canvas->FillRect( rectBar );
}
if( m_iModifyBeginPoint<m_nDataWidth-1 ){
Canvas->Brush->Color = clrNormal;
rectBar.left = leftDraw + m_iModifyBeginPoint;
rectBar.right = leftDraw + m_nDataWidth;
Canvas->FillRect( rectBar );
}
}
else if( iBar==m_iModifyEndBar ){
if( m_iModifyEndPoint>0 ){
Canvas->Brush->Color = clrNormal;
rectBar.right = leftDraw + m_iModifyEndPoint;
Canvas->FillRect( rectBar );
}
if( m_iModifyEndPoint<m_nDataWidth-1 ){
Canvas->Brush->Color = clrDisable;
rectBar.left = leftDraw + m_iModifyEndPoint;
rectBar.right = leftDraw + m_nDataWidth;
Canvas->FillRect( rectBar );
}
}
}
}
//---------------------------------------------------------------------------
#define COLOR_WAVE_NEW RGB(15,229,226)
#define COLOR_WAVE_OLD RGB(75,148,147)
void __fastcall CompletePanelUnit::TPanel::DrawBarContext( int iBar, int leftDraw, int topDraw )
{
//绘制波形
TColor clrOld = Canvas->Pen->Color;
int mid = topDraw + m_nDataHeight/2;
BARVOLS *pBV = g_lstCompleteVols[iBar];
if( iBar>=g_lstCompleteVols.size() || pBV->bInvalid )
return;
if( pBV->bRecording )
Canvas->Pen->Color = COLOR_WAVE_NEW;
else
Canvas->Pen->Color = COLOR_WAVE_OLD;
for( int k=0; k<POINTS_PER_BAR; k++ ){
if( pBV->aVols[k]!=0 && pBV->aVols[k]!=-1 ){
DWORD wLeft = LOWORD(pBV->aVols[k]),
wRight = HIWORD(pBV->aVols[k]);
int yTop = mid - ((14 * wLeft )/0x8000),
yBottom = mid + ((14 * wRight )/0x8000);
if( yBottom>yTop ){
Canvas->MoveTo( leftDraw+k, yTop );
Canvas->LineTo( leftDraw+k, yBottom );
}
}
}
Canvas->Pen->Color = clrOld;
}
//---------------------------------------------------------------------------
void __fastcall CompletePanelUnit::TPanel::BarPosChanged()
{
//
}
//---------------------------------------------------------------------------
bool CompletePanelUnit::TPanel::SetModifyPos( bool bBegin, int iNewBar, int iNewPoint )
{
int iBeginBar, iBeginPoint, iEndBar, iEndPoint;
bool bSet = false;
if( bBegin ){
iBeginBar = iNewBar,
iBeginPoint = iNewPoint;
iEndBar = m_iModifyEndBar;
iEndPoint = m_iModifyEndPoint;
int iBPoints = iBeginBar * m_nDataWidth + iBeginPoint,
iEPoints = iEndBar * m_nDataWidth + iEndPoint;
if( iBPoints<0 )
iBPoints = 0;
if( iEPoints<0 )
iEPoints = m_nBarNum * m_nDataWidth - 1;
if( iEPoints >= iBPoints ){
if( iEPoints < iBPoints + 15 ){
iBPoints = iEPoints - 15;
iBeginBar = iBPoints / m_nDataWidth;
iBeginPoint = iBPoints % m_nDataWidth;
}
m_iModifyBeginBar = iBeginBar;
m_iModifyBeginPoint = iBeginPoint;
bSet = true;
}
}
else{
iBeginBar = m_iModifyBeginBar;
iBeginPoint = m_iModifyBeginPoint;
iEndBar = iNewBar;
iEndPoint = iNewPoint;
int iBPoints = iBeginBar * m_nDataWidth + iBeginPoint,
iEPoints = iEndBar * m_nDataWidth + iEndPoint;
if( iBPoints<0 )
iBPoints = 0;
if( iEPoints<0 )
iEPoints = m_nBarNum * m_nDataWidth - 1;
if( iEPoints >= iBPoints ){
if( iEPoints < iBPoints + 15 ){
iEPoints = iBPoints + 15;
iEndBar = iEPoints / POINTS_PER_BAR;
iEndPoint = iEPoints % POINTS_PER_BAR;
}
m_iModifyEndBar = iEndBar;
m_iModifyEndPoint = iEndPoint;
bSet = true;
}
}
Invalidate();
return bSet;
}
//---------------------------------------------------------------------------
void CompletePanelUnit::TPanel::GetModifyPos( bool bBegin, int& iBar, int& iPoint )
{
if( bBegin ){
iBar = m_iModifyBeginBar;
iPoint = m_iModifyBeginPoint;
}
else{
iBar = m_iModifyEndBar;
iPoint = m_iModifyEndPoint;
}
}
//---------------------------------------------------------------------------
void CompletePanelUnit::TPanel::ShowModifyPos( bool bShow )
{
m_bShowModifyPos = bShow;
if( !bShow ){
m_iModifyBeginBar = m_iModifyBeginPoint =
m_iModifyEndBar = m_iModifyEndPoint = -1;
}
Invalidate();
}
//---------------------------------------------------------------------------
int CompletePanelUnit::TPanel::FindStage( int iBar, int *piFirstBar )
{
if( iBar>=0 ){
int nStageNum = g_lstComposeStages.size();
int nBarCount = 0;
for( int i=0; i<nStageNum; i++ ){
COMPOSESTAGE* pStage = g_lstComposeStages[i];
if( piFirstBar )
*piFirstBar = nBarCount;
nBarCount += pStage->nStageBars;
if( iBar<nBarCount ){
return i;
}
}
}
return -1;
}
//---------------------------------------------------------------------------
int CompletePanelUnit::TPanel::FirstBar( int iStage )
{
if( iStage>=g_lstComposeStages.size() )
return -1;
int nBarCount = 0;
for( int i=0; i<iStage; i++ ){
COMPOSESTAGE* pStage = g_lstComposeStages[i];
nBarCount += pStage->nStageBars;
}
return nBarCount;
}
//---------------------------------------------------------------------------
void CompletePanelUnit::TPanel::InvalidateStage( int iStage, int iArea )
{
int iFirstBar = FirstBar( iStage );
COMPOSESTAGE * pStage = g_lstComposeStages[iStage];
for( int i=0; i<pStage->nStageBars; i++ ){
InvalidateBar( iFirstBar+i, 0, m_nBarWidth, iArea );
}
}
//---------------------------------------------------------------------------