X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_routes.cc;h=f6a5cffb0b25a3802e263ec77006719c42b1f226;hb=f974ff594a132fe651a6e620bab3e6f913d697a3;hp=aaa7daf80f074a007d10a8f7b7498ab2a28622ae;hpb=1d28665f86de13de27cfdde2e16e015a73bbb698;p=ardour.git diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index aaa7daf80f..f6a5cffb0b 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -42,6 +42,8 @@ #include "gtkmm2ext/cell_renderer_pixbuf_toggle.h" #include "gtkmm2ext/treeutils.h" +#include "widgets/tooltips.h" + #include "actions.h" #include "ardour_ui.h" #include "audio_time_axis.h" @@ -54,7 +56,6 @@ #include "mixer_strip.h" #include "plugin_setup_dialog.h" #include "route_sorter.h" -#include "tooltips.h" #include "vca_time_axis.h" #include "utils.h" @@ -62,6 +63,7 @@ using namespace std; using namespace ARDOUR; +using namespace ArdourWidgets; using namespace ARDOUR_UI_UTILS; using namespace PBD; using namespace Gtk; @@ -87,7 +89,6 @@ EditorRoutes::EditorRoutes (Editor* e) , _queue_tv_update (0) , _menu (0) , old_focus (0) - , selection_countdown (0) , name_editable (0) { static const int column_width = 22; @@ -194,7 +195,7 @@ EditorRoutes::EditorRoutes (Editor* e) TreeViewColumn* solo_isolate_state_column = manage (new TreeViewColumn("SI", *solo_iso_renderer)); solo_isolate_state_column->add_attribute(solo_iso_renderer->property_state(), _columns.solo_isolate_state); - solo_isolate_state_column->add_attribute(solo_iso_renderer->property_visible(), _columns.solo_visible); + solo_isolate_state_column->add_attribute(solo_iso_renderer->property_visible(), _columns.solo_lock_iso_visible); solo_isolate_state_column->set_sizing(TREE_VIEW_COLUMN_FIXED); solo_isolate_state_column->set_alignment(ALIGN_CENTER); solo_isolate_state_column->set_expand(false); @@ -209,7 +210,7 @@ EditorRoutes::EditorRoutes (Editor* e) TreeViewColumn* solo_safe_state_column = manage (new TreeViewColumn(_("SS"), *solo_safe_renderer)); solo_safe_state_column->add_attribute(solo_safe_renderer->property_state(), _columns.solo_safe_state); - solo_safe_state_column->add_attribute(solo_safe_renderer->property_visible(), _columns.solo_visible); + solo_safe_state_column->add_attribute(solo_safe_renderer->property_visible(), _columns.solo_lock_iso_visible); solo_safe_state_column->set_sizing(TREE_VIEW_COLUMN_FIXED); solo_safe_state_column->set_alignment(ALIGN_CENTER); solo_safe_state_column->set_expand(false); @@ -261,7 +262,6 @@ EditorRoutes::EditorRoutes (Editor* e) _display.set_name (X_("EditGroupList")); _display.set_rules_hint (true); _display.set_size_request (100, -1); - _display.add_object_drag (_columns.stripable.index(), "routes"); CellRendererText* name_cell = dynamic_cast (_display.get_column_cell_renderer (_name_column)); @@ -304,6 +304,7 @@ EditorRoutes::EditorRoutes (Editor* e) active_col->set_sizing (TREE_VIEW_COLUMN_FIXED); active_col->set_fixed_width (30); active_col->set_alignment (ALIGN_CENTER); + active_col->add_attribute (active_cell->property_visible(), _columns.no_vca); _model->signal_row_deleted().connect (sigc::mem_fun (*this, &EditorRoutes::row_deleted)); _model->signal_rows_reordered().connect (sigc::mem_fun (*this, &EditorRoutes::reordered)); @@ -360,7 +361,6 @@ EditorRoutes::enter_notify (GdkEventCrossing*) /* arm counter so that ::selection_filter() will deny selecting anything for the * next two attempts to change selection status. */ - selection_countdown = 2; _scroller.grab_focus (); Keyboard::magic_widget_grab_focus (); return false; @@ -369,8 +369,6 @@ EditorRoutes::enter_notify (GdkEventCrossing*) bool EditorRoutes::leave_notify (GdkEventCrossing*) { - selection_countdown = 0; - if (old_focus) { old_focus->grab_focus (); old_focus = 0; @@ -425,13 +423,13 @@ EditorRoutes::on_tv_rec_enable_changed (std::string const & path_string) Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string)); TimeAxisView* tv = row[_columns.tv]; - RouteTimeAxisView *rtv = dynamic_cast (tv); + StripableTimeAxisView* stv = dynamic_cast (tv); - if (!rtv) { + if (!stv || !stv->stripable()) { return; } - boost::shared_ptr ac = rtv->route()->rec_enable_control(); + boost::shared_ptr ac = stv->stripable()->rec_enable_control(); if (ac) { ac->set_value (!ac->get_value(), Controllable::UseGroup); @@ -443,13 +441,13 @@ EditorRoutes::on_tv_rec_safe_toggled (std::string const & path_string) { Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string)); TimeAxisView* tv = row[_columns.tv]; - RouteTimeAxisView *rtv = dynamic_cast (tv); + StripableTimeAxisView* stv = dynamic_cast (tv); - if (!rtv) { + if (!stv || !stv->stripable()) { return; } - boost::shared_ptr ac (rtv->route()->rec_safe_control()); + boost::shared_ptr ac (stv->stripable()->rec_safe_control()); if (ac) { ac->set_value (!ac->get_value(), Controllable::UseGroup); @@ -463,13 +461,13 @@ EditorRoutes::on_tv_mute_enable_toggled (std::string const & path_string) Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string)); TimeAxisView *tv = row[_columns.tv]; - RouteTimeAxisView *rtv = dynamic_cast (tv); + StripableTimeAxisView* stv = dynamic_cast (tv); - if (!rtv) { + if (!stv || !stv->stripable()) { return; } - boost::shared_ptr ac (rtv->route()->mute_control()); + boost::shared_ptr ac (stv->stripable()->mute_control()); if (ac) { ac->set_value (!ac->get_value(), Controllable::UseGroup); @@ -483,13 +481,13 @@ EditorRoutes::on_tv_solo_enable_toggled (std::string const & path_string) Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string)); TimeAxisView *tv = row[_columns.tv]; - RouteTimeAxisView* rtv = dynamic_cast (tv); + StripableTimeAxisView* stv = dynamic_cast (tv); - if (!rtv) { + if (!stv || !stv->stripable()) { return; } - boost::shared_ptr ac (rtv->route()->solo_control()); + boost::shared_ptr ac (stv->stripable()->solo_control()); if (ac) { ac->set_value (!ac->get_value(), Controllable::UseGroup); @@ -503,13 +501,13 @@ EditorRoutes::on_tv_solo_isolate_toggled (std::string const & path_string) Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string)); TimeAxisView *tv = row[_columns.tv]; - RouteTimeAxisView* rtv = dynamic_cast (tv); + StripableTimeAxisView* stv = dynamic_cast (tv); - if (!rtv) { + if (!stv || !stv->stripable()) { return; } - boost::shared_ptr ac (rtv->route()->solo_isolate_control()); + boost::shared_ptr ac (stv->stripable()->solo_isolate_control()); if (ac) { ac->set_value (!ac->get_value(), Controllable::UseGroup); @@ -523,13 +521,13 @@ EditorRoutes::on_tv_solo_safe_toggled (std::string const & path_string) Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string)); TimeAxisView *tv = row[_columns.tv]; - RouteTimeAxisView* rtv = dynamic_cast (tv); + StripableTimeAxisView* stv = dynamic_cast (tv); - if (!rtv) { + if (!stv || !stv->stripable()) { return; } - boost::shared_ptr ac (rtv->route()->solo_safe_control()); + boost::shared_ptr ac (stv->stripable()->solo_safe_control()); if (ac) { ac->set_value (!ac->get_value(), Controllable::UseGroup); @@ -551,10 +549,10 @@ EditorRoutes::build_menu () items.push_back (MenuElem (_("Hide All"), sigc::mem_fun (*this, &EditorRoutes::hide_all_routes))); items.push_back (MenuElem (_("Show All Audio Tracks"), sigc::mem_fun (*this, &EditorRoutes::show_all_audiotracks))); items.push_back (MenuElem (_("Hide All Audio Tracks"), sigc::mem_fun (*this, &EditorRoutes::hide_all_audiotracks))); - items.push_back (MenuElem (_("Show All Audio Busses"), sigc::mem_fun (*this, &EditorRoutes::show_all_audiobus))); - items.push_back (MenuElem (_("Hide All Audio Busses"), sigc::mem_fun (*this, &EditorRoutes::hide_all_audiobus))); items.push_back (MenuElem (_("Show All Midi Tracks"), sigc::mem_fun (*this, &EditorRoutes::show_all_miditracks))); items.push_back (MenuElem (_("Hide All Midi Tracks"), sigc::mem_fun (*this, &EditorRoutes::hide_all_miditracks))); + items.push_back (MenuElem (_("Show All Busses"), sigc::mem_fun (*this, &EditorRoutes::show_all_audiobus))); + items.push_back (MenuElem (_("Hide All Busses"), sigc::mem_fun (*this, &EditorRoutes::hide_all_audiobus))); items.push_back (MenuElem (_("Only Show Tracks with Regions Under Playhead"), sigc::mem_fun (*this, &EditorRoutes::show_tracks_with_regions_at_playhead))); } @@ -749,6 +747,7 @@ EditorRoutes::time_axis_views_added (list tavs) row[_columns.is_track] = false; row[_columns.is_input_active] = false; row[_columns.is_midi] = false; + row[_columns.no_vca] = false; } else if (rtav) { @@ -756,6 +755,7 @@ EditorRoutes::time_axis_views_added (list tavs) midi_trk= boost::dynamic_pointer_cast (stripable); row[_columns.is_track] = (boost::dynamic_pointer_cast (stripable) != 0); + row[_columns.no_vca] = true; if (midi_trk) { row[_columns.is_input_active] = midi_trk->input_active (); @@ -777,7 +777,8 @@ EditorRoutes::time_axis_views_added (list tavs) row[_columns.stripable] = stripable; row[_columns.mute_state] = RouteUI::mute_active_state (_session, stripable); row[_columns.solo_state] = RouteUI::solo_active_state (stripable); - row[_columns.solo_visible] = true; + row[_columns.solo_visible] = !stripable->is_master (); + row[_columns.solo_lock_iso_visible] = row[_columns.solo_visible] && row[_columns.no_vca]; row[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (stripable); row[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (stripable); row[_columns.name_editable] = true; @@ -949,8 +950,7 @@ EditorRoutes::update_visibility () (*i)[_columns.visible] = tv->marked_for_display (); } - /* force route order keys catch up with visibility changes - */ + /* force route order keys catch up with visibility changes */ sync_presentation_info_from_treeview (); } @@ -1003,19 +1003,17 @@ EditorRoutes::sync_presentation_info_from_treeview () DEBUG_TRACE (DEBUG::OrderKeys, "editor sync presentation info from treeview\n"); - TreeModel::Children::iterator ri; bool change = false; PresentationInfo::order_t order = 0; - TreeOrderKeys sorted; - PresentationInfo::ChangeSuspender cs; - for (ri = rows.begin(); ri != rows.end(); ++ri) { + for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri) { boost::shared_ptr stripable = (*ri)[_columns.stripable]; bool visible = (*ri)[_columns.visible]; #ifndef NDEBUG // these should not exist in the treeview + assert (stripable); if (stripable->is_monitor() || stripable->is_auditioner()) { assert (0); continue; @@ -1028,8 +1026,6 @@ EditorRoutes::sync_presentation_info_from_treeview () stripable->set_presentation_order (order); change = true; } - - sorted.push_back (TreeOrderKey (order, stripable)); ++order; } @@ -1059,11 +1055,11 @@ EditorRoutes::sync_treeview_from_presentation_info (PropertyChange const & what_ TreeModel::Children rows = _model->children(); - if (what_changed.contains (hidden_or_order)) { + bool changed = false; + if (what_changed.contains (hidden_or_order)) { vector neworder; uint32_t old_order = 0; - bool changed = false; if (rows.empty()) { return; @@ -1110,24 +1106,16 @@ EditorRoutes::sync_treeview_from_presentation_info (PropertyChange const & what_ } } - if (what_changed.contains (Properties::selected)) { - + if (changed || what_changed.contains (Properties::selected)) { /* by the time this is invoked, the GUI Selection model has * already updated itself. */ - - TrackViewList tvl; PBD::Unwinder uw (_ignore_selection_change, true); /* 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->is_selected()) { - TimeAxisView* tav = (*ri)[_columns.tv]; - if (tav) { - tvl.push_back (tav); - } _display.get_selection()->select (*ri); } else { _display.get_selection()->unselect (*ri); @@ -1476,21 +1464,9 @@ EditorRoutes::selection_changed () bool EditorRoutes::selection_filter (Glib::RefPtr const& model, TreeModel::Path const& path, bool /*selected*/) { - if (selection_countdown) { - if (--selection_countdown == 0) { - return true; - } else { - /* no selection yet ... */ - return false; - } - } - TreeModel::iterator iter = model->get_iter (path); if (iter) { boost::shared_ptr stripable = (*iter)[_columns.stripable]; - if (boost::dynamic_pointer_cast (stripable)) { - return false; - } } return true; @@ -1501,7 +1477,7 @@ EditorRoutes::initial_display () { if (!_session) { - _model->clear (); + clear (); return; } @@ -1510,35 +1486,12 @@ EditorRoutes::initial_display () StripableList s; - RouteList r (*_session->get_routes()); - for (RouteList::iterator ri = r.begin(); ri != r.end(); ++ri) { - s.push_back (*ri); - } - - VCAList v (_session->vca_manager().vcas()); - for (VCAList::iterator vi = v.begin(); vi != v.end(); ++vi) { - s.push_back (*vi); - } - + _session->get_stripables (s); _editor->add_stripables (s); sync_treeview_from_presentation_info (Properties::order); } -void -EditorRoutes::display_drag_data_received (const RefPtr& context, - int x, int y, - const SelectionData& data, - guint info, guint time) -{ - if (data.get_target() == "GTK_TREE_MODEL_ROW") { - _display.on_drag_data_received (context, x, y, data, info, time); - return; - } - - context->drag_finish (true, false, time); -} - struct ViewStripable { TimeAxisView* tav; boost::shared_ptr stripable; @@ -1820,7 +1773,7 @@ EditorRoutes::solo_changed_so_update_mute () void EditorRoutes::show_tracks_with_regions_at_playhead () { - boost::shared_ptr const r = _session->get_routes_with_regions_at (_session->transport_frame ()); + boost::shared_ptr const r = _session->get_routes_with_regions_at (_session->transport_sample ()); set show; for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {