Files
AC_Pro/StylePanel.cpp
2026-06-13 00:05:19 +08:00

2449 lines
60 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#include <Vcl.Imaging.pngimage.hpp>
#pragma hdrstop
#include "GlobalUnit.h"
#include "StylePanel.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define MIDI_EVENT_PROGRAM 2
#define MIDI_EVENT_VOLUME 12
#define INSERT_HEIGHT 10
extern TImage * w_imgDrag; //拖动图片
extern bool w_bDraging;
extern int w_iDragMode, //拖动模式
w_xImgDrag, //透明图片位置
w_yImgDrag,
w_xOldDrag, //透明图片上次位置
w_yOldDrag,
w_xOffDrag, //图片左上角与鼠标距离
w_yOffDrag;
extern COLORREF clrTextStyle, //Style文字
clrTextHot, //高亮文字
clrTextDisable, //未下载文字
clrBackground, //面板背景
clrFocback, //焦点背景
clrSelback; //选中背景
extern TPngImage *u_imgFold,
*u_imgUnfold,
*u_imgTrackOn,
*u_imgTrackOff,
*u_imgDelete,
*u_imgDownload,
*u_imgDownloading,
*u_imgProg,
*u_imgTexture,
*u_imgVolume,
*u_imgBrush,
*u_imgCollect,
*u_imgUnCollect,
*u_imgScore,
*u_imgSave,
*u_imgImport,
*u_imgUpload,
*u_imgCharge;
const BYTE u_arrChordPreset[2][4][4] = { //预设和弦
{{0,37,9,30},{0,37,20,28},{0,9,20,28},{0,17,37,30}},
{{37,9,28,16},{37,17,20,28},{37,0,9,17},{37,28,20,16}} };
/////////////////////////////////////////////////////////////////////////////
// TStylePanel
void TStylePanel::LoadImages()
{
if( u_imgFold )
delete u_imgFold;
if( u_imgUnfold )
delete u_imgUnfold;
if( u_imgTrackOn )
delete u_imgTrackOn;
if( u_imgTrackOff )
delete u_imgTrackOff;
if( u_imgDelete )
delete u_imgDelete;
if( u_imgBrush )
delete u_imgBrush;
if( u_imgVolume )
delete u_imgVolume;
if( u_imgDownload )
delete u_imgDownload;
if( u_imgProg )
delete u_imgProg;
if( u_imgTexture )
delete u_imgTexture;
if( u_imgCollect )
delete u_imgCollect;
if( u_imgUnCollect )
delete u_imgUnCollect;
if( u_imgScore )
delete u_imgScore;
if( u_imgSave )
delete u_imgSave;
if( u_imgImport )
delete u_imgImport;
if( u_imgUpload )
delete u_imgUpload;
if( u_imgCharge )
delete u_imgCharge;
u_imgFold = new TPngImage();
u_imgFold->LoadFromResourceName(int(HInstance), L"imgFold");
u_imgUnfold = new TPngImage();
u_imgUnfold->LoadFromResourceName(int(HInstance), L"imgUnfold");
u_imgTrackOn = new TPngImage();
u_imgTrackOn->LoadFromResourceName(int(HInstance), L"imgTrackOn");
u_imgTrackOff = new TPngImage();
u_imgTrackOff->LoadFromResourceName(int(HInstance), L"imgTrackOff");
u_imgDelete = new TPngImage();
u_imgDelete->LoadFromResourceName(int(HInstance), L"imgDelete");
u_imgBrush = new TPngImage();
u_imgBrush->LoadFromResourceName(int(HInstance), L"imgBrush");
u_imgDownload = new TPngImage();
u_imgDownload->LoadFromResourceName(int(HInstance), L"imgDownload");
u_imgProg = new TPngImage();
u_imgProg->LoadFromResourceName(int(HInstance), L"imgProg");
u_imgTexture = new TPngImage();
u_imgTexture->LoadFromResourceName(int(HInstance), L"imgTexture");
u_imgVolume = new TPngImage();
u_imgVolume->LoadFromResourceName(int(HInstance), L"imgVolume");
u_imgCollect = new TPngImage();
u_imgCollect->LoadFromResourceName(int(HInstance), L"imgCollect");
u_imgUnCollect = new TPngImage();
u_imgUnCollect->LoadFromResourceName(int(HInstance), L"imgUnCollect");
u_imgScore = new TPngImage();
u_imgScore->LoadFromResourceName(int(HInstance), L"imgStar");
u_imgSave = new TPngImage();
u_imgSave->LoadFromResourceName(int(HInstance), L"imgStyleSave");
u_imgImport = new TPngImage();
u_imgImport->LoadFromResourceName(int(HInstance), L"imgAddSegment");
u_imgUpload = new TPngImage();
u_imgUpload->LoadFromResourceName(int(HInstance), L"imgStyleUpload");
u_imgCharge = new TPngImage();
u_imgCharge->LoadFromResourceName(int(HInstance), L"imgStyleCharge");
}
void TStylePanel::FreeImages()
{
if( u_imgFold ){
delete u_imgFold;
u_imgFold = NULL;
}
if( u_imgUnfold ){
delete u_imgUnfold;
u_imgUnfold = NULL;
}
if( u_imgTrackOn ){
delete u_imgTrackOn;
u_imgTrackOn = NULL;
}
if( u_imgTrackOff ){
delete u_imgTrackOff;
u_imgTrackOff = NULL;
}
if( u_imgDelete ){
delete u_imgDelete;
u_imgDelete = NULL;
}
if( u_imgBrush ){
delete u_imgBrush;
u_imgBrush = NULL;
}
if( u_imgDownload ){
delete u_imgDownload;
u_imgDownload = NULL;
}
if( u_imgVolume ){
delete u_imgVolume;
u_imgVolume = NULL;
}
if( u_imgProg ){
delete u_imgProg;
u_imgProg = NULL;
}
if( u_imgScore ){
delete u_imgScore;
u_imgScore = NULL;
}
if( u_imgCollect ){
delete u_imgCollect;
u_imgCollect = NULL;
}
if( u_imgUnCollect ){
delete u_imgUnCollect;
u_imgUnCollect = NULL;
}
if( u_imgSave ){
delete u_imgSave;
u_imgSave = NULL;
}
if( u_imgImport ){
delete u_imgImport;
u_imgImport = NULL;
}
if( u_imgUpload ){
delete u_imgUpload;
u_imgUpload = NULL;
}
if( u_imgCharge ){
delete u_imgCharge;
u_imgCharge = NULL;
}
}
__fastcall TStylePanel::TStylePanel(TComponent* AOwner)
: TToolpalPanel(AOwner)
{
m_iType = TPTYPE_STYLE;
m_aItems = new System::Classes::TList();
m_pTimer = NULL;
m_nItemHeight = OPTION_HEIGHT;
m_pTopItem = m_pFocItem = m_pSelItem = m_pPlayItem = NULL;
m_pDragItem = m_pDropItem = m_pHoverItem = NULL;
m_iFocLine = m_iSelLine = m_iHoverLine = -1;
m_nTotalLine = m_iTopLine = 0;
m_iFocCol = 0;
m_bPlaying = false;
m_VolTrackBar = NULL;
m_editName = NULL;
// m_Hint = NULL;
// m_HintTimer = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::CreateWnd(void)
{
TToolpalPanel::CreateWnd();
OnDblClick = DoubleClick;
OnMouseLeave = MouseLeave;
m_sbVert = new TSkinScrollBar(NULL);
m_sbVert->Parent = this;
m_sbVert->m_pWndCtrl = this;
m_sbVert->Visible = false;
m_sbVert->Left = ClientWidth - m_sbVert->Width - 1;
m_sbVert->Top = m_nTitleHeight + 1;
m_sbVert->Height = ClientHeight - m_nTitleHeight - 2;
Canvas->Font->Name = g_strTxtFontName;//"Times New Roman";
Canvas->Font->Quality = TFontQuality::fqClearTypeNatural;
// if( !strcmp( g_strTxtFontName, "微软雅黑" ) ){
// Canvas->Font->Size = g_szFont9;
// }
// else{
// Canvas->Font->Size = g_szFont8;
// }
Canvas->Font->Size = g_szFont9;
CalcViewArea();
InitItems();
// m_PopupMenu = NULL;
}
//---------------------------------------------------------------------------
__fastcall TStylePanel::~TStylePanel()
{
// if( m_PopupMenu )
// delete m_PopupMenu;
ClearAllItems();
delete m_aItems;
if( m_pTimer )
delete m_pTimer;
// if( m_Hint )
// delete m_Hint;
//
// if( m_HintTimer )
// delete m_HintTimer;
if( m_editName )
delete m_editName;
if( m_VolTrackBar )
delete m_VolTrackBar;
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::DoHandleMessage(MSG &Msg, bool &Handled)
{
if( !Visible )
return;
if( ( Msg.message==WM_LBUTTONDOWN || Msg.message==WM_RBUTTONDOWN )
&& Msg.hwnd!=Handle
&& !( Msg.hwnd==m_PopMenu->Handle
|| m_editName && Msg.hwnd==m_editName->Handle
|| m_VolTrackBar && Msg.hwnd==m_VolTrackBar->Handle )){
SetFocusedItem( NULL, -1, 0 );
}
TToolpalPanel::DoHandleMessage( Msg, Handled );
}
//---------------------------------------------------------------------------
void TStylePanel::ClearAllItems()
{
Stop( STOP_SELF );
m_pTopItem = m_pFocItem = m_pSelItem = NULL;
m_pDragItem = m_pHoverItem = NULL;
m_iFocLine = m_iSelLine = m_iHoverLine = -1;
m_nTotalLine = m_iTopLine = 0;
m_iFocCol = 0;
for( int i=0; i<m_aItems->Count; i++ ){
delete m_aItems->Items[i];
}
m_aItems->Clear();
if( m_VolTrackBar ){
delete m_VolTrackBar;
m_VolTrackBar = NULL;
}
if( m_editName && m_editName->Visible ){
m_editName->Hide();
}
}
//---------------------------------------------------------------------------
void TStylePanel::CalcViewArea()
{
m_nItemWidth = ClientWidth - 2;
m_nItemShow = (ClientHeight - m_nTitleHeight - 1) / m_nItemHeight;
if( ((ClientHeight - m_nTitleHeight - 1) % m_nItemHeight ) > 3 )
m_nItemShow++;
}
//---------------------------------------------------------------------------
void TStylePanel::ScrollView( int nPos, bool bRedraw )
{
if( m_iTopLine!=nPos ){
if( m_iTopLine<nPos ){
for( int i=m_iTopLine; i<nPos; i++ ){
if( m_pTopItem ){
m_pTopItem = GetNextItem( m_pTopItem );
}
else{
break;
}
}
}
else{
for( int i=nPos; i<m_iTopLine; i++ ){
if( m_pTopItem ){
m_pTopItem = GetPrevItem( m_pTopItem );
}
else{
break;
}
}
}
if( m_pSelItem )
m_iSelLine += m_iTopLine - nPos;
if( m_pHoverItem )
m_iHoverLine += m_iTopLine - nPos;
SetFocusedItem( NULL, -1, 0 );
m_iTopLine = nPos;
Paint();
}
if( bRedraw ){
m_sbVert->SetPosition( nPos );
}
}
//---------------------------------------------------------------------------
TStyleItem* __fastcall TStylePanel::AddStyle( TPROSTYLE* info, DWORD opts )
{
TStyleItem* pItem = new TStyleItem( info, opts );
if( m_aItems->Count>0 ){
TCommonItem *pLast = (TCommonItem*)m_aItems->Last();
pLast->next = pItem;
pItem->prev = pLast;
}
else{
m_pTopItem = pItem;
}
m_aItems->Add( pItem );
m_nTotalLine++;
return pItem;
}
//---------------------------------------------------------------------------
TCommonItem* TStylePanel::GetItem( int iSty, int iSeg, int iTrk )
{
TCommonItem* pItem = NULL;
if( iSty<m_aItems->Count ){
TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[iSty];
if( iSeg<0 ){
return pStyItem;
}
else if( iSeg < pStyItem->aItems->Count ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[iSeg];
if( iTrk<0 ){
return pSeg;
}
else if( iTrk < pSeg->aItems->Count ){
return (TTrackItem*)pSeg->aItems->Items[iTrk];
}
}
}
return NULL;
}
//---------------------------------------------------------------------------
TCommonItem* TStylePanel::GetNextItem( TCommonItem* pItem )
{
TCommonItem* pNextItem = NULL;
if( (pItem->dwState & STATE_UNFOLD) && pItem->aItems->Count>0 ){
pNextItem = (TCommonItem*)pItem->aItems->First();
}
else if( pItem->next ){
pNextItem = pItem->next;
}
else if( pItem->up && pItem->up->next ){
pNextItem = pItem->up->next;
}
else if( pItem->up && pItem->up->up && pItem->up->up->next ){
pNextItem = pItem->up->up->next;
}
return pNextItem;
}
//---------------------------------------------------------------------------
TCommonItem* TStylePanel::GetPrevItem( TCommonItem *pItem )
{
TCommonItem* pPrevItem = pItem->prev;
if( pPrevItem ){
while( pPrevItem->aItems->Count>0 && (pPrevItem->dwState & STATE_UNFOLD) ){
pPrevItem = (TCommonItem*)pPrevItem->aItems->Last();
}
}
else{
pPrevItem = pItem->up;
}
return pPrevItem;
}
//---------------------------------------------------------------------------
TCommonItem* TStylePanel::HitTest( int X, int Y, WORD* iCol )
{
if( Y<0 || Y>Height-1 )
return NULL;
TCommonItem* pItem = m_pTopItem,
*pHitItem = NULL;
int h = m_nItemHeight;
for( int i=0; i<m_nItemShow && pItem; i++ ){
if( Y<h ){
pHitItem = pItem;
break;
}
pItem = GetNextItem( pItem );
h += m_nItemHeight;
}
if( pHitItem ){
int leftFold = LEFT_BOUND,
rightFold = leftFold + OPTION_WIDTH,
leftText = leftFold + OPTION_WIDTH,
rightText = Width - RIGHT_BOUND - OPTION_WIDTH * pHitItem->aOptions->Count,
offset = 0;
if( pHitItem->iType!=SEGTYPE_STYLE ){
offset += OPTION_WIDTH;
if( pHitItem->iType==SEGTYPE_TRACK ){
offset += OPTION_WIDTH;
}
}
leftFold += offset;
rightFold += offset;
leftText += offset;
// rightText += offset;
WORD col = 0;
if( X<rightFold && X>leftFold ){
col = COL_FOLD;
}
else if( X>leftText && X<rightText ){
col = COL_TEXT;
}
else if( X>rightText && X<Width-RIGHT_BOUND ){
int l = rightText,
r = l + OPTION_WIDTH;
for( int i=0; i<OPT_COL_NUM; i++ ){
if( X>l && X<=r ){
col = (COL_OPT<<(pHitItem->aOptions->Count-i-1));
break;
}
l = r;
r += OPTION_WIDTH;
}
}
else{
pHitItem = NULL;
}
if( iCol )
*iCol = col;
}
return pHitItem;
}
//---------------------------------------------------------------------------
void TStylePanel::InitItems()
{
//清空内容
ClearAllItems();
Init();
ResetScrollBar();
Paint();
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::Paint()
{
TCommonItem* pItem = m_pTopItem;
for( int i=0; i<m_nItemShow; i++ ){
DrawItem( pItem, i, -1 );
if( pItem )
pItem = GetNextItem( pItem );
}
TToolpalPanel::Paint();
}
//---------------------------------------------------------------------------
void TStylePanel::ResetScrollBar()
{
int page = m_nItemShow;
if( ((ClientHeight - m_nTitleHeight - 1) % m_nItemHeight ) > 3 )
page--;
if( m_nTotalLine>page ){ //显示滚动条
int range = m_nTotalLine;
m_sbVert->SetRange( 0, range-1 );
m_sbVert->SetPageSize( page );
m_sbVert->SetPosition( 0 );
int iRowScroll = 0, iTopLine = m_iTopLine;
if( iTopLine>0 ){
iRowScroll = min( iTopLine, range-page );
if( iRowScroll<0 ){
iRowScroll = 0;
}
}
ScrollView( iRowScroll );
}
else{
m_sbVert->SetRange( 0, 0, false );
m_sbVert->SetPageSize( 0, false );
m_sbVert->SetPosition( 0, false );
if( m_iTopLine!=0 ){
m_iTopLine = 0;
m_pTopItem = m_aItems->Count>0 ? (TCommonItem*)m_aItems->Items[0] : NULL;
Paint();
}
}
}
//---------------------------------------------------------------------------
void TStylePanel::ShowSelItem()
{
bool bPaint = true;
if( m_pSelItem ){
if( m_iSelLine >= m_nItemShow ){ //需要向下滚动
ScrollView( m_iSelLine + m_iTopLine - m_nItemShow + 1, true );
bPaint = false;
}
else if( m_iSelLine<0 ){ //需要向上滚动
ScrollView( m_iSelLine + m_iTopLine, true );
bPaint = false;
}
}
if( bPaint ){
Paint();
}
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::WMSize(Winapi::Messages::TWMSize &Message)
{
TToolpalPanel::WMSize( Message );
CalcViewArea();
if( m_sbVert ){
m_sbVert->Left = Width - m_sbVert->Width - 1;
m_sbVert->Top = m_nTitleHeight + 1;
m_sbVert->Height = Height - m_nTitleHeight - 2;
ResetScrollBar();
}
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::WMVScroll(Winapi::Messages::TWMScroll &Message)
{
if( !m_sbVert->IsOperable() )
return;
int minpos, maxpos, page, curpos;
m_sbVert->GetScrollRange(&minpos, &maxpos);
page = m_sbVert->GetPageSize();
// Get the current position of scroll box.
curpos = m_sbVert->GetScrollPos();
// Determine the new position of scroll box.
switch (Message.ScrollCode)
{
case SB_TOP: // Scroll to far top.
curpos = minpos;
break;
case SB_BOTTOM: // Scroll to far bottom.
curpos = maxpos-page+1;
break;
case SB_ENDSCROLL: // End scroll.
break;
case SB_LINEUP: // Scroll left.
if (curpos > minpos)
curpos--;
break;
case SB_LINEDOWN: // Scroll right.
if (curpos < maxpos-page+1)
curpos++;
break;
case SB_PAGEUP: // Scroll one page left.
if (curpos > minpos)
curpos = max(minpos, curpos-page);
break;
case SB_PAGEDOWN: // Scroll one page right.
if( curpos<maxpos-page+1 )
curpos = min(maxpos-page+1, curpos+page);
break;
case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
curpos = Message.Pos; // of the scroll box at the end of the drag operation.
break;
case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the
curpos = Message.Pos; // position that the scroll box has been dragged to.
break;
}
// Set the new position of the thumb (scroll box).
if( Message.ScrollBar!=m_sbVert->Handle )
m_sbVert->SetPosition(curpos);
ScrollView(curpos, FALSE);
Message.Result = true;
}
//---------------------------------------------------------------------------
void TStylePanel::SetSelect( TCommonItem *pItem, int iLine )
{
if( pItem!=m_pSelItem ){
if( m_bPlaying )
Stop();
if( m_pSelItem ){
m_pSelItem->Select( false );
if( m_iSelLine>=0 && m_iSelLine<m_nItemShow ){ //需要重绘选中项
DrawItem( m_pSelItem, m_iSelLine, -1 );
}
}
if( pItem ){
pItem->Select( true );
if( iLine>=0 && iLine<m_nItemShow ){
DrawItem( pItem, iLine, -1 );
}
}
m_pSelItem = pItem;
m_iSelLine = iLine;
}
}
//---------------------------------------------------------------------------
void TStylePanel::SetCollect(TCommonItem* pStyle)
{
int idLoc = ((TStyleItem*)pStyle)->pStyle->idLoc,
idStyle = ((TStyleItem*)pStyle)->pStyle->idStyle;
int index=-1;
bool bCollected = false;
for( int i=0; i<g_aCollectStyles.size(); i++ ){
if( g_aCollectStyles[i]->idLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){
bCollected = true;
index = i;
break;
}
}
// pStyle->SetCollect( !bCollected );
if( bCollected ){
//删除Collect 容器内容
g_aCollectStyles.erase( g_aCollectStyles.begin() + index );
f_CM_SetCollectionStyle( false, idLoc, idStyle );
}
else{
//添加进容器
g_aCollectStyles.push_back( ((TStyleItem*)pStyle)->pStyle );
f_CM_SetCollectionStyle( true, idLoc, idStyle );
}
}
void __fastcall TStylePanel::WMMouseWheel(TWMMouseWheel &Message)
{
if( m_editName && m_editName->Visible )
return;
if( m_VolTrackBar ){
// if( m_Hint )
// m_Hint->ReleaseHandle(); //删除hint
m_VolTrackBar->Perform( WM_MOUSEWHEEL, MAKELONG(0,Message.WheelDelta), NULL );
}
else if( m_sbVert->IsOperable() ){
// if( m_Hint )
// m_Hint->ReleaseHandle(); //删除hint
UINT nSBCode;
if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP;
else nSBCode = SB_LINEDOWN;
Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL );
}
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::UMMouseMove(TWMMouseMove &Message)
{
TShiftState Shift(Message.Keys);
if( m_pDragItem ){
if( abs(Message.XPos-ptDown.X)>=4
|| abs(Message.YPos-ptDown.Y)>=4 ){ //开始拖动
DrawDragImg( m_pDragItem );
int left = LEFT_BOUND,
iLine = (ptDown.Y - m_nTitleHeight)/m_nItemHeight,
top = iLine * m_nItemHeight + m_nTitleHeight;
if( m_pDragItem->iType==SEGTYPE_TRACK )
left += OPTION_WIDTH * 2;
else if( m_pDragItem->iType!=SEGTYPE_STYLE )
left += OPTION_WIDTH;
TPoint pt( left, top );
pt = ClientToScreen( pt );
w_xOldDrag = w_xImgDrag = pt.X;
w_yOldDrag = w_yImgDrag = pt.Y;
w_xOffDrag = ptDown.X - left;
w_yOffDrag = ptDown.Y - top;
}
}
else if( Shift.Empty() ){
if( !Focused())
SetFocus();
WORD iCol = 0;
int iHitLine = (Message.YPos - m_nTitleHeight)/m_nItemHeight;
TCommonItem* pItem = NULL;
if( !m_sbVert->Visible || Message.XPos < m_sbVert->Left )
pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol );
// pMove.X = Message.XPos;
// pMove.Y = (iHitLine+1)*m_nItemHeight +m_nTitleHeight ;//Message.YPos;
if( pItem!=m_pFocItem || iCol!=m_iFocCol ){
// Hint = "";
// Hint = "";
Application->CancelHint();
// Application->ShowHint = false;
if( pItem ){
//创建hint
if( iCol==COL_TEXT ){
Hint = pItem->HintText();
}
else if( iCol==COL_FOLD ){
if( pItem->iType==SEGTYPE_TRACK ){
Hint = "静音";
}
else{
if( pItem->IsUnfold() )
Hint = "收起";
else
Hint = "展开";
}
}
else{
DWORD opt = pItem->GetOption( iCol );
if( opt==OPT_DEL ){
Hint = "删除";
}
else if( opt==OPT_DOWNLOAD ){
Hint = "下载";
}
else if( opt==OPT_VOL ){
int vol=0;
if( pItem->iType==SEGTYPE_TRACK ){
TTrackItem* pTrk = (TTrackItem*)pItem;
vol = pTrk->pTrack->nVol;
}
else{
TSegmentItem* pSeg = (TSegmentItem*)pItem;
vol = pSeg->volume;
}
Hint = "音量:"+IntToStr(vol);
}
else if( opt==OPT_BRUSH){
if( pItem->iType==SEGTYPE_TRACK )
Hint = "乐器刷";
else
Hint = "风格刷";
}
else if( opt==OPT_TEXTURE ){
Hint = "更换织体";
}
else if( opt==OPT_FONTPROG ){
if(pItem->iType == SEGTYPE_STYLE)
Hint = "批量更换音色/乐器";
else
Hint = "更换音色/乐器";
}
else if( opt==OPT_COLLECT ){
if( pItem->iType==SEGTYPE_STYLE ){
if( pItem->IsCollected() )
Hint = "取消风格收藏";
else
Hint = "收藏风格";
}
else if( pItem->iType==SEGTYPE_TRACK ){
if( pItem->IsCollected() )
Hint = "取消织体收藏";
else
Hint = "收藏织体";
}
}
else if( opt==OPT_SCORE ){
TStyleItem * pStyItem = (TStyleItem*)pItem;
if( pStyItem->pStyle ){
char buf[8];
int score10;
if( pStyItem->pStyle->idLoc==0 )
score10 = (int)(pStyItem->pStyle->pOrigin->score/10.0 + 0.5);
else
score10 = (int)(pStyItem->pStyle->pShare->score/10.0 + 0.5);
sprintf( buf, "%.1f", score10 / 10.0 );
Hint = "当前评分:" + String(buf) + "\n (点击评分)";
}
}
else if( opt==OPT_SAVE ){
Hint = "保存为本地风格";
}
else if( opt==OPT_IMPORT ){
Hint = "导入MIDI片段";
}
else if( opt==OPT_UPLOAD ){
Hint = "发布:原创风格\n分享:重组风格";
}
else if( opt==OPT_CHARGE ){
if( pItem->iType==SEGTYPE_STYLE )
Hint = ChargeTip( (TStyleItem*)pItem );
}
}
}
// Hint = HintStr;
// Application->ShowHint = true;
}
SetFocusedItem( pItem, iHitLine, iCol );
}
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::WMMouseDown(TWMMouse &Message)
{
TToolpalPanel::WMMouseDown(Message);
if( Message.Result==1 )
return;
// if( m_HintTimer && m_HintTimer->Enabled )
// m_HintTimer->Enabled = false;
if( m_VolTrackBar ){
delete m_VolTrackBar;
m_VolTrackBar = NULL;
}
int iHitLine = (Message.YPos - m_nTitleHeight)/m_nItemHeight;
unsigned short iCol = 0;
TCommonItem* pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol );
SetFocusedItem( pItem, iHitLine, iCol );
if( !m_pFocItem ){
SetSelect( NULL, -1 );
}
else if( Message.Keys & MK_RBUTTON ){
CMenuItem* pMenuItem = NULL;
m_PopMenu->ClearItems();
int index = -1;
if( m_pFocItem->aItems->Count>0 ){
if( m_pFocItem->IsUnfold() )
m_PopMenu->CreateMenu( "收起", "", DoFold );
else
m_PopMenu->CreateMenu( "展开", "", DoFold );
}
else if( m_pFocItem->iType==SEGTYPE_TRACK ){
if( m_pFocItem->IsMute() )
m_PopMenu->CreateMenu( "取消静音", "", DoMute );
else
m_PopMenu->CreateMenu( "静音", "", DoMute );
}
if( index!=-1 )
m_PopMenu->CreateMenu( "-" );
int iOnline = m_pFocItem->GetOnlineState();
if( iOnline==e_Downloaded ){
m_PopMenu->CreateMenu( "试听播放", "", DoPlay );
pMenuItem = m_PopMenu->CreateMenu( "停止试听", "", DoStop );
pMenuItem->Enabled = m_bPlaying;
bool bBreak = true;
for( int i=0; i<OPT_COL_NUM; i++ ){
int opt = m_pFocItem->GetOption( COL_OPT<<i );
if( opt>0 && opt!=OPT_CHARGE ){
if( bBreak ){
m_PopMenu->CreateMenu( "-" );
//m_PopupMenu->AddMenuItem( "-" );
bBreak = false;
}
if( opt==OPT_DEL ){
m_PopMenu->CreateMenu( "删除", "", DoDelete );
if( m_pFocItem->iType==SEGTYPE_STYLE ){
m_PopMenu->CreateMenu( "重命名", "", DoRename );
}
}
else if( opt==OPT_VOL ){
m_PopMenu->CreateMenu( "调节音量", "", DoAdjustVolume );
}
else if( opt==OPT_BRUSH ){
if( m_pFocItem->iType==SEGTYPE_TRACK )
m_PopMenu->CreateMenu( "乐器刷", "", DoUseBrush );
else
m_PopMenu->CreateMenu( "风格刷", "", DoUseBrush );
}
else if( opt==OPT_TEXTURE ){
m_PopMenu->CreateMenu( "更换织体", "", DoChangeTexture );
}
else if( opt==OPT_FONTPROG ){
if(m_pFocItem->iType == SEGTYPE_STYLE){
m_PopMenu->CreateMenu( "批量更换音色/乐器", "", DoChangeFontProg );
if( !g_lstOpusStages.empty() && ((TStyleItem*)m_pFocItem)->nBars==0 ){
m_PopMenu->CreateMenu( "-" );
m_PopMenu->CreateMenu( "替换使用风格", "", DoApplyUseStyle );
}
}
else
m_PopMenu->CreateMenu( "更换音色库或音色", "", DoChangeFontProg );
}
else if( opt==OPT_COLLECT ){
String strMenu;
if( m_pFocItem->iType==SEGTYPE_STYLE ){
if( m_pFocItem->IsCollected() )
strMenu = "取消风格收藏";
else
strMenu = "收藏风格";
}
else if( m_pFocItem->iType==SEGTYPE_TRACK ){
if( m_pFocItem->IsCollected() )
strMenu = "取消织体收藏";
else
strMenu = "收藏织体";
}
if( !strMenu.IsEmpty() )
m_PopMenu->CreateMenu( strMenu, "", DoCollect );
}
else if( opt==OPT_SAVE ){
m_PopMenu->CreateMenu( "-" );
m_PopMenu->CreateMenu( "保存为本地风格...", "", DoSaveLocalStyle );
}
else if( opt==OPT_IMPORT ){
m_PopMenu->CreateMenu( "导入MIDI片段...", "", DoImportSegment );
}
}
}
if( m_pFocItem->iType==SEGTYPE_STYLE ){
if( m_pFocItem!=g_pUseStyle ){
m_PopMenu->CreateMenu( "-" );
pMenuItem = m_PopMenu->CreateMenu( "替换使用风格", "", DoApplyUseStyle );
pMenuItem->Enabled = !g_lstOpusStages.empty();
if( m_pFocItem!=g_pPreStyle ){
m_PopMenu->CreateMenu( "替换预编风格", "", DoApplyPreStyle );
m_PopMenu->CreateMenu( "-" );
pMenuItem = m_PopMenu->CreateMenu( "重新下载风格", "", DoDownload );
pMenuItem->Enabled = !g_bUpdateMandatory && SOFTWARE_ID!=e_Pro_Lite;
}
}
}
}
else if( iOnline==e_UnDownload ){
pMenuItem = m_PopMenu->CreateMenu( "下载风格", "", DoDownload );
pMenuItem->Enabled = !g_bUpdateMandatory && SOFTWARE_ID!=e_Pro_Lite;
pMenuItem = m_PopMenu->CreateMenu( "全部下载", "", DoDownloadAll );
pMenuItem->Enabled = !g_bUpdateMandatory && SOFTWARE_ID!=e_Pro_Lite;
}
else{
m_PopMenu->CreateMenu( "取消下载", "", DoCancelDownload );
}
m_PopMenu->Parent = this;
m_PopMenu->Show(Message.XPos,Message.YPos);
}
else if( Message.Keys & MK_LBUTTON ){
if( m_iFocCol==COL_TEXT ){ //左键点中文字
if( StartDrag() ){ //符合条件准备拖动
if( m_pFocItem==m_pSelItem && m_pFocItem->iType==SEGTYPE_STYLE ){
RenameTiming( 1 );
}
SetSelect( m_pFocItem, m_iFocLine );
m_pDragItem = m_pFocItem;
ptDown.X = Message.XPos;
ptDown.Y = Message.YPos;
SetCapture( Handle );
}
}
else{
DWORD opt = m_pFocItem->GetOption( m_iFocCol );
if( opt==OPT_VOL ){ //左键点击音量
SetSelect( m_pFocItem, m_iFocLine );
DoAdjustVolume( NULL );
}
else if( opt==OPT_FONTPROG ){ //替换音色/乐器
SetSelect( m_pFocItem, m_iFocLine );
DoChangeFontProg(NULL);
}
else if( opt==OPT_TEXTURE ){
SetSelect( m_pFocItem, m_iFocLine );
DoChangeTexture(NULL);
}
else if( opt==OPT_SAVE ){
DoSaveLocalStyle( NULL );
}
else if( opt==OPT_IMPORT ){
DoImportSegment( NULL );
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::UMMouseUp(TWMMouse &Message)
{
TShiftState Shift(Message.Keys);
TCommonItem* pLastItem = NULL;
if( m_pDragItem ){
pLastItem = m_pDragItem;
ReleaseCapture();
m_pDragItem = NULL;
}
if( Shift.Contains( ssLeft ) && m_pFocItem && m_iFocCol ){
WORD iCol = 0;
int iHitLine = (Message.YPos - m_nTitleHeight)/m_nItemHeight;
TCommonItem* pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol );
if( pItem==m_pFocItem && iCol==m_iFocCol ){
if( m_iFocCol==COL_TEXT ){
SetSelect( m_pFocItem, m_iFocLine );
}
else if( m_iFocCol==COL_FOLD ){
if( m_pFocItem->iType==SEGTYPE_TRACK ){
DoMute(NULL);
}
else{
SetFold( m_pFocItem, m_iFocLine );
}
}
else if( m_pFocItem->GetOption( m_iFocCol )==OPT_DEL ){
if( m_pSelItem && ( m_pSelItem==m_pFocItem || m_pSelItem==m_pFocItem->up
|| m_pFocItem->up && m_pSelItem==m_pFocItem->up->up )){
Stop();
}
DeleteItem( m_pFocItem, m_iFocLine );
//再次选择焦点项
pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol );
SetFocusedItem( pItem, iHitLine, iCol );
}
else if( m_pFocItem->GetOption( m_iFocCol )==OPT_DOWNLOAD ){
DoDownload( NULL );
}
else if( m_pFocItem->GetOption( m_iFocCol )==OPT_BRUSH ){
if( m_pFocItem->GetOnlineState()==e_Downloaded ){
SetSelect( m_pFocItem, m_iFocLine );
PostMessage( Parent->Handle, UM_SHOWBRUSH, 0, LPARAM(m_pFocItem) );
}
}
else if( m_pFocItem->GetOption( m_iFocCol )==OPT_COLLECT ){ //点击收藏
DoCollect(NULL);
//SetCollect(m_pFocItem);
//DrawItem( m_pFocItem,iHitLine,iCol );
}
else if( m_pFocItem->GetOption( m_iFocCol )==OPT_SCORE ){ //评分
if( m_pFocItem->GetOnlineState()!=e_Downloaded ){
DoDownload( NULL );
}
else{
SetSelect( m_pFocItem, m_iFocLine );
int iTop = Top + m_nTitleHeight + ( m_iFocLine + 1 ) * m_nItemHeight,
iRight = Left + Width - m_sbVert->Width - 2;
PostMessage( Application->MainFormHandle, UM_STYLESCORE,
MAKELONG( iTop, iRight ),
(LPARAM)((TStyleItem*)m_pFocItem)->pStyle );
}
}
else if( m_pFocItem->GetOption( m_iFocCol )==OPT_UPLOAD ){ //发布
SetSelect( m_pFocItem, m_iFocLine );
PostMessage( Parent->Handle, UM_UPLOADSTYLE, 0, LPARAM(m_pFocItem) );
}
}
}
}
//---------------------------------------------------------------------------
void TStylePanel::DrawItem( TCommonItem *pItem, int iLine, WORD iCol )
{
TRect rect;
rect.Left = LEFT_BOUND;
rect.Right = Width - RIGHT_BOUND;
rect.Top = iLine * m_nItemHeight + m_nTitleHeight;
rect.Bottom = min( Height-1, (int)(rect.Top + m_nItemHeight) );
if( pItem ){
pItem->DrawItem( Canvas, rect, iCol );
}
else{
Canvas->Brush->Color = clrBackground;
Canvas->FillRect( rect );
}
}
//---------------------------------------------------------------------------
void TStylePanel::DrawDragImg( TCommonItem *pDragItem )
{
if( pDragItem ){
w_imgDrag = new TImage(this);
w_imgDrag->Width = Width - LEFT_BOUND - RIGHT_BOUND - OPTION_WIDTH*3;
w_imgDrag->Height = m_nItemHeight-2;
if( pDragItem->iType==SEGTYPE_TRACK )
w_imgDrag->Width -= OPTION_WIDTH * 2;
else if( pDragItem->iType!=SEGTYPE_STYLE )
w_imgDrag->Width -= OPTION_WIDTH;
TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height );
//绘制底色
w_imgDrag->Canvas->Brush->Color = clrSelback;
w_imgDrag->Canvas->FillRect( rcDraw );
//绘制列表项文字
w_imgDrag->Canvas->Font->Assign( Canvas->Font );
if( m_pDragItem->iType==SEGTYPE_STYLE )
w_imgDrag->Canvas->Font->Color = clrTextStyle;
else{
w_imgDrag->Canvas->Font->Color = pDragItem->TextColor();
}
String strCaption = pDragItem->GetCaption();
int Y = rcDraw.Top + ( OPTION_HEIGHT - Canvas->TextHeight(strCaption) )/2;
rcDraw.Left += LEFT_BOUND + OPTION_WIDTH;
w_imgDrag->Canvas->Brush->Style = bsSolid;
w_imgDrag->Canvas->TextRect( rcDraw, rcDraw.Left,
Y, strCaption );
w_bDraging = true;
w_iDragMode = DM_ADJUSTSTYLE;
}
}
//---------------------------------------------------------------------------
bool TStylePanel::ShowDragImg( bool bShow, int iState )
{
bool bCanDrop = false;
int w = w_imgDrag->Width,
h = w_imgDrag->Height;
TPoint ptOld( w_xOldDrag, w_yOldDrag ),
ptNew( w_xImgDrag, w_yImgDrag );
RECT rtInvalid;
ptOld = ScreenToClient( ptOld );
ptNew = ScreenToClient( ptNew );
if( w_iDragMode==DM_ADJUSTHEIGHT ){
rtInvalid.left = 1;
rtInvalid.right = Width-1;
rtInvalid.top = Height;
rtInvalid.bottom = 0;
if( ptOld.Y>0 && ptOld.Y<Height
|| ptOld.Y+h>0 && ptOld.Y+h<Height ){
rtInvalid.top = min( ptOld.Y, rtInvalid.top );
rtInvalid.bottom = max( ptOld.Y+h, rtInvalid.bottom );
}
if( bShow && ( ptNew.Y>0 && ptNew.Y<Height
|| ptNew.Y+h>0 && ptNew.Y+h<Height )){
rtInvalid.top = min( ptNew.Y, rtInvalid.top );
rtInvalid.bottom = max( ptNew.Y+h, rtInvalid.bottom );
}
if( rtInvalid.top<0 ) rtInvalid.top = 0;
if( rtInvalid.bottom>Height ) rtInvalid.bottom = Height;
if( rtInvalid.bottom>rtInvalid.top ){
InvalidateRect( Handle, &rtInvalid, false );
}
}
else if( w_iDragMode==DM_ADJUSTSTYLE ){
TPoint ptMouse( ptNew.X+w_xOffDrag, ptNew.Y+w_yOffDrag );
rtInvalid.left = 0;
rtInvalid.right = Width;
rtInvalid.top = Height;
rtInvalid.bottom = 0;
if( ptOld.Y>0 && ptOld.Y<Height
|| ptOld.Y+h>0 && ptOld.Y+h<Height ){
rtInvalid.top = min( ptOld.Y, rtInvalid.top );
rtInvalid.bottom = max( ptOld.Y+h, rtInvalid.bottom );
}
if( ptOld.X>0 && ptOld.X<Width
|| ptOld.X+w>0 && ptOld.X+w<Width ){
rtInvalid.left = min( ptOld.X, rtInvalid.left );
rtInvalid.right = max( ptOld.X+w, rtInvalid.right );
}
if( bShow ){
if( ptNew.Y>0 && ptNew.Y<Height
|| ptNew.Y+h>0 && ptNew.Y+h<Height ){
rtInvalid.top = min( ptNew.Y, rtInvalid.top );
rtInvalid.bottom = max( ptNew.Y+h, rtInvalid.bottom );
}
if( ptNew.X>0 && ptNew.X<Width
|| ptNew.X+w>0 && ptNew.X+w<Width ){
rtInvalid.left = min( ptNew.X, rtInvalid.left );
rtInvalid.right = max( ptNew.X+w, rtInvalid.right );
}
RenameTiming( 0 );
if( ptMouse.X>LEFT_BOUND && ptMouse.X<Width-RIGHT_BOUND
&& ptMouse.Y>m_nTitleHeight && ptMouse.Y<Height )
bCanDrop = HandleHoverEvent( ptMouse );
else
SetHover( NULL, -1 );
}
else{
if( m_pHoverItem || ptMouse.X>LEFT_BOUND && ptMouse.X<Width-RIGHT_BOUND
&& ptMouse.Y>m_nTitleHeight && ptMouse.Y<Height ){ //处理Drop事件
HandleDropEvent( iState );
}
if( m_pTimer ){
delete m_pTimer;
m_pTimer = NULL;
}
m_pDragItem = m_pDropItem = NULL;
SetHover( NULL, -1 );
}
if( rtInvalid.top<0 ) rtInvalid.top = 0;
if( rtInvalid.bottom>Height ) rtInvalid.bottom = Height;
if( rtInvalid.left<0 ) rtInvalid.left = 0;
if( rtInvalid.right>Width ) rtInvalid.right = Width;
if( rtInvalid.bottom>rtInvalid.top && rtInvalid.right>rtInvalid.left ){
InvalidateRect( Handle, &rtInvalid, false );
}
if( bShow && m_pDropItem ){
//SetScrollTimer( ptMouse );
SetScrollTimer( ptNew );
}
}
else
return TToolpalPanel::ShowDragImg( bShow );
return bCanDrop;
}
//---------------------------------------------------------------------------
void TStylePanel::SetScrollTimer( TPoint ptMouse )
{
int X = ptMouse.X,
Y = ptMouse.Y;
//判断是否滚动
if( m_sbVert->Visible && X>LEFT_BOUND && X<Width-RIGHT_BOUND ){
int iDirect = 0;
if( Y>Height-m_nItemHeight && Y<Height
&& m_iTopLine<m_nTotalLine-m_nItemShow )
iDirect = 1;
else if( Y>0 && Y<m_nTitleHeight && m_iTopLine>0 )
iDirect = -1;
if( iDirect!=0 ){
if( !m_pTimer ){
m_pTimer = new TTimer(this);
m_pTimer->OnTimer = TimerProc;
// m_pTimer->Tag = iDirect;
// m_pTimer->Interval = 500;
// m_pTimer->Enabled = true;
}
else if( m_pTimer->Tag!=iDirect ){
m_pTimer->Enabled = false;
}
m_pTimer->Tag = iDirect;
m_pTimer->Interval = 500;
m_pTimer->Enabled = true;
}
else if( m_pTimer && ( m_pTimer->Tag==1
|| m_pTimer->Tag==-1 ) ){
delete m_pTimer;
m_pTimer = NULL;
}
}
}
//---------------------------------------------------------------------------
void TStylePanel::SetUnfoldTimer(TCommonItem *pItem, TCommonItem *pHoverItem)
{
if( pItem && pItem->aItems->Count>0 && !pItem->IsUnfold() && pItem==pHoverItem){
if( !m_pTimer ){
m_pTimer = new TTimer(this);
m_pTimer->OnTimer = TimerProc;
m_pTimer->Enabled = false;
}
if( pHoverItem!=m_pHoverItem && m_pTimer->Enabled )
m_pTimer->Enabled = false;
m_pTimer->Tag = 0;
m_pTimer->Interval = 1500;
m_pTimer->Enabled = true;
}
else{
if( m_pTimer && m_pTimer->Tag==0 ){
delete m_pTimer;
m_pTimer = NULL;
}
}
}
//---------------------------------------------------------------------------
void TStylePanel::SetFold( TCommonItem *pFoldItem, int iFoldLine )
{
if( !pFoldItem )
return;
bool bUnfold = !pFoldItem->IsUnfold();
pFoldItem->SetUnfold( bUnfold );
if( bUnfold && pFoldItem==m_pHoverItem && pFoldItem->aItems->Count>0 ){
TCommonItem* pSubItem = (TCommonItem*)m_pHoverItem->aItems->First();
while( pSubItem!=m_pHoverItem->next ){
pSubItem->SetHover( true );
pSubItem = GetNextItem( pSubItem );
}
}
RECT rt;
rt.left = LEFT_BOUND;
rt.top = (iFoldLine>0 ? iFoldLine : 0) * m_nItemHeight + m_nTitleHeight,
rt.right = Width - RIGHT_BOUND;
rt.bottom = Height-1;
InvalidateRect( Handle, &rt, false );
//重新计算选中行号
if( m_pSelItem && m_iSelLine>iFoldLine ){
if( m_pSelItem->up && ( m_pSelItem->up==pFoldItem ||
m_pSelItem->up->up==pFoldItem )){
m_pSelItem->Select( false );
m_pSelItem = NULL;
m_iSelLine = -1;
Stop();
}
else{
int iSelLine = iFoldLine;
TCommonItem* pItem = pFoldItem;
while( pItem ){
if( pItem==m_pSelItem ){
m_iSelLine = iSelLine;
break;
}
else{
iSelLine++;
}
pItem = GetNextItem( pItem );
}
}
}
if( pFoldItem->aItems->Count>0 ){
//计算总行数
TCommonItem* pSubItem = (TCommonItem*)pFoldItem->aItems->First();
int count = 0;
while( pSubItem!=pFoldItem->next ){ //所有显示的子孙项
count++;
pSubItem = GetNextItem( pSubItem );
}
if( bUnfold )
m_nTotalLine += count;
else
m_nTotalLine -= count;
ResetScrollBar();
}
}
//---------------------------------------------------------------------------
void TStylePanel::DeleteItem( TCommonItem *pItem, int iLine )
{
if( !pItem )
return;
if( m_pFocItem==pItem || m_pFocItem && m_pFocItem->up==pItem
|| m_pFocItem && m_pFocItem->up
&& m_pFocItem->up->up==pItem ){
m_pFocItem = NULL;
m_iFocLine = -1;
m_iFocCol = 0;
}
if( m_pSelItem==pItem || m_pSelItem && m_pSelItem->up==pItem
|| m_pSelItem && m_pSelItem->up
&& m_pSelItem->up->up==pItem ){
m_pSelItem = NULL;
m_iSelLine = -1;
Stop();
}
if( pItem->prev )
pItem->prev->next = pItem->next;
if( pItem->next )
pItem->next->prev = pItem->prev;
//重新计算选中行号
if( iLine>=0 && m_pSelItem && m_iSelLine>iLine ){
if( m_pSelItem->up && m_pSelItem->up==pItem ){
m_pSelItem->Select( false );
m_pSelItem = NULL;
m_iSelLine = -1;
Stop();
}
else{
int iSelLine = iLine;
TCommonItem* pTmpItem = GetNextItem(pItem);
while( pTmpItem ){
if( pTmpItem==m_pSelItem ){
m_iSelLine = iSelLine;
break;
}
else{
iSelLine++;
}
pTmpItem = GetNextItem( pTmpItem );
}
}
}
if( m_pTopItem==pItem ){
if( pItem->iType==SEGTYPE_TRACK ){
m_pTopItem = GetNextItem( pItem );
if( !m_pTopItem ){
m_pTopItem = GetPrevItem( pItem );
m_iTopLine--;
}
}
else{
m_pTopItem = pItem->next ? pItem->next : pItem->prev;
}
}
if( pItem->iType==SEGTYPE_STYLE ){
if( pItem->IsUnfold() ){
m_nTotalLine -= pItem->aItems->Count;
for( int i=0; i<pItem->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pItem->aItems->Items[i];
if( pSeg->IsUnfold() ){
m_nTotalLine -= pSeg->aItems->Count;
}
}
}
delete pItem;
m_aItems->Remove( pItem );
m_nTotalLine--;
}
else{
TStyleItem * pStyItem = NULL;
if( pItem->iType==SEGTYPE_TRACK ){
TCommonItem * pUp = pItem->up;
if( pUp->up->IsUnfold() && pUp->IsUnfold() )
m_nTotalLine--;
((TSegmentItem*)pUp)->DeleteTrack( pItem );
// pStyItem = (TStyleItem*)pUp->up;
}
else{
pStyItem = (TStyleItem*)pItem->up;
if( pStyItem->IsUnfold() ){
m_nTotalLine--;
if( pItem->IsUnfold() )
m_nTotalLine -= pItem->aItems->Count;
}
pStyItem->DeleteSegment( pItem );
}
}
ResetScrollBar();
Paint();
}
//---------------------------------------------------------------------------
void TStylePanel::SetHover( TCommonItem *pHoverItem, int iHoverLine )
{
if( m_pHoverItem!=pHoverItem ){
//清除原Hover标志
if( m_pHoverItem ){
m_pHoverItem->SetHover( false );
if( m_iHoverLine>=0 && m_iHoverLine<m_nItemShow )
DrawItem( m_pHoverItem, m_iHoverLine, -1 );
if( m_pHoverItem->IsUnfold() && m_pHoverItem->aItems->Count>0 ){
TCommonItem* pSubItem = (TCommonItem*)m_pHoverItem->aItems->First();
int iLine = m_iHoverLine+1;
while( pSubItem!=m_pHoverItem->next ){ //所有显示的子孙项
pSubItem->SetHover( false );
if( iLine>=0 && iLine<m_nItemShow )
DrawItem( pSubItem, iLine, -1 );
pSubItem = GetNextItem( pSubItem );
iLine++;
}
}
}
if( pHoverItem ){
pHoverItem->SetHover( true );
if( iHoverLine>=0 && iHoverLine<m_nItemShow )
DrawItem( pHoverItem, iHoverLine, -1 );
if( pHoverItem->IsUnfold() && pHoverItem->aItems->Count>0 ){
TCommonItem* pSubItem = (TCommonItem*)pHoverItem->aItems->First();
int iLine = iHoverLine+1;
while( pSubItem!=pHoverItem->next ){ //所有显示的子孙项
pSubItem->SetHover( true );
if( iLine>=0 && iLine<m_nItemShow )
DrawItem( pSubItem, iLine, -1 );
pSubItem = GetNextItem( pSubItem );
iLine++;
}
}
}
m_pHoverItem = pHoverItem;
if( pHoverItem )
m_iHoverLine = iHoverLine;
else
m_iHoverLine = -1;
}
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::TimerProc(TObject* Sender)
{
if( w_bDraging ){
DebugPrint( "On timer." );
if( m_pTimer->Tag!=0 ){
ScrollView( m_iTopLine + m_pTimer->Tag );
if( m_iTopLine<=0 || m_iTopLine>=m_nTotalLine-m_nItemShow ){
delete m_pTimer;
m_pTimer = NULL;
}
else if( m_pTimer->Interval>200 ){
m_pTimer->Interval = 200;
}
}
else{
SetFold( m_pHoverItem, m_iHoverLine );
delete m_pTimer;
m_pTimer = NULL;
}
}
}
//---------------------------------------------------------------------------
void TStylePanel::Stop( DWORD dwSpec )
{
if( dwSpec==STOP_SELF ){
if( m_bPlaying )
f_MM_Stop();
}
else{
Parent->Perform( UM_STOP, dwSpec, 0 );
}
m_pPlayItem = NULL;
m_bPlaying = false;
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::MouseLeave(TObject* Sender)
{
TPoint pt;
GetCursorPos(&pt);
pt = this->ScreenToClient(pt);
//如果离开当前的面板
if( pt.X<=0||pt.X>=this->Width - RIGHT_BOUND || pt.Y<=0 || pt.Y>=this->Height )
{
if( m_VolTrackBar ){
delete m_VolTrackBar;
m_VolTrackBar=NULL;
}
SetFocusedItem( NULL, -1, 0 );
}
else if( m_pFocItem ){
if( !m_VolTrackBar && !m_PopMenu->Visible ){
SetFocusedItem( NULL, -1, 0 );
}
}
//
// if( m_Hint ){
// m_Hint->ReleaseHandle();
// delete m_Hint;
// m_Hint = NULL;
// HintStr = "";
// }
//
// if( m_HintTimer ){
// m_HintTimer->Enabled = false;
// delete m_HintTimer;
// m_HintTimer = NULL;
// }
}
TCommonItem* TStylePanel::GetTrackHoverItem( TCommonItem* pItem, int& iHoverLine )
{
TCommonItem* pHoverItem = NULL;
int stDrop = m_pDropItem->GetSegType(),
stHover = pItem->GetSegType();
// snDrop = m_pDropItem->GetSegNo(),
// snHover = pItem->GetSegNo();
if( stDrop!=SEGTYPE_INTRO && stDrop!=SEGTYPE_ENDING && stDrop==stHover ){
TSegmentItem *pSeg = NULL;
if( pItem->iType!=SEGTYPE_TRACK )
pSeg = (TSegmentItem*)pItem;
else
pSeg = (TSegmentItem*)pItem->up;
char chan = ((TTrackItem*)m_pDropItem)->pTrack->iChanNo;
if( !pSeg->bAutoSpec || pSeg->aItems->Count<16 || chan==9 && pSeg->IsChanUsed(9) ){
pHoverItem = pItem;
if( pItem->iType==SEGTYPE_TRACK ){
do{
iHoverLine--;
pHoverItem = GetPrevItem( pHoverItem );
}
while( pHoverItem!=pSeg );
}
}
}
return pHoverItem;
}
//---------------------------------------------------------------------------
TTrackItem* TStylePanel::AddTrack( TSegmentItem* pSeg, TTrackItem* pSrcTrk, bool bOwn )
{
TTrackItem* pDestTrk = NULL;
if( pSeg && pSrcTrk ){
int nTrksBefore = pSeg->aItems->Count;
DWORD opts = OPT_DEL|OPT_VOL;
if( pSeg->iSegType<SEGTYPE_INTRO )
opts |= OPT_TEXTURE;
TTrack* pNewTrack = new TTrack( pSrcTrk->pTrack );
pDestTrk = pSeg->AddTrack( pSrcTrk->pStyle, pNewTrack, opts, bOwn );
int nTrksAfter = pSeg->aItems->Count;
if( !pSeg->IsUnfold() ){
SetFold( pSeg, m_iHoverLine );
}
else if( nTrksAfter!=nTrksBefore ){
m_nTotalLine += nTrksAfter-nTrksBefore;
}
if( m_pSelItem ){
m_pSelItem->Select( false );
}
pDestTrk->Select( true );
m_pSelItem = pDestTrk;
m_iSelLine = m_iHoverLine;
if( m_pHoverItem->iType!=SEGTYPE_TRACK ){
m_iSelLine++;
TCommonItem* pItem = GetNextItem( m_pHoverItem );
while( pItem!=pDestTrk ){
m_iSelLine++;
pItem = GetNextItem( pItem );
}
}
}
return pDestTrk;
}
//---------------------------------------------------------------------------
void __fastcall TStylePanel::DoubleClick(TObject* sender)
{
if( m_pSelItem && m_iFocCol==COL_TEXT ){
PlayDemo( m_pSelItem, g_nMelodyTempo );
}
}
//---------------------------------------------------------------------------
void TStylePanel::PlayDemo( TCommonItem *pItem, int tempo )
{
if( !pItem )
return;
Stop( STOP_ALL );
int seed = time(NULL);
int key = g_iMelodyKey;
if( key<0 || key>11 )
key = seed % 12;
char cType = (seed>>1) % 2;
TStage* aStages = NULL;
int nStageNum = 0;
if( pItem->iType==SEGTYPE_STYLE ){ //组合试听
TStyleItem* pStyle = (TStyleItem*)pItem;
if( tempo<0 ){
if( pStyle->pStyle->idLoc==0 )
tempo = pStyle->pStyle->pOrigin->detail.iTempo;
else if( pStyle->pStyle->idLoc==1 )
tempo = pStyle->pStyle->pShare->iTempo;
else
tempo = pStyle->pStyle->pLocal->iTempo;
}
int segCount = pStyle->nSegNum[SEGTYPE_VAR];
int fillNum = pStyle->nSegNum[SEGTYPE_FILL];
int barNum = fillNum>0 ? 3 : 4;
int repeat = fillNum>0 ? 2 : 1;
vector<TSegmentItem*> aSegments[2];
for( int i=0; i<pStyle->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyle->aItems->Items[i];
int stype = pSeg->GetSegType();
if( stype==SEGTYPE_VAR )
aSegments[0].push_back( pSeg );
else if( stype==SEGTYPE_FILL)
aSegments[1].push_back( pSeg );
}
nStageNum = segCount * repeat;
aStages = new TStage[nStageNum];
for( int s=0; s<segCount; s++ ){
int iPreset = (seed>>(s+2)) % 4;
for( int k=0; k<repeat; k++ ){
int i = s * repeat + k;
int sc = (k==0) ? s : (s % fillNum);
TSegmentItem* pSeg = aSegments[k][sc];
aStages[i].iSegType = pSeg->iSegType;
aStages[i].iSegKey = key;
//chords
aStages[i].nBarNum = (k==0) ? barNum : 1;
aStages[i].aChords = new TBarChords[aStages[i].nBarNum];
for( int j=0; j<aStages[i].nBarNum; j++ ){
int c = (k==0) ? j : 3;
char chordType = u_arrChordPreset[cType][iPreset][c] % 4;
char chordKey = u_arrChordPreset[cType][iPreset][c] / 4;
aStages[i].aChords[j].iKey[0]
= aStages[i].aChords[j].iKey[1]
= aStages[i].aChords[j].iKey[2]
= aStages[i].aChords[j].iKey[3] = chordKey;
aStages[i].aChords[j].iType[0]
= aStages[i].aChords[j].iType[1]
= aStages[i].aChords[j].iType[2]
= aStages[i].aChords[j].iType[3] = chordType;
}
//tracks
aStages[i].nTrkNum = pSeg->aItems->Count;
aStages[i].aTracks = new TComposeTrack[aStages[i].nTrkNum];
for( int j=0; j<aStages[i].nTrkNum; j++ ){
//TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j];
TTrack* pTrack = ((TTrackItem*)pSeg->aItems->Items[j])->pTrack;
TComposeTrack& track = aStages[i].aTracks[j];
track.iStyleLoc = pTrack->iStyleLoc;// pTrk->pStyle->idLoc;
track.iStyleId = pTrack->iStyleId;// pTrk->pStyle->idStyle;
track.iSegNo = pTrack->iSegNo;
track.iChanNo = pTrack->iChanNo;
track.iChanSpec = pTrack->iChanSpec;
track.iProg = pTrack->iProg;// >progCurr;
track.nVol = pTrack->nVol<0 ? 0 : pTrack->nVol * pSeg->volume / 100.0;
}
}
}
}
else{
if( tempo<0 ){
TStyleItem* pStyItem = pItem->GetStyleItem();
if( pStyItem->pStyle->idLoc==0 )
tempo = pStyItem->pStyle->pOrigin->detail.iTempo;
else if( pStyItem->pStyle->idLoc==1 )
tempo = pStyItem->pStyle->pShare->iTempo;
else
tempo = pStyItem->pStyle->pLocal->iTempo;
}
int stype = pItem->GetSegType();
// sno = pItem->GetSegNo();
int barNum = 4;
if( stype>=SEGTYPE_INTRO ){
TSegmentItem* pSeg = pItem->iType==SEGTYPE_TRACK
? (TSegmentItem*)pItem->up
: (TSegmentItem*)pItem;
barNum = pSeg->nBars;
}
nStageNum = 1;
aStages = new TStage[1];
aStages->iSegType = stype;
aStages->iSegKey = key;
aStages->nBarNum = barNum;
int trkNum = 1;
TTrack * pTrk = NULL;
char nSegVol = 100;
if( pItem->iType==SEGTYPE_TRACK ){
pTrk = ((TTrackItem*)pItem)->pTrack;
nSegVol = ((TSegmentItem*)pItem->up)->volume;
}
else{
trkNum = pItem->aItems->Count;
nSegVol = ((TSegmentItem*)pItem)->volume;
}
aStages->nTrkNum = trkNum;
aStages->aTracks = new TComposeTrack[trkNum];
for( int i=0; i<trkNum; i++ ){
if( pItem->iType!=SEGTYPE_TRACK )
pTrk = ((TTrackItem*)pItem->aItems->Items[i])->pTrack;
aStages->aTracks[i].iStyleId = pTrk->iStyleId;
aStages->aTracks[i].iStyleLoc = pTrk->iStyleLoc;
if( stype>=SEGTYPE_INTRO ){
cType = (pTrk->iSegNo / 4 + 1) << 4;
int sno = pTrk->iSegNo % 4;
aStages->aTracks[i].iSegNo = sno + cType;
}
else
aStages->aTracks[i].iSegNo = pTrk->iSegNo;
aStages->aTracks[i].iChanNo = pTrk->iChanNo;
aStages->aTracks[i].iChanSpec = pTrk->iChanSpec;
aStages->aTracks[i].iProg = pTrk->iProg;// >progCurr;
aStages->aTracks[i].nVol = pTrk->nVol<0 ? 0 : pTrk->nVol * nSegVol / 100.0;
}
if( stype<=SEGTYPE_FILL ){
int iPreset = (seed>>2) % 4;
aStages->aChords = new TBarChords[barNum];
for( int j=0; j<barNum; j++ ){
char chordType = u_arrChordPreset[cType][iPreset][j] % 4;
char chordKey = u_arrChordPreset[cType][iPreset][j] / 4;
aStages->aChords[j].iKey[0]
= aStages->aChords[j].iKey[1]
= aStages->aChords[j].iKey[2]
= aStages->aChords[j].iKey[3] = chordKey;
aStages->aChords[j].iType[0]
= aStages->aChords[j].iType[1]
= aStages->aChords[j].iType[2]
= aStages->aChords[j].iType[3] = chordType;
}
}
}
int len = 1000000;
BYTE* data = new BYTE[len];
int ret = f_CM_Compose( &len, data, g_iMelodyTimeSignature, tempo,
nStageNum, aStages, false, NULL, NULL );
if( ret==0 ){
f_MM_LoadDemo( data, len );
f_MM_PlayDemo( Handle, -1, -1, -1, -1, NULL );
m_pPlayItem = pItem;
m_bPlaying = true;
}
else{
DebugPrint( "Compose error: %d", ret );
}
delete[] data;
SAFE_DELETE_ARRAY(aStages);
}
//---------------------------------------------------------------------------
void TStylePanel::VolumeChanged( TCommonItem *pItem, char volNew )
{
char &refVol = pItem->iType==SEGTYPE_TRACK ? ((TTrackItem*)pItem)->pTrack->nVol
: ((TSegmentItem*)pItem)->volume,
volOld = refVol;
if( volNew==(char)0x80 ){
pItem->SetMute( !pItem->IsMute() );
volNew = refVol;
}
else{
if( volOld<0 )
volNew |= 0x80;
refVol = volNew;
}
if( m_bPlaying && ( pItem==m_pSelItem
|| pItem->up && ( pItem->up==m_pSelItem
|| pItem->up->up && pItem->up->up==m_pSelItem ))){
int iStartBar, iEndBar, vol, segCount, fillNum, repeat = 1;
TSegmentItem* pSeg = pItem->iType==SEGTYPE_TRACK
? (TSegmentItem*)pItem->up
: (TSegmentItem*)pItem;
if( m_pSelItem->iType==SEGTYPE_STYLE ){
if( pSeg->iSegType<=SEGTYPE_FILL ){
segCount = ((TStyleItem*)m_pSelItem)->nSegNum[SEGTYPE_VAR];
fillNum = ((TStyleItem*)m_pSelItem)->nSegNum[SEGTYPE_FILL];
int barNum = 1;
if( pSeg->iSegType==SEGTYPE_VAR ){
iStartBar = pSeg->iInd * 4;
barNum = fillNum>0 ? 3 : 4;
}
else{
iStartBar = pSeg->iInd * 4 + 3;
repeat = segCount / fillNum;
}
iEndBar = iStartBar + barNum;
}
else
repeat = 0;
}
else{
iStartBar = 0;
if( m_pSelItem->GetSegType()>=SEGTYPE_INTRO ){
iEndBar = pSeg->nBars;
}
else
iEndBar = 4;
}
for( int i=0; i<repeat; i++ ){
float fSegVol = pSeg->volume / 100.0;
if( pItem->iType==SEGTYPE_TRACK ){
TTrack* pTrk = ((TTrackItem*)pItem)->pTrack;
vol = pTrk->nVol<0 ? 0 : pTrk->nVol * fSegVol;
f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, iStartBar, iEndBar,
pTrk->iChanSpec, vol, -1 );
}
else{
for( int i=0; i<pItem->aItems->Count; i++ ){
TTrack* pTrk = ((TTrackItem*)pItem->aItems->Items[i])->pTrack;
vol = pTrk->nVol<0 ? 0 : pTrk->nVol * fSegVol;
f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, iStartBar, iEndBar,
pTrk->iChanSpec, vol, -1 );
}
}
iStartBar += fillNum * 4;
iEndBar = iStartBar + 1;
}
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::SetStyleItem( TStyleItem* pStyItem )
{
TStyleItem* pOldSty = m_aItems->Count > 0 ? (TStyleItem*)m_aItems->First() : NULL;
if( pOldSty==pStyItem )
return;
ClearAllItems();
if( pStyItem ){
m_aItems->Add( pStyItem );
m_nTotalLine++;
if( pStyItem->aItems->Count==0 ){
RestoreItems();
}
m_pTopItem = pStyItem;
SetFold( pStyItem, 0 );
}
ResetScrollBar();
Paint();
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::TrackBarChange(System::TObject* Sender)
{
TCommonItem *pItem = (TCommonItem*)m_VolTrackBar->Tag;
if( pItem ){
VolumeChanged( pItem, m_VolTrackBar->Position );
}
}
// ---------------------------------------------------------------------------
//void __fastcall TStylePanel::HintTimerProc(System::TObject* Sender)
//{
// if( m_HintTimer )
// m_HintTimer->Enabled = false;
//
// if( m_Hint && HintStr.Length()>0 ){
// m_Hint->ShowHintWindow( ClientToScreen(pMove), HintStr );
// Application->Hint = HintStr;
// Hint = HintStr;
// Application->ActivateHint(ClientToScreen(pMove));
// }
//}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoDownload(TObject* Sender)
{
if( m_pFocItem /*&& m_pFocItem->GetOnlineState()==e_UnDownload*/ ){
TStyleItem* pStyItem = m_pFocItem->GetStyleItem();
HRESULT ret = 0;
if( pStyItem->pStyle->idLoc==0 )
ret = f_CS_DownloadStyle( pStyItem->pStyle->idStyle, Handle );
else if( pStyItem->pStyle->idLoc==1 ){
for( int i=0; i<pStyItem->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i];
for( int j=0; j<pSeg->aItems->Count; j++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j];
if( pTrk->pStyle->idLoc==0 && pTrk->pStyle->pOrigin->state==e_UnDownload ){
ret = f_CS_DownloadStyle( pTrk->pStyle->idStyle, Handle );
if( ret==0 )
pTrk->pStyle->pOrigin->state = e_Downloading;
}
}
}
}
if( ret==0 ){
m_pFocItem->SetOnlineState( e_Downloading );
}
else{
DebugPrint( "DownloadStyle error : %d\n", ret );
}
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoDownloadAll(TObject* Sender)
{
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i];
if( pItem->pStyle && pItem->pStyle->idLoc==0
&& pItem->pStyle->pOrigin->state==e_UnDownload ){
HRESULT ret = f_CS_DownloadStyle( pItem->pStyle->idStyle, Handle );
if( ret==0 )
pItem->pStyle->pOrigin->state = e_Downloading;
else
DebugPrint( "DownloadStyle error : %d\n", ret );
}
}
Paint();
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoCancelDownload(TObject* Sender)
{
f_CS_CancelOperation();
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i];
if( pItem->pStyle && pItem->pStyle->idLoc==0
&& pItem->pStyle->pOrigin->state==e_Downloading )
pItem->pStyle->pOrigin->state = e_UnDownload;
}
Paint();
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoPlay(TObject* Sender)
{
SetSelect( m_pFocItem, m_iFocLine );
PlayDemo( m_pSelItem, g_nMelodyTempo );
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoStop(TObject* Sender)
{
Stop();
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoFold(TObject* Sender)
{
SetFold( m_pFocItem, m_iFocLine );
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoMute(TObject* Sender)
{
// m_pFocItem->SetMute( !m_pFocItem->IsMute() );
VolumeChanged( m_pFocItem, 0x80 );
DrawItem( m_pFocItem, m_iFocLine, COL_FOLD );
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoAdjustVolume(TObject* Sender)
{
if( Sender )
SetSelect( m_pFocItem, m_iFocLine );
if( m_pSelItem ){
if( !m_VolTrackBar ){
m_VolTrackBar = new TSkinTrackBar(this);
m_VolTrackBar->Parent = this;
m_VolTrackBar->ParentBackground = false;
m_VolTrackBar->Color = RGB(55,56,62);//RGB(69,74,84);
m_VolTrackBar->Orientation = true;
m_VolTrackBar->PageSize = 10;
m_VolTrackBar->Height = 16;
m_VolTrackBar->Width = 63;
m_VolTrackBar->Min = 0;
}
m_VolTrackBar->Top = m_iSelLine*m_nItemHeight+m_nTitleHeight + 1;
m_VolTrackBar->Left = Width - RIGHT_BOUND - 3*OPTION_WIDTH;
m_VolTrackBar->Tag = (int)m_pSelItem;
char vol = m_pSelItem->iType==SEGTYPE_TRACK ? ((TTrackItem*)m_pSelItem)->pTrack->nVol
: ((TSegmentItem*)m_pSelItem)->volume;
m_VolTrackBar->Max = m_pSelItem->iType>=SEGTYPE_TRACK ? 127 : 100;
m_VolTrackBar->Position = vol & 0x7F;
if( vol < 0 )
m_VolTrackBar->Enabled = false;
m_VolTrackBar->OnChange = TrackBarChange;
m_VolTrackBar->SetFocus();
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoUseBrush(TObject* Sender)
{
if( Sender )
SetSelect( m_pFocItem, m_iFocLine );
if( m_pSelItem && m_pSelItem->GetOnlineState()==e_Downloaded ){
PostMessage( Parent->Handle, UM_SHOWBRUSH, 0, LPARAM(m_pFocItem) );
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoDelete(TObject* Sender)
{
if( m_pSelItem && ( m_pSelItem==m_pFocItem || m_pSelItem==m_pFocItem->up
|| m_pFocItem->up && m_pSelItem==m_pFocItem->up->up )){
Stop();
}
DeleteItem( m_pFocItem, m_iFocLine );
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::SetFocusedItem( TCommonItem* pItem, int iLine, WORD iCol )
{
// if( pItem!=m_pFocItem || iCol!=m_iFocCol ){
// if( m_Hint ){
// m_Hint->ReleaseHandle();
// delete m_Hint;
// m_Hint = NULL;
// }
//
// if( m_HintTimer ){
// m_HintTimer->Enabled = false;
// delete m_HintTimer;
// m_HintTimer = NULL;
// }
// Hint = "";
// }
// if( !HintStr.IsEmpty() ){
// Hint = HintStr;
// if( !m_Hint ){
// m_Hint = new TSkinHintWindow(this);
// m_HintTimer = new TTimer(this);
// m_HintTimer->Interval = 800;
// m_HintTimer->OnTimer = HintTimerProc;
// }
//
// if( m_HintTimer ){
// m_HintTimer->Enabled = false;
// m_HintTimer->Enabled = true;
// }
// }
if( pItem!=m_pFocItem ){
if( m_pFocItem ){ //取消前一焦点
m_pFocItem->SetFocus( 0 );
if( m_iFocLine>=0 ){
DrawItem( m_pFocItem, m_iFocLine, m_iFocCol );
}
}
if( pItem ){ //显示当前焦点
pItem->SetFocus( iCol );
DrawItem( pItem, iLine, iCol );
}
else{
// HintStr = "";
Hint = "";
}
m_pFocItem = pItem;
m_iFocLine = iLine;
m_iFocCol = iCol;
}
else{
if( pItem && iCol!=m_iFocCol ){
pItem->SetFocus( iCol );
DrawItem( pItem, iLine, m_iFocCol ); //取消前一焦点列
DrawItem( pItem, iLine, iCol ); //显示当前焦点列
}
m_iFocLine = iLine;
m_iFocCol = iCol;
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoApplyPreStyle(TObject* Sender)
{
if( m_pFocItem && m_pFocItem->GetOnlineState()==e_Downloaded ){
PostMessage( Parent->Handle, UM_APPLYSTYLE, 0, LPARAM(m_pFocItem) );
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoApplyUseStyle(TObject* Sender)
{
if( m_pFocItem && m_pFocItem->GetOnlineState()==e_Downloaded ){
PostMessage( Parent->Handle, UM_APPLYSTYLE, 1, LPARAM(m_pFocItem) );
}
}
// ---------------------------------------------------------------------------
void __fastcall TStylePanel::DoSaveLocalStyle(TObject* Sender)
{
if( m_pFocItem ){
PostMessage( Parent->Handle, UM_SAVELOCALSTYLE, 0, 0 );
}
}
// ---------------------------------------------------------------------------