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

223 lines
5.8 KiB
C++

/*
* PatternEditorDialogs.h
* ----------------------
* Purpose: Code for various dialogs that are used in the pattern editor.
* 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"
#include "dlg_misc.h" // for keyboard control
#include "EffectInfo.h"
#include "PatternCursor.h"
#include "TrackerSettings.h"
#include "ResizableDialog.h"
#include "ColorPickerButton.h"
OPENMPT_NAMESPACE_BEGIN
class CModDoc;
struct SplitKeyboardSettings;
class CPatternPropertiesDlg: public CDialog
{
protected:
CModDoc &modDoc;
TempoSwing m_tempoSwing;
PATTERNINDEX m_nPattern;
public:
CPatternPropertiesDlg(CModDoc &modParent, PATTERNINDEX nPat, CWnd *parent=NULL)
: CDialog(IDD_PATTERN_PROPERTIES, parent)
, modDoc(modParent)
, m_nPattern(nPat)
{ }
protected:
BOOL OnInitDialog() override;
void OnOK() override;
afx_msg void OnHalfRowNumber();
afx_msg void OnDoubleRowNumber();
afx_msg void OnOverrideSignature();
afx_msg void OnTempoSwing();
DECLARE_MESSAGE_MAP()
};
//////////////////////////////////////////////////////////////////////////
// Command Editing
class CEditCommand: public CDialog
{
protected:
CComboBox cbnNote, cbnInstr, cbnVolCmd, cbnCommand, cbnPlugParam;
CSliderCtrl sldVolParam, sldParam;
CSoundFile &sndFile;
const CModSpecifications *oldSpecs = nullptr;
ModCommand *m = nullptr;
EffectInfo effectInfo;
PATTERNINDEX editPattern = PATTERNINDEX_INVALID;
CHANNELINDEX editChannel = CHANNELINDEX_INVALID;
ROWINDEX editRow = ROWINDEX_INVALID;
UINT xParam, xMultiplier;
bool modified = false;
public:
CEditCommand(CSoundFile &sndFile);
public:
bool ShowEditWindow(PATTERNINDEX pat, const PatternCursor &cursor, CWnd *parent);
protected:
void InitAll() { InitNote(); InitVolume(); InitEffect(); InitPlugParam(); }
void InitNote();
void InitVolume();
void InitEffect();
void InitPlugParam();
void UpdateVolCmdRange();
void UpdateVolCmdValue();
void UpdateEffectRange(bool set);
void UpdateEffectValue(bool set);
void PrepareUndo(const char *description);
//{{AFX_VIRTUAL(CEditCommand)
void DoDataExchange(CDataExchange *pDX) override;
void OnOK() override { ShowWindow(SW_HIDE); }
void OnCancel() override { ShowWindow(SW_HIDE); }
BOOL PreTranslateMessage(MSG *pMsg) override;
afx_msg void OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized);
afx_msg void OnClose() { ShowWindow(SW_HIDE); }
afx_msg void OnNoteChanged();
afx_msg void OnVolCmdChanged();
afx_msg void OnCommandChanged();
afx_msg void OnPlugParamChanged();
afx_msg void OnHScroll(UINT, UINT, CScrollBar *);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////
// Chord Editor
class CChordEditor : public ResizableDialog
{
protected:
CKeyboardControl m_Keyboard;
CComboBox m_CbnShortcut, m_CbnBaseNote, m_CbnNote[MPTChord::notesPerChord - 1];
MPTChords m_chords;
MPTChord::NoteType m_mouseDownKey = MPTChord::noNote, m_dragKey = MPTChord::noNote;
static constexpr MPTChord::NoteType CHORD_MIN = -24;
static constexpr MPTChord::NoteType CHORD_MAX = 24;
public:
CChordEditor(CWnd *parent = nullptr);
protected:
MPTChord &GetChord();
void DoDataExchange(CDataExchange* pDX) override;
BOOL OnInitDialog() override;
void OnOK() override;
void UpdateKeyboard();
afx_msg LRESULT OnKeyboardNotify(WPARAM, LPARAM);
afx_msg void OnChordChanged();
afx_msg void OnBaseNoteChanged();
afx_msg void OnNote1Changed() { OnNoteChanged(0); }
afx_msg void OnNote2Changed() { OnNoteChanged(1); }
afx_msg void OnNote3Changed() { OnNoteChanged(2); }
void OnNoteChanged(int noteIndex);
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////
// Keyboard Split Settings (pattern editor)
class CSplitKeyboardSettings : public CDialog
{
protected:
CComboBox m_CbnSplitInstrument, m_CbnSplitNote, m_CbnOctaveModifier, m_CbnSplitVolume;
CSoundFile &sndFile;
public:
SplitKeyboardSettings &m_Settings;
CSplitKeyboardSettings(CWnd *parent, CSoundFile &sf, SplitKeyboardSettings &settings) : CDialog(IDD_KEYBOARD_SPLIT, parent), sndFile(sf), m_Settings(settings) { }
protected:
void DoDataExchange(CDataExchange* pDX) override;
BOOL OnInitDialog() override;
void OnOK() override;
void OnCancel() override;
afx_msg void OnOctaveModifierChanged();
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////
// Show channel properties from pattern editor
class QuickChannelProperties : public CDialog
{
protected:
CModDoc *m_document = nullptr;
CHANNELINDEX m_channel = 0;
bool m_visible = false;
bool m_settingsChanged = false;
bool m_settingColor = false;
ColorPickerButton m_colorBtn, m_colorBtnPrev, m_colorBtnNext;
CSliderCtrl m_volSlider, m_panSlider;
CSpinButtonCtrl m_volSpin, m_panSpin;
CEdit m_nameEdit;
public:
QuickChannelProperties() = default;
~QuickChannelProperties();
void Show(CModDoc *modDoc, CHANNELINDEX chn, CPoint position);
void UpdateDisplay();
CHANNELINDEX GetChannel() const { return m_channel; }
protected:
void DoDataExchange(CDataExchange *pDX) override;
void PrepareUndo();
void PickColorFromChannel(CHANNELINDEX channel);
afx_msg void OnActivate(UINT nState, CWnd *, BOOL);
afx_msg void OnVolChanged();
afx_msg void OnPanChanged();
afx_msg void OnHScroll(UINT, UINT, CScrollBar *);
afx_msg void OnMuteChanged();
afx_msg void OnSurroundChanged();
afx_msg void OnNameChanged();
afx_msg void OnPrevChannel();
afx_msg void OnNextChannel();
afx_msg void OnChangeColor();
afx_msg void OnPickPrevColor();
afx_msg void OnPickNextColor();
afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM);
afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult);
BOOL PreTranslateMessage(MSG *pMsg);
DECLARE_MESSAGE_MAP();
};
OPENMPT_NAMESPACE_END