X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mixer.cc;h=09e3764483dc3b93fb502ef77e521d47772dd60d;hb=48de21b1201fdf828c32ab396ac75dc884a96d90;hp=410474114a0c7c8fe38f378327edbea62d4363cd;hpb=17b18acda3447214bd739107d9a46eecfaa6ef70;p=ardour.git diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index 410474114a..09e3764483 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2003-2004 Paul Davis + Copyright (C) 2003-2004 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,221 +15,218 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + +#include #include -#include +#include + +#include "pbd/enumwriter.h" +#include "actions.h" +#include "ardour_ui.h" +#include "audio_time_axis.h" +#include "automation_time_axis.h" #include "editor.h" +#include "editor_routes.h" +#include "editor_route_groups.h" +#include "editor_regions.h" +#include "gui_thread.h" +#include "midi_time_axis.h" #include "mixer_strip.h" -#include "ardour_ui.h" #include "selection.h" -#include "audio_time_axis.h" -#include "actions.h" #include "i18n.h" +using namespace std; +using namespace Gtkmm2ext; +using namespace PBD; + void Editor::editor_mixer_button_toggled () { Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); if (act) { Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - bool yn = tact->get_active(); - cerr << "button toggled, state = " << yn << endl; show_editor_mixer (tact->get_active()); } } void -Editor::cms_deleted () +Editor::editor_list_button_toggled () { - current_mixer_strip = 0; + 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::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()) { - 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)); - break; - } + if (track_views.empty()) { + show_editor_mixer_when_tracks_arrive = true; + return; + } + + 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 { - for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { - AudioTimeAxisView* atv; + } else { + sort_track_selection (); - if ((atv = dynamic_cast (*i)) != 0) { + for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { + RouteTimeAxisView* atv; - 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)); - break; - } + if ((atv = dynamic_cast (*i)) != 0) { + r = atv->route(); + break; } - } + } + if (r) { if (current_mixer_strip == 0) { - return; - } + create_editor_mixer (); + } + + current_mixer_strip->set_route (r); + current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this); } - + 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); - global_hpacker.pack_start (*current_mixer_strip, Gtk::PACK_SHRINK ); global_hpacker.reorder_child (*current_mixer_strip, 0); - - current_mixer_strip->show_all (); + current_mixer_strip->show (); } } 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::set_selected_mixer_strip (TimeAxisView& view) +Editor::ensure_all_elements_drawn () { - AudioTimeAxisView* at; - bool show = false; + controls_layout.queue_draw (); + ruler_label_event_box.queue_draw (); + time_button_event_box.queue_draw (); +} +#endif + +void +Editor::create_editor_mixer () +{ + current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), + _session, + false); + current_mixer_strip->Hiding.connect (sigc::mem_fun(*this, &Editor::current_mixer_strip_hidden)); + current_mixer_strip->WidthChanged.connect (sigc::mem_fun (*this, &Editor::mixer_strip_width_changed)); + +#ifdef GTKOSX + current_mixer_strip->WidthChanged.connect (sigc::mem_fun(*this, &Editor::ensure_all_elements_drawn)); +#endif + current_mixer_strip->set_embedded (true); +} - if (!session || (at = dynamic_cast(&view)) == 0) { +void +Editor::set_selected_mixer_strip (TimeAxisView& view) +{ + if (!_session) { return; } - - if (current_mixer_strip) { - /* might be nothing to do */ + Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); - if (¤t_mixer_strip->route() == &at->route()) { + 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; } - current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), - *session, - at->route()); - current_mixer_strip->GoingAway.connect (mem_fun(*this, &Editor::cms_deleted)); - - if (show) { - show_editor_mixer (true); + if (current_mixer_strip == 0) { + create_editor_mixer (); } -} -void -Editor::update_current_screen () -{ - if (session && engine.running()) { - jack_nframes_t frame; + // if this is an automation track, then we shold the mixer strip should + // show the parent - frame = session->audible_frame(); + boost::shared_ptr route; + AutomationTimeAxisView* atv; - /* only update if the playhead is on screen or we are following it */ + if ((atv = dynamic_cast(&view)) != 0) { - if (_follow_playhead) { + AudioTimeAxisView *parent = dynamic_cast(view.get_parent()); - playhead_cursor->canvas_item.show(); - if (frame != last_update_frame) { + if (parent) { + route = parent->route (); + } - if (frame < leftmost_frame || frame > leftmost_frame + current_page_frames()) { - - if (session->transport_speed() < 0) { - if (frame > (current_page_frames()/2)) { - center_screen (frame-(current_page_frames()/2)); - } else { - center_screen (current_page_frames()/2); - } - } else { - center_screen (frame+(current_page_frames()/2)); - } - } + } else { - playhead_cursor->set_position (frame); - } + AudioTimeAxisView* at = dynamic_cast (&view); + if (at) { + route = at->route(); } 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); - } + MidiTimeAxisView* mt = dynamic_cast (&view); + if (mt) { + route = mt->route(); } } + } - last_update_frame = frame; - - if (current_mixer_strip) { - current_mixer_strip->fast_update (); - } - + if (current_mixer_strip->route() == route) { + return; } -} -void -Editor::current_mixer_strip_removed () -{ - if (current_mixer_strip) { - /* it is being deleted */ - current_mixer_strip = 0; + if (route) { + current_mixer_strip->set_route (route); + current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this); } } void Editor::current_mixer_strip_hidden () { - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - - AudioTimeAxisView* tmp; - - if ((tmp = dynamic_cast(*i)) != 0) { - if (&(tmp->route()) == &(current_mixer_strip->route())) { - (*i)->set_selected (false); - break; - } - } - } - Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); if (act) { Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); @@ -238,66 +235,19 @@ Editor::current_mixer_strip_hidden () } void -Editor::session_going_away () +Editor::maybe_add_mixer_strip_width (XMLNode& node) { - for (vector::iterator i = session_connections.begin(); i != session_connections.end(); ++i) { - (*i).disconnect (); - } - - stop_scrolling (); - selection->clear (); - cut_buffer->clear (); - - clicked_regionview = 0; - clicked_trackview = 0; - clicked_audio_trackview = 0; - clicked_crossfadeview = 0; - entered_regionview = 0; - entered_track = 0; - latest_regionview = 0; - last_update_frame = 0; - drag_info.item = 0; - last_audition_region = 0; - - /* hide all tracks */ - - hide_all_tracks (false); - - /* rip everything out of the list displays */ - - region_list_clear (); // no clear() method in gtkmm 1.2 - route_display_model->clear (); - named_selection_model->clear (); - group_model->clear (); - - edit_cursor_clock.set_session (0); - selection_start_clock.set_session (0); - selection_end_clock.set_session (0); - 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); - /* clear tempo/meter rulers */ - - remove_metric_marks (); - hide_measures (); - clear_marker_display (); - - if (current_bbt_points) { - delete current_bbt_points; - current_bbt_points = 0; + if (current_mixer_strip) { + node.add_property ("mixer-width", enum_2_string (editor_mixer_strip_width)); } +} - /* mixer strip will be deleted all by itself - when its route is deleted. - */ - - current_mixer_strip = 0; - - set_title (_("ardour: editor")); +void +Editor::mixer_strip_width_changed () +{ +#ifdef GTKOSX + ensure_all_elements_drawn (); +#endif - session = 0; + editor_mixer_strip_width = current_mixer_strip->get_width_enum (); }