Skip to content

Commit

Permalink
Changes AutomationPattern to use nodes instead of raw float values (L…
Browse files Browse the repository at this point in the history
  • Loading branch information
IanCaio authored Feb 28, 2021
1 parent 0b354c7 commit 5476531
Show file tree
Hide file tree
Showing 16 changed files with 1,319 additions and 1,255 deletions.
Binary file added data/themes/classic/edit_draw_outvalue.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion data/themes/classic/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ AutomationEditor {
background-color: rgb(0, 0, 0);
color: #e0e0e0;
qproperty-backgroundShade: rgba(255, 255, 255, 15);
qproperty-vertexColor: #ff77af;
qproperty-nodeInValueColor: rgba(255, 119, 175, 150);
qproperty-nodeOutValueColor: rgba(129, 231, 181, 150);
qproperty-crossColor: rgb( 255, 51, 51 );
/* Grid colors */
qproperty-lineColor: rgba(128, 128, 128, 80);
Expand Down
Binary file added data/themes/default/edit_draw_outvalue.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion data/themes/default/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ AutomationEditor {
color: #ffffff;
background-color: #141616;
qproperty-backgroundShade: rgba(255, 255, 255, 15);
qproperty-vertexColor: #6749C2;
qproperty-nodeInValueColor: rgba(103, 73, 194, 150);
qproperty-nodeOutValueColor: rgba(125, 40, 40, 150);
qproperty-crossColor: rgba(215, 210, 254, 150);
/* Grid colors */
qproperty-lineColor: #292929;
Expand Down
76 changes: 22 additions & 54 deletions include/AutomationEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#ifndef AUTOMATION_EDITOR_H
#define AUTOMATION_EDITOR_H

#include <QtCore/QMutex>
#include <QVector>
#include <QWidget>

Expand All @@ -52,14 +51,15 @@ class TimeLineWidget;
class AutomationEditor : public QWidget, public JournallingObject
{
Q_OBJECT
Q_PROPERTY(QColor barLineColor READ barLineColor WRITE setBarLineColor)
Q_PROPERTY(QColor beatLineColor READ beatLineColor WRITE setBeatLineColor)
Q_PROPERTY(QColor lineColor READ lineColor WRITE setLineColor)
Q_PROPERTY(QColor vertexColor READ vertexColor WRITE setVertexColor)
Q_PROPERTY(QBrush scaleColor READ scaleColor WRITE setScaleColor)
Q_PROPERTY(QBrush graphColor READ graphColor WRITE setGraphColor)
Q_PROPERTY(QColor crossColor READ crossColor WRITE setCrossColor)
Q_PROPERTY(QColor backgroundShade READ backgroundShade WRITE setBackgroundShade)
Q_PROPERTY(QColor barLineColor MEMBER m_barLineColor)
Q_PROPERTY(QColor beatLineColor MEMBER m_beatLineColor)
Q_PROPERTY(QColor lineColor MEMBER m_lineColor)
Q_PROPERTY(QColor nodeInValueColor MEMBER m_nodeInValueColor)
Q_PROPERTY(QColor nodeOutValueColor MEMBER m_nodeOutValueColor)
Q_PROPERTY(QBrush scaleColor MEMBER m_scaleColor)
Q_PROPERTY(QBrush graphColor MEMBER m_graphColor)
Q_PROPERTY(QColor crossColor MEMBER m_crossColor)
Q_PROPERTY(QColor backgroundShade MEMBER m_backgroundShade)
public:
void setCurrentPattern(AutomationPattern * new_pattern);

Expand All @@ -80,30 +80,11 @@ class AutomationEditor : public QWidget, public JournallingObject
return "automationeditor";
}

// qproperty access methods
QColor barLineColor() const;
void setBarLineColor(const QColor & c);
QColor beatLineColor() const;
void setBeatLineColor(const QColor & c);
QColor lineColor() const;
void setLineColor(const QColor & c);
QBrush graphColor() const;
void setGraphColor(const QBrush & c);
QColor vertexColor() const;
void setVertexColor(const QColor & c);
QBrush scaleColor() const;
void setScaleColor(const QBrush & c);
QColor crossColor() const;
void setCrossColor(const QColor & c);
QColor backgroundShade() const;
void setBackgroundShade(const QColor & c);

enum EditModes
{
DRAW,
ERASE,
SELECT,
MOVE
DRAW_OUTVALUES
};

public slots:
Expand All @@ -126,13 +107,11 @@ public slots:
float getLevel( int y );
int xCoordOfTick( int tick );
float yCoordOfLevel( float level );
inline void drawLevelTick( QPainter & p, int tick, float value);// bool is_selected ); //NEEDS Change in CSS
void removeSelection();
void selectAll();
void getSelectedValues(timeMap & selected_values );
inline void drawLevelTick(QPainter & p, int tick, float value);

timeMap::iterator getNodeAt(int x, int y, bool outValue = false, int r = 5);

void drawLine( int x0, float y0, int x1, float y1 );
void removePoints( int x0, int x1 );

protected slots:
void play();
Expand All @@ -148,11 +127,6 @@ protected slots:
void setProgressionType(int type);
void setTension();

void copySelectedValues();
void cutSelectedValues();
void pasteValues();
void deleteSelectedValues();

void updatePosition( const TimePos & t );

void zoomingXChanged();
Expand All @@ -167,8 +141,10 @@ protected slots:
{
NONE,
MOVE_VALUE,
SELECT_VALUES,
MOVE_SELECTION
ERASE_VALUES,
MOVE_OUTVALUE,
RESET_OUTVALUES,
DRAW_LINE
} ;

// some constants...
Expand All @@ -187,7 +163,7 @@ protected slots:

static QPixmap * s_toolDraw;
static QPixmap * s_toolErase;
static QPixmap * s_toolSelect;
static QPixmap * s_toolDrawOut;
static QPixmap * s_toolMove;
static QPixmap * s_toolYFlip;
static QPixmap * s_toolXFlip;
Expand All @@ -200,7 +176,6 @@ protected slots:

FloatModel * m_tensionModel;

QMutex m_patternMutex;
AutomationPattern * m_pattern;
float m_minLevel;
float m_maxLevel;
Expand All @@ -219,13 +194,6 @@ protected slots:

Actions m_action;

tick_t m_selectStartTick;
tick_t m_selectedTick;
float m_selectStartLevel;
float m_selectedLevels;

float m_moveStartLevel;
tick_t m_moveStartTick;
int m_moveXOffset;

float m_drawLastLevel;
Expand All @@ -235,9 +203,8 @@ protected slots:
int m_y_delta;
bool m_y_auto;

timeMap m_valuesToCopy;
timeMap m_selValuesForMove;

// Time position (key) of automation node whose outValue is being dragged
int m_draggedOutValueKey;

EditModes m_editMode;

Expand All @@ -255,7 +222,8 @@ protected slots:
QColor m_beatLineColor;
QColor m_lineColor;
QBrush m_graphColor;
QColor m_vertexColor;
QColor m_nodeInValueColor;
QColor m_nodeOutValueColor;
QBrush m_scaleColor;
QColor m_crossColor;
QColor m_backgroundShade;
Expand Down
153 changes: 153 additions & 0 deletions include/AutomationNode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/*
* AutomationNode.h - Declaration of class AutomationNode, which contains
* all information about an automation node
*
* Copyright (c) 2020 Ian Caio <iancaio_dev/at/hotmail.com>
*
* This file is part of LMMS - https://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/

#ifndef AUTOMATION_NODE_H
#define AUTOMATION_NODE_H

// MACROs to help handling automation nodes
#define INVAL(x) ((x).value().getInValue())
#define OUTVAL(x) ((x).value().getOutValue())
#define OFFSET(x) ((x).value().getValueOffset())
#define INTAN(x) ((x).value().getInTangent())
#define OUTTAN(x) ((x).value().getOutTangent())
#define POS(x) ((x).key())

class AutomationPattern;


// Note: We use the default copy-assignment on the AutomationPattern constructor. It's
// fine for now as we don't have dynamic allocated members, but if any are added we should
// have an user-defined one to perform a deep-copy.
class AutomationNode
{
public:
AutomationNode(); // Dummy constructor for the QMap
AutomationNode(AutomationPattern* pat, float value, int pos);
AutomationNode(AutomationPattern* pat, float inValue, float outValue, int pos);

AutomationNode& operator+=(float f)
{
m_inValue += f;
m_outValue += f;
return *this;
}
AutomationNode& operator-=(float f)
{
m_inValue -= f;
m_outValue -= f;
return *this;
}
AutomationNode& operator*=(float f)
{
m_inValue *= f;
m_outValue *= f;
return *this;
}
AutomationNode& operator/=(float f)
{
m_inValue /= f;
m_outValue /= f;
return *this;
}

inline const float getInValue() const
{
return m_inValue;
}
void setInValue(float value);

inline const float getOutValue() const
{
return m_outValue;
}
void setOutValue(float value);
void resetOutValue();

/**
* @brief Gets the offset between inValue and outValue
* @return Float representing the offset between inValue and outValue
*/
inline const float getValueOffset() const
{
return m_outValue - m_inValue;
}

/**
* @brief Gets the tangent of the left side of the node
* @return Float with the tangent from the inValue side
*/
inline const float getInTangent() const
{
return m_inTangent;
}

/**
* @brief Sets the tangent of the left side of the node
* @param Float with the tangent for the inValue side
*/
inline void setInTangent(float tangent)
{
m_inTangent = tangent;
}

/**
* @brief Gets the tangent of the right side of the node
* @return Float with the tangent from the outValue side
*/
inline const float getOutTangent() const
{
return m_outTangent;
}

/**
* @brief Sets the tangent of the right side of the node
* @param Float with the tangent for the outValue side
*/
inline void setOutTangent(float tangent)
{
m_outTangent = tangent;
}

private:
// Pattern that this node belongs to
AutomationPattern* m_pattern;

// Time position of this node (matches the timeMap key)
int m_pos;

// Values of this node
float m_inValue;
float m_outValue;

// Slope at each point for calculating spline
// We might have discrete jumps between curves, so we possibly have
// two different tangents for each side of the curve. If inValue and
// outValue are equal, inTangent and outTangent are equal too.
float m_inTangent;
float m_outTangent;
};


#endif
Loading

0 comments on commit 5476531

Please sign in to comment.