: tracks (e)
, editor (e)
, next_time_id (0)
- , _no_tracks_changed (false)
{
clear ();
Selection::clear_tracks (bool with_signal)
{
if (!tracks.empty()) {
+ PresentationInfo::ChangeSuspender cs;
+
for (TrackViewList::iterator x = tracks.begin(); x != tracks.end(); ++x) {
(*x)->set_selected (false);
}
+
tracks.clear ();
- if (!_no_tracks_changed && with_signal) {
- TracksChanged();
- }
}
}
void
Selection::toggle (const TrackViewList& track_list)
{
+ PresentationInfo::ChangeSuspender cs;
+
for (TrackViewList::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
toggle ((*i));
}
TrackSelection::iterator i;
if ((i = find (tracks.begin(), tracks.end(), track)) == tracks.end()) {
- track->set_selected (true);
tracks.push_back (track);
+ track->set_selected (true);
} else {
- track->set_selected (false);
tracks.erase (i);
+ track->set_selected (false);
}
- if (!_no_tracks_changed) {
- TracksChanged();
- }
}
void
}
void
-Selection::add (const TrackViewList& track_list)
+Selection::add (TrackViewList const & track_list)
{
clear_objects(); //enforce object/range exclusivity
+ PresentationInfo::ChangeSuspender cs;
+
TrackViewList added = tracks.add (track_list);
if (!added.empty()) {
for (TrackViewList::iterator x = added.begin(); x != added.end(); ++x) {
(*x)->set_selected (true);
}
- if (!_no_tracks_changed) {
- TracksChanged ();
- }
}
}
if ((i = find (tracks.begin(), tracks.end(), track)) != tracks.end()) {
track->set_selected (false);
tracks.erase (i);
-
- if (!_no_tracks_changed) {
- TracksChanged();
- }
}
}
void
Selection::remove (const TrackViewList& track_list)
{
- bool changed = false;
-
for (TrackViewList::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
TrackViewList::iterator x = find (tracks.begin(), tracks.end(), *i);
if (x != tracks.end()) {
(*i)->set_selected (false);
tracks.erase (x);
- changed = true;
- }
- }
-
- if (changed) {
- if (!_no_tracks_changed) {
- TracksChanged();
}
}
}
Selection::set (TimeAxisView* track)
{
clear_objects (); //enforce object/range exclusivity
- clear_tracks (false);
+
+ PresentationInfo::ChangeSuspender cs;
+
+ if (!tracks.empty()) {
+
+ if (tracks.size() == 1 && tracks.front() == track) {
+ /* already single selection: nothing to do */
+ return;
+ }
+
+ for (TrackViewList::iterator x = tracks.begin(); x != tracks.end(); ++x) {
+ (*x)->set_selected (false);
+ }
+
+ tracks.clear ();
+ }
+
add (track);
}
Selection::set (const TrackViewList& track_list)
{
clear_objects(); //enforce object/range exclusivity
- clear_tracks (false);
+
+ PresentationInfo::ChangeSuspender cs;
+
+ if (!tracks.empty()) {
+
+ /* cannot use set<T>::operator== (set<T> const &) here, because
+ * apparently the ordering used within 2 sets is not
+ * necessarily the same.
+ */
+
+ if (tracks.size() == track_list.size()) {
+ bool missing = false;
+
+ for (TrackViewList::const_iterator x = track_list.begin(); x != track_list.end(); ++x) {
+ if (find (tracks.begin(), tracks.end(), *x) == tracks.end()) {
+ missing = true;
+ }
+ }
+
+ if (!missing) {
+ /* already same selection: nothing to do */
+ return;
+ }
+ }
+
+ /* argument is different from existing selection */
+
+ for (TrackViewList::iterator x = tracks.begin(); x != tracks.end(); ++x) {
+ (*x)->set_selected (false);
+ }
+
+ tracks.clear ();
+ }
+
add (track_list);
}
}
/* midi region views have thir own internal selection. */
- XMLNode* n = NULL;
list<pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > > rid_notes;
editor->get_per_region_note_selection (rid_notes);
- if (!rid_notes.empty()) {
- n = node->add_child (X_("MIDINote"));
- }
+
list<pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > >::iterator rn_it;
for (rn_it = rid_notes.begin(); rn_it != rid_notes.end(); ++rn_it) {
- assert(n); // hint for clang static analysis
- n->add_property (X_("region_id"), atoi((*rn_it).first.to_s().c_str()));
+ XMLNode* n = node->add_child (X_("MIDINotes"));
+ n->add_property (X_("region-id"), atoi((*rn_it).first.to_s().c_str()));
for (std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > >::iterator i = (*rn_it).second.begin(); i != (*rn_it).second.end(); ++i) {
XMLNode* nc = n->add_child(X_("note"));
snprintf(buf, sizeof(buf), "%d", (*i)->id());
- nc->add_property(X_("id"), string(buf));
+ nc->add_property (X_("note-id"), string(buf));
}
}
regions.pending.push_back (id);
}
- } else if ((*i)->name() == X_("MIDINote")) {
+ } else if ((*i)->name() == X_("MIDINotes")) {
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 const * prop_id = (*ci)->property (X_("id"));
- Evoral::event_id_t id = atoi(prop_id->value());
-
- notes.push_back (id);
+ XMLProperty const * prop_id = (*ci)->property (X_("note-id"));
+ if (prop_id) {
+ Evoral::event_id_t id = atoi(prop_id->value());
+ notes.push_back (id);
+ }
}
for (RegionSelection::iterator rsi = rs.begin(); rsi != rs.end(); ++rsi) {
i = tmp;
}
}
-
-void
-Selection::block_tracks_changed (bool yn)
-{
- _no_tracks_changed = yn;
-}