251 lines
7.8 KiB
C
251 lines
7.8 KiB
C
|
/*
|
||
|
* view_ins.h
|
||
|
* ----------
|
||
|
* Purpose: Instrument tab, lower panel.
|
||
|
* Notes : (currently none)
|
||
|
* Authors: Olivier Lapicque
|
||
|
* OpenMPT Devs
|
||
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "openmpt/all/BuildSettings.hpp"
|
||
|
|
||
|
OPENMPT_NAMESPACE_BEGIN
|
||
|
|
||
|
#define INSSTATUS_DRAGGING 0x01
|
||
|
#define INSSTATUS_NCLBTNDOWN 0x02
|
||
|
#define INSSTATUS_SPLITCURSOR 0x04
|
||
|
|
||
|
// Non-Client toolbar buttons
|
||
|
#define ENV_LEFTBAR_BUTTONS 22
|
||
|
|
||
|
enum DragPoints
|
||
|
{
|
||
|
ENV_DRAGLOOPSTART = (MAX_ENVPOINTS + 1),
|
||
|
ENV_DRAGLOOPEND = (MAX_ENVPOINTS + 2),
|
||
|
ENV_DRAGSUSTAINSTART = (MAX_ENVPOINTS + 3),
|
||
|
ENV_DRAGSUSTAINEND = (MAX_ENVPOINTS + 4),
|
||
|
ENV_DRAGPREVIOUS = (MAX_ENVPOINTS + 5),
|
||
|
ENV_DRAGNEXT = (MAX_ENVPOINTS + 6),
|
||
|
};
|
||
|
|
||
|
class CViewInstrument: public CModScrollView
|
||
|
{
|
||
|
protected:
|
||
|
CImageList m_bmpEnvBar;
|
||
|
CPoint m_ptMenu;
|
||
|
CRect m_rcClient, m_rcOldClient;
|
||
|
|
||
|
CBitmap m_bmpGrid;
|
||
|
CBitmap m_bmpMemMain;
|
||
|
HBITMAP m_pbmpOldGrid = nullptr;
|
||
|
HBITMAP oldBitmap = nullptr;
|
||
|
|
||
|
EnvelopeType m_nEnv = ENV_VOLUME;
|
||
|
uint32 m_nDragItem = 1, m_nBtnMouseOver = 0xFFFF;
|
||
|
DWORD m_dwStatus = 0;
|
||
|
DWORD m_NcButtonState[ENV_LEFTBAR_BUTTONS];
|
||
|
|
||
|
INSTRUMENTINDEX m_nInstrument = 1;
|
||
|
|
||
|
CDC m_dcMemMain;
|
||
|
CDC m_dcGrid;
|
||
|
int m_GridScrollPos = -1;
|
||
|
int m_GridSpeed = -1;
|
||
|
|
||
|
float m_zoom = 4;
|
||
|
int m_envPointSize = 4;
|
||
|
|
||
|
bool m_bGrid = true;
|
||
|
bool m_bGridForceRedraw = false;
|
||
|
bool m_mouseMoveModified = false;
|
||
|
|
||
|
std::bitset<128> m_baPlayingNote;
|
||
|
CModDoc::NoteToChannelMap m_noteChannel; // Note -> Preview channel assignment
|
||
|
std::array<uint32, MAX_CHANNELS> m_dwNotifyPos;
|
||
|
|
||
|
public:
|
||
|
CViewInstrument();
|
||
|
DECLARE_SERIAL(CViewInstrument)
|
||
|
|
||
|
protected:
|
||
|
void PrepareUndo(const char *description);
|
||
|
|
||
|
////////////////////////
|
||
|
// Envelope get stuff
|
||
|
|
||
|
// Flags
|
||
|
bool EnvGetFlag(const EnvelopeFlags dwFlag) const;
|
||
|
bool EnvGetLoop() const { return EnvGetFlag(ENV_LOOP); };
|
||
|
bool EnvGetSustain() const { return EnvGetFlag(ENV_SUSTAIN); };
|
||
|
bool EnvGetCarry() const { return EnvGetFlag(ENV_CARRY); };
|
||
|
|
||
|
// Misc.
|
||
|
uint32 EnvGetTick(int nPoint) const;
|
||
|
uint32 EnvGetValue(int nPoint) const;
|
||
|
uint32 EnvGetLastPoint() const;
|
||
|
uint32 EnvGetNumPoints() const;
|
||
|
|
||
|
// Get loop points
|
||
|
uint32 EnvGetLoopStart() const;
|
||
|
uint32 EnvGetLoopEnd() const;
|
||
|
uint32 EnvGetSustainStart() const;
|
||
|
uint32 EnvGetSustainEnd() const;
|
||
|
|
||
|
// Get envelope status
|
||
|
bool EnvGetVolEnv() const;
|
||
|
bool EnvGetPanEnv() const;
|
||
|
bool EnvGetPitchEnv() const;
|
||
|
bool EnvGetFilterEnv() const;
|
||
|
|
||
|
////////////////////////
|
||
|
// Envelope set stuff
|
||
|
|
||
|
// Flags
|
||
|
bool EnvSetFlag(EnvelopeFlags flag, bool enable);
|
||
|
bool EnvSetLoop(bool enable) {return EnvSetFlag(ENV_LOOP, enable);};
|
||
|
bool EnvSetSustain(bool enable) {return EnvSetFlag(ENV_SUSTAIN, enable);};
|
||
|
bool EnvSetCarry(bool enable) {return EnvSetFlag(ENV_CARRY, enable);};
|
||
|
|
||
|
// Misc.
|
||
|
bool EnvSetValue(int nPoint, int32 nTick = int32_min, int32 nValue = int32_min, bool moveTail = false);
|
||
|
bool CanMovePoint(uint32 envPoint, int step);
|
||
|
|
||
|
// Set loop points
|
||
|
bool EnvSetLoopStart(int nPoint);
|
||
|
bool EnvSetLoopEnd(int nPoint);
|
||
|
bool EnvSetSustainStart(int nPoint);
|
||
|
bool EnvSetSustainEnd(int nPoint);
|
||
|
bool EnvToggleReleaseNode(int nPoint);
|
||
|
|
||
|
// Set envelope status
|
||
|
bool EnvToggleEnv(EnvelopeType envelope, CSoundFile &sndFile, ModInstrument &ins, bool enable, EnvelopeNode::value_t defaultValue, EnvelopeFlags extraFlags = EnvelopeFlags(0));
|
||
|
bool EnvSetVolEnv(bool enable);
|
||
|
bool EnvSetPanEnv(bool enable);
|
||
|
bool EnvSetPitchEnv(bool enable);
|
||
|
bool EnvSetFilterEnv(bool enable);
|
||
|
|
||
|
// Keyboard envelope control
|
||
|
void EnvKbdSelectPoint(DragPoints point);
|
||
|
void EnvKbdMovePointLeft(int stepsize);
|
||
|
void EnvKbdMovePointRight(int stepsize);
|
||
|
void EnvKbdMovePointVertical(int stepsize);
|
||
|
void EnvKbdInsertPoint();
|
||
|
void EnvKbdRemovePoint();
|
||
|
void EnvKbdSetLoopStart();
|
||
|
void EnvKbdSetLoopEnd();
|
||
|
void EnvKbdSetSustainStart();
|
||
|
void EnvKbdSetSustainEnd();
|
||
|
void EnvKbdToggleReleaseNode();
|
||
|
|
||
|
bool IsDragItemEnvPoint() const { return m_nDragItem >= 1 && m_nDragItem <= EnvGetNumPoints(); }
|
||
|
|
||
|
////////////////////////
|
||
|
// Misc stuff
|
||
|
void UpdateScrollSize();
|
||
|
void SetModified(InstrumentHint hint, bool updateAll);
|
||
|
BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, EnvelopeType m_nEnv = ENV_VOLUME);
|
||
|
ModInstrument *GetInstrumentPtr() const;
|
||
|
InstrumentEnvelope *GetEnvelopePtr() const;
|
||
|
bool InsertAtPoint(CPoint pt);
|
||
|
uint32 EnvInsertPoint(int nTick, int nValue);
|
||
|
bool EnvRemovePoint(uint32 nPoint);
|
||
|
uint32 DragItemToEnvPoint() const;
|
||
|
int TickToScreen(int nTick) const;
|
||
|
int PointToScreen(int nPoint) const;
|
||
|
int ScreenToTick(int x) const;
|
||
|
int ScreenToPoint(int x, int y) const;
|
||
|
int ValueToScreen(int val) const { return m_rcClient.bottom - 1 - (val * (m_rcClient.bottom - 1)) / 64; }
|
||
|
int ScreenToValue(int y) const;
|
||
|
void InvalidateEnvelope() { InvalidateRect(NULL, FALSE); }
|
||
|
void DrawPositionMarks();
|
||
|
void DrawNcButton(CDC *pDC, UINT nBtn);
|
||
|
bool GetNcButtonRect(UINT button, CRect &rect) const;
|
||
|
UINT GetNcButtonAtPoint(CPoint point, CRect *outRect = nullptr) const;
|
||
|
void UpdateNcButtonState();
|
||
|
void PlayNote(ModCommand::NOTE note);
|
||
|
void DrawGrid(CDC *memDC, uint32 speed);
|
||
|
void UpdateIndicator();
|
||
|
void UpdateIndicator(int tick, int val);
|
||
|
CString EnvValueToString(int tick, int val) const;
|
||
|
|
||
|
void OnEnvZoomIn() { EnvSetZoom(m_zoom + 1); };
|
||
|
void OnEnvZoomOut() { EnvSetZoom(m_zoom - 1); };
|
||
|
void EnvSetZoom(float fNewZoom);
|
||
|
|
||
|
public:
|
||
|
//{{AFX_VIRTUAL(CViewInstrument)
|
||
|
void OnDraw(CDC *) override;
|
||
|
void OnInitialUpdate() override;
|
||
|
void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override;
|
||
|
BOOL PreTranslateMessage(MSG *pMsg) override;
|
||
|
BOOL OnDragonDrop(BOOL, const DRAGONDROP *) override;
|
||
|
LRESULT OnModViewMsg(WPARAM, LPARAM) override;
|
||
|
LRESULT OnPlayerNotify(Notification *) override;
|
||
|
HRESULT get_accName(VARIANT varChild, BSTR *pszName) override;
|
||
|
INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override;
|
||
|
//}}AFX_VIRTUAL
|
||
|
|
||
|
protected:
|
||
|
//{{AFX_MSG(CViewInstrument)
|
||
|
afx_msg BOOL OnEraseBkgnd(CDC *) { return TRUE; }
|
||
|
afx_msg void OnSetFocus(CWnd *pOldWnd);
|
||
|
afx_msg void OnSize(UINT nType, int cx, int cy);
|
||
|
afx_msg LRESULT OnDPIChanged(WPARAM = 0, LPARAM = 0);
|
||
|
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
|
||
|
afx_msg LRESULT OnNcHitTest(CPoint point);
|
||
|
afx_msg void OnNcPaint();
|
||
|
afx_msg void OnPrevInstrument();
|
||
|
afx_msg void OnNextInstrument();
|
||
|
afx_msg void OnMouseMove(UINT, CPoint);
|
||
|
afx_msg void OnLButtonDown(UINT, CPoint);
|
||
|
afx_msg void OnLButtonUp(UINT, CPoint);
|
||
|
afx_msg void OnLButtonDblClk(UINT /*nFlags*/, CPoint point) { InsertAtPoint(point); }
|
||
|
afx_msg void OnRButtonDown(UINT, CPoint);
|
||
|
afx_msg void OnMButtonDown(UINT, CPoint);
|
||
|
afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
|
||
|
afx_msg void OnNcLButtonDown(UINT, CPoint);
|
||
|
afx_msg void OnNcLButtonUp(UINT, CPoint);
|
||
|
afx_msg void OnNcLButtonDblClk(UINT, CPoint);
|
||
|
afx_msg void OnEnvLoopChanged();
|
||
|
afx_msg void OnEnvSustainChanged();
|
||
|
afx_msg void OnEnvCarryChanged();
|
||
|
afx_msg void OnEnvToggleReleasNode();
|
||
|
afx_msg void OnEnvInsertPoint();
|
||
|
afx_msg void OnEnvRemovePoint();
|
||
|
afx_msg void OnSelectVolumeEnv();
|
||
|
afx_msg void OnSelectPanningEnv();
|
||
|
afx_msg void OnSelectPitchEnv();
|
||
|
afx_msg void OnEnvVolChanged();
|
||
|
afx_msg void OnEnvPanChanged();
|
||
|
afx_msg void OnEnvPitchChanged();
|
||
|
afx_msg void OnEnvFilterChanged();
|
||
|
afx_msg void OnEnvToggleGrid();
|
||
|
afx_msg void OnEnvLoad();
|
||
|
afx_msg void OnEnvSave();
|
||
|
afx_msg void OnEditCopy();
|
||
|
afx_msg void OnEditPaste();
|
||
|
afx_msg void OnEditSampleMap();
|
||
|
afx_msg void OnEnvelopeScalePoints();
|
||
|
afx_msg void OnDropFiles(HDROP hDropInfo);
|
||
|
afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM);
|
||
|
afx_msg LRESULT OnMidiMsg(WPARAM, LPARAM);
|
||
|
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
|
||
|
afx_msg void OnXButtonUp(UINT nFlags, UINT nButton, CPoint point);
|
||
|
afx_msg void OnEditUndo();
|
||
|
afx_msg void OnEditRedo();
|
||
|
afx_msg void OnUpdateUndo(CCmdUI *pCmdUI);
|
||
|
afx_msg void OnUpdateRedo(CCmdUI *pCmdUI);
|
||
|
//}}AFX_MSG
|
||
|
DECLARE_MESSAGE_MAP()
|
||
|
|
||
|
private:
|
||
|
uint8 EnvGetReleaseNode();
|
||
|
};
|
||
|
|
||
|
|
||
|
OPENMPT_NAMESPACE_END
|