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

1162 lines
31 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#include <Vcl.Imaging.pngimage.hpp>
#include <stdio.h>
#pragma hdrstop
#include "GlobalUnit.h"
#include "AudStylePanel.h"
#include "MessageFormUnit.h"
#include "FavorTextureUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define LIST_RECOMMAND 0
#define LIST_ORIGIN 1
#define LIST_SHARE 2
#define LIST_LOCAL 3
#define LIST_COLLECTION 4
__fastcall TAudStylePanel::TAudStylePanel(TComponent* AOwner)
: TStylePanel(AOwner)
{
m_strTitle = "风格库";
AddToolBtn( 3, "imgTabSelect", CMClick, "筛选与排序" );
m_nBtnCount = 1;
AddToolBtn( 3, "imgTabLocal", ListTypeClick, "本地自定义风格" );
m_lstBtnTools[m_nBtnCount++]->Tag = LIST_LOCAL;
AddToolBtn( 3, "imgTabCollect", ListTypeClick, "收藏的风格" );
m_lstBtnTools[m_nBtnCount++]->Tag = LIST_COLLECTION;
if( SOFTWARE_ID!=e_Pro_Lite ){
AddToolBtn( 3, "imgTabShare", ListTypeClick, "网友分享的组合风格" );
m_lstBtnTools[m_nBtnCount++]->Tag = LIST_SHARE;
}
AddToolBtn( 3, "imgTabRelease", ListTypeClick, "在线发布的原创风格" );
m_lstBtnTools[m_nBtnCount++]->Tag = LIST_ORIGIN;
AddToolBtn( 3, "imgTabRecom", ListTypeClick, "官方推荐风格" );
m_lstBtnTools[m_nBtnCount++]->Tag = LIST_RECOMMAND;
m_SearchPanel = new TStyleSelPanel(this); //搜索面板
m_SearchPanel->Parent = this;
m_SearchPanel->Visible = false;
m_SearchPanel->Left = 1;
m_SearchPanel->Top = 25;
m_editName = new TEdit(this);
m_editName->Parent = this;
m_editName->HideSelection = false;
m_editName->BorderStyle = bsNone;
m_editName->MaxLength = 39;
m_editName->Font->Name = g_strTxtFontName;
m_editName->Font->Quality = TFontQuality::fqClearTypeNatural;
m_editName->Font->Size = g_szFont9;
m_editName->OnMouseDown = EditMouseDown;
m_editName->OnMouseUp = EditMouseUp;
m_editName->OnMouseMove = EditMouseMove;
m_editName->OnKeyDown = EditKeyDown;
m_editName->OnChange = EditChange;
m_iListType = 0;
m_bDoubleClick = false;
m_RenameTimer = NULL;
}
//---------------------------------------------------------------------------
__fastcall TAudStylePanel::~TAudStylePanel()
{
ClearFavorTextures( true );
}
//---------------------------------------------------------------------------
void TAudStylePanel::Init()
{
// InsColGet();
if( g_aOriginStyles.empty() ){
SelectStyle();
}
if( m_SearchPanel ){
m_SearchPanel->Reset();
if( ((TPNGButton*)m_lstBtnTools[0])->Down ){
CMClick( NULL );
}
}
m_iListType = LIST_RECOMMAND;
for( int i=0; i<m_nBtnCount-1; i++ ){
m_lstBtnTools[i]->Down = false;
}
m_lstBtnTools[m_nBtnCount-1]->Down = true;
GetFavorTextures();
RefreshList();
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::UMSearchStyle(TMessage &msg)
{
Stop( STOP_SELF );
ClearAllItems();
RefreshList();
CalcViewArea();
ResetScrollBar();
InvalidateRgn( Handle, NULL, false );
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::DoubleClick(TObject* sender)
{
if( m_pSelItem && m_iFocCol==COL_TEXT ){
int iOnline = m_pSelItem->GetOnlineState();
if( iOnline==e_Downloaded ){
PlayDemo( m_pSelItem, -1 );
}
else if( iOnline==e_UnDownload ){
DoDownload( sender );
}
m_bDoubleClick = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::DoCollect(TObject* Sender)
{
if( m_pFocItem->iType==SEGTYPE_STYLE )
SetCollect(m_pFocItem);
else if( m_pFocItem->iType==SEGTYPE_TRACK ){
TTrackItem *pTrk = (TTrackItem*)m_pFocItem;
bool bSet = !pTrk->IsCollected();
// InsColSet( (TTrackItem*)m_pFocItem, bCollected);
// pTrk->SetCollect( bSet );
SetFavorTexture( pTrk->pStyle->idLoc, pTrk->pStyle->idStyle, pTrk->GetSegType(),
pTrk->GetSegNo(), pTrk->pTrack->iChanNo, bSet );
}
DrawItem( m_pFocItem, m_iFocLine, -1 );
}
// ---------------------------------------------------------------------------
void TAudStylePanel::PlayDemo( TCommonItem *pItem, int tempo )
{
TStylePanel::PlayDemo( pItem, g_iMelodyKey<0 ? -1 : g_nMelodyTempo );
}
//---------------------------------------------------------------------------
bool TAudStylePanel::StartDrag()
{
bool bCanDrag = m_pFocItem->GetOnlineState()==e_Downloaded; //可选风格已下载
if( m_SearchPanel->DInStr.Length>0 && m_pFocItem->iType!=SEGTYPE_TRACK )
bCanDrag = false;
return bCanDrag;
}
//---------------------------------------------------------------------------
void TAudStylePanel::SetDownload( TCommonItem *pItem )
{
TStyleItem* pStyItem = pItem->GetStyleItem() ;
pStyItem->SetDownload();
//查找当前行号
TCommonItem *pFind = m_pTopItem;
for( int i=0; i<m_nItemShow && pFind; i++ ){
if( pFind->GetStyleItem()==pStyItem ){
DrawItem( pFind, i, COL_TEXT );
}
pFind = GetNextItem( pFind );
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::OnNetworkMessage(TMessage &msg)
{
WORD eMessage = HIWORD(msg.WParam);
WORD eExtra = LOWORD(msg.WParam);
switch (eMessage) {
case e_styleInfoResponse:
{
if( 0!=eExtra && eExtra!=e_ShareStyle )
break;
int iStyleId = msg.LParam;
int idLoc = eExtra==e_ShareStyle ? 1 : 0;
TPROSTYLE infoStyle;
if( idLoc==0 )
infoStyle.pOrigin = new TSTYLEORIGIN;
else
infoStyle.pShare = new TSTYLESHARE;
int ret = f_CM_GetStyleInfo( idLoc, iStyleId, &infoStyle );
if( ret==0 ){
if( idLoc==0 && infoStyle.pOrigin->detail.iTimesignature!=g_iMelodyTimeSignature )
break;
if( idLoc==1 && infoStyle.pShare->iTimesignature!=g_iMelodyTimeSignature )
break;
bool bNew = false;
TPROSTYLE* pInfo = GetStyleInfo( idLoc, iStyleId );
if( !pInfo ){
pInfo = new TPROSTYLE;
if( idLoc==0 )
pInfo->pOrigin = new TSTYLEORIGIN;
else
pInfo->pShare = new TSTYLESHARE;
bNew = true;
}
pInfo->idLoc = infoStyle.idLoc;
pInfo->idStyle = infoStyle.idStyle;
if( idLoc==0 )
memcpy( pInfo->pOrigin, infoStyle.pOrigin, sizeof(TSTYLEORIGIN) );
else
memcpy( pInfo->pShare, infoStyle.pShare, sizeof(TSTYLESHARE) );
if( bNew ){
STYLELIST& aStyles = idLoc==0 ? g_aOriginStyles : g_aShareStyles;
int index = 0;
for( int i=aStyles.size()-1; i>=0; i-- ){
if( pInfo->idStyle > aStyles[i]->idStyle ){
index = i+1;
break;
}
}
if( index>=aStyles.size() )
aStyles.push_back( pInfo );
else
aStyles.insert( aStyles.begin()+index, pInfo );
if( idLoc==0 && m_iListType==LIST_ORIGIN ||
idLoc==1 && m_iListType==LIST_SHARE ){
int iLine = m_nTotalLine - m_iTopLine;
TStyleItem* pStyItem = AddStyleItem( pInfo,
IsCollected( pInfo->idLoc, pInfo->idStyle ) );
ResetScrollBar();
if( iLine<m_nItemShow )
DrawItem( pStyItem, iLine, -1 );
}
}
}
else{
TPROSTYLE* pInfo = GetStyleInfo( idLoc, iStyleId );
if( pInfo ){
/* pInfo->pOrigin->cost = -1;
TStyleItem * pStyItem = NULL;
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem *pItem = (TStyleItem*)m_aItems->Items[i];
if( pItem->pStyle->idLoc==0 && pItem->pStyle->idStyle==iStyleId ){
pStyItem = pItem;
break;
}
}
//从列表中删除
if( pStyItem ){
DeleteItem( pStyItem, iLine );
}
*/
DeleteStyleInfo( idLoc, iStyleId );
}
}
}
break;
case e_styleDataResponse: // download the style data
{
if( 0!=eExtra )
break;
int iRet = 0;
int iStyleId = msg.LParam;
TPROSTYLE* pInfo = GetStyleInfo( 0, iStyleId );
if( pInfo && pInfo->pOrigin->state!=e_Downloaded ){
pInfo->pOrigin->state = e_Downloaded;
if( m_iListType==LIST_ORIGIN || m_iListType==LIST_RECOMMAND ){
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i];
if( pItem->pStyle && pItem->pStyle==pInfo ){
//刷新显示
SetDownload( pItem );
break;
}
}
}
else if( m_iListType==LIST_SHARE ){
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[i];
bool bSet = false;
for( int j=0; !bSet && j<pStyItem->aItems->Count; j++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[j];
for( int k=0; k<pSeg->aItems->Count; k++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[k];
if( pTrk->pStyle==pInfo ){
SetDownload( pStyItem );
bSet = true;
break;
}
}
}
}
}
}
}
break;
case e_styleRecomResponse:
{
if( 0!=eExtra )
break;
//获取推荐列表
int nRecomNum = 50;
DWORD idRecoms[50];
f_CM_GetStyleRecomIDs( g_iMelodyTimeSignature, idRecoms, &nRecomNum );
if( nRecomNum==0 )
break;
g_aRecomStyles.clear();
for( int i=0; i<g_aOriginStyles.size(); i++ ){
TPROSTYLE* pInfo = g_aOriginStyles[i];
for( int j=0; j<nRecomNum; j++ ){
if( idRecoms[j]==pInfo->idStyle ){
g_aRecomStyles.push_back( pInfo );
break;
}
}
}
if( m_iListType==LIST_RECOMMAND && m_aItems->Count==0 ){
PostMessage( Handle, UM_SEARCH, 0, 0 );
}
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::OnNetworkError(TMessage &msg)
{
WORD eMessage = HIWORD(msg.WParam);
WORD eExtra = LOWORD(msg.WParam);
DebugPrint("网络访问错误,消息号:%d,错误号:0x%X\n", eMessage, eExtra);
}
// ---------------------------------------------------------------------------
void __fastcall TAudStylePanel::CMClick(System::TObject* Sender) //add ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
m_SearchPanel->Visible = !m_SearchPanel->Visible;
((TPNGButton*)m_lstBtnTools[0])->Down = m_SearchPanel->Visible; //按钮
Winapi::Messages::TWMSize Message;
Message.Width = Width;
Message.Height = Height;
WMSize(Message);
InvalidateRgn( Handle, NULL, false );
}
void __fastcall TAudStylePanel::WMSize(Winapi::Messages::TWMSize &Message)
{
if( m_SearchPanel && m_SearchPanel->Width != Width-2 )
m_SearchPanel->Width = Width-2;
if( m_SearchPanel && m_SearchPanel->Visible ){
m_nTitleHeight = 25 + m_SearchPanel->Height;
}
else{
m_nTitleHeight = 25;
}
TStylePanel::WMSize(Message);
}
bool TAudStylePanel::IsCollected( UINT idLoc, UINT idStyle )
{
for( int i=0; i<g_aCollectStyles.size(); i++ ){
if( g_aCollectStyles[i]->idLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){
return true;
}
}
return false;
}
//---------------------------------------------------------------------------
DWORD TAudStylePanel::GetStyleOptions( TPROSTYLE* info )
{
DWORD dwOpts = 0;
if( info->idLoc==0 ){
dwOpts |= OPT_SCORE;
if( info->pOrigin->state!=e_Downloaded )
dwOpts |= OPT_DOWNLOAD;
else
dwOpts |= OPT_COLLECT;
if( info->pOrigin->cost>0 )
dwOpts |= OPT_CHARGE;
}
else if( info->idLoc==1 ){
dwOpts |= OPT_SCORE;
bool bDownloaded = true,
bCharge = false;
for( int s=0; s<4; s++ ){
int rep = s<2 ? 1 : 2;
for( int r=0; r<rep; r++ ){
int nSegNum = info->pShare->nSegNum[s];
int iStart = r * 4,
iEnd = iStart + ( r==0 ? ( nSegNum & 0x0F ) : ( nSegNum>>4 ));
for( int n=iStart; n<iEnd; n++ ){
for( int t=0; t<16 && info->pShare->trkRef[s][n][t].idStyle>0; t++ ){
TPROSTYLE* pTrkInfo = GetStyleInfo( 0, info->pShare->trkRef[s][n][t].idStyle );
if(!pTrkInfo){
bDownloaded = false;
goto LINE_BREAK;
}
if( bDownloaded && pTrkInfo->pOrigin->state!=e_Downloaded ){
bDownloaded = false;
if( bCharge )
goto LINE_BREAK;
}
if( !bCharge && pTrkInfo->pOrigin->cost>0 ){
bCharge = true;
if( !bDownloaded )
goto LINE_BREAK;
}
}
}
}
}
LINE_BREAK:
if( !bDownloaded )
dwOpts |= OPT_DOWNLOAD;
else
dwOpts |= OPT_COLLECT;
if( bCharge )
dwOpts |= OPT_CHARGE;
}
else{
dwOpts = OPT_DEL | OPT_UPLOAD;
}
return dwOpts;
}
//---------------------------------------------------------------------------
String TAudStylePanel::ChargeTip( TStyleItem* pItem )
{
String strTip;
if( pItem->pStyle->idLoc==0 ){
strTip = "收费:";
strTip += IntToStr( ((TStyleItem*)pItem)->pStyle->pOrigin->cost );
strTip += "唱作音符";
}
else if( pItem->pStyle->idLoc==1 ){
strTip = " 包含收费风格\n\n 风格 唱作音符\n";
strTip += "------------------------";
STYLELIST aStyles;
TPROSTYLE* info = pItem->pStyle;
char buf[512];
for( int s=0; s<4; s++ ){
int rep = s<2 ? 1 : 2;
for( int r=0; r<rep; r++ ){
int nSegNum = info->pShare->nSegNum[s];
int iStart = r * 4,
iEnd = iStart + ( r==0 ? ( nSegNum & 0x0F ) : ( nSegNum>>4 ));
for( int n=iStart; n<iEnd; n++ ){
for( int t=0; t<16 && info->pShare->trkRef[s][n][t].idStyle>0; t++ ){
TPROSTYLE* pTrkInfo = GetStyleInfo( 0, info->pShare->trkRef[s][n][t].idStyle );
if( pTrkInfo->pOrigin->cost>0 ){
bool bMatch = false;
for( int k=0; k<aStyles.size(); k++ ){
if( pTrkInfo==aStyles[k] ){
bMatch = true;
break;
}
}
if( !bMatch ){
aStyles.push_back( pTrkInfo );
sprintf( buf, "\n[%4d] %d", pTrkInfo->idStyle,
pTrkInfo->pOrigin->cost );
strTip += buf;
}
}
}
}
}
}
}
return strTip;
}
//---------------------------------------------------------------------------
TStyleItem* __fastcall TAudStylePanel::AddStyleItem( TPROSTYLE* info, bool bCollected )
{
TStyleItem* pStyItem = CreateStyleItem( info, bCollected, true );
InsertStyleItem( pStyItem, m_aItems->Count );
return pStyItem;
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::ListTypeClick(TObject *Sender)
{
TPNGButton* pBtn = (TPNGButton*)Sender;
if( !pBtn->Down ){
pBtn->Down = true;
for( int i=1; i<m_nBtnCount; i++ ){
if( m_lstBtnTools[i]==pBtn ){
m_iListType = pBtn->Tag;
}
else{
m_lstBtnTools[i]->Down = false;
}
}
if( m_SearchPanel ){
m_SearchPanel->Reset();
if( ((TPNGButton*)m_lstBtnTools[0])->Down ){
CMClick( NULL );
}
}
PostMessage( Handle, UM_SEARCH, 0, 0 );
}
}
//---------------------------------------------------------------------------
void TAudStylePanel::RefreshList()
{
bool bAuthority = SOFTWARE_ID==e_Pro_Lite || g_bLogon
&& (g_infoUser.accountInfo.authority & 0x1000);
int iStart, iEnd, iStep;
STYLELIST& lstStyles = m_iListType==LIST_RECOMMAND ? g_aRecomStyles
: m_iListType==LIST_ORIGIN ? g_aOriginStyles
: m_iListType==LIST_SHARE ? g_aShareStyles
: m_iListType==LIST_COLLECTION ? g_aCollectStyles
: g_aLocalStyles;
if( !lstStyles.empty() ){
if( m_SearchPanel->iSortType==0 && m_SearchPanel->iSortMode==1 ){
iStart = 0;
iEnd = lstStyles.size();
iStep = 1;
}
else{
iStart = lstStyles.size()-1;
iEnd = -1;
iStep = -1;
}
for( int ind=iStart; ind!=iEnd; ind+=iStep ){
TPROSTYLE* info = lstStyles[ind];
bool bCollect = false;
if( m_iListType!=LIST_LOCAL )
bCollect = IsCollected( info->idLoc, info->idStyle );
//检查分类
bool bAdd = false;
if( m_SearchPanel->DStyle.Length==10 || m_iListType==LIST_LOCAL ){
bAdd = true;
}
else{
for( int cunt=0; !bAdd && cunt<m_SearchPanel->DStyle.Length; cunt++ ){
if( info->idLoc==0 ){
TSTYLEDETAIL& detail = info->pOrigin->detail;
for( int ity=0;ity<sizeof(detail.type);ity++ ){
//判断是否添加项
if( detail.type[ity]>=0 && detail.type[ity]<=23
&&( detail.type[ity] == m_SearchPanel->DStyle[cunt]
|| m_SearchPanel->DStyle[cunt] == -2
&& detail.type[ity] >8 ) ){ // “>8" 为 其他
bAdd = true;
break;
}
}
}
else if( info->idLoc==1 ){
TSTYLESHARE* detail = info->pShare;
for( int ity=0;ity<sizeof(detail->type);ity++ ){
//判断是否添加项
if( detail->type[ity]>=0 && detail->type[ity]<=23
&&( detail->type[ity] == m_SearchPanel->DStyle[cunt]
|| m_SearchPanel->DStyle[cunt] == -2
&& detail->type[ity] > 8 ) ){ // “>8" 为 其他
bAdd = true;
break;
}
}
}
else if( m_SearchPanel->DStyle[cunt] == -2 ){
bAdd = true;
break;
}
}
}
if( bAdd ){
//检查乐器查找
TStyleItem* pStyItem = NULL;
bool bInstSearch = m_SearchPanel->DInStr.Length>0;
if( bInstSearch ){
pStyItem = CreateInstrumentItem( info, bCollect, bAuthority );
}
else if( m_iListType!=LIST_COLLECTION || bCollect ){
pStyItem = CreateStyleItem( info, bCollect, bAuthority );
}
if( pStyItem ){
if( pStyItem->aItems->Count>0 ){
int index = m_aItems->Count;
if( m_SearchPanel->iSortType==3 ){ //速度排序
int iMode = m_SearchPanel->iSortMode,
iTempo = info->idLoc==0 ? info->pOrigin->detail.iTempo
: info->idLoc==1 ? info->pShare->iTempo
: info->pLocal->iTempo;
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem* pTmpSty = (TStyleItem*)m_aItems->Items[i];
int tmpTempo = pTmpSty->pStyle->idLoc==0
? pTmpSty->pStyle->pOrigin->detail.iTempo
: pTmpSty->pStyle->idLoc==1
? pTmpSty->pStyle->pShare->iTempo
: pTmpSty->pStyle->pLocal->iTempo;
if( iMode==0 && iTempo > tmpTempo
|| iMode==1 && iTempo < tmpTempo ){
index = i;
break;
}
}
}
else if( ( m_iListType==LIST_ORIGIN || m_iListType==LIST_RECOMMAND )
&& m_SearchPanel->iSortType!=0 ){ //价格/评分排序
int iType = m_SearchPanel->iSortType,
iMode = m_SearchPanel->iSortMode,
cost = info->pOrigin->cost,
score = info->pOrigin->score;
for( int i=0; i<m_aItems->Count; i++ ){
TStyleItem* pTmpSty = (TStyleItem*)m_aItems->Items[i];
int tmpCost = pTmpSty->pStyle->pOrigin->cost,
tmpScore = pTmpSty->pStyle->pOrigin->score;
if( iMode==0 && ( iType==1 && cost > tmpCost
|| iType==2 && score > tmpScore )
|| iMode==1 && ( iType==1 && cost < tmpCost
|| iType==2 && score < tmpScore )){
index = i;
break;
}
}
}
InsertStyleItem( pStyItem, index );
}
else{
delete pStyItem;
}
}
}
}
}
if( m_aItems->Count>0 ){
m_pTopItem = (TCommonItem*)m_aItems->First();
}
}
//---------------------------------------------------------------------------
TStyleItem* TAudStylePanel::CreateInstrumentItem( TPROSTYLE* info, bool bCollected, bool bAuthority )
{
TStyleItem* pStyItem = NULL;
for( int s=0; s<SEGTYPE_TRACK; s++ ){
int rep = s<SEGTYPE_INTRO ? 1 : 2;
for( int r=0; r<rep; r++ ){
int nSegNum = info->idLoc==0 ? info->pOrigin->detail.nSegNum[s]
: info->idLoc==1 ? info->pShare->nSegNum[s]
: info->pLocal->nSegNum[s];
int num = s<SEGTYPE_INTRO ? nSegNum
: r==0 ? ( nSegNum & 0x0F )
: ( nSegNum>>4 );
if( num>0 ){
for( int i=0; i<num; i++ ){
TSegmentItem* pSegItem = NULL;
int sn = r==0 ? i : i+4;
for( int j=0; j<16; j++ ){
if( info->idLoc==0 && info->pOrigin->detail.tracks[s][sn][j].no>=0
&& info->pOrigin->detail.tracks[s][sn][j].no!=9
|| info->idLoc==1 && info->pShare->trkRef[s][sn][j].idStyle>=0
&& info->pShare->trkRef[s][sn][j].chan!=9
|| info->idLoc>0 && info->pLocal->trkRef[s][sn][j].idStyle>=0
&& info->pLocal->trkRef[s][sn][j].chan!=9 ){
char prog = info->idLoc==0 ? info->pOrigin->detail.tracks[s][sn][j].prog
: info->idLoc==1 ? info->pShare->trkRef[s][sn][j].prog
: info->pLocal->trkRef[s][sn][j].prog;
for( int m=0;m<m_SearchPanel->DInStr.Length;m++ ){
if( m_SearchPanel->DInStr[m]==prog ){
if( !pStyItem ){ //添加风格
DWORD dwOpts = GetStyleOptions( info );
//pStyItem = AddStyle( info, dwOpts );
pStyItem = new TStyleItem( info, dwOpts );
// if( bCollected )
// pStyItem->SetCollect( true );
}
if( pStyItem && !pSegItem ){
int vol = info->idLoc==0 ? 100
: info->idLoc==1 ? info->pShare->nSegVol[s][sn]
: info->pLocal->nSegVol[s][sn];
pSegItem = pStyItem->AddSegment( s, sn, 0, 0, -1, vol );
}
if( pSegItem ){ //添加具体项
pSegItem->AddTrack( info, sn, j, info->idLoc<=1?OPT_COLLECT:0, bAuthority );
}
}
}
}
}
if( pSegItem ){
if( pSegItem->aItems->Count>0 ){
if( s==SEGTYPE_INTRO ){
pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn]
: info->idLoc==1 ? info->pShare->aIEBars[0][sn]
: info->pLocal->aIEBars[0][sn];
}
else if( s==SEGTYPE_ENDING ){
pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn]
: info->idLoc==1 ? info->pShare->aIEBars[1][sn]
: info->pLocal->aIEBars[1][sn];
}
}
else{
pStyItem->DeleteSegment( pSegItem );
}
}
}
}
}
}
return pStyItem;
}
//---------------------------------------------------------------------------
TStyleItem* TAudStylePanel::CreateStyleItem( TPROSTYLE* info, bool bCollected, bool bAuthority )
{
DWORD dwOpts = GetStyleOptions( info );
TStyleItem* pStyItem = new TStyleItem( info, dwOpts );
// if( bCollected ) pStyItem->SetCollect( true );
for( int s=0; s<SEGTYPE_TRACK; s++ ){
int rep = s<SEGTYPE_INTRO ? 1 : 2;
for( int r=0; r<rep; r++ ){
int nSegNum = info->idLoc==0 ? info->pOrigin->detail.nSegNum[s]
: info->idLoc==1 ? info->pShare->nSegNum[s]
: info->pLocal->nSegNum[s];
int num = s<SEGTYPE_INTRO ? nSegNum
: r==0 ? ( nSegNum & 0x0F )
: ( nSegNum>>4 );
if( num>0 ){
DWORD opts = s<SEGTYPE_INTRO ? OPT_BRUSH : 0;
for( int i=0; i<num; i++ ){
int sn = r==0 ? i : i+4;
int vol = info->idLoc==0 ? 100
: info->idLoc==1 ? info->pShare->nSegVol[s][sn]
: info->pLocal->nSegVol[s][sn];
TSegmentItem* pSegItem = pStyItem->AddSegment( s, sn, opts, 0, -1, vol );
for( int j=0; j<16; j++ ){
pSegItem->AddTrack( info, sn, j, info->idLoc<=1?OPT_COLLECT:0, bAuthority );
}
if( pSegItem->aItems->Count>0 ){
if( s==SEGTYPE_INTRO ){
pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn]
: info->idLoc==1 ? info->pShare->aIEBars[0][sn]
: info->pLocal->aIEBars[0][sn];
}
else if( s==SEGTYPE_ENDING ){
pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn]
: info->idLoc==1 ? info->pShare->aIEBars[1][sn]
: info->pLocal->aIEBars[1][sn];
}
}
else{
pStyItem->DeleteSegment( pSegItem );
}
}
}
}
}
return pStyItem;
}
//---------------------------------------------------------------------------
void TAudStylePanel::InsertStyleItem( TStyleItem* pStyItem, int index )
{
if( index<m_aItems->Count ){
if( index>0 ){
TCommonItem* pPrev = (TCommonItem*)m_aItems->Items[index-1];
pPrev->next = pStyItem;
pStyItem->prev = pPrev;
}
TCommonItem* pNext = (TCommonItem*)m_aItems->Items[index];
pNext->prev = pStyItem;
pStyItem->next = pNext;
}
else if( m_aItems->Count>0 ){
TCommonItem *pLast = (TCommonItem*)m_aItems->Last();
pLast->next = pStyItem;
pStyItem->prev = pLast;
}
m_aItems->Insert( index, pStyItem );
m_nTotalLine++;
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::ReloadLocalStyle( bool bShow )
{
if( m_iListType==LIST_LOCAL ){
PostMessage( Handle, UM_SEARCH, 0, 0 );
}
else if( bShow ){
ListTypeClick( m_lstBtnTools[1] );
}
}
//---------------------------------------------------------------------------
void TAudStylePanel::DeleteItem( TCommonItem *pItem, int iLine )
{
if( pItem->iType==SEGTYPE_STYLE ){
TPROSTYLE* pStyle = ((TStyleItem*)pItem)->pStyle;
//检查是否正在使用
bool bUsed = false;
if( g_pUseStyle ){
TStyleItem* pStyItem = (TStyleItem*)g_pUseStyle;
if( pStyItem->pStyle==pStyle )
bUsed = true;
for( int i=0; !bUsed && i<pStyItem->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i];
for( int j=0; !bUsed && j<pSeg->aItems->Count; j++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j];
if( pTrk->pStyle==pStyle ){
bUsed = true;
}
}
}
}
if( !bUsed && g_pPreStyle ){
TStyleItem* pStyItem = (TStyleItem*)g_pPreStyle;
if( pStyItem->pStyle==pStyle )
bUsed = true;
for( int i=0; !bUsed && i<pStyItem->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i];
for( int j=0; !bUsed && j<pSeg->aItems->Count; j++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j];
if( pTrk->pStyle==pStyle ){
bUsed = true;
}
}
}
}
if( bUsed ){
MessageForm->ShowMessage( "该风格正在使用或编辑中,无法删除!",
MB_ICONERROR | MB_OK, "删除风格" );
return;
}
bUsed = false;
TPROSTYLE* pExampleStyle = NULL;
for( int i=0; !bUsed && i<m_aItems->Count; i++ ){
if( pItem==m_aItems->Items[i] )
continue;
TStyleItem* pSty = (TStyleItem*)m_aItems->Items[i];
for( int j=0; !bUsed && j<pSty->aItems->Count; j++ ){
TSegmentItem* pSeg = (TSegmentItem*)pSty->aItems->Items[j];
for( int k=0; k<pSeg->aItems->Count; k++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[k];
if( pTrk->pStyle->idLoc==pStyle->idLoc
&& pTrk->pStyle->idStyle==pStyle->idStyle ){
bUsed = true;
pExampleStyle = pSty->pStyle;
break;
}
}
}
}
String strMsg = "确定删除本地风格【";
strMsg += UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str();
strMsg += "】?";
if( bUsed ){
char buff[512];
sprintf( buff, "\n\n该操作将修改 L%d【%s】等风格",
LOWORD(pExampleStyle->idStyle),
UTF8ToMBCS(pExampleStyle->pLocal->strStyleName).c_str() );
strMsg += buff;
}
if( mrCancel==MessageForm->ShowMessage(strMsg, MB_ICONQUESTION | MB_OKCANCEL) )
return;
f_CM_DeleteLocalStyle( pStyle->idLoc, pStyle->idStyle );
DeleteStyleInfo( pStyle->idLoc, pStyle->idStyle );
if( bUsed )
Perform( UM_SEARCH, 0, 0 );
else
TStylePanel::DeleteItem( pItem, iLine );
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::EditChange(TObject *Sender)
{
TEdit* pEdit = ((TEdit*)Sender);
AnsiString strName = pEdit->Text.Trim();
string strTmp = GBToUTF8(strName.c_str());
if( strTmp.length()>pEdit->MaxLength ){
pEdit->OnChange = NULL;
pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 );
pEdit->SelStart = pEdit->Text.Length();
pEdit->OnChange = EditChange;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::EditMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
if( X>0 && X<m_editName->Width && Y>0 && Y<m_editName->Height )
Screen->Cursor = crIBeam;
else
Screen->Cursor = crArrow;
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::EditMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if( X<0 || X>m_editName->Width || Y<0 || Y>m_editName->Height ){
ReleaseCapture();
TPoint pt( X, Y );
pt = m_editName->ClientToScreen( pt );
pt = ScreenToClient( pt );
bool bInsideAudPanel = pt.x>0 && pt.x<Width && pt.y>0 && pt.y<Height;
if( Button==mbLeft && bInsideAudPanel )
StyleRename();
m_editName->Hide();
Screen->Cursor = crDefault;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::EditMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
SetCapture( m_editName->Handle );
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::EditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch( Key ){
case VK_RETURN:
StyleRename();
m_editName->Hide();
ReleaseCapture();
Screen->Cursor = crDefault;
break;
case VK_ESCAPE:
m_editName->Hide();
ReleaseCapture();
Screen->Cursor = crDefault;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::RenameTiming(int op)
{
if( m_RenameTimer ){
delete m_RenameTimer;
m_RenameTimer = NULL;
}
if( m_bDoubleClick ){
m_bDoubleClick = false;
}
else if( op==1 ){
m_RenameTimer = new TTimer(this);
m_RenameTimer->Interval = GetDoubleClickTime();
m_RenameTimer->OnTimer = RenameTimerProc;
m_RenameTimer->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::RenameTimerProc(System::TObject* Sender)
{
if( m_RenameTimer ){
DoRename( NULL );
delete m_RenameTimer;
m_RenameTimer = NULL;
}
}
//---------------------------------------------------------------------------
void __fastcall TAudStylePanel::DoRename(TObject* Sender)
{
if( m_iListType!=LIST_LOCAL )
return;
if( Sender ){
SetSelect( m_pFocItem, m_iFocLine );
}
if( m_iFocLine==m_nItemShow-1 ){
ScrollView( m_iTopLine+1 );
}
if( m_editName && m_pSelItem ){
m_editName->Tag = (int)m_pSelItem;
String strText;
m_pSelItem->AddStyleId( strText );
int left = LEFT_BOUND + OPTION_WIDTH + Canvas->TextWidth( strText );
int nOpt = m_pSelItem->aOptions->Count;
int top = ( m_editName->Font->Size==g_szFont9 ? 0 : 2 ) + m_iSelLine*m_nItemHeight+m_nTitleHeight;
int height = m_editName->Font->Size==g_szFont9 ? 16 : 13;
m_editName->SetBounds( left + LEFT_BOUND,
top,
Width - left - nOpt * OPTION_WIDTH - RIGHT_BOUND - 4,
height );
TPROSTYLE* pStyle = ((TStyleItem*)m_pSelItem)->pStyle;
strText = UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str();
m_editName->Text = strText;
m_editName->Show();
m_editName->SelectAll();
m_editName->SetFocus();
SetCapture( m_editName->Handle );
}
}
//---------------------------------------------------------------------------
void TAudStylePanel::StyleRename()
{
if( !m_pSelItem )
return;
String strOldName, strNewName;
// TStyleItem* pStyItem = (TStyleItem*)m_editName->Tag;
TPROSTYLE* pStyle = ((TStyleItem*)m_pSelItem)->pStyle;
/* if( pStyle->idLoc==1 )
strOldName = UTF8ToMBCS(pStyle->pShare->strStyleName).c_str();
else if( pStyle->idLoc!=(UINT)-1 )
*/ strOldName = UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str();
strNewName = m_editName->Text.Trim();
if( strNewName.Length()>0 && strNewName.Compare( strOldName ) ){
string strName = GBToUTF8(AnsiString(strNewName.c_str()).c_str()).c_str();
strcpy( pStyle->pLocal->strStyleName, strName.c_str() );
f_CM_ChangeLocalStyle( pStyle );
}
}
//---------------------------------------------------------------------------