Files
AC_Pro/ContentPanelUnit.h
2026-06-13 00:05:19 +08:00

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