winamp/Src/external_dependencies/openmpt-trunk/mptrack/EffectVis.h
2024-09-24 14:54:57 +02:00

146 lines
3.5 KiB
C++

/*
* EffectVis.h
* -----------
* Purpose: Implementation of parameter visualisation dialog.
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "openmpt/all/BuildSettings.hpp"
#include "EffectInfo.h"
OPENMPT_NAMESPACE_BEGIN
class CViewPattern;
class CModDoc;
class CSoundFile;
#define FXVSTATUS_LDRAGGING 0x01
#define FXVSTATUS_RDRAGGING 0x02
// EffectVis dialog
class CEffectVis : public CDialog
{
DECLARE_DYNAMIC(CEffectVis)
public:
enum EditAction
{
kAction_OverwriteFX,
kAction_OverwriteFXWithNote,
kAction_FillFX,
kAction_OverwritePC,
kAction_FillPC,
kAction_Preserve
};
CEffectVis(CViewPattern *pViewPattern, ROWINDEX startRow, ROWINDEX endRow, CHANNELINDEX nchn, CModDoc &modDoc, PATTERNINDEX pat);
void UpdateSelection(ROWINDEX startRow, ROWINDEX endRow, CHANNELINDEX nchn, PATTERNINDEX pat);
void Update();
void OpenEditor(CWnd *parent);
void SetPlayCursor(PATTERNINDEX nPat, ROWINDEX nRow);
void DoClose();
afx_msg void OnSize(UINT nType, int cx, int cy);
protected:
void DoDataExchange(CDataExchange* pDX) override; // DDX/DDV support
void PostNcDestroy() override;
EffectInfo effectInfo;
CBitmap m_bGrid, m_bNodes, m_bPlayPos;
HBITMAP m_pbOldGrid = nullptr, m_pbOldNodes = nullptr, m_pbOldPlayPos = nullptr;
CDC m_dcGrid, m_dcNodes, m_dcPlayPos;
void DrawNodes();
void DrawGrid();
void ShowVis(CDC *pDC);
void ShowVisImage(CDC *pDC);
RECT invalidated;
ROWINDEX m_nLastDrawnRow = ROWINDEX_INVALID; // for interpolation
int m_nLastDrawnY = -1; // for interpolation
int m_nRowToErase = -1;
int m_nParamToErase = -1;
int m_nodeSizeHalf; // Half width of a node;
int m_marginBottom;
int m_innerBorder;
ROWINDEX m_nOldPlayPos = ROWINDEX_INVALID;
ModCommand m_templatePCNote;
protected:
ROWINDEX m_startRow;
ROWINDEX m_endRow;
ROWINDEX m_nRows;
CHANNELINDEX m_nChan;
PATTERNINDEX m_nPattern;
int m_nFillEffect;
static EditAction m_nAction;
int m_nDragItem = -1;
UINT m_nBtnMouseOver;
DWORD m_dwStatus = 0;
float m_pixelsPerRow = 1, m_pixelsPerFXParam = 1, m_pixelsPerPCParam = 1;
bool m_forceRedraw = true;
void InvalidateRow(int row);
int RowToScreenX(ROWINDEX row) const;
int RowToScreenY(ROWINDEX row) const;
int PCParamToScreenY(uint16 param) const;
int FXParamToScreenY(uint16 param) const;
uint16 GetParam(ROWINDEX row) const;
EffectCommand GetCommand(ROWINDEX row) const;
void SetParamFromY(ROWINDEX row, int y);
void SetCommand(ROWINDEX row, EffectCommand cmd);
ModCommand::PARAM ScreenYToFXParam(int y) const;
uint16 ScreenYToPCParam(int y) const;
ROWINDEX ScreenXToRow(int x) const;
bool IsPcNote(ROWINDEX row) const;
void SetPcNote(ROWINDEX row);
CModDoc &m_ModDoc;
CSoundFile &m_SndFile;
CRect m_rcDraw;
CRect m_rcFullWin;
CComboBox m_cmbEffectList, m_cmbActionList;
CEdit m_edVisStatus;
void OnOK() override;
void OnCancel() override;
afx_msg void OnClose();
CViewPattern *m_pViewPattern;
DECLARE_MESSAGE_MAP()
BOOL OnInitDialog() override;
afx_msg void OnPaint();
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnEffectChanged();
afx_msg void OnActionChanged();
afx_msg BOOL OnEraseBkgnd(CDC *) { return TRUE; }
void MakeChange(ROWINDEX currentRow, int newY);
};
OPENMPT_NAMESPACE_END