Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automation Node fine tuning with double-click (Rewrites #5292) #5923

Merged
merged 70 commits into from
Mar 28, 2021

Commits on Oct 13, 2020

  1. First commit

    	This commit introduces the use of AutomationNodes instead of just floats for keeping the automation values. The AutomationNodes will give more flexibility when it comes to storing extra information about the values (and make it possible to have multiple progression types in the future). Now the tangents are stored on the node, requiring one less timeMap on the automation pattern. Some methods had to be changed for that, since before they used const_iterator, which wouldn't allow us to change the tangent values.
    
    TODO:
    	- Check TODO comments that were added in places of the code I had some doubts about.
    	- Maybe change the timeMap to hold pointers to AutomationNodes and not actual instances.
    	- In some pieces of the code, I check if the AutomationNode already exists before setting its value or creating another node. I think that's unnecessary since if I create another node and assign it to the current existing one it could just clone its value. (That would not be valid for pointers to AutomationNodes, so that's something to consider when deciding between the two).
    	- I still didn't find a good solution for renaming QMap::iterator method from "value()" to something else, so now we have lines that look a bit odd like "it.value().getValue()", because value() is actually returning the node, and getValue() is getting the node's automation value.
    IanCaio committed Oct 13, 2020
    Configuration menu
    Copy the full SHA
    77d69e2 View commit details
    Browse the repository at this point in the history

Commits on Oct 14, 2020

  1. Implements inValue/outValue on Automation Nodes

    	This commit is a big change in comparison to the previous one. Automation nodes now have a inValue and outValue instead of a single value. The inValue represents the core value of the node, which is used for incoming progressions. The outValue represents the value of the node for progressions starting from that node on. In practice, the true value of the node is the inValue and outValue represents a way of creating discrete jumps in a node's position.
    	By default inValue and outValue are the same. The user will then be allowed to change the outValue to create those discrete jumps. Because their values might be different, we now need two tangents for a single node: One for the curve coming before the node and one for the curve coming after the node. So instead of a single tangent variable, we now have inTangent and outTangent. If inValue and outValue are the same, so are inTangent and outTangent, but if they are different both are calculated according to the curve before and after the node.
    	On the Automation Editor, the inValue of the node is represented by our default blue circle, while the outValue is represented by a red circle with 80% alpha (we should add a variable to the Automation Editor class to hold the color of this second circle in the future).
    	Lots of comments were added on the modified files to explain the existing methods where changes were required (not only explaining the logic of the methods but the reason behind using inValue or outValue on them). Lots of TODO comments were also added as placeholders for changes that could or should be done before the finishing of this PR (or after it).
    	For now only the logic for the nodes was added, but there's still no way for the user to change outValues (on the next commit a small placeholder shortcut will be added to do that for testing purposes).
    	The drawing of the notes detuning on the piano roll was updated to account for the discrete jumps.
    	The drawing of the pattern TCO was updated to account for the discrete jumps.
    	The drawing of the pattern on the AutomationEditor was updated to account for the discrete jumps.
    
    	IMPORTANT:
    		- There were changes to the loadSettings and saveSettings of AutomationPatterns, to account for inValues and outValues, but I didn't create an upgrade routine yet.
    
    	Some behavior that is important to mention:
    		- Most operations on nodes (drawing, moving, X/Y flipping, and even selection copy/paste, apparently not fully finished) ignore the outValue, basically reseting it to the inValue. So when an user moves a node with a discrete jump, for example, that discrete jump will be lost and the user will need to set it again. Obviously in the future we might want to keep that information, but that isn't a critical issue, just a behavior that can be improved later by upgrading the code.
    		- Later on we might want to connect a signal to the AutomationNode class, so it calls generateTangents when node data is changed.
    		- When an object is disconnected from an automation pattern and it has to rescale the values so they fit the new range of values (max and min) the outValue is reset, meaning all discrete jumps are lost. This behavior will be changed in the future.
    
    	Things that I think are also important noting:
    		- Mainly in the src/gui/editor/AutomationEditor.cpp file there were lots of codes that apparently are related to a feature that is not yet finished (moving/cutting/copying/pasting selections of automation values). This doesn't sound good unless it's currently being worked on. I tried my best to update the current code to comply to the use of AutomationNodes so their developing can be picked up from a unbroken state. As with other operations involving AutomationNodes, they only account for the inValue discarding any discrete jumps that were present.
    		- I added comments on some logic that seemed flawed in the src/gui/editor/AutomationEditor.cpp file so it can be reviewed. It's beyond the scope of this PR, but since I had to read and change a lot on that file I thought it was pertinent to at least comment those observations.
    IanCaio committed Oct 14, 2020
    Configuration menu
    Copy the full SHA
    fb2107d View commit details
    Browse the repository at this point in the history

