From cc82fc675b096c3dfec76d0c45671b78c85007cf Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 27 Jan 2017 19:18:33 +0100 Subject: remove editor/mixer selection change signals; make editor and mixer use PresentationInfo::Change more correctly; make Selection a bit smarter when setting track selection --- gtk2_ardour/ardour_ui_dependents.cc | 3 - gtk2_ardour/editor.cc | 1 - gtk2_ardour/editor.h | 1 - gtk2_ardour/editor_mixer.cc | 31 -------- gtk2_ardour/editor_ops.cc | 7 +- gtk2_ardour/editor_routes.cc | 130 +++++++++++++++++++++---------- gtk2_ardour/editor_routes.h | 4 +- gtk2_ardour/mixer_ui.cc | 59 ++++++-------- gtk2_ardour/mixer_ui.h | 7 +- gtk2_ardour/public_editor.h | 1 - gtk2_ardour/route_processor_selection.cc | 25 +----- gtk2_ardour/route_processor_selection.h | 5 -- gtk2_ardour/selection.cc | 89 +++++++++++++-------- gtk2_ardour/selection.h | 4 - 14 files changed, 181 insertions(+), 186 deletions(-) diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index a1c264cf01..4ca4648499 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -101,9 +101,6 @@ ARDOUR_UI::we_have_dependents () ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file); - editor->track_mixer_selection (); - mixer->track_editor_selection (); - /* catch up on parameters */ boost::function pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1)); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index e64e079808..c9dab0a0e5 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -578,7 +578,6 @@ Editor::Editor () _summary = new EditorSummary (this); selection->TimeChanged.connect (sigc::mem_fun(*this, &Editor::time_selection_changed)); - selection->TracksChanged.connect (sigc::mem_fun(*this, &Editor::track_selection_changed)); editor_regions_selection_changed_connection = selection->RegionsChanged.connect (sigc::mem_fun(*this, &Editor::region_selection_changed)); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index c2a2566873..2cf7f569fb 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -256,7 +256,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Selection& get_selection() const { return *selection; } bool get_selection_extents (framepos_t &start, framepos_t &end) const; // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes Selection& get_cut_buffer() const { return *cut_buffer; } - void track_mixer_selection (); bool extend_selection_to_track (TimeAxisView&); diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index 0c0348383f..51691136ae 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -285,34 +285,3 @@ Editor::mixer_strip_width_changed () editor_mixer_strip_width = current_mixer_strip->get_width_enum (); } -void -Editor::track_mixer_selection () -{ - Mixer_UI::instance()->selection().RoutesChanged.connect (sigc::mem_fun (*this, &Editor::follow_mixer_selection)); -} - -void -Editor::follow_mixer_selection () -{ - if (_following_mixer_selection) { - return; - } - - _following_mixer_selection = true; - selection->block_tracks_changed (true); - - AxisViewSelection& s (Mixer_UI::instance()->selection().axes); - - selection->clear_tracks (); - - for (AxisViewSelection::iterator i = s.begin(); i != s.end(); ++i) { - TimeAxisView* tav = axis_view_from_stripable ((*i)->stripable()); - if (tav) { - selection->add (tav); - } - } - - _following_mixer_selection = false; - selection->block_tracks_changed (false); - selection->TracksChanged (); /* EMIT SIGNAL */ -} diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index ed83da2d80..4df88b9025 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -7379,10 +7379,10 @@ edit your ardour.rc file to set the\n\ } } - Mixer_UI::instance()->selection().block_routes_changed (true); - selection->block_tracks_changed (true); { + PresentationInfo::ChangeSuspender cs; DisplaySuspender ds; + boost::shared_ptr rl (new RouteList); for (vector >::iterator x = routes.begin(); x != routes.end(); ++x) { rl->push_back (*x); @@ -7393,9 +7393,6 @@ edit your ardour.rc file to set the\n\ * destructors are called, * diskstream drops references, save_state is called (again for every track) */ - selection->block_tracks_changed (false); - Mixer_UI::instance()->selection().block_routes_changed (false); - selection->TracksChanged (); /* EMIT SIGNAL */ } void diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index 27189f29af..016d5432f3 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -77,6 +77,7 @@ struct ColumnInfo { EditorRoutes::EditorRoutes (Editor* e) : EditorComponent (e) , _ignore_reorder (false) + , _ignore_selection_change (false) , _no_redisplay (false) , _adding_routes (false) , _route_deletion_in_progress (false) @@ -252,7 +253,7 @@ EditorRoutes::EditorRoutes (Editor* e) } _display.set_headers_visible (true); - _display.get_selection()->set_mode (SELECTION_SINGLE); + _display.get_selection()->set_mode (SELECTION_MULTIPLE); _display.get_selection()->set_select_function (sigc::mem_fun (*this, &EditorRoutes::selection_filter)); _display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &EditorRoutes::selection_changed)); _display.set_reorderable (true); @@ -318,7 +319,7 @@ EditorRoutes::EditorRoutes (Editor* e) _display.set_enable_search (false); Route::PluginSetup.connect_same_thread (*this, boost::bind (&EditorRoutes::plugin_setup, this, _1, _2, _3)); - PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_treeview_from_presentation_info, this), gui_context()); + PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::presentation_info_changed, this, _1), gui_context()); } bool @@ -925,7 +926,6 @@ EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost: if (what_changed.contains (ARDOUR::Properties::hidden)) { (*i)[_columns.visible] = !stripable->presentation_info().hidden(); - cerr << stripable->name() << " visibility changed, redisplay\n"; redisplay (); } @@ -1093,7 +1093,20 @@ EditorRoutes::sync_presentation_info_from_treeview () } void -EditorRoutes::sync_treeview_from_presentation_info () +EditorRoutes::presentation_info_changed (PropertyChange const & what_changed) +{ + PropertyChange soh; + soh.add (Properties::selected); + soh.add (Properties::order); + soh.add (Properties::hidden); + + if (what_changed.contains (soh)) { + sync_treeview_from_presentation_info (what_changed); + } +} + +void +EditorRoutes::sync_treeview_from_presentation_info (PropertyChange const & what_changed) { /* Some route order key(s) have been changed, make sure that we update out tree/list model and GUI to reflect the change. @@ -1105,53 +1118,85 @@ EditorRoutes::sync_treeview_from_presentation_info () DEBUG_TRACE (DEBUG::OrderKeys, "editor sync model from presentation info.\n"); - vector neworder; + PropertyChange hidden_or_order; + hidden_or_order.add (Properties::hidden); + hidden_or_order.add (Properties::order); + TreeModel::Children rows = _model->children(); - uint32_t old_order = 0; - bool changed = false; - if (rows.empty()) { - return; - } + if (what_changed.contains (hidden_or_order)) { - OrderingKeys sorted; - const size_t cmp_max = rows.size (); + vector neworder; + uint32_t old_order = 0; + bool changed = false; - for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) { - boost::shared_ptr stripable = (*ri)[_columns.stripable]; - /* use global order */ - sorted.push_back (OrderKeys (old_order, stripable, cmp_max)); - } + if (rows.empty()) { + return; + } + + OrderingKeys sorted; + const size_t cmp_max = rows.size (); + + for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) { + boost::shared_ptr stripable = (*ri)[_columns.stripable]; + /* use global order */ + sorted.push_back (OrderKeys (old_order, stripable, cmp_max)); + } + + SortByNewDisplayOrder cmp; - SortByNewDisplayOrder cmp; + sort (sorted.begin(), sorted.end(), cmp); + neworder.assign (sorted.size(), 0); - sort (sorted.begin(), sorted.end(), cmp); - neworder.assign (sorted.size(), 0); + uint32_t n = 0; - uint32_t n = 0; + for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) { - for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) { + neworder[n] = sr->old_display_order; - neworder[n] = sr->old_display_order; + if (sr->old_display_order != n) { + changed = true; + } + } - if (sr->old_display_order != n) { - changed = true; + if (changed) { + Unwinder uw (_ignore_reorder, true); + /* prevent traverse_cells: assertion 'row_path != NULL' + * in case of DnD re-order: row-removed + row-inserted. + * + * The rows (stripables) are not actually removed from the model, + * but only from the display in the DnDTreeView. + * ->reorder() will fail to find the row_path. + * (re-order drag -> remove row -> rync PI from TV -> notify -> sync TV from PI -> crash) + */ + _display.unset_model(); + _model->reorder (neworder); + _display.set_model (_model); } } - if (changed) { - Unwinder uw (_ignore_reorder, true); - /* prevent traverse_cells: assertion 'row_path != NULL' - * in case of DnD re-order: row-removed + row-inserted. - * - * The rows (stripables) are not actually removed from the model, - * but only from the display in the DnDTreeView. - * ->reorder() will fail to find the row_path. - * (re-order drag -> remove row -> rync PI from TV -> notify -> sync TV from PI -> crash) - */ - _display.unset_model(); - _model->reorder (neworder); - _display.set_model (_model); + if (what_changed.contains (Properties::selected)) { + + TrackViewList tvl; + PBD::Unwinder uw (_ignore_selection_change, true); + + /* step one: set the treeview model selection state */ + for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri) { + boost::shared_ptr stripable = (*ri)[_columns.stripable]; + if (stripable && stripable->presentation_info().selected()) { + TimeAxisView* tav = (*ri)[_columns.tv]; + if (tav) { + tvl.push_back (tav); + } + _display.get_selection()->select (*ri); + } else { + _display.get_selection()->unselect (*ri); + } + } + + /* step two: set the Selection (for stripables/routes) */ + + _editor->get_selection().set (tvl); } redisplay (); @@ -1457,6 +1502,10 @@ EditorRoutes::button_press (GdkEventButton* ev) void EditorRoutes::selection_changed () { + if (_ignore_selection_change) { + return; + } + _editor->begin_reversible_selection_op (X_("Select Track from Route List")); if (_display.get_selection()->count_selected_rows() > 0) { @@ -1465,8 +1514,6 @@ EditorRoutes::selection_changed () TreeView::Selection::ListHandle_Path rows = _display.get_selection()->get_selected_rows (); TrackViewList selected; - _editor->get_selection().clear_regions (); - for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) { if ((iter = _model->get_iter (*i))) { @@ -1545,7 +1592,8 @@ EditorRoutes::initial_display () } _editor->add_stripables (s); - sync_treeview_from_presentation_info (); + + sync_treeview_from_presentation_info (Properties::order); } void diff --git a/gtk2_ardour/editor_routes.h b/gtk2_ardour/editor_routes.h index 29e8b45dba..e1bf61e82e 100644 --- a/gtk2_ardour/editor_routes.h +++ b/gtk2_ardour/editor_routes.h @@ -78,7 +78,8 @@ private: void on_tv_solo_safe_toggled (std::string const &); void build_menu (); void show_menu (); - void sync_treeview_from_presentation_info (); + void presentation_info_changed (PBD::PropertyChange const &); + void sync_treeview_from_presentation_info (PBD::PropertyChange const &); void row_deleted (Gtk::TreeModel::Path const &); void visible_changed (std::string const &); void active_changed (std::string const &); @@ -165,6 +166,7 @@ private: int _active_column; bool _ignore_reorder; + bool _ignore_selection_change; bool _no_redisplay; bool _adding_routes; bool _route_deletion_in_progress; diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 4ffa753e0c..5192a90abc 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -107,7 +107,6 @@ Mixer_UI::Mixer_UI () , ignore_reorder (false) , _in_group_rebuild_or_clear (false) , _route_deletion_in_progress (false) - , _following_editor_selection (false) , _maximised (false) , _show_mixer_list (true) , myactions (X_("mixer")) @@ -116,7 +115,7 @@ Mixer_UI::Mixer_UI () load_bindings (); _content.set_data ("ardour-bindings", bindings); - PresentationInfo::Change.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_presentation_info, this), gui_context()); + PresentationInfo::Change.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::presentation_info_changed, this, _1), gui_context()); scroller.set_can_default (true); // set_default (scroller); @@ -384,12 +383,6 @@ Mixer_UI::escape () select_none (); } -void -Mixer_UI::track_editor_selection () -{ - PublicEditor::instance().get_selection().TracksChanged.connect (sigc::mem_fun (*this, &Mixer_UI::follow_editor_selection)); -} - Gtk::Window* Mixer_UI::use_own_window (bool and_fill_it) { @@ -687,6 +680,19 @@ Mixer_UI::remove_strip (MixerStrip* strip) } } +void +Mixer_UI::presentation_info_changed (PropertyChange const & what_changed) +{ + PropertyChange soh; + soh.add (Properties::selected); + soh.add (Properties::order); + soh.add (Properties::hidden); + + if (what_changed.contains (soh)) { + sync_treeview_from_presentation_info (what_changed); + } +} + void Mixer_UI::sync_presentation_info_from_treeview () { @@ -780,7 +786,7 @@ Mixer_UI::sync_presentation_info_from_treeview () } void -Mixer_UI::sync_treeview_from_presentation_info () +Mixer_UI::sync_treeview_from_presentation_info (PropertyChange const & what_changed) { if (!_session || _session->deletion_in_progress()) { return; @@ -831,35 +837,21 @@ Mixer_UI::sync_treeview_from_presentation_info () track_model->reorder (neworder); } - redisplay_track_list (); -} - -void -Mixer_UI::follow_editor_selection () -{ - if (_following_editor_selection) { - return; - } - - _following_editor_selection = true; - _selection.block_routes_changed (true); - - TrackSelection& s (PublicEditor::instance().get_selection().tracks); + if (what_changed.contains (Properties::selected)) { - _selection.clear_routes (); + PresentationInfo::ChangeSuspender cs; - for (TrackViewList::iterator i = s.begin(); i != s.end(); ++i) { - TimeAxisView* tav = dynamic_cast (*i); - if (tav) { - AxisView* axis = axis_by_stripable (tav->stripable()); - if (axis) { - _selection.add (axis); + for (list::const_iterator i = strips.begin(); i != strips.end(); ++i) { + boost::shared_ptr stripable = (*i)->stripable(); + if (stripable && stripable->presentation_info().selected()) { + _selection.add (*i); + } else { + _selection.remove (*i); } } } - _following_editor_selection = false; - _selection.block_routes_changed (false); + redisplay_track_list (); } @@ -1537,8 +1529,7 @@ Mixer_UI::initial_track_display () add_stripables (sl); } - redisplay_track_list (); - sync_treeview_from_presentation_info (); + sync_treeview_from_presentation_info (Properties::order); } void diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index 8e5bbddfd0..a96ce69734 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -86,7 +86,6 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p void show_window (); void set_session (ARDOUR::Session *); - void track_editor_selection (); PluginSelector* plugin_selector(); @@ -337,8 +336,9 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p Width _strip_width; + void presentation_info_changed (PBD::PropertyChange const &); + void sync_treeview_from_presentation_info (PBD::PropertyChange const &); void sync_presentation_info_from_treeview (); - void sync_treeview_from_presentation_info (); bool ignore_reorder; @@ -362,9 +362,6 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p friend class MixerGroupTabs; - void follow_editor_selection (); - bool _following_editor_selection; - void monitor_section_going_away (); void monitor_section_attached (); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index cdae2480ec..64c35e2ecd 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -207,7 +207,6 @@ class PublicEditor : public Gtkmm2ext::Tabbable { virtual Selection& get_selection () const = 0; virtual bool get_selection_extents (framepos_t &start, framepos_t &end) const = 0; virtual Selection& get_cut_buffer () const = 0; - virtual void track_mixer_selection () = 0; virtual bool extend_selection_to_track (TimeAxisView&) = 0; virtual void play_selection () = 0; virtual void play_with_preroll () = 0; diff --git a/gtk2_ardour/route_processor_selection.cc b/gtk2_ardour/route_processor_selection.cc index 7428267b50..6b7592efd4 100644 --- a/gtk2_ardour/route_processor_selection.cc +++ b/gtk2_ardour/route_processor_selection.cc @@ -32,7 +32,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -unsigned int RouteProcessorSelection::_no_route_change_signal = 0; + RouteProcessorSelection::RouteProcessorSelection() { } @@ -71,14 +71,13 @@ RouteProcessorSelection::clear_processors () void RouteProcessorSelection::clear_routes () { + PresentationInfo::ChangeSuspender cs; + for (AxisViewSelection::iterator i = axes.begin(); i != axes.end(); ++i) { (*i)->set_selected (false); } axes.clear (); drop_connections (); - if (0 == _no_route_change_signal) { - RoutesChanged (); - } } void @@ -109,10 +108,6 @@ RouteProcessorSelection::add (AxisView* r) if (ms) { ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context()); } - - if (0 == _no_route_change_signal) { - RoutesChanged(); - } } } @@ -125,9 +120,6 @@ RouteProcessorSelection::remove (AxisView* r) if ((i = find (axes.begin(), axes.end(), r)) != axes.end()) { (*i)->set_selected (false); axes.erase (i); - if (0 == _no_route_change_signal) { - RoutesChanged (); - } } } @@ -149,14 +141,3 @@ RouteProcessorSelection::empty () { return processors.empty () && axes.empty (); } - -void -RouteProcessorSelection::block_routes_changed (bool yn) -{ - if (yn) { - ++_no_route_change_signal; - } else { - assert (_no_route_change_signal > 0); - --_no_route_change_signal; - } -} diff --git a/gtk2_ardour/route_processor_selection.h b/gtk2_ardour/route_processor_selection.h index a4d6f0f1a4..c708723e4d 100644 --- a/gtk2_ardour/route_processor_selection.h +++ b/gtk2_ardour/route_processor_selection.h @@ -37,9 +37,6 @@ class RouteProcessorSelection : public PBD::ScopedConnectionList, public sigc::t RouteProcessorSelection& operator= (const RouteProcessorSelection& other); sigc::signal ProcessorsChanged; - sigc::signal RoutesChanged; - - void block_routes_changed (bool); void clear (); bool empty(); @@ -58,8 +55,6 @@ class RouteProcessorSelection : public PBD::ScopedConnectionList, public sigc::t private: void removed (AxisView*); - static unsigned int _no_route_change_signal; - }; bool operator==(const RouteProcessorSelection& a, const RouteProcessorSelection& b); diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index 98b5d62c10..36a4a087a9 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -57,7 +57,6 @@ Selection::Selection (const PublicEditor* e) : tracks (e) , editor (e) , next_time_id (0) - , _no_tracks_changed (false) { clear (); @@ -132,13 +131,13 @@ void 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(); - } } } @@ -290,9 +289,6 @@ Selection::toggle (TimeAxisView* track) tracks.erase (i); } - if (!_no_tracks_changed) { - TracksChanged(); - } } void @@ -429,19 +425,18 @@ Selection::add (const list >& pllist) } 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 (); - } } } @@ -639,31 +634,18 @@ Selection::remove (TimeAxisView* track) 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(); } } } @@ -797,7 +779,23 @@ void 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); } @@ -805,7 +803,40 @@ void Selection::set (const TrackViewList& track_list) { clear_objects(); //enforce object/range exclusivity - clear_tracks (false); + + PresentationInfo::ChangeSuspender cs; + + if (!tracks.empty()) { + + /* cannot use set::operator== (set 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); } @@ -1551,9 +1582,3 @@ Selection::remove_regions (TimeAxisView* t) i = tmp; } } - -void -Selection::block_tracks_changed (bool yn) -{ - _no_tracks_changed = yn; -} diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h index 8599da70d8..daa81ab1d6 100644 --- a/gtk2_ardour/selection.h +++ b/gtk2_ardour/selection.h @@ -95,7 +95,6 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList // Selection& operator= (const Selection& other); sigc::signal RegionsChanged; - sigc::signal TracksChanged; sigc::signal TimeChanged; sigc::signal LinesChanged; sigc::signal PlaylistsChanged; @@ -104,8 +103,6 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList sigc::signal MidiNotesChanged; sigc::signal MidiRegionsChanged; - void block_tracks_changed (bool); - void clear (); /** check if all selections are empty @@ -231,7 +228,6 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList private: PublicEditor const * editor; uint32_t next_time_id; - bool _no_tracks_changed; }; bool operator==(const Selection& a, const Selection& b); -- cgit v1.2.3