#include "ardour/playlist.h"
#include "ardour/rc_configuration.h"
+#include "control_protocol/control_protocol.h"
+
#include "audio_region_view.h"
#include "debug.h"
#include "gui_thread.h"
#include "public_editor.h"
#include "control_point.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
}
void
-Selection::clear_objects ()
+Selection::clear_objects (bool with_signal)
{
- clear_regions ();
- clear_points ();
- clear_lines();
- clear_playlists ();
- clear_midi_notes ();
- clear_midi_regions ();
+ clear_regions (with_signal);
+ clear_points (with_signal);
+ clear_lines(with_signal);
+ clear_playlists (with_signal);
+ clear_midi_notes (with_signal);
+ clear_midi_regions (with_signal);
}
void
-Selection::clear_tracks ()
+Selection::clear_tracks (bool with_signal)
{
if (!tracks.empty()) {
for (TrackViewList::iterator x = tracks.begin(); x != tracks.end(); ++x) {
(*x)->set_selected (false);
}
tracks.clear ();
- if (!_no_tracks_changed) {
+ if (!_no_tracks_changed && with_signal) {
TracksChanged();
}
}
}
void
-Selection::clear_time ()
+Selection::clear_time (bool with_signal)
{
time.clear();
-
- TimeChanged ();
+ if (with_signal) {
+ TimeChanged ();
+ }
}
void
void
-Selection::clear_regions ()
+Selection::clear_regions (bool with_signal)
{
if (!regions.empty()) {
regions.clear_all ();
- RegionsChanged();
+ if (with_signal) {
+ RegionsChanged();
+ }
}
}
void
-Selection::clear_midi_notes ()
+Selection::clear_midi_notes (bool with_signal)
{
if (!midi_notes.empty()) {
for (MidiNoteSelection::iterator x = midi_notes.begin(); x != midi_notes.end(); ++x) {
delete *x;
}
midi_notes.clear ();
- MidiNotesChanged ();
+ if (with_signal) {
+ MidiNotesChanged ();
+ }
}
// clear note selections for MRV's that have note selections
}
void
-Selection::clear_midi_regions ()
+Selection::clear_midi_regions (bool with_signal)
{
if (!midi_regions.empty()) {
midi_regions.clear ();
- MidiRegionsChanged ();
+ if (with_signal) {
+ MidiRegionsChanged ();
+ }
}
}
void
-Selection::clear_playlists ()
+Selection::clear_playlists (bool with_signal)
{
/* Selections own their playlists */
if (!playlists.empty()) {
playlists.clear ();
- PlaylistsChanged();
+ if (with_signal) {
+ PlaylistsChanged();
+ }
}
}
void
-Selection::clear_lines ()
+Selection::clear_lines (bool with_signal)
{
if (!lines.empty()) {
lines.clear ();
- LinesChanged();
+ if (with_signal) {
+ LinesChanged();
+ }
}
}
void
-Selection::clear_markers ()
+Selection::clear_markers (bool with_signal)
{
if (!markers.empty()) {
markers.clear ();
- MarkersChanged();
+ if (with_signal) {
+ MarkersChanged();
+ }
}
}
warning << "Programming error: Selected list is not an ARDOUR::AutomationList" << endmsg;
return;
}
- if (find (lines.begin(), lines.end(), al) == lines.end()) {
- lines.push_back (al);
- LinesChanged();
- }
+
+ /* The original may change so we must store a copy (not a pointer) here.
+ * e.g AutomationLine rewrites the list with gain mapping.
+ * the downside is that we can't perfom duplicate checks.
+ * This code was changed in response to #6842
+ */
+ lines.push_back (boost::shared_ptr<ARDOUR::AutomationList> (new ARDOUR::AutomationList(*al)));
+ LinesChanged();
}
void
if ((i = find (tracks.begin(), tracks.end(), track)) != tracks.end()) {
track->set_selected (false);
tracks.erase (i);
+
if (!_no_tracks_changed) {
TracksChanged();
}
void
Selection::set (TimeAxisView* track)
{
- clear_objects(); //enforce object/range exclusivity
- clear_tracks ();
+ clear_objects (); //enforce object/range exclusivity
+ clear_tracks (false);
add (track);
}
Selection::set (const TrackViewList& track_list)
{
clear_objects(); //enforce object/range exclusivity
- clear_tracks ();
+ clear_tracks (false);
add (track_list);
}
bool
Selection::selected (TimeAxisView* tv)
{
- return tv->get_selected ();
+ return tv->selected ();
}
bool
clear_time(); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
- cp->set_selected (!cp->get_selected ());
+ cp->set_selected (!cp->selected ());
PointSelection::iterator i = find (points.begin(), points.end(), cp);
if (i == points.end()) {
points.push_back (cp);
}
void
-Selection::clear_points ()
+Selection::clear_points (bool with_signal)
{
if (!points.empty()) {
points.clear ();
- PointsChanged ();
+ if (with_signal) {
+ PointsChanged ();
+ }
}
}
clear_time (); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
- if (cp->get_selected () && points.size () == 1) {
+ if (cp->selected () && points.size () == 1) {
return;
}
for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
if ((*i)->name() == X_("RouteView")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
assert (prop_id);
PBD::ID id (prop_id->value ());
RouteTimeAxisView* rtv = editor->get_route_view_by_route_id (id);
}
} else if ((*i)->name() == X_("Region")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
assert (prop_id);
PBD::ID id (prop_id->value ());
}
} else if ((*i)->name() == X_("MIDINote")) {
- XMLProperty* prop_region_id = (*i)->property (X_("region-id"));
+ XMLProperty const * prop_region_id = (*i)->property (X_("region-id"));
assert (prop_region_id);
XMLNodeList children = (*i)->children ();
for (XMLNodeList::const_iterator ci = children.begin(); ci != children.end(); ++ci) {
- XMLProperty* prop_channel = (*ci)->property (X_("channel"));
- XMLProperty* prop_time = (*ci)->property (X_("time"));
- XMLProperty* prop_note = (*ci)->property (X_("note"));
- XMLProperty* prop_length = (*ci)->property (X_("length"));
- XMLProperty* prop_velocity = (*ci)->property (X_("velocity"));
- XMLProperty* prop_off_velocity = (*ci)->property (X_("off-velocity"));
+ XMLProperty const * prop_channel = (*ci)->property (X_("channel"));
+ XMLProperty const * prop_time = (*ci)->property (X_("time"));
+ XMLProperty const * prop_note = (*ci)->property (X_("note"));
+ XMLProperty const * prop_length = (*ci)->property (X_("length"));
+ XMLProperty const * prop_velocity = (*ci)->property (X_("velocity"));
+ XMLProperty const * prop_off_velocity = (*ci)->property (X_("off-velocity"));
assert (prop_channel);
assert (prop_time);
}
} else if ((*i)->name() == X_("ControlPoint")) {
- XMLProperty* prop_type = (*i)->property (X_("type"));
+ XMLProperty const * prop_type = (*i)->property (X_("type"));
assert(prop_type);
if (prop_type->value () == "track") {
- XMLProperty* prop_route_id = (*i)->property (X_("route-id"));
- XMLProperty* prop_alist_id = (*i)->property (X_("automation-list-id"));
- XMLProperty* prop_parameter = (*i)->property (X_("parameter"));
- XMLProperty* prop_view_index = (*i)->property (X_("view-index"));
+ XMLProperty const * prop_route_id = (*i)->property (X_("route-id"));
+ XMLProperty const * prop_alist_id = (*i)->property (X_("automation-list-id"));
+ XMLProperty const * prop_parameter = (*i)->property (X_("parameter"));
+ XMLProperty const * prop_view_index = (*i)->property (X_("view-index"));
assert (prop_route_id);
assert (prop_alist_id);
add (cps);
}
} else if (prop_type->value () == "region") {
- XMLProperty* prop_region_id = (*i)->property (X_("region-id"));
- XMLProperty* prop_view_index = (*i)->property (X_("view-index"));
+ XMLProperty const * prop_region_id = (*i)->property (X_("region-id"));
+ XMLProperty const * prop_view_index = (*i)->property (X_("view-index"));
if (!prop_region_id || !prop_view_index) {
continue;
}
} else if ((*i)->name() == X_("AudioRange")) {
- XMLProperty* prop_start = (*i)->property (X_("start"));
- XMLProperty* prop_end = (*i)->property (X_("end"));
+ XMLProperty const * prop_start = (*i)->property (X_("start"));
+ XMLProperty const * prop_end = (*i)->property (X_("end"));
assert (prop_start);
assert (prop_end);
} else if ((*i)->name() == X_("AutomationView")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
- XMLProperty* prop_parameter = (*i)->property (X_("parameter"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_parameter = (*i)->property (X_("parameter"));
assert (prop_id);
assert (prop_parameter);
} else if ((*i)->name() == X_("Marker")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
- XMLProperty* prop_start = (*i)->property (X_("start"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_start = (*i)->property (X_("start"));
assert (prop_id);
assert (prop_start);