Commits on Oct 15, 2020

  1. Fixes and refactor code on AutomationEditor.cpp

    	While implementing the automation nodes, I noticed AutomatinEditor.cpp had some issues regarding flawed logic, code style convention, code that could comply to DRY paradigm, conditions that resulted in Undefined Behavior and unused legacy code. That's probably due to how old some changes are, they probably reflect a much different state of LMMS's code base. To make the transition to automation nodes a better one and avoid having to rework everything later I'm using the fact I have to get in touch with most of this code to try to fix some things.
    
    	This commit starts refactoring AutomationEditor::mousePressEvent and AutomationEditor::mouseMoveEvent. There are still things to be improved on both but I'll slowly commit them so I can have better versioning control of the PR.
    
    	Some changes worth noting:
    		- A new action was created in the AutomationEditor class for drawing lines, since its logic was too mixed up with the logic of drawing and dragging a single node.
    		- Changed most variable names to fit the current code style (just very few left to change).
    		- Improved comments explaining the code.
    		- Created a separate method for checking if the mouse position is sitting over an existing node (previously this code was repeated inside the event method and it had flaws on its logic, most of the times returning that the user didn't click a node even when he/she clicked one). Method is called getNodeAt(x,y,r), r being the "radius" to be considered (not actually a radius, the area is actually a square).
    
    	Some changes that are still planned:
    		- Removing legacy code for features that weren't finished (select and move selection) if it's agreed.
    		- Adding some logic to the DRAW_LINE action so it can be even improved.
    		- Not forgetting the main focus of the PR, adding a way for the user to edit the outValue of nodes.
    IanCaio committed Oct 15, 2020
    Configuration menu
    Copy the full SHA
    28611b8 View commit details
    Browse the repository at this point in the history
  2. Avoids unnecessary check in putValue

    	When adding a value to a particular time, instead of checking if there's a node there already and manually setting its value, we just assign it with a new AutomationNode. QMap silently removes the existing node and adds the new one.
    IanCaio committed Oct 15, 2020
    Configuration menu
    Copy the full SHA
    e5c9669 View commit details
    Browse the repository at this point in the history
  3. Adds upgrade routine for the automation nodes

    	Adds an upgrade method for the change in the automation nodes settings. The "value" attribute of the <time> element is deleted and assigned to the "inValue" and "outValue" attributes.
    
    	Now older project files can be loaded properly.
    IanCaio committed Oct 15, 2020
    Configuration menu
    Copy the full SHA
    ab0aeb0 View commit details
    Browse the repository at this point in the history

Commits on Oct 16, 2020

  1. Allows dragging outValues on the Automation Editor

    	This commit introduces a way for the user to drag outValues on the Automation Editor, by Alt+clicking the outValue red node and dragging up and down.
    
    	A new action was added for that purpose, called MOVE_OUTVALUE. When the user clicks a outValue sphere with the Alt modifier, m_action is set to MOVE_OUTVALUE, and the time position of the node being affected is stored on m_draggedOutValueKey. That is later used on the mouseMoveEvent to update the outValue of the node.
    
    	Removed repeated code on the mouseReleaseEvent and removed excessive blank lines after a method.
    
    	Things to keep in mind when testing through this commit's build:
    		- Creating/Moving an automation node resets the outValue
    		- When the outValue is changed, generateTangents isn't called automatically. So you'll notice that after adding another automation node the curves change (that's because after the new node being added the tangents are then recalculated).
    
    	Still lots of work ahead!
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    2ed2a66 View commit details
    Browse the repository at this point in the history
  2. Small fix inside AutomationPattern.cpp

    	Unnecessary loop was removed with call to appropriate method.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    7b6729b View commit details
    Browse the repository at this point in the history
  3. Creates separate files for AutomationNode

    	Creates a separate header and source file for the AutomationNode class.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    a800943 View commit details
    Browse the repository at this point in the history
  4. Adds more members to AutomationNode

    	Adds 2 new members to the AutomationNode class:
    		m_pattern - A pointer to the pattern this node belongs to
    		m_key - The time position (timeMap key) of this node
    
    	The constructors (and places they were used) were updated accordingly. AutomationNode was also made a friend class of AutomationPattern so it can access private/protected methods from its pointer. This will be later used to allow AutomationNode's to call generateTangents once their values are updated.
    
    	Small fix on a code block related to moving selections inside the mouseMoveEvent from AutomationEditor.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    3932106 View commit details
    Browse the repository at this point in the history
  5. Removes unused code from AutomationEditor

    	This commit removes code that was not currently used in the AutomationEditor. Most of it was related to a feature I believe was once functional but broke along the way, but the code was not cleaned up in an effort to fix it later. The feature allowed selecting and moving/cutting/copying/pasting/removing values from the automation pattern. It added up to lots of lines of code, which so far I was keeping up to date to the changes. However, I believe (and others devs agree) that rewritting this code later might be a better approach than trying to fix what we currently have, so I'm removing the obsolete code. The git history will allow us to reference back to it when implementing the feature again and this will make it harder for this PR to introduce bugs because a certain affected feature couldn't be tested.
    
    	It also makes reviewing easier, for there are less affected code to cover.
    
    For reviewing purposes:
    	I used a single commit for removing the mentioned code, so its diff in relation to the previous commit should give a good idea of everything that was removed.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    9f55d2c View commit details
    Browse the repository at this point in the history
  6. Changes to the outValues now update the tangents

    	The methods that change the inValue and outValue of nodes now also generate new tangents for the previous, current and next nodes (the ones affected), so now when the user drags the node outValue the curve is updated accordingly.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    c42c46b View commit details
    Browse the repository at this point in the history
  7. Keeps discrete jumps when flipping patterns

    	Adds a method to the automation node that returns the valueOffset between inValue and outValue. AutomationPattern::putValue now has an extra parameter called outValueOffset (defaults to 0), so when it adds a node to the timeMap the outValue is set according to this offset. flipY() will calculate the offset and invert it, so the discrete jumps are kept but flipped vertically as well. flipX() doesn't need to calculate this offset because it uses the outValue itself.
    
    Obs:
    	I believe cleanObjects() was meant to be called everytime AutomationPattern::flipX() is called, but it was inside a conditional that would only call it on some situations. I moved it outside of the conditional.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    504143c View commit details
    Browse the repository at this point in the history
  8. Allows reseting outValues on the AutomationEditor

    	User can now reset the outValue of nodes on a very analogous way to removing nodes but with the Alt key pressed. Alt + right clicking over the node (or dragging over an area), or Alt + clicking on it on Erase mode (or dragging over an area) will reset the outValues of the nodes.
    	To do that, two new actions were created: ERASE_VALUES (for the regular node removing) and RESET_OUTVALUES (for the outValues reseting). Those are checked for in the moveMouseEvent, which acts accordingly. The removePoints() method was removed and two new methods were added instead: removeNodes() and resetNodes(), which will remove nodes on a tick range or reset them respectivately.
    
    	The AutomationNode.h and AutomationNode.cpp files were fixed to fit the current code style conventions. The other files were kept as is, so they can be changed all at once at the end of the PR.
    
    	Change requests made by Veratil were done.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    d67942b View commit details
    Browse the repository at this point in the history
  9. Makes so dragging nodes keep the outValue

    	This commit makes a small change to setDragValue. When starting the drag (m_dragging == false), it checks if the time position being dragged already has a node. If it does, then the offset between inValue and offValue is stored on m_dragOutValueOffset so it can be used on the putValue calls, keeping the offset. If there isn't a node in the time position, m_dragOutValueOffset is set to 0.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    7c269bd View commit details
    Browse the repository at this point in the history
  10. Fixes code style on modified code

    	Fixes the modified code to comply to current code style convention.
    
    	I tried to keep the changes exclusive to the lines modified by this PR (to keep the diff cleaner), but I might have fixed a couple of other because either they were hard to differentiate on the current diff or because they were too close in context. But still, tried to keep changes mostly to the lines actually changed by the PR.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    64fcec0 View commit details
    Browse the repository at this point in the history
  11. Adds a QProperty for the node outValue color

    	Adds a CSS property for the outValue color and renames the one used for the inValue color so they are consistent.
    
    	Colors were added to classic and default themes. The original inValue colors were kept, but to fit with the outValue node they had a little bit of transparency added.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    578367e View commit details
    Browse the repository at this point in the history
  12. Adds doxygen comments on methods

    	Adds doxygen comments explaining methods that were either introduced by this PR or which had parameters modified by this PR.
    
    	Changes valueAt(timeMap::iterator, int offset) method, so it can handle offsets equal to 0 properly. This method is currently never used with an offset of 0 (because this case scenario is handled before this method is called), but it was a simply modification so I just added the conditional to make it possible to use an offset of 0.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    c4960a1 View commit details
    Browse the repository at this point in the history
  13. Refactor flipX and flipY methods

    	AutomationPattern::flipX and AutomationPattern::flipY had some issues to the logic that caused UBs (from accessing an iterator past QMap::end()) and possibly misbehaviors when flipping an empty pattern.
    	Both were refactored to fix those noted issues.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    5c94591 View commit details
    Browse the repository at this point in the history
  14. Add a new edit mode to Automation Editor

    	Adds another editing mode to Automation Editor (DRAW_OUTVALUES), specific to deal with node outValues. The Pixmap being used is the same as the DRAW edit mode for now.
    
    	The way it works now:
    
    DRAW Mode (Shortcut SHIFT+D)
    	Shift + Left click = Draws lines of nodes
    	Left click = Draws/Drag node
    	Right click = Remove nodes
    
    ERASE Mode (Shortcut SHIFT+E)
    	Left click = Remove nodes
    	Right click = Reset outValues
    
    DRAW_OUTVALUES Mode (Shortcut SHIFT+C)
    	Left click = Drags outValue
    	Right click = Reset outValues
    
    	Now using a switch statement on the events to make things more organized.
    IanCaio committed Oct 16, 2020
    Configuration menu
    Copy the full SHA
    939596a View commit details
    Browse the repository at this point in the history

Commits on Oct 17, 2020

  1. Improves the Draw OutValue edit mode

    	Now, instead of only being able to change an outValue by clicking over the sphere representing it, the user can also click on any time on the pattern: If the quantized time of the place he clicked has a node, the outValue of its node will be set to the value where the mouse click happened and the outValue will start being dragged. Very similar to the way it works for the node itself on the draw mode.
    IanCaio committed Oct 17, 2020
    Configuration menu
    Copy the full SHA
    5a38f74 View commit details
    Browse the repository at this point in the history
  2. Adds mutex to AutomationPattern

    	Adds a recursive mutex to the AutomationPattern class and locks it on every method that access the member variables. Also rename the mutex from the AutomationEditor class and add locks to some methods that didn't have it before (except on methods that don't access member variables).
    IanCaio committed Oct 17, 2020
    Configuration menu
    Copy the full SHA
    7925196 View commit details
    Browse the repository at this point in the history

Commits on Oct 19, 2020

  1. Veratil's review changes

    	Applies changes requested by Veratil:
    		- Replaces NULL with nullptr where necessary on AutomationEditor.cpp
    		- Fixes spacing on the mutex commit (plus some other places)
    		- Changes some if blocks to one liners
    		- Replace while with do-while on some places, since the condition was already checked for earlier on the method.
    		- Moves getNodeAt call a level up on the block, since it's called on both conditionals below.
    		- Fixes identation on some code inside AutomationEditor::mousePressEvent.
    		- Adds explicits blocks on a switch statement. Even though this was not necessary for that particular one (because there was no variable declaration inside it) it helps keeping it consistent with another switch statement that happened earlier.
    
    I also added a break statement to the last case of a switch (even though it was not needed, it's safer to avoid mistakes in the future with new cases being added).
    IanCaio committed Oct 19, 2020
    Configuration menu
    Copy the full SHA
    9e325dc View commit details
    Browse the repository at this point in the history
  2. Changes the inValue sphere to be draw first

    	The red sphere representing the outValue was drawed after the blue sphere representing the inValue. Because of that, if they had the same value the red sphere would be on top. For the user, it makes more sense to be able to see the blue sphere representing the input value on top instead. This commit changes the order of the drawing.
    IanCaio committed Oct 19, 2020
    Configuration menu
    Copy the full SHA
    61d20ff View commit details
    Browse the repository at this point in the history

Commits on Oct 21, 2020

  1. Configuration menu
    Copy the full SHA
    ff92b56 View commit details
    Browse the repository at this point in the history
  2. Changes comments and variables names

    	Fixes some comments pointed out on Spekular's review. Changes the AutomationNode's variable m_key to m_pos (leaving a comment on the header reminding that it matches the timeMap key). Removes comments related to removed code. Fixes code style on a pointer declaration.
    IanCaio committed Oct 21, 2020
    Configuration menu
    Copy the full SHA
    3d4be23 View commit details
    Browse the repository at this point in the history

Commits on Oct 22, 2020

  1. Changes QProperty variables to use MEMBER

    	Instead of creating a getter and setter for each QProperty, we use MEMBER instead and access those variables directly.
    IanCaio committed Oct 22, 2020
    Configuration menu
    Copy the full SHA
    caa43ad View commit details
    Browse the repository at this point in the history
  2. Overloads some AutomationNode's operators

    	Overloads compound assignment operators +=, -=, *= and /= for AutomationNodes, making it so they affect the inValue and outValue of the node being assigned. Changes AutomationPattern::flipY() so it uses the new operators.
    IanCaio committed Oct 22, 2020
    Configuration menu
    Copy the full SHA
    61ef27a View commit details
    Browse the repository at this point in the history
  3. Improves getNodeAt method

    	Makes the AutomationEditor::getNodeAt method more efficient, by exiting if the node we are checking is already past the position we given (since the nodes are ordered in the timeMap, all subsequent nodes will also be past the position). Now instead of returning the last node that is inside the coordinates, it returns the first.
    	Also improves AutomationEditor::mousePressEvent to avoid getNodeAt being called twice unnecessarily.
    IanCaio committed Oct 22, 2020
    Configuration menu
    Copy the full SHA
    932a46e View commit details
    Browse the repository at this point in the history
  4. Changes behavior of setDragValue

    	Now, instead of keeping the offset between the inValue and outValue while dragging a node, setDragValue will either keep the current outValue intact, or move it together with the inValue if they are the same.
    	The putValue method now doesn't have an offset parameter. If we want to put a node with an outValue different from the inValue we use putValues instead.
    IanCaio committed Oct 22, 2020
    Configuration menu
    Copy the full SHA
    a64942a View commit details
    Browse the repository at this point in the history
  5. Moves getNodeAt to an upper level, reducing lines

    	Creates a boolean before the m_editMode switch, that will be true if the action being processed affects outValues and false if it affects inValues. That way we can move the statement clickedNode=getNodeAt() before the switch-case, reducing repeated lines.
    IanCaio committed Oct 22, 2020
    Configuration menu
    Copy the full SHA
    3b6f238 View commit details
    Browse the repository at this point in the history
  6. Changes icon of Draw OutValue edit mode

    	Changes the icon for the Draw OutValue tool and toolbar action, so it's different from the Draw mode. Just a placeholder until a visual artist come up with something better or we change the controls.
    IanCaio committed Oct 22, 2020
    Configuration menu
    Copy the full SHA
    53f4afa View commit details
    Browse the repository at this point in the history

Commits on Oct 24, 2020

  1. Configuration menu
    Copy the full SHA
    108323d View commit details
    Browse the repository at this point in the history

Commits on Nov 12, 2020

  1. Removes unnecessary non-const methods

    	Some getter methods had declarations for both const and
    non-const object types, when just the const one were needed (no changes
    to the object are made). The unnecessary ones were removed.
    	Also fixes formatting on operator /= method.
    IanCaio committed Nov 12, 2020
    Configuration menu
    Copy the full SHA
    203d3b5 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    1531668 View commit details
    Browse the repository at this point in the history

Commits on Nov 13, 2020

  1. Fixes formatting and doxygen comments

    	Fixes doxygen comments on AutomationPattern.cpp and
    AutomationEditor.cpp (also changes one so it uses the same format as the
    rest of the file).
    	Fixes some formatting issues (removal of excessive tabs,
    changing some statements to be one line instead of multiple lines,
    fixing of spacing, use of one line ifs, removal of unnecessary else on a
    method, use of ternary expressions, etc).
    IanCaio committed Nov 13, 2020
    Configuration menu
    Copy the full SHA
    5184d79 View commit details
    Browse the repository at this point in the history
  2. Adds helper macros for AutomationNodes

    	Adds 3 macros to the AutomationNode header file: INVAL, OUTVAL
    and POS, which return the InValue, OutValue and Key of a node
    respectively. This improved redability and made statements shorter on
    the AutomationPattern.cpp code.
    	Macros weren't added for InTangent and OutTangent, since those
    are only used once in the code (and INTAN/OUTTAN might not have their
    meaning as obvious as INVAL/OUTVAL).
    IanCaio committed Nov 13, 2020
    Configuration menu
    Copy the full SHA
    9805321 View commit details
    Browse the repository at this point in the history
  3. Removes tabs from ternary operator

    	Removed tabs to improve formatting on a ternary operator
    as requested and also removed a comment that doesn't seem necessary.
    IanCaio committed Nov 13, 2020
    Configuration menu
    Copy the full SHA
    055c95f View commit details
    Browse the repository at this point in the history
  4. Update files to use AutomationNode macros

    	Other files besides "AutomationPattern.cpp" also included the
    AutomationNode.h header and handled automation nodes, but they weren't
    using the macros. Those were updated to use INVAL, OUTVAL and POS
    macros.
    	Two conditionals were changed to one liners for consistency.
    IanCaio committed Nov 13, 2020
    Configuration menu
    Copy the full SHA
    1c3502c View commit details
    Browse the repository at this point in the history

Commits on Nov 26, 2020

  1. Configuration menu
    Copy the full SHA
    3471b8f View commit details
    Browse the repository at this point in the history
  2. Addresses my own code review

    	This commit addresses some fixes from a review I made from the
    code on Github and also one requested change from Veratil.
    
    	Changes:
    	- Fixes code style issues.
    	- Adds a helper MACRO to return the offset between the inValue
    and outValue of a node and use it where getValueOffset was called.
    	- Removes conditional that was not needed inside
    AutomationPattern::valueAt.
    	- Updates InlineAutomation.h to use the helper MACROs and
    account for the outValue when deciding whether to save or discard an
    inline automation.
    	- Adds TODO comments on two loops present on
    src/code/AutomationPattern.cpp that could be optimized.
    	- Fixes some comments.
    	- Uses INVAL(it) instead of valueAt(POS(it)) on the flip methods
    when possible.
    	- Adds a resetOutValue() method to AutomationNode and use it
    where convenient.
    	- Fixes a small "bug" where flipping a pattern from the TCO
    context menu, when the pattern is smaller than the TCO, would use the
    inValue of the last node for the node created at the end of the TCO
    instead of the outValue (which is the value that the position would have
    if the pattern continued).
    IanCaio committed Nov 26, 2020
    Configuration menu
    Copy the full SHA
    7559a41 View commit details
    Browse the repository at this point in the history
  3. Addresses Veratil's review

    	- Fixes some code style issues
    	- Changes to improve readability at some snippets
    	- Uses if one-liners when convenient
    	- On a polynomial expression inside AutomationPattern::valueAt,
    uses some variables to improve readability (those will be optimized out
    by the compiler)
    	- Removes unnecessary casting on alignedX variable inside
    AutomationEditor::mousePressEvent (it was also using C-style casting
    instead of static_cast)
    IanCaio committed Nov 26, 2020
    Configuration menu
    Copy the full SHA
    2cf33e1 View commit details
    Browse the repository at this point in the history
  4. Adds helper MACROs for node tangents

    	Adds INTAN and OUTTAN macros to retrieve a node's InTangent and
    OutTangent respectively, and replace calls to getInTangent/getOutTangent
    with those macros.
    IanCaio committed Nov 26, 2020
    Configuration menu
    Copy the full SHA
    e0c3563 View commit details
    Browse the repository at this point in the history

Commits on Dec 5, 2020

  1. Merge branch 'master' into feature/automationProgression

    	Fixes conflicts introduced by recent commits (LMMS#5684 and LMMS#5806
    mostly).
    IanCaio committed Dec 5, 2020
    Configuration menu
    Copy the full SHA
    85a0ca3 View commit details
    Browse the repository at this point in the history
  2. Fixes header inclusion order

    IanCaio committed Dec 5, 2020
    Configuration menu
    Copy the full SHA
    cbf73dc View commit details
    Browse the repository at this point in the history

Commits on Dec 6, 2020

  1. Removes mutex from AutomationEditor

    	Now that there's a mutex protecting the AutomationPattern on its
    own methods, there's no need to have a mutex on the AutomationEditor
    class. The editor's member variables don't need to be protected because
    LMMS's UI runs from a single thread.
    	This commit removes the m_patternEditorMutex.
    IanCaio committed Dec 6, 2020
    Configuration menu
    Copy the full SHA
    de6d7c9 View commit details
    Browse the repository at this point in the history
  2. Locks mutex on AutomationPattern copy assignment

    	On the copy assignment constructor of AutomationPattern, the
    values were being copied from the other pattern without locking its
    mutex, which could result in race conditions. Now the constructor locks
    the other pattern's mutex.
    
    	Other small changes:
    	- Removes unnecessary comments and fix others.
    	- Uses the OFFSET macro on the generateTangents method.
    	- Uses the resetOutValue() method on
    AutomationEditor::mousePressEvent, in a place where I forgot to change
    it.
    IanCaio committed Dec 6, 2020
    Configuration menu
    Copy the full SHA
    7d1f196 View commit details
    Browse the repository at this point in the history
  3. Changes resetOutValue() so it generates tangents

    	Changes the AutomationNode::resetOutValue() method so it calls
    setOutValue() instead of directly setting the m_outValue, since the
    latter will also take care of generating tangents.
    	Fixes small bug where reseting outValues would not recalculate
    the tangents.
    IanCaio committed Dec 6, 2020
    Configuration menu
    Copy the full SHA
    128c723 View commit details
    Browse the repository at this point in the history

Commits on Dec 11, 2020

  1. Changes some methods to use for loops

    	AutomationEditor::removeNodes and AutomationEditor::resetNodes
    were previously using while loops where for loops are much more well
    suited. Both methods were changed to use those instead.
    IanCaio committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    adc223b View commit details
    Browse the repository at this point in the history
  2. Move removeNodes/resetNodes to AutomationPattern

    	- Renames AutomationPattern::removeValue to
    AutomationPattern::removeNode.
    	- Moves AutomationEditor::removeNodes and
    AutomationEditor::resetNodes to AutomationPattern, since they are more
    suited there and could be reused in other areas of code that need to
    remove a range of nodes.
    IanCaio committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    169cc3b View commit details
    Browse the repository at this point in the history
  3. Optimizes loop inside putValue/putValues

    	There was a TODO comment about a loop that could be optimized
    inside putValue/putValues. It went through all the ticks in the
    surrounding values instead of just going through the nodes that were in
    that range. Now that the removeNodes/resetNodes methods are part of the
    AutomationPattern we can use them to optimize the loop.
    
    	Changes:
    	- removeNodes/resetNodes will remove or reset a node if a range
    with start == end is given (before it would return).
    	- The loop was replaced with a call to removeNodes from
    newTime + 1 to newTime + quantization() - 1 (which will cover the nodes
    that are between the quantization limits). We add a conditional that
    quantization() is greater than 1 to avoid a bug where the added node is
    removed by that call because we get a range from [newTime + 1, newTime].
    IanCaio committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    033bfab View commit details
    Browse the repository at this point in the history

Commits on Dec 12, 2020

  1. Adds comment to mysterious calculation

    	There was a calculation on the drawAutomationPoint method that
    wasn't really obvious at first glance. Thanks to @PhysSong, a comment
    was added explaining the reasoning behind the calculation.
    IanCaio committed Dec 12, 2020
    Configuration menu
    Copy the full SHA
    fe53845 View commit details
    Browse the repository at this point in the history

Commits on Dec 16, 2020

  1. Configuration menu
    Copy the full SHA
    1f28a45 View commit details
    Browse the repository at this point in the history
  2. Reduces indentation on getNodeAt

    	Reduces one indentation level on AutomationEditor::getNodeAt()
    by reversing the conditional.
    	Fixes style on switch statements.
    IanCaio committed Dec 16, 2020
    Configuration menu
    Copy the full SHA
    1e1e5f8 View commit details
    Browse the repository at this point in the history
  3. Applies Veratil suggestions

    	Condense two code blocks in a single one by using a ternary
    operator on the only variable that changed between them.
    
    	Comment out a "else" block that currently doesn't have anything
    (placeholder for future code).
    
    	Format a for statement in multiple lines to improve readability.
    IanCaio committed Dec 16, 2020
    Configuration menu
    Copy the full SHA
    6bec055 View commit details
    Browse the repository at this point in the history
  4. Updates comment from changed code

    	Updates comment to better match the recently changed code.
    IanCaio committed Dec 16, 2020
    Configuration menu
    Copy the full SHA
    1d23334 View commit details
    Browse the repository at this point in the history
  5. Uses lambda functions to extract code

    	Uses two helper lambda functions inside
    AutomationEditor::mousePressEvent to extract code and use fewer lines on
    places where it's repeated.
    IanCaio committed Dec 16, 2020
    Configuration menu
    Copy the full SHA
    8c5f9d4 View commit details
    Browse the repository at this point in the history

Commits on Dec 20, 2020

  1. Fixes behavior of AutomationPattern::flipX

    	To truly flip a pattern horizontally, we also needed to swap the
    inValues and outValues of the nodes being flipped. This commit fixes
    that behavior by including the swap when necessary.
    
    	Also adds a TODO comment regarding the behavior of the
    generateTangents method when the difference between inValue and outValue
    is very small.
    IanCaio committed Dec 20, 2020
    Configuration menu
    Copy the full SHA
    1d1d57c View commit details
    Browse the repository at this point in the history
  2. Changes pattern XML for backwards compatibility

    	Changes the inValue attribute name on the XML from "inValue" to
    "value" to make projects created with the new automation pattern
    partially backwards compatible (outValues will still not be loaded
    obviously, but the inValues will be loaded as the regular pattern values
    we had before).
    IanCaio committed Dec 20, 2020
    Configuration menu
    Copy the full SHA
    d9862c5 View commit details
    Browse the repository at this point in the history
  3. Fixes bug on AutomationPattern::resetNodes

    	Fixes bug on AutomationPattern::resetNodes: If it was called
    with tick0 == tick1, m_timeMap.find() return value was being used to
    call resetOutValue. When QMap::find() doesn't find a value it returns
    QMap::end() though, resulting in a SegFault.
    	Fixed by checking if the return value is QMap::end() first.
    IanCaio committed Dec 20, 2020
    Configuration menu
    Copy the full SHA
    2d1fbd0 View commit details
    Browse the repository at this point in the history

Commits on Dec 26, 2020

  1. Implements fine tuning with double click

    	Implements a way to fine tune a node's inValue/outValue by
    double clicking the node on the AutomationEditor.
    	This is an adaptation of PR LMMS#5292 for the new AutomationEditor
    code which is being changed by PR LMMS#5712, keeping the original
    authorship.
    tecknixia authored and IanCaio committed Dec 26, 2020
    Configuration menu
    Copy the full SHA
    2226108 View commit details
    Browse the repository at this point in the history

Commits on Jan 7, 2021

  1. Adds comment about copy-assignment

    	Adds a note about the default copy-assignment from
    AutomationNode being used on the AutomationPattern constructor. If any
    dynamic allocated resources are added to the class, an user-defined
    copy-assignment constructor should be used instead.
    
    	Also changes the position of an arithmetics operator on a
    multiline statement for readability.
    IanCaio committed Jan 7, 2021
    Configuration menu
    Copy the full SHA
    4b4ac2b View commit details
    Browse the repository at this point in the history

Commits on Jan 30, 2021

  1. Configuration menu
    Copy the full SHA
    93c0c65 View commit details
    Browse the repository at this point in the history
  2. Changes flipY logic and address PhysSong review

    	This commit addresses PhysSong review:
    	- An if-statement was replaced with a ternary operator on
    AutomationEditor::paintEvent().
    	- One comment was improved on PianoRow::drawDetuningInfo() to
    make it clearer that drawing cubic hermit curves as straight lines is
    just a temporary thing.
    	- While applying the requested changes on the
    AutomationPattern::flipY() method, I noticed that even though it
    accepted any integer values as min and max, the current logic (both on
    master and on the previous commit from this PR) would only work if the
    range was [-max,+max] or [0,+max]. If min was -5 and max 10 for example,
    the flipping could return us a pattern with values out of range. This
    commit replaces the logic with an improved one that now relies on the
    distance between the node and the edges of the range instead, thus
    working for any range instead of those two mentioned earlier. The new
    logic also attend to the request of using a for-loop and also using
    in-place operations.
    IanCaio committed Jan 30, 2021
    Configuration menu
    Copy the full SHA
    5a66667 View commit details
    Browse the repository at this point in the history

Commits on Feb 25, 2021

  1. Configuration menu
    Copy the full SHA
    174f335 View commit details
    Browse the repository at this point in the history

Commits on Feb 28, 2021

  1. Configuration menu
    Copy the full SHA
    5a2a5db View commit details
    Browse the repository at this point in the history
  2. Fixes bug with double clicking on erase mode

    	Double clicking on Erase mode caused a seg fault because only
    Draw and Draw Outvalues modes were being handled but later code expected
    variables to have been set on either of those.
    	This commit now uses a lambda function instead to fine tune
    values, fixes the bug, removes a warning of unhandled cases (by adding a
    default case) and makes it so update() is only called if something
    changed.
    IanCaio committed Feb 28, 2021
    Configuration menu
    Copy the full SHA
    5f3e69b View commit details
    Browse the repository at this point in the history
  3. Small change to the fine tuning of inValues

    	Now, if the offset between inValue and outValue of a node is 0
    (meaning they are both the same), fine tuning an inValue will set the
    outValue to the same. In terms of UX that's more desirable (it's also
    how the dragging of nodes work).
    IanCaio committed Feb 28, 2021
    Configuration menu
    Copy the full SHA
    5290c71 View commit details
    Browse the repository at this point in the history

Commits on Mar 26, 2021

  1. Addresses Spekular change requests

    	Moves fineTuneValue to a method inside AutomationEditor so it
    can be accessed from other places in the future.
    	Removes needsUpdate variable and instead just calls for update
    where necessary inside the double click event.
    IanCaio committed Mar 26, 2021
    Configuration menu
    Copy the full SHA
    df67e46 View commit details
    Browse the repository at this point in the history
  2. Addresses Veratil's review

    IanCaio committed Mar 26, 2021
    Configuration menu
    Copy the full SHA
    0334021 View commit details
    Browse the repository at this point in the history

Commits on Mar 28, 2021

  1. Improves indentation on fineTuneValue

    	Uses an inverse check on the "ok" variable to reduce the
    indentation on fineTuneValue.
    IanCaio committed Mar 28, 2021
    Configuration menu
    Copy the full SHA
    7eae19c View commit details
    Browse the repository at this point in the history