X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mixer.cc;h=0109aa38c1107bd04f1b550e0785b17da6b35ee5;hb=5fcfee7f4dbc315c56ce0e84045caddc1fe1b69e;hp=8cffd5c64b357368045662f6486db103a8dc83a8;hpb=2c16f7aa7f7b78e84399d9ed0d8cf99a84d09eb6;p=ardour.git diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index 8cffd5c64b..0109aa38c1 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -17,22 +17,32 @@ */ +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + #include +#include #include #include #include "pbd/enumwriter.h" -#include "editor.h" -#include "mixer_strip.h" +#include "ardour/rc_configuration.h" + +#include "actions.h" #include "ardour_ui.h" -#include "selection.h" #include "audio_time_axis.h" -#include "actions.h" -#include "editor_routes.h" +#include "automation_time_axis.h" +#include "editor.h" #include "editor_route_groups.h" #include "editor_regions.h" #include "gui_thread.h" +#include "midi_time_axis.h" +#include "mixer_strip.h" +#include "mixer_ui.h" +#include "selection.h" +#include "ui_config.h" #include "i18n.h" @@ -67,6 +77,28 @@ Editor::show_editor_mixer (bool yn) show_editor_mixer_when_tracks_arrive = false; + if (yn) { + Gtk::Window* toplevel = current_toplevel(); + Glib::RefPtr win; + Glib::RefPtr screen; + + if (toplevel) { + win = toplevel->get_window(); + } + + if (win) { + screen = win->get_screen(); + } else { + screen = Gdk::Screen::get_default(); + } + + if (g_getenv ("ARDOUR_LOVES_STUPID_TINY_SCREENS") == 0 && screen && screen->get_height() < 700) { + Gtk::MessageDialog msg (_("This screen is not tall enough to display the editor mixer")); + msg.run (); + return; + } + } + if (!_session) { show_editor_mixer_when_tracks_arrive = yn; return; @@ -91,7 +123,7 @@ Editor::show_editor_mixer (bool yn) } } else { - sort_track_selection (); + sort_track_selection (selection->tracks); for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { RouteTimeAxisView* atv; @@ -107,15 +139,17 @@ Editor::show_editor_mixer (bool yn) if (current_mixer_strip == 0) { 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) { + if (current_mixer_strip && current_mixer_strip->get_parent() == 0) { 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 (); + } + + if (r) { + current_mixer_strip->set_route (r); + current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this); } } else { @@ -127,42 +161,39 @@ Editor::show_editor_mixer (bool yn) } } -#ifdef GTKOSX +#ifdef __APPLE__ /* XXX gtk problem here */ ensure_all_elements_drawn(); #endif } -#ifdef GTKOSX +#ifdef __APPLE__ void Editor::ensure_all_elements_drawn () { controls_layout.queue_draw (); - ruler_label_event_box.queue_draw (); - time_button_event_box.queue_draw (); + time_bars_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 = 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 +#ifdef __APPLE__ current_mixer_strip->WidthChanged.connect (sigc::mem_fun(*this, &Editor::ensure_all_elements_drawn)); #endif current_mixer_strip->set_embedded (true); + } void Editor::set_selected_mixer_strip (TimeAxisView& view) { - RouteTimeAxisView* at; - - if (!_session || (at = dynamic_cast(&view)) == 0) { + if (!_session) { return; } @@ -180,31 +211,48 @@ Editor::set_selected_mixer_strip (TimeAxisView& view) create_editor_mixer (); } - /* might be nothing to do */ - if (current_mixer_strip->route() == at->route()) { - return; - } + // if this is an automation track, then we shold the mixer strip should + // show the parent - current_mixer_strip->set_route (at->route()); - current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this); -} + boost::shared_ptr route; + AutomationTimeAxisView* atv; -void -Editor::current_mixer_strip_hidden () -{ - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + if ((atv = dynamic_cast(&view)) != 0) { + + AudioTimeAxisView *parent = dynamic_cast(view.get_parent()); + + if (parent) { + route = parent->route (); + } + + } else { - RouteTimeAxisView* tmp; + AudioTimeAxisView* at = dynamic_cast (&view); - if ((tmp = dynamic_cast(*i)) != 0) { - if (tmp->route() == current_mixer_strip->route()) { - (*i)->set_selected (false); - break; + if (at) { + route = at->route(); + } else { + MidiTimeAxisView* mt = dynamic_cast (&view); + if (mt) { + route = mt->route(); } } } + if (current_mixer_strip->route() == route) { + return; + } + + 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 () +{ Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); if (act) { Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); @@ -216,7 +264,48 @@ 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_enum())); + node.add_property ("mixer-width", enum_2_string (editor_mixer_strip_width)); } } +void +Editor::mixer_strip_width_changed () +{ +#ifdef __APPLE__ + ensure_all_elements_drawn (); +#endif + + 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); + + RouteUISelection& s (Mixer_UI::instance()->selection().routes); + + selection->clear_tracks (); + + for (RouteUISelection::iterator i = s.begin(); i != s.end(); ++i) { + TimeAxisView* tav = get_route_view_by_route_id ((*i)->route()->id()); + if (tav) { + selection->add (tav); + } + } + + _following_mixer_selection = false; + selection->block_tracks_changed (false); + selection->TracksChanged (); /* EMIT SIGNAL */ +}