//--------------------------------------------------------------------------- #include #include #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; iCount; 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_iTopLineSetPosition( 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( iStyCount ){ 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; iaOptions->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( XleftFold ){ col = COL_FOLD; } else if( X>leftText && XrightText && Xl && 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 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( curposHandle ) 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_iSelLineSelect( true ); if( iLine>=0 && iLinepStyle->idLoc, idStyle = ((TStyleItem*)pStyle)->pStyle->idStyle; int index=-1; bool bCollected = false; for( int i=0; iidLoc==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; iGetOption( COL_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.Y0 && ptOld.Y+h0 && ptNew.Y0 && ptNew.Y+hHeight ) 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.Y0 && ptOld.Y+h0 && ptOld.X0 && ptOld.X+w0 && ptNew.Y0 && ptNew.Y+h0 && ptNew.X0 && ptNew.X+wLEFT_BOUND && ptMouse.Xm_nTitleHeight && ptMouse.YLEFT_BOUND && ptMouse.Xm_nTitleHeight && ptMouse.YHeight ) 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 && XHeight-m_nItemHeight && Y0 && Y0 ) 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; iaItems->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_iHoverLineIsUnfold() && 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 && iLineSetHover( true ); if( iHoverLine>=0 && iHoverLineIsUnfold() && pHoverItem->aItems->Count>0 ){ TCommonItem* pSubItem = (TCommonItem*)pHoverItem->aItems->First(); int iLine = iHoverLine+1; while( pSubItem!=pHoverItem->next ){ //所有显示的子孙项 pSubItem->SetHover( true ); if( iLine>=0 && iLineTag!=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->iSegTypepTrack ); 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 aSegments[2]; for( int i=0; iaItems->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>(s+2)) % 4; for( int k=0; kiSegType; aStages[i].iSegKey = key; //chords aStages[i].nBarNum = (k==0) ? barNum : 1; aStages[i].aChords = new TBarChords[aStages[i].nBarNum]; for( int j=0; jaItems->Count; aStages[i].aTracks = new TComposeTrack[aStages[i].nTrkNum]; for( int j=0; jaItems->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; iiType!=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; jaChords[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; ivolume / 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; iaItems->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; iaItems->Count; i++ ){ TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; for( int j=0; jaItems->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; iCount; 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; iCount; 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 ); } } // ---------------------------------------------------------------------------