327 lines
11 KiB
C++
327 lines
11 KiB
C++
//---------------------------------------------------------------------------
|
|
|
|
#ifndef ContentPanelUnitH
|
|
#define ContentPanelUnitH
|
|
|
|
#include "SkinScrollBarUnit.h"
|
|
#include "ToolpalPanel.h"
|
|
#include "StyleItem.h"
|
|
#include "MenuUnit.h"
|
|
#include "BaseTrack.h"
|
|
|
|
#define BAR_CURSOR 0x00
|
|
#define BAR_TITLE 0x100
|
|
#define BAR_DATA 0x200
|
|
#define BAR_TRACK 0x400
|
|
#define BAR_LEFT 0x1000
|
|
#define MIN_HDR_WIDTH 120
|
|
#define MAX_HDR_WIDTH 240
|
|
|
|
typedef struct tagShowTrack
|
|
{
|
|
BYTE type;
|
|
BYTE index;
|
|
BYTE iHover;
|
|
TBaseTrack* pTrack;
|
|
|
|
tagShowTrack( BYTE ty, BYTE ind, TBaseTrack* p )
|
|
{
|
|
type = ty;
|
|
index = ind;
|
|
iHover = 0;
|
|
pTrack = p;
|
|
};
|
|
}TShowTrack, *PTShowTrack;
|
|
|
|
typedef vector<TShowTrack*> TShowTrackList;
|
|
//---------------------------------------------------------------------------
|
|
class TContentPanel : public Extctrls::TPanel
|
|
{
|
|
private:
|
|
//显示相关
|
|
HRGN m_rgnClip;
|
|
bool m_bVertical; //竖版/横版
|
|
|
|
int m_iMode, //0=音频模式 1=和弦模式 2=风格模式
|
|
m_nRowShow,
|
|
m_nTrackShow,
|
|
m_nColumnNum,
|
|
m_nRowNum,
|
|
m_nBarNum,
|
|
m_iBeginShowRow,
|
|
m_iBeginShowBar,
|
|
m_iBeginShowTrack,
|
|
|
|
m_nBarWidth,
|
|
m_nBarHeight,
|
|
m_nDataWidth,
|
|
m_nBarDrawHeight,
|
|
m_nRowGapHeight, //播放区
|
|
m_nTitleHeight, //小节区
|
|
m_nChordHeight, //和弦区
|
|
m_nTrackHeight, //轨道区
|
|
m_nTrkHdrWidth, //轨道头宽度
|
|
|
|
m_nLeftBound,
|
|
m_nLeftOriBound,
|
|
m_nRightBound,
|
|
m_nTopBound,
|
|
m_nBottomBound;
|
|
|
|
TShowTrackList m_aTracks; //显示的轨道
|
|
|
|
TSkinScrollBar *m_sbVert,
|
|
*m_sbHoriz;
|
|
TToolpalPanel *m_pStylePanel, //风格面板
|
|
*m_pChordPanel, //和弦面板
|
|
*m_pTrackPanel; //轨道面板
|
|
|
|
//选择相关
|
|
int m_iSelBarStart,
|
|
m_iSelBarEnd,
|
|
m_iSelPointStart,
|
|
m_iSelPointEnd,
|
|
m_iSelTrackBar,
|
|
m_iSelTrackPoint,
|
|
m_iSelTrack;
|
|
|
|
//录音/播放相关
|
|
bool m_bPlaying;
|
|
int m_iPlayBar,
|
|
m_iPlayPoint;
|
|
TBitmap *m_imgPlayCursor,
|
|
*m_imgMidiIcon,
|
|
*m_imgWaveIcon;
|
|
|
|
TPngImage * m_imgBeatHint[4],
|
|
*m_pngChordUp,
|
|
*m_pngChordDown,
|
|
*m_pngChord2,
|
|
*m_pngChord4,
|
|
*m_pngChord6,
|
|
*m_pngChord7,
|
|
*m_pngChordI,
|
|
*m_pngChordV,
|
|
*m_pngChordMaj,
|
|
*m_pngChordMin,
|
|
*m_pngChordSus;
|
|
int m_iBeatHint,
|
|
m_lBeatHint,
|
|
m_tBeatHint,
|
|
m_wBeatHint,
|
|
m_hBeatHint;
|
|
|
|
//和弦相关
|
|
int m_nChordTxtWidth,
|
|
m_nChordTxtHeight,
|
|
m_iMinSelBar,
|
|
m_iMaxSelBar,
|
|
m_iSelCellStart,
|
|
m_iSelCellEnd;
|
|
|
|
//复制剪切相关
|
|
int m_iCopyBarStart,
|
|
m_iCopyBarEnd,
|
|
m_iCopyCellStart,
|
|
m_iCopyCellEnd,
|
|
m_iCopyPointStart,
|
|
m_iCopyPointEnd,
|
|
m_iCopyAudio;
|
|
bool m_bCut;
|
|
|
|
//拖动相关
|
|
int m_iDropBar,
|
|
m_iMouseDownBar,
|
|
m_iMouseDownPoint,
|
|
m_iDragingStage,
|
|
m_iDragAudio; //拖动的音频轨
|
|
bool m_bDragReady, //鼠标拖动进行选择操作
|
|
m_bDraging,
|
|
m_bBrush;
|
|
TPoint ptDown;
|
|
TCommonItem *m_pItem;
|
|
|
|
TTimer *m_pTimer; //自动滚屏定时器
|
|
|
|
TMenuPanel *m_PopupMenu; //右键菜单 //add
|
|
TApplicationEvents *m_ApplicationEvents;
|
|
|
|
void ChordPaste( int key[], int type[], int len, bool bAddUndo=true );
|
|
// void ChangeMelodyKey( int Index );
|
|
void ChangeBarsKey( int iBarStart, int iBarEnd, int iKey, int keys[] );
|
|
void AudioMove( int iSrcTrack, int iBarStart, int iPointStart,
|
|
int iBarEnd, int iPointEnd, bool bCut );
|
|
void GetBarKeys( int iBarStart, int iBarEnd, int keys[] );
|
|
void ChangeMidiTrack( int iMT=-1, int iSBar=-1, int iEBar=-1 );
|
|
|
|
void ClearShowTracks();
|
|
void ShowTrackChangeState( int iTrack, int iType );
|
|
void ShowPlayPoint();
|
|
|
|
void CalcViewArea();
|
|
bool SetScrollView( int iFirstShowBar );
|
|
|
|
void DrawBars();
|
|
void DrawBarTitle( int l, int r, int t, bool bSel );
|
|
void DrawBarData( int iBar, int iStage, int iFirstBar, int left, int top );
|
|
void DrawTrack( int iBar, int nBarNum, int left, int top, int iTrack );
|
|
void DrawRowWave( int iBar, int nBarNum, int left, int top, int iWave );
|
|
void DrawRowMidi( int iBar, int nBarNum, int left, int top, int iMidi );
|
|
void DrawChord( TRect& rcDraw, int iBarKey, int iKey, int iType );
|
|
|
|
//HitTest返回iHitType值 -1=无效区域 0=行间空白 1=小节栏 2=和弦区 >=3 波形区
|
|
DWORD HitTest( int X, int Y, int& iHitType, bool bHead=false );
|
|
|
|
void SelectRange( int iBarStart, int iPointStart, int iBarEnd, int iPointEnd, bool bInvalid=false );
|
|
void SelectCopyBars( int iBarStart, int iBarEnd, bool bCut=false );
|
|
void SelectCopyCells( int iBarStart, int iCellStart, int iBarEnd, int iCellEnd );
|
|
void SelectCopyPos( int iBarStart, int iPointStart, int iBarEnd, int iPointEnd );
|
|
void SetDropBar( int iBar );
|
|
void SelectRangeByWave( int iHitBar, int iHitPoint );
|
|
|
|
int GetCell( int iPoint );
|
|
void GetSelectChord( int& iBarKey, int& iChordKey, int& iChordType );
|
|
|
|
void DrawDragImg( int mode );
|
|
void SetScrollTimer(TPoint ptMouse, bool bVertical=true);
|
|
void HandleDropEvent( int iState=0 );
|
|
bool HandleHoverEvent(TPoint ptMouse);
|
|
void HandleBrush();
|
|
|
|
void OnAudioEffectProcess( int iFxType );
|
|
void OnAudioEffectAdd( int iFxType );
|
|
void OnWMScroll(TWMScroll &Message, bool bVertical);
|
|
|
|
void __fastcall DoHandleMessage(MSG &Msg, bool &Handled); //鼠标消息处理
|
|
void __fastcall TimerProc(TObject* Sender);
|
|
void __fastcall DoubleClick(TObject* sender);
|
|
void __fastcall DoSetSelPosStart(System::TObject* Sender);
|
|
void __fastcall DoSetSelPosEnd(System::TObject* Sender);
|
|
void __fastcall DoDelSelPosStart(System::TObject* Sender);
|
|
void __fastcall DoDelSelPosEnd(System::TObject* Sender);
|
|
void __fastcall DoAudioFxProcess(System::TObject* Sender);
|
|
void __fastcall DoAudioVstProcess(System::TObject* Sender);
|
|
void __fastcall DoAudioAddFx(System::TObject* Sender);
|
|
void __fastcall DoAudioAddVst(System::TObject* Sender);
|
|
|
|
MESSAGE void __fastcall OnMidiSwitch(TMessage &msg);
|
|
MESSAGE void __fastcall UMMouseMove(TWMMouse &Message);
|
|
MESSAGE void __fastcall UMMouseUp(TWMMouse &Message);
|
|
MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message);
|
|
MESSAGE void __fastcall WMSize(TWMSize &Message);
|
|
MESSAGE void __fastcall WMVScroll(TWMScroll &Message);
|
|
MESSAGE void __fastcall WMHScroll(TWMScroll &Message);
|
|
MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message);
|
|
MESSAGE void __fastcall WMMouseDown(TWMMouse &Message);
|
|
|
|
BEGIN_MESSAGE_MAP
|
|
MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd)
|
|
MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
|
|
MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll)
|
|
MESSAGE_HANDLER(WM_HSCROLL, TWMHScroll, WMHScroll)
|
|
MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel)
|
|
MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMMouse, WMMouseDown)
|
|
MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMMouse, WMMouseDown)
|
|
MESSAGE_HANDLER(UM_MOUSEMOVE, TWMMouseMove, UMMouseMove)
|
|
MESSAGE_HANDLER(UM_MOUSEUP, TWMMouse, UMMouseUp)
|
|
MESSAGE_HANDLER(UM_MIDISWITCH, TMessage, OnMidiSwitch)
|
|
END_MESSAGE_MAP(Vcl::Extctrls::TPanel)
|
|
|
|
protected:
|
|
virtual void __fastcall CreateWnd();
|
|
virtual void __fastcall Paint(void);
|
|
|
|
public:
|
|
inline void SetStylePanel( TToolpalPanel* pPanel ){ m_pStylePanel=pPanel; };
|
|
inline void SetChordPanel( TToolpalPanel* pPanel ){ m_pChordPanel=pPanel; };
|
|
inline void SetTrackPanel( TToolpalPanel* pPanel ){ m_pTrackPanel=pPanel; };
|
|
inline void SetPopMenu( TMenuPanel* pMenu ){ m_PopupMenu = pMenu; };
|
|
|
|
void InitialVars( bool bClear = false );
|
|
inline int GetBarNum(){ return m_nBarNum; };
|
|
void AddNewBar( int iBar );
|
|
void ShowBeatHint( int iBeat );
|
|
|
|
void SetMode( int iMode );
|
|
void SetScrollMode( bool bVertical=true );
|
|
inline bool IsVertical() { return m_bVertical; };
|
|
inline void Play( bool bPlay ) { m_bPlaying=bPlay; };
|
|
inline bool IsPlaying() { return m_bPlaying; };
|
|
void SetPlayPoint( int iBar, int iPoint );
|
|
|
|
int GetShowTrackId( int type, int index );
|
|
void SelectTrack( int iTrack, int iBar, int iPoint, bool bClear=true );
|
|
void ShowTrack( int type, int index, bool bShow );
|
|
void DeleteTrack( int type, int index );
|
|
|
|
void SetSelectRange( int iStartBar, int iStartPoint, int iEndBar, int iEndPoint, bool bInvalid=false );
|
|
void GetSelectRange( int& iStartBar, int& iStartPoint, int& iEndBar, int& iEndPoint );
|
|
inline bool IsModifyMode() { return !(m_iSelBarStart<0 && m_iSelBarEnd<0); };
|
|
|
|
bool SetSelectChord( int iKey, int iChordType );
|
|
void GetChordDispalyKey( int iKey, int iBarKey, int& iMainKey, int& iAjustKey );
|
|
|
|
void SelectCells( int iBarStart, int iCellStart, int iBarEnd, int iCellEnd );
|
|
void SelectStage( int iStage );
|
|
void SelectBars( int iStartBar, int iEndBar );
|
|
void GetSelectBars( int& iStartBar, int& iEndBar );
|
|
|
|
void InvalidateBar( int iBar, int iBeginPoint, int iEndPoint, int iArea=BAR_DATA );
|
|
void InvalidateBars( int iBarStart, int iBarEnd, int iArea=BAR_DATA );
|
|
void InvalidateShowBars( int iArea=BAR_TITLE|BAR_DATA|BAR_TRACK );
|
|
void InvalidateStage( int iStage, int iArea=BAR_DATA );
|
|
void ScrollView( int nPos, bool bVertical=true, bool bRedraw=true );
|
|
|
|
bool ShowDragImg( bool bShow=true, int iState=0 );
|
|
TCommonItem* GetDropItem(){ return m_pItem; };
|
|
void SetDropItem( TCommonItem* pItem ){ m_pItem = pItem; };
|
|
void BeginBrush( TCommonItem* pBrushItem );
|
|
void CancelBrush();
|
|
bool IsStyleBrush() { return m_bBrush; };
|
|
|
|
void Undo( bool bUndo );
|
|
|
|
void __fastcall OnTrackStateChanged( int iType, int iIndex, BYTE iState, bool bUnset );
|
|
void __fastcall OnStageChanged( int iStage, int iMode );
|
|
void __fastcall OnChangeMelodyKey( int Index );
|
|
void __fastcall OnDirectionKey( WORD key );
|
|
|
|
void __fastcall DoCancelAll(System::TObject* Sender);
|
|
void __fastcall DoSelectAll(System::TObject* Sender);
|
|
void __fastcall DoInsertBlankBar(System::TObject* Sender);
|
|
void __fastcall DoBarsCopy(System::TObject* Sender);
|
|
void __fastcall DoBarsCut(System::TObject* Sender);
|
|
void __fastcall DoBarsDelete(System::TObject* Sender);
|
|
void __fastcall DoBarsInsert(System::TObject* Sender);
|
|
void __fastcall DoBarsChangeKey(System::TObject* Sender);
|
|
void __fastcall DoChordCopy(System::TObject* Sender);
|
|
void __fastcall DoChordPaste(System::TObject* Sender);
|
|
void __fastcall DoChordDelete(System::TObject* Sender);
|
|
void __fastcall DoAudioDelete(System::TObject* Sender);
|
|
void __fastcall DoAudioCopy(System::TObject* Sender);
|
|
void __fastcall DoAudioCut(System::TObject* Sender);
|
|
void __fastcall DoAudioPaste(System::TObject* Sender);
|
|
void __fastcall DoAudioLoad(System::TObject* Sender);
|
|
void __fastcall DoTrackAdd(System::TObject* Sender);
|
|
void __fastcall DoTrackDel(System::TObject* Sender);
|
|
void __fastcall DoTrackShow(System::TObject* Sender);
|
|
void __fastcall DoTrackHide(System::TObject* Sender);
|
|
void __fastcall DoTrackSave(System::TObject* Sender);
|
|
void __fastcall DoTrackMute(System::TObject* Sender);
|
|
void __fastcall DoTrackSolo(System::TObject* Sender);
|
|
void __fastcall DoInsertTexture(TObject* Sender);
|
|
void __fastcall DoDeleteTexture(TObject* Sender);
|
|
void __fastcall DoSwitchTexture(TObject* Sender);
|
|
void __fastcall DoSwitchFontProg(TObject* Sender);
|
|
void __fastcall DoTrackSwitchTexture(TObject* Sender);
|
|
void __fastcall DoTrackSwitchFontProg(TObject* Sender);
|
|
|
|
void __fastcall CreateEditMenu(TMenuPanel *Menu, bool bEnabled);
|
|
void __fastcall CreateTrackMenu(TMenuPanel *Menu, bool bEnabled);
|
|
|
|
__fastcall virtual TContentPanel(System::Classes::TComponent* AOwner);
|
|
__fastcall ~TContentPanel();
|
|
};
|
|
|
|
#endif
|