X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mixer.cc;h=d6ce61fc487c7cb960626c71805bcf651f60995e;hb=e11b3f90c2d02735a071d526d67cfd0de90cbac3;hp=283db9f862b5a72c04c4c41c61bf93a24b8ec09d;hpb=c38fdbc64c73c686f9f55729b352f8d0f4c09070;p=ardour.git diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index 283db9f862..d6ce61fc48 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -15,10 +15,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ +#include #include +#include + +#include + #include #include "editor.h" @@ -26,13 +30,38 @@ #include "ardour_ui.h" #include "selection.h" #include "audio_time_axis.h" +#include "actions.h" #include "i18n.h" +using namespace Gtkmm2ext; +using namespace PBD; + void Editor::editor_mixer_button_toggled () { - show_editor_mixer (editor_mixer_button.get_active()); + Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + show_editor_mixer (tact->get_active()); + } +} + +void +Editor::editor_list_button_toggled () +{ + Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-list")); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + show_editor_list (tact->get_active()); + } +} + +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 @@ -44,40 +73,37 @@ Editor::cms_deleted () void Editor::show_editor_mixer (bool yn) { + show_editor_mixer_when_tracks_arrive = false; + if (yn) { if (current_mixer_strip == 0) { if (selection->tracks.empty()) { - if (track_views.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 ((atv = dynamic_cast (*i)) != 0) { - - current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), - *session, - atv->route(), false); - - current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::cms_deleted)); + cms_new (atv->route ()); break; } } } else { + + sort_track_selection (); + for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { AudioTimeAxisView* atv; if ((atv = dynamic_cast (*i)) != 0) { - - current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), - *session, - atv->route(), false); - current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::cms_deleted)); + cms_new (atv->route ()); break; } } @@ -90,21 +116,21 @@ Editor::show_editor_mixer (bool yn) } 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); + 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 (); - - global_hpacker.pack_start (*current_mixer_strip, false, false); - global_hpacker.reorder_child (*current_mixer_strip, 0); } } else { if (current_mixer_strip) { - editor_mixer_strip_width = current_mixer_strip->get_width (); + editor_mixer_strip_width = current_mixer_strip->get_width (); if (current_mixer_strip->get_parent() != 0) { global_hpacker.remove (*current_mixer_strip); } @@ -112,13 +138,23 @@ Editor::show_editor_mixer (bool yn) } } +void +Editor::show_editor_list (bool yn) +{ + if (yn) { + the_notebook.show(); + } else { + the_notebook.hide(); + } +} + void Editor::set_selected_mixer_strip (TimeAxisView& view) { - AudioTimeAxisView* at; + RouteTimeAxisView* rt; bool show = false; - if (!session || (at = dynamic_cast(&view)) == 0) { + if (!session || (rt = dynamic_cast(&view)) == 0) { return; } @@ -126,21 +162,20 @@ Editor::set_selected_mixer_strip (TimeAxisView& view) /* might be nothing to do */ - if (¤t_mixer_strip->route() == &at->route()) { + if (current_mixer_strip->route() == rt->route()) { return; } if (current_mixer_strip->get_parent()) { show = true; } - delete current_mixer_strip; current_mixer_strip = 0; } current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), *session, - at->route()); + rt->route(), false); current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::cms_deleted)); if (show) { @@ -148,23 +183,33 @@ Editor::set_selected_mixer_strip (TimeAxisView& view) } } +double current = 0.0; +bool currentInitialized = 0; + void Editor::update_current_screen () { - if (session && engine.running()) { + if (session && session->engine().running()) { - jack_nframes_t frame; + nframes64_t frame; frame = session->audible_frame(); + if (_dragging_playhead) { + goto almost_done; + } + /* only update if the playhead is on screen or we are following it */ - if (_follow_playhead) { + if (_follow_playhead && session->requested_return_frame() < 0) { - gnome_canvas_item_show (playhead_cursor->canvas_item); + //playhead_cursor->canvas_item.show(); if (frame != last_update_frame) { + +#undef CONTINUOUS_SCROLL +#ifndef CONTINUOUS_SCROLL if (frame < leftmost_frame || frame > leftmost_frame + current_page_frames()) { if (session->transport_speed() < 0) { @@ -179,21 +224,45 @@ Editor::update_current_screen () } playhead_cursor->set_position (frame); + +#else // CONTINUOUS_SCROLL + + /* don't do continuous scroll till the new position is in the rightmost quarter of the + editor canvas + */ + + if (session->transport_speed()) { + double target = ((double)frame - (double)current_page_frames()/2.0) / frames_per_unit; + if (target <= 0.0) target = 0.0; + if ( fabs(target - current) < current_page_frames()/frames_per_unit ) { + target = (target * 0.15) + (current * 0.85); + } else { + /* relax */ + } + //printf("frame: %d, cpf: %d, fpu: %6.6f, current: %6.6f, target : %6.6f\n", frame, current_page_frames(), frames_per_unit, current, target ); + current = target; + horizontal_adjustment.set_value ( current ); + } + + playhead_cursor->set_position (frame); + +#endif // CONTINUOUS_SCROLL + } } else { if (frame != last_update_frame) { - if (frame < leftmost_frame || frame > leftmost_frame + current_page_frames()) { - gnome_canvas_item_hide (playhead_cursor->canvas_item); - } else { - playhead_cursor->set_position (frame); - } + playhead_cursor->set_position (frame); } } + almost_done: last_update_frame = frame; - +#ifdef GTKOSX + /*XXX in a perfect world we would not have to do this. */ + track_canvas->update_now(); +#endif if (current_mixer_strip) { current_mixer_strip->fast_update (); } @@ -201,14 +270,6 @@ Editor::update_current_screen () } } -void -Editor::update_slower () -{ - if (current_mixer_strip) { - current_mixer_strip->update (); - } -} - void Editor::current_mixer_strip_removed () { @@ -226,18 +287,25 @@ Editor::current_mixer_strip_hidden () AudioTimeAxisView* tmp; if ((tmp = dynamic_cast(*i)) != 0) { - if (&(tmp->route()) == &(current_mixer_strip->route())) { + if (tmp->route() == current_mixer_strip->route()) { (*i)->set_selected (false); break; } } } - global_hpacker.remove (*current_mixer_strip); + + Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + tact->set_active (false); + } } void Editor::session_going_away () { + _have_idled = false; + for (vector::iterator i = session_connections.begin(); i != session_connections.end(); ++i) { (*i).disconnect (); } @@ -247,16 +315,16 @@ Editor::session_going_away () cut_buffer->clear (); clicked_regionview = 0; - clicked_trackview = 0; - clicked_audio_trackview = 0; + clicked_axisview = 0; + clicked_routeview = 0; clicked_crossfadeview = 0; entered_regionview = 0; entered_track = 0; - latest_regionview = 0; - region_list_display_drag_region = 0; last_update_frame = 0; drag_info.item = 0; - last_audition_region = 0; + last_canvas_frame = 0; + + playhead_cursor->canvas_item.hide (); /* hide all tracks */ @@ -264,14 +332,25 @@ Editor::session_going_away () /* rip everything out of the list displays */ - region_list_clear (); // no clear() method in gtkmm 1.2 - route_list.clear (); - named_selection_display.clear (); - edit_group_list.clear (); + 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)); + + region_list_model->clear (); + route_display_model->clear (); + 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(); - edit_cursor_clock.set_session (0); - selection_start_clock.set_session (0); - selection_end_clock.set_session (0); + edit_point_clock.set_session (0); zoom_range_clock.set_session (0); nudge_clock.set_session (0); @@ -279,8 +358,10 @@ Editor::session_going_away () 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 (); @@ -290,21 +371,25 @@ Editor::session_going_away () current_bbt_points = 0; } - if (embed_audio_item) { - embed_audio_item->set_sensitive (false); - } - - if (import_audio_item) { - import_audio_item->set_sensitive (false); - } - /* mixer strip will be deleted all by itself when its route is deleted. */ current_mixer_strip = 0; - set_title (_("ardour: editor")); + WindowTitle title(Glib::get_application_name()); + title += _("Editor"); + + set_title (title.get_string()); session = 0; } + +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())); + } +} +