DragonNest/Client/EtEffect2Tool/SequenceView.h
2024-12-19 09:48:26 +08:00

196 lines
5.6 KiB
C++

#pragma once
// CSequenceView view
class CSequenceView : public CScrollView
{
DECLARE_DYNCREATE(CSequenceView)
public:
class CSequenceSignalBase {
public:
CSequenceSignalBase();
virtual ~CSequenceSignalBase();
public:
bool bModifyLength;
bool bFreeze;
bool bDestroy;
COLORREF Color;
COLORREF InitialColor;
int nStartFrame;
int nEndFrame;
int nYOrder;
CString szString;
CString szDesc;
};
protected:
CSequenceView(); // protected constructor used by dynamic creation
virtual ~CSequenceView();
public:
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
bool m_bActivate;
CBitmap *m_pBitmap;
CDC *m_pDC;
CSliderCtrl *m_pSlider;
CRect m_rcSliderRect;
int m_nScrollHeight;
CPoint m_GridSize;
int m_nGridHeightCount;
DWORD m_dwAdditionalGridHeightCount;
bool m_bUpdateAdditionalGridHeightCount;
bool m_bEnable;
CPen *m_Pens[2][4];
bool m_bSelectEmpty;
CPoint m_SelectEmptyMousePos;
#ifdef _SELECT_MULTIPLE_SIGNAL
CPoint m_DragEndPoint;
std::vector<DWORD> m_CurSelectedItems;
#else
int m_nFocusSignalIndex;
#endif
std::vector<CSequenceSignalBase *> m_pVecSignalList;
// Mouse Event Variable
bool m_bButton[2];
CPoint m_PrevMousePosition;
char m_cMouseEventFlag;
char *m_pCursor;
int m_nCurSingalMaxRange;
static int s_nMargin;
public:
protected:
void CreateDC();
void DeleteDC();
void DrawSequence();
void DrawSignals();
void DrawSignal(int nIndex);
void CalcSignalRect( int nIndex, CRect &rcRect );
char CheckSignalRect( int nIndex, const CPoint &point );
void MousePosToGridPos( CPoint &MousePos, CPoint &ResultPos );
bool IsMoveSignal(int nStartFrame, int nEndFrame, int nYOrder, bool bCheckFocus = true);
bool ModifySignalStartFrame( CPoint p, int nCurSelectedSignalIndex );
bool ModifySignalEndFrame( CPoint p, int nCurSelectedSignalIndex );
bool ModifySignalMove( CPoint p, int nCurSelectedSignalIndex );
#ifdef _SELECT_MULTIPLE_SIGNAL
void OnDragEnd(const CPoint& startPoint, const CPoint& endPoint);
void OnDragging(const CRect& dragArea);
BOOL IsSignalInDragginArea(DWORD dwIndex, const CRect& dragArea);
BOOL IsSelectedSignal_Valid(DWORD dwIndex);
BOOL IsSelectedSignal(DWORD dwIndex);
BOOL IsSelectedSignal(CPoint& pointInsideItem);
BOOL ExtendGridHeightCount(int nYOrder);
void PushBackSelectedSignalIndex(DWORD dwIndex);
void RemoveSelectedSignal(DWORD dwIndex);
void ClearSelectedSignals();
BOOL IsTabKey();
#endif
public:
std::vector<CSequenceSignalBase *> &GetSignalList() { return m_pVecSignalList; }
void SetEnable( bool bEnable );
CSliderCtrl *GetSlider() { return m_pSlider; }
int GetSliderPos() { return m_pSlider->GetPos(); }
void SetSliderPos(int nPos) { m_pSlider->SetPos(nPos); Invalidate(); }
void SetSliderRange(int nMin, int nMax) { m_pSlider->SetRange(nMin, nMax); }
CSequenceSignalBase *AddSignal( int nStart, int nEnd, int nYOrder, char *szDescription, char *szStr );
bool CanAddSignal( int nStartFrame, int nEndFrame, int nYOrder );
bool CanAddSignal( int nX, int nY );
bool CalcSignalPos( int nX, int nY, int &nPos, int &nYOrder );
void RemoveSignal( int nIndex );
void Reset();
void EnableUpdateAdditionalGridHeightCount( bool bEnable ) { m_bUpdateAdditionalGridHeightCount = bEnable; }
virtual bool IsValidPropertyPaneState() const;
#ifdef _SELECT_MULTIPLE_SIGNAL
BOOL IsSignalInArea(int nStart, int nEnd, int nStartYOrder, int nEndYOrder) const;
BOOL IsSignalInArea(const CRect& area) const;
int IsSignalEndOverRangeMax(const int& nGridEnd);
int GetLastSignalYOrder(const CRect& area) const;
#endif
BOOL IsSelectEmpty() { return m_bSelectEmpty; }
CPoint GetSelectEmptyMousePos() { return m_SelectEmptyMousePos; }
#ifdef _SELECT_MULTIPLE_SIGNAL
bool IsSelectedSignal() { return (m_CurSelectedItems.empty() == false); }
#else
bool IsSelectedSignal() { return (m_nFocusSignalIndex != -1); }
#endif
void RefreshSlider();
void RefreshScroll();
void Refresh()
{
RefreshScroll();
RefreshSlider();
Invalidate();
}
void SetFrame( CString str, int nStart, int nEnd );
protected:
// Sequence Event
virtual void OnSelectSignal( CSequenceSignalBase *pSignal ) {}
virtual bool OnRemoveSignal( CSequenceSignalBase *pSignal ) { return true; }
virtual void OnModifySignal( CSequenceSignalBase *pSignal );
virtual bool InsertSignal( CSequenceSignalBase *pSignal ) { return true; }
virtual CSequenceSignalBase *CreateSignal() { CSequenceSignalBase *pSignal = new CSequenceSignalBase(); return pSignal; }
#ifdef _SELECT_MULTIPLE_SIGNAL
virtual void OnSelectSignalArray( std::vector<CSequenceSignalBase *>& pSignals ) {}
virtual void OnClearSelectedSignals() {}
#endif
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
DECLARE_MESSAGE_MAP()
};