Implement paste to region gain/fx automation
This commit is contained in:
parent
5401f2c3eb
commit
0ea7e80aa6
@ -67,6 +67,7 @@
|
||||
#include "mergeable_line.h"
|
||||
#include "region_gain_line.h"
|
||||
#include "control_point.h"
|
||||
#include "paste_context.h"
|
||||
#include "ghostregion.h"
|
||||
#include "audio_time_axis.h"
|
||||
#include "rgb_macros.h"
|
||||
@ -1258,6 +1259,40 @@ AudioRegionView::get_region_fx_line (PBD::ID& id, uint32_t& param_id)
|
||||
return _rdx_param != UINT32_MAX && _rfx_id != 0;
|
||||
}
|
||||
|
||||
bool
|
||||
AudioRegionView::paste (Temporal::timepos_t const& pos, const Selection& selection, PasteContext& ctx)
|
||||
{
|
||||
if (!_fx_line || selection.lines.size() != 1) {
|
||||
return false;
|
||||
}
|
||||
std::shared_ptr<AutomationList> alist (_fx_line->the_list());
|
||||
|
||||
AutomationSelection::const_iterator p = selection.lines.begin ();
|
||||
|
||||
Temporal::timecnt_t len = (*p)->length();
|
||||
Temporal::timepos_t tpos (pos);
|
||||
|
||||
unsigned paste_count = ctx.count;
|
||||
|
||||
switch (alist->time_domain()) {
|
||||
case Temporal::BeatTime:
|
||||
tpos += trackview.editor().get_paste_offset (pos, paste_count > 0 ? 1 : 0, len);
|
||||
break;
|
||||
case Temporal::AudioTime:
|
||||
tpos += trackview.editor().get_paste_offset (pos, paste_count, len);
|
||||
break;
|
||||
}
|
||||
|
||||
XMLNode &before = alist->get_state();
|
||||
Temporal::timepos_t model_pos (_region->position().distance (tpos));
|
||||
alist->paste (**p, model_pos);
|
||||
timepos_t rlen ((samplepos_t)_region->length().samples());
|
||||
alist->truncate_end (rlen);
|
||||
trackview.session()->add_command (new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
AudioRegionView::update_envelope_visibility ()
|
||||
{
|
||||
|
@ -54,6 +54,7 @@ class GhostRegion;
|
||||
class AutomationTimeAxisView;
|
||||
class RegionFxLine;
|
||||
class RouteTimeAxisView;
|
||||
class PasteContext;
|
||||
|
||||
class AudioRegionView : public RegionView, public LineMerger
|
||||
{
|
||||
@ -97,6 +98,7 @@ public:
|
||||
bool set_region_fx_line (std::weak_ptr<PBD::Controllable>);
|
||||
bool get_region_fx_line (PBD::ID&, uint32_t&);
|
||||
void update_envelope_visibility ();
|
||||
bool paste (Temporal::timepos_t const&, const Selection&, PasteContext&);
|
||||
|
||||
sigc::signal<void> region_line_changed;
|
||||
|
||||
|
@ -5405,7 +5405,7 @@ Editor::paste_internal (timepos_t const & pos, float times)
|
||||
* the below "do the reasonable thing" logic. */
|
||||
ts = selection->tracks.filter_to_unique_playlists ();
|
||||
sort_track_selection (ts);
|
||||
} else {
|
||||
} else if (cut_buffer->lines.empty ()) {
|
||||
/* Figure out which track to base the paste at. */
|
||||
TimeAxisView* base_track = NULL;
|
||||
if (_edit_point == Editing::EditAtMouse && entered_track) {
|
||||
@ -5459,10 +5459,17 @@ Editor::paste_internal (timepos_t const & pos, float times)
|
||||
R1.A1, R1.A2, R2, R2.A1, ... */
|
||||
}
|
||||
|
||||
|
||||
bool commit = false;
|
||||
begin_reversible_command (Operations::paste);
|
||||
|
||||
if (ts.size() == 1 && cut_buffer->lines.size() == 1 &&
|
||||
if (ts.size() == 0 && cut_buffer->lines.size() == 1 && entered_regionview) {
|
||||
AudioRegionView* arv = dynamic_cast<AudioRegionView*>(entered_regionview);
|
||||
if (arv) {
|
||||
PasteContext ctx(paste_count, times, ItemCounts(), true);
|
||||
commit |= arv->paste (position, *cut_buffer, ctx);
|
||||
}
|
||||
} else if (ts.size() == 1 && cut_buffer->lines.size() == 1 &&
|
||||
dynamic_cast<AutomationTimeAxisView*>(ts.front())) {
|
||||
/* Only one line copied, and one automation track selected. Do a
|
||||
"greedy" paste from one automation type to another. */
|
||||
|
Loading…
Reference in New Issue
Block a user