X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mixer.cc;h=46b05a20f4e7dfe7929f81d11413a1c2681b7da8;hb=a7f4f660956250cc98cc519321ad5b8e715f9d0f;hp=a85c3a4feb8bf98f35585d505217d937c56f6a86;hpb=7295d8e9f675f4441ab626c0655b2d2e6663e47e;p=ardour.git diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index a85c3a4feb..46b05a20f4 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -21,9 +21,9 @@ #include #include -#include +#include "pbd/enumwriter.h" -#include +#include "ardour/audioengine.h" #include "editor.h" #include "mixer_strip.h" @@ -31,9 +31,13 @@ #include "selection.h" #include "audio_time_axis.h" #include "actions.h" +#include "editor_routes.h" +#include "editor_route_groups.h" +#include "editor_regions.h" #include "i18n.h" +using namespace std; using namespace Gtkmm2ext; using namespace PBD; @@ -57,13 +61,6 @@ Editor::editor_list_button_toggled () } } -void -Editor::cms_new (boost::shared_ptr r) -{ - current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), *session, r); - current_mixer_strip->GoingAway.connect (mem_fun (*this, &Editor::cms_deleted)); -} - void Editor::cms_deleted () { @@ -73,71 +70,94 @@ Editor::cms_deleted () void Editor::show_editor_mixer (bool yn) { + boost::shared_ptr r; + show_editor_mixer_when_tracks_arrive = false; + if (!session) { + show_editor_mixer_when_tracks_arrive = yn; + return; + } + if (yn) { - if (current_mixer_strip == 0) { + if (selection->tracks.empty()) { - if (selection->tracks.empty()) { - - if (track_views.empty()) { - show_editor_mixer_when_tracks_arrive = true; - return; - } - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - AudioTimeAxisView* atv; + if (track_views.empty()) { + show_editor_mixer_when_tracks_arrive = true; + return; + } - if ((atv = dynamic_cast (*i)) != 0) { - cms_new (atv->route ()); - break; - } + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + RouteTimeAxisView* atv; + + if ((atv = dynamic_cast (*i)) != 0) { + r = atv->route(); + break; } + } - } else { + } else { + sort_track_selection (); + + for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { + RouteTimeAxisView* atv; + + if ((atv = dynamic_cast (*i)) != 0) { + r = atv->route(); + break; + } + } + } - sort_track_selection (); + if (r) { + bool created; - for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { - AudioTimeAxisView* atv; + if (current_mixer_strip == 0) { + create_editor_mixer (); + created = true; + } else { + created = false; + } - if ((atv = dynamic_cast (*i)) != 0) { - cms_new (atv->route ()); - break; - } - } + current_mixer_strip->set_route (r); + if (created) { + current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this); } - - if (current_mixer_strip == 0) { - return; - } } if (current_mixer_strip->get_parent() == 0) { - current_mixer_strip->set_embedded (true); - current_mixer_strip->Hiding.connect (mem_fun(*this, &Editor::current_mixer_strip_hidden)); - current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::current_mixer_strip_removed)); - current_mixer_strip->set_width (editor_mixer_strip_width, (void*) this); - global_hpacker.pack_start (*current_mixer_strip, Gtk::PACK_SHRINK ); global_hpacker.reorder_child (*current_mixer_strip, 0); - current_mixer_strip->show_all (); } } else { if (current_mixer_strip) { - editor_mixer_strip_width = current_mixer_strip->get_width (); if (current_mixer_strip->get_parent() != 0) { global_hpacker.remove (*current_mixer_strip); } } } + +#ifdef GTKOSX + /* XXX gtk problem here */ + ensure_all_elements_drawn(); +#endif } +#ifdef GTKOSX +void +Editor::ensure_all_elements_drawn () +{ + controls_layout.queue_draw (); + ruler_label_event_box.queue_draw (); + time_button_event_box.queue_draw (); +} +#endif + void Editor::show_editor_list (bool yn) { @@ -148,52 +168,76 @@ Editor::show_editor_list (bool yn) } } +void +Editor::create_editor_mixer () +{ + current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), + *session, + false); + current_mixer_strip->Hiding.connect (mem_fun(*this, &Editor::current_mixer_strip_hidden)); + current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::current_mixer_strip_removed)); +#ifdef GTKOSX + current_mixer_strip->WidthChanged.connect (mem_fun(*this, &Editor::ensure_all_elements_drawn)); +#endif + current_mixer_strip->set_embedded (true); +} + void Editor::set_selected_mixer_strip (TimeAxisView& view) { - RouteTimeAxisView* rt; - bool show = false; + RouteTimeAxisView* at; + bool created; - if (!session || (rt = dynamic_cast(&view)) == 0) { + if (!session || (at = dynamic_cast(&view)) == 0) { return; } - - if (current_mixer_strip) { - - /* might be nothing to do */ - if (current_mixer_strip->route() == rt->route()) { + Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); + + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + if (!tact || !tact->get_active()) { + /* not showing mixer strip presently */ return; } + } - if (current_mixer_strip->get_parent()) { - show = true; - } - delete current_mixer_strip; - current_mixer_strip = 0; + if (current_mixer_strip == 0) { + create_editor_mixer (); + created = true; + } else { + created = false; } - current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), - *session, - rt->route(), false); - current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::cms_deleted)); + /* might be nothing to do */ + + if (current_mixer_strip->route() == at->route()) { + return; + } - if (show) { - show_editor_mixer (true); + if (created) { + current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this); } + + current_mixer_strip->set_route (at->route()); } double current = 0.0; -bool currentInitialized = 0; void Editor::update_current_screen () { + if (_pending_locate_request) { + /* we don't update things when there's a pending locate request, otherwise + when the editor requests a locate there is a chance that this method + will move the playhead before the locate request is processed, causing + a visual glitch. */ + return; + } + if (session && session->engine().running()) { - nframes_t frame; - - frame = session->audible_frame(); + nframes64_t const frame = session->audible_frame(); if (_dragging_playhead) { goto almost_done; @@ -203,7 +247,7 @@ Editor::update_current_screen () if (_follow_playhead && session->requested_return_frame() < 0) { - playhead_cursor->canvas_item.show(); + //playhead_cursor->canvas_item.show(); if (frame != last_update_frame) { @@ -251,19 +295,13 @@ Editor::update_current_screen () } } else { - if (frame != last_update_frame) { - if (frame < leftmost_frame || frame > leftmost_frame + current_page_frames()) { - playhead_cursor->canvas_item.hide(); - } else { - playhead_cursor->set_position (frame); - } + playhead_cursor->set_position (frame); } } almost_done: last_update_frame = frame; - if (current_mixer_strip) { current_mixer_strip->fast_update (); } @@ -275,7 +313,7 @@ void Editor::current_mixer_strip_removed () { if (current_mixer_strip) { - /* it is being deleted */ + /* it is being deleted elsewhere */ current_mixer_strip = 0; } } @@ -285,9 +323,9 @@ Editor::current_mixer_strip_hidden () { for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - AudioTimeAxisView* tmp; + RouteTimeAxisView* tmp; - if ((tmp = dynamic_cast(*i)) != 0) { + if ((tmp = dynamic_cast(*i)) != 0) { if (tmp->route() == current_mixer_strip->route()) { (*i)->set_selected (false); break; @@ -305,6 +343,8 @@ Editor::current_mixer_strip_hidden () void Editor::session_going_away () { + _have_idled = false; + for (vector::iterator i = session_connections.begin(); i != session_connections.end(); ++i) { (*i).disconnect (); } @@ -320,29 +360,23 @@ Editor::session_going_away () entered_regionview = 0; entered_track = 0; last_update_frame = 0; - drag_info.item = 0; - last_canvas_frame = 0; + _drag = 0; + + playhead_cursor->canvas_item.hide (); /* hide all tracks */ - hide_all_tracks (false); + _routes->hide_all_tracks (false); /* rip everything out of the list displays */ - region_list_display.set_model (Glib::RefPtr(0)); - route_list_display.set_model (Glib::RefPtr(0)); - named_selection_display.set_model (Glib::RefPtr(0)); - edit_group_display.set_model (Glib::RefPtr(0)); + _regions->clear (); + _routes->clear (); + _route_groups->clear (); - region_list_model->clear (); - route_display_model->clear (); + named_selection_display.set_model (Glib::RefPtr(0)); named_selection_model->clear (); - group_model->clear (); - - region_list_display.set_model (region_list_model); - route_list_display.set_model (route_display_model); named_selection_display.set_model (named_selection_model); - edit_group_display.set_model (group_model); edit_point_clock_connection_a.disconnect(); edit_point_clock_connection_b.disconnect(); @@ -351,30 +385,27 @@ Editor::session_going_away () zoom_range_clock.set_session (0); nudge_clock.set_session (0); - /* put editor/mixer toggle button in off position and disable until a new session is loaded */ - - editor_mixer_button.set_active(false); - editor_mixer_button.set_sensitive(false); editor_list_button.set_active(false); editor_list_button.set_sensitive(false); /* clear tempo/meter rulers */ - remove_metric_marks (); hide_measures (); clear_marker_display (); - if (current_bbt_points) { - delete current_bbt_points; - current_bbt_points = 0; + delete current_bbt_points; + current_bbt_points = 0; + + /* get rid of any existing editor mixer strip */ + + if (current_mixer_strip) { + if (current_mixer_strip->get_parent() != 0) { + global_hpacker.remove (*current_mixer_strip); + } + delete current_mixer_strip; + current_mixer_strip = 0; } - /* mixer strip will be deleted all by itself - when its route is deleted. - */ - - current_mixer_strip = 0; - WindowTitle title(Glib::get_application_name()); title += _("Editor"); @@ -387,7 +418,7 @@ void Editor::maybe_add_mixer_strip_width (XMLNode& node) { if (current_mixer_strip) { - node.add_property ("mixer-width", enum_2_string (current_mixer_strip->get_width())); + node.add_property ("mixer-width", enum_2_string (current_mixer_strip->get_width_enum())); } }