LMMS
Loading...
Searching...
No Matches
AutomationEditor.h
Go to the documentation of this file.
1/*
2 * AutomationEditor.h - declaration of class AutomationEditor which is a window
3 * where you can edit dynamic values in an easy way
4 *
5 * Copyright (c) 2006-2008 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
6 *
7 * This file is part of LMMS - https://lmms.io
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program (see COPYING); if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301 USA.
23 *
24 */
25
26#ifndef LMMS_GUI_AUTOMATION_EDITOR_H
27#define LMMS_GUI_AUTOMATION_EDITOR_H
28
29#include <QWidget>
30#include <array>
31
32#include "AutomationClip.h"
33#include "ComboBoxModel.h"
34#include "Editor.h"
35#include "JournallingObject.h"
36#include "SampleClip.h"
37#include "TimePos.h"
38#include "LmmsTypes.h"
39#include "SampleThumbnail.h"
40
41class QPushButton;
42class QScrollBar;
43
44namespace lmms
45{
46
47class MidiClip;
48
49namespace gui
50{
51
52class ComboBox;
53class Knob;
54class TimeLineWidget;
55
56
57
58class AutomationEditor : public QWidget, public JournallingObject
59{
60 Q_OBJECT
61 Q_PROPERTY(QColor barLineColor MEMBER m_barLineColor)
62 Q_PROPERTY(QColor beatLineColor MEMBER m_beatLineColor)
63 Q_PROPERTY(QColor lineColor MEMBER m_lineColor)
64 Q_PROPERTY(QColor nodeInValueColor MEMBER m_nodeInValueColor)
65 Q_PROPERTY(QColor nodeOutValueColor MEMBER m_nodeOutValueColor)
67 Q_PROPERTY(QBrush scaleColor MEMBER m_scaleColor)
68 Q_PROPERTY(QBrush graphColor MEMBER m_graphColor)
69 Q_PROPERTY(QColor crossColor MEMBER m_crossColor)
70 Q_PROPERTY(QColor backgroundShade MEMBER m_backgroundShade)
71 Q_PROPERTY(QColor ghostNoteColor MEMBER m_ghostNoteColor)
72 Q_PROPERTY(QColor detuningNoteColor MEMBER m_detuningNoteColor)
73 Q_PROPERTY(QColor ghostSampleColor MEMBER m_ghostSampleColor)
74 Q_PROPERTY(QColor outOfBoundsShade MEMBER m_outOfBoundsShade)
75public:
76 void setCurrentClip(AutomationClip * new_clip);
77 void setGhostMidiClip(MidiClip* newMidiClip);
78 void setGhostSample(SampleClip* newSample);
79
81 {
82 return m_clip;
83 }
84
85 inline bool validClip() const
86 {
87 return m_clip != nullptr;
88 }
89
90 void saveSettings(QDomDocument & doc, QDomElement & parent) override;
91 void loadSettings(const QDomElement & parent) override;
92 QString nodeName() const override
93 {
94 return "automationeditor";
95 }
96
104
105public slots:
106 void update();
108
109
110protected:
112
113 void keyPressEvent(QKeyEvent * ke) override;
114 void leaveEvent(QEvent * e) override;
115 void mousePressEvent(QMouseEvent * mouseEvent) override;
116 void mouseDoubleClickEvent(QMouseEvent * mouseEvent) override;
117 void mouseReleaseEvent(QMouseEvent * mouseEvent) override;
118 void mouseMoveEvent(QMouseEvent * mouseEvent) override;
119 void paintEvent(QPaintEvent * pe) override;
120 void resizeEvent(QResizeEvent * re) override;
121 void wheelEvent(QWheelEvent * we) override;
122
123 float getLevel( int y );
124 int xCoordOfTick( int tick );
125 float yCoordOfLevel( float level );
126 inline void drawLevelTick(QPainter & p, int tick, float value);
127
128 timeMap::iterator getNodeAt(int x, int y, bool outValue = false, int r = 5);
135 timeMap::iterator getClosestNode(int x);
136
137 void drawLine( int x0, float y0, int x1, float y1 );
138 bool fineTuneValue(timeMap::iterator node, bool editingOutValue);
139
140protected slots:
141 void play();
142 void stop();
143
144 void horScrolled( int new_pos );
145 void verScrolled( int new_pos );
146
148 void setEditMode(int mode);
149
157 void setProgressionType(int type);
158 void setTension();
159
160 void updatePosition();
161
162 void zoomingXChanged();
163 void zoomingYChanged();
164
165 void updateYDelta();
166
168 void setQuantization();
169
171 {
172 m_ghostNotes = nullptr;
173 m_ghostSample = nullptr;
174 update();
175 }
176
177private:
178
190
191 // some constants...
192 static const int SCROLLBAR_SIZE = 12;
193 static const int TOP_MARGIN = 16;
194
195 static const int DEFAULT_Y_DELTA = 6;
196 static const int DEFAULT_STEPS_PER_BAR = 16;
197 static const int DEFAULT_PPB = 12 * DEFAULT_STEPS_PER_BAR;
198
199 static const int VALUES_WIDTH = 64;
200
201 static const int NOTE_HEIGHT = 10; // height of individual notes
202 static const int NOTE_MARGIN = 40; // total border margin for notes
203 static const int MIN_NOTE_RANGE = 20; // min number of keys for fixed size
204 static const int SAMPLE_MARGIN = 40;
205 static constexpr int MAX_SAMPLE_HEIGHT = 400; // constexpr for use in min
206
209 ~AutomationEditor() override;
210
211 QPixmap m_toolDraw = embed::getIconPixmap("edit_draw");
212 QPixmap m_toolErase = embed::getIconPixmap("edit_erase");
213 QPixmap m_toolDrawOut = embed::getIconPixmap("edit_draw_outvalue");
214 QPixmap m_toolEditTangents = embed::getIconPixmap("edit_tangent");
215 QPixmap m_toolMove = embed::getIconPixmap("edit_move");
218
222
223 static const std::array<float, 7> m_zoomXLevels;
224
226
230 float m_step;
234
236 QPointer<SampleClip> m_ghostSample = nullptr; // QPointer to set to nullptr on deletion
237 bool m_renderSample = false;
238
241
242 QScrollBar * m_leftRightScroll;
243 QScrollBar * m_topBottomScroll;
244
245 void adjustLeftRightScoll(int value);
246
248
250
252
255
256 int m_ppb;
259
260 // Time position (key) of automation node whose outValue is being dragged
262
263 // The tick from the node whose tangent is being dragged
265 // Whether the tangent being dragged is the InTangent or OutTangent
267
269
271 bool m_mouseDownRight; //true if right click is being held down
272
275
276 void drawCross(QPainter & p );
277 void drawAutomationPoint( QPainter & p, timeMap::iterator it );
278 void drawAutomationTangents(QPainter& p, timeMap::iterator it);
279 bool inPatternEditor();
280
295
297
299
300
301signals:
303} ;
304
305
306
307
309{
310 Q_OBJECT
311
312 static const int INITIAL_WIDTH = 860;
313 static const int INITIAL_HEIGHT = 480;
314public:
316 ~AutomationEditorWindow() override = default;
317
318 void setCurrentClip(AutomationClip* clip);
319 void setGhostMidiClip(MidiClip* clip) { m_editor->setGhostMidiClip(clip); };
320 void setGhostSample(SampleClip* newSample) { m_editor->setGhostSample(newSample); };
321
323
324 void dropEvent( QDropEvent * _de ) override;
325 void dragEnterEvent( QDragEnterEvent * _dee ) override;
326
327 void open(AutomationClip* clip);
328
330
331 QSize sizeHint() const override;
332
333public slots:
334 void clearCurrentClip();
335
336signals:
338
339protected:
340 void focusInEvent(QFocusEvent * event) override;
341
342protected slots:
343 void play() override;
344 void stop() override;
345
346private slots:
347 void updateWindowTitle();
348 void setProgressionType(int progType);
355 void updateEditTanButton();
356
357private:
358 QAction* m_drawAction;
362
366
369
371
375
376 QPushButton* m_resetGhostNotes;
377};
378
379} // namespace gui
380
381} // namespace lmms
382
383#endif // LMMS_GUI_AUTOMATION_EDITOR_H
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition AutomationClip.h:52
QMap< int, AutomationNode > timeMap
Definition AutomationClip.h:62
ProgressionType
Definition AutomationClip.h:56
Definition ComboBoxModel.h:39
Definition AutomatableModel.h:463
JournallingObject()
Definition JournallingObject.cpp:36
Definition MidiClip.h:46
Definition SampleClip.h:46
Definition SampleThumbnail.h:55
Definition TimePos.h:68
Definition AutomationEditor.h:59
int m_draggedTangentTick
Definition AutomationEditor.h:264
int xCoordOfTick(int tick)
Definition AutomationEditor.cpp:1425
bool m_mouseDownRight
Definition AutomationEditor.h:271
void setProgressionType(AutomationClip::ProgressionType type)
Definition AutomationEditor.cpp:1752
void updateYDelta()
Definition AutomationEditor.cpp:1830
void zoomingXChanged()
Definition AutomationEditor.cpp:1811
void updatePosition()
Definition AutomationEditor.cpp:1783
QColor m_detuningNoteColor
Definition AutomationEditor.h:292
QColor m_outOfBoundsShade
Definition AutomationEditor.h:294
float yCoordOfLevel(float level)
Definition AutomationEditor.cpp:1434
QColor m_barLineColor
Definition AutomationEditor.h:281
void drawLine(int x0, float y0, int x1, float y1)
Definition AutomationEditor.cpp:303
void resetGhostNotes()
Definition AutomationEditor.h:170
bool m_renderSample
Definition AutomationEditor.h:237
void paintEvent(QPaintEvent *pe) override
Definition AutomationEditor.cpp:1025
QBrush m_scaleColor
Definition AutomationEditor.h:288
QColor m_ghostNoteColor
Definition AutomationEditor.h:291
MidiClip * m_ghostNotes
Definition AutomationEditor.h:235
QColor nodeInValueColor
Definition AutomationEditor.h:64
void keyPressEvent(QKeyEvent *ke) override
Definition AutomationEditor.cpp:252
void updateAfterClipChange()
Definition AutomationEditor.cpp:207
bool fineTuneValue(timeMap::iterator node, bool editingOutValue)
Definition AutomationEditor.cpp:337
QBrush scaleColor
Definition AutomationEditor.h:67
QColor m_nodeTangentLineColor
Definition AutomationEditor.h:287
Action m_action
Definition AutomationEditor.h:249
QColor m_beatLineColor
Definition AutomationEditor.h:282
static const int DEFAULT_Y_DELTA
Definition AutomationEditor.h:195
QColor barLineColor
Definition AutomationEditor.h:61
static const int SAMPLE_MARGIN
Definition AutomationEditor.h:204
const AutomationClip * currentClip() const
Definition AutomationEditor.h:80
static const int NOTE_MARGIN
Definition AutomationEditor.h:202
void wheelEvent(QWheelEvent *we) override
Definition AutomationEditor.cpp:1546
QBrush graphColor
Definition AutomationEditor.h:68
static const int MIN_NOTE_RANGE
Definition AutomationEditor.h:203
QColor backgroundShade
Definition AutomationEditor.h:70
int m_ppb
Definition AutomationEditor.h:256
void setQuantization()
Updates the clip's quantization using the current user selected value.
Definition AutomationEditor.cpp:1849
QPixmap m_toolDraw
Definition AutomationEditor.h:211
FloatModel * m_tensionModel
Definition AutomationEditor.h:225
QColor ghostSampleColor
Definition AutomationEditor.h:73
static const int VALUES_WIDTH
Definition AutomationEditor.h:199
QColor m_nodeInValueColor
Definition AutomationEditor.h:285
float m_drawLastLevel
Definition AutomationEditor.h:253
void loadSettings(const QDomElement &parent) override
Definition AutomationEditor.cpp:199
void stop()
Definition AutomationEditor.cpp:1691
QPixmap m_toolXFlip
Definition AutomationEditor.h:217
QPixmap m_toolYFlip
Definition AutomationEditor.h:216
QColor m_crossColor
Definition AutomationEditor.h:289
static constexpr int MAX_SAMPLE_HEIGHT
Definition AutomationEditor.h:205
QPointer< SampleClip > m_ghostSample
Definition AutomationEditor.h:236
QPixmap m_toolMove
Definition AutomationEditor.h:215
void drawAutomationPoint(QPainter &p, timeMap::iterator it)
Definition AutomationEditor.cpp:951
void mouseDoubleClickEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:655
friend class AutomationEditorWindow
Definition AutomationEditor.h:298
QPixmap m_toolErase
Definition AutomationEditor.h:212
static const int DEFAULT_STEPS_PER_BAR
Definition AutomationEditor.h:196
void mouseMoveEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:716
void adjustLeftRightScoll(int value)
Definition AutomationEditor.cpp:1538
void centerTopBottomScroll()
Definition AutomationEditor.cpp:1480
float m_step
Definition AutomationEditor.h:230
void horScrolled(int new_pos)
Definition AutomationEditor.cpp:1711
void setCurrentClip(AutomationClip *new_clip)
Definition AutomationEditor.cpp:170
QColor nodeTangentLineColor
Definition AutomationEditor.h:66
QColor ghostNoteColor
Definition AutomationEditor.h:71
TimeLineWidget * m_timeLine
Definition AutomationEditor.h:273
ComboBoxModel m_quantizeModel
Definition AutomationEditor.h:221
QPixmap m_toolEditTangents
Definition AutomationEditor.h:214
QColor lineColor
Definition AutomationEditor.h:63
QColor m_ghostSampleColor
Definition AutomationEditor.h:293
static const int NOTE_HEIGHT
Definition AutomationEditor.h:201
tick_t m_drawLastTick
Definition AutomationEditor.h:254
QColor nodeOutValueColor
Definition AutomationEditor.h:65
void mousePressEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:384
bool m_mouseDownLeft
Definition AutomationEditor.h:270
int m_moveXOffset
Definition AutomationEditor.h:251
QScrollBar * m_leftRightScroll
Definition AutomationEditor.h:242
void zoomingYChanged()
Definition AutomationEditor.cpp:1824
float m_minLevel
Definition AutomationEditor.h:228
QScrollBar * m_topBottomScroll
Definition AutomationEditor.h:243
float m_scrollLevel
Definition AutomationEditor.h:231
AutomationClip * m_clip
Definition AutomationEditor.h:227
float m_maxLevel
Definition AutomationEditor.h:229
void drawCross(QPainter &p)
Definition AutomationEditor.cpp:916
timeMap::iterator getClosestNode(int x)
Given a mouse X coordinate, returns a timeMap::iterator that points to the closest node.
Definition AutomationEditor.cpp:1959
QColor m_backgroundShade
Definition AutomationEditor.h:290
QColor m_lineColor
Definition AutomationEditor.h:283
AutomationEditor(const AutomationEditor &)
bool m_scrollBack
Definition AutomationEditor.h:274
float m_bottomLevel
Definition AutomationEditor.h:232
void leaveEvent(QEvent *e) override
Definition AutomationEditor.cpp:292
QColor crossColor
Definition AutomationEditor.h:69
void setEditMode(AutomationEditor::EditMode mode)
Definition AutomationEditor.cpp:1731
void setTension()
Definition AutomationEditor.cpp:1771
float m_topLevel
Definition AutomationEditor.h:233
void resizeEvent(QResizeEvent *re) override
Definition AutomationEditor.cpp:1504
Action
Definition AutomationEditor.h:180
@ MoveValue
Definition AutomationEditor.h:182
@ ResetOutValues
Definition AutomationEditor.h:185
@ EraseValues
Definition AutomationEditor.h:183
@ MoveTangent
Definition AutomationEditor.h:187
@ ResetTangents
Definition AutomationEditor.h:188
@ MoveOutValue
Definition AutomationEditor.h:184
@ DrawLine
Definition AutomationEditor.h:186
QString nodeName() const override
Definition AutomationEditor.h:92
ComboBoxModel m_zoomingXModel
Definition AutomationEditor.h:219
float m_y_delta
Definition AutomationEditor.h:257
QPixmap m_toolDrawOut
Definition AutomationEditor.h:213
~AutomationEditor() override
Definition AutomationEditor.cpp:157
QColor outOfBoundsShade
Definition AutomationEditor.h:74
int m_draggedOutValueKey
Definition AutomationEditor.h:261
bool m_draggedOutTangent
Definition AutomationEditor.h:266
AutomationEditor()
Definition AutomationEditor.cpp:68
void setGhostSample(SampleClip *newSample)
Definition AutomationEditor.cpp:1017
QColor beatLineColor
Definition AutomationEditor.h:62
timeMap::iterator getNodeAt(int x, int y, bool outValue=false, int r=5)
Given a mouse coordinate, returns a timeMap::iterator that points to the first node inside a square o...
Definition AutomationEditor.cpp:1918
float getLevel(int y)
Definition AutomationEditor.cpp:1623
static const int DEFAULT_PPB
Definition AutomationEditor.h:197
void setGhostMidiClip(MidiClip *newMidiClip)
Definition AutomationEditor.cpp:1010
static const std::array< float, 7 > m_zoomXLevels
Definition AutomationEditor.h:223
void verScrolled(int new_pos)
Definition AutomationEditor.cpp:1721
AutomationClip::timeMap timeMap
Definition AutomationEditor.h:111
EditMode m_editMode
Definition AutomationEditor.h:268
QColor detuningNoteColor
Definition AutomationEditor.h:72
QColor m_nodeOutValueColor
Definition AutomationEditor.h:286
bool inPatternEditor()
Definition AutomationEditor.cpp:1640
void drawAutomationTangents(QPainter &p, timeMap::iterator it)
Definition AutomationEditor.cpp:977
void update()
Definition AutomationEditor.cpp:238
void drawLevelTick(QPainter &p, int tick, float value)
Definition AutomationEditor.cpp:1450
void saveSettings(QDomDocument &doc, QDomElement &parent) override
Definition AutomationEditor.cpp:191
void play()
Definition AutomationEditor.cpp:1648
SampleThumbnail m_sampleThumbnail
Definition AutomationEditor.h:296
bool m_y_auto
Definition AutomationEditor.h:258
TimePos m_currentPosition
Definition AutomationEditor.h:247
bool validClip() const
Definition AutomationEditor.h:85
void updateTopBottomLevels()
Definition AutomationEditor.cpp:1859
QBrush m_graphColor
Definition AutomationEditor.h:284
EditMode
Definition AutomationEditor.h:98
@ Draw
Definition AutomationEditor.h:99
@ EditTangents
Definition AutomationEditor.h:102
@ DrawOutValues
Definition AutomationEditor.h:101
@ Erase
Definition AutomationEditor.h:100
static const int TOP_MARGIN
Definition AutomationEditor.h:193
static const int SCROLLBAR_SIZE
Definition AutomationEditor.h:192
ComboBoxModel m_zoomingYModel
Definition AutomationEditor.h:220
void mouseReleaseEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:682
QAction * m_flipXAction
Definition AutomationEditor.h:368
void dropEvent(QDropEvent *_de) override
Definition AutomationEditor.cpp:2225
QAction * m_drawOutAction
Definition AutomationEditor.h:360
QAction * m_linearAction
Definition AutomationEditor.h:364
AutomationEditorWindow()
Definition AutomationEditor.cpp:2005
void stop() override
Definition AutomationEditor.cpp:2288
void setGhostMidiClip(MidiClip *clip)
Definition AutomationEditor.h:319
void updateWindowTitle()
Definition AutomationEditor.cpp:2293
ComboBox * m_zoomingYComboBox
Definition AutomationEditor.h:373
QAction * m_eraseAction
Definition AutomationEditor.h:359
QAction * m_editTanAction
Definition AutomationEditor.h:361
QAction * m_flipYAction
Definition AutomationEditor.h:367
QAction * m_cubicHermiteAction
Definition AutomationEditor.h:365
void open(AutomationClip *clip)
Definition AutomationEditor.cpp:2258
QAction * m_discreteAction
Definition AutomationEditor.h:363
void play() override
Definition AutomationEditor.cpp:2282
QSize sizeHint() const override
Definition AutomationEditor.cpp:2266
ComboBox * m_quantizeComboBox
Definition AutomationEditor.h:374
AutomationEditor * m_editor
Definition AutomationEditor.h:329
Knob * m_tensionKnob
Definition AutomationEditor.h:370
void setCurrentClip(AutomationClip *clip)
Definition AutomationEditor.cpp:2166
void dragEnterEvent(QDragEnterEvent *_dee) override
Definition AutomationEditor.cpp:2250
void setProgressionType(int progType)
Definition AutomationEditor.cpp:2304
QAction * m_drawAction
Definition AutomationEditor.h:358
~AutomationEditorWindow() override=default
void focusInEvent(QFocusEvent *event) override
Definition AutomationEditor.cpp:2277
QPushButton * m_resetGhostNotes
Definition AutomationEditor.h:376
ComboBox * m_zoomingXComboBox
Definition AutomationEditor.h:372
static const int INITIAL_WIDTH
Definition AutomationEditor.h:312
void updateEditTanButton()
The Edit Tangent edit mode should only be available for Cubic Hermite progressions,...
Definition AutomationEditor.cpp:2310
void setGhostSample(SampleClip *newSample)
Definition AutomationEditor.h:320
static const int INITIAL_HEIGHT
Definition AutomationEditor.h:313
const AutomationClip * currentClip()
Definition AutomationEditor.cpp:2220
void clearCurrentClip()
Definition AutomationEditor.cpp:2271
Definition ComboBox.h:38
Editor(bool record=false, bool record_step=false)
Constructor.
Definition Editor.cpp:91
Definition Knob.h:47
Definition TimeLineWidget.h:54
* e
Definition inflate.c:1404
int y
Definition inflate.c:1588
unsigned x[BMAX+1]
Definition inflate.c:1586
static PuglViewHint int value
Definition pugl.h:1708
static uintptr_t parent
Definition pugl.h:1644
auto getIconPixmap(std::string_view name, int width, int height, const char *const *xpm) -> QPixmap
Definition embed.cpp:107
Definition AudioPortAudio.cpp:209
Definition AudioAlsa.cpp:35
std::int32_t tick_t
Definition LmmsTypes.h:35
png_structrp int mode
Definition png.h:1139
uch * p
Definition crypt.c:594
int r
Definition crypt.c:458
static ZCONST char Far None[]
Definition unzip.c:380
#define const
Definition zconf.h:137