X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmixer_ui.cc;h=85c5ebce1817f77c0e94afff8322e524abae66f5;hb=74eded425a5244831c80968c1781c3f81f90e996;hp=84fade54726e69085f8fae31c3e50236718e4790;hpb=25d1670a61d19e795227b939a98be9cf5a050c67;p=ardour.git diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 84fade5472..85c5ebce18 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -29,14 +28,15 @@ #include #include #include +#include -#include #include #include #include #include #include +#include "keyboard.h" #include "mixer_ui.h" #include "mixer_strip.h" #include "plugin_selector.h" @@ -58,18 +58,15 @@ using namespace std; using PBD::atoi; -Mixer_UI::Mixer_UI (AudioEngine& eng) - : Window (Gtk::WINDOW_TOPLEVEL), - engine (eng) +Mixer_UI::Mixer_UI () + : Window (Gtk::WINDOW_TOPLEVEL) { _strip_width = Wide; track_menu = 0; mix_group_context_menu = 0; no_track_list_redisplay = false; in_group_row_change = false; - - XMLNode* node = ARDOUR_UI::instance()->mixer_settings(); - set_state (*node); + _visible = false; scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); scroller_base.set_name ("MixerWindow"); @@ -78,12 +75,12 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) strip_packer.pack_end (scroller_base, true, true); scroller.add (strip_packer); - scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC); track_model = ListStore::create (track_columns); track_display.set_model (track_model); track_display.append_column (_("Strips"), track_columns.text); - track_display.append_column (_("Visible"), track_columns.visible); + track_display.append_column (_("Show"), track_columns.visible); track_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); track_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); track_display.get_column (0)->set_expand(true); @@ -109,7 +106,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) group_display.set_model (group_model); group_display.append_column (_("Group"), group_columns.text); group_display.append_column (_("Active"), group_columns.active); - group_display.append_column (_("Visible"), group_columns.visible); + group_display.append_column (_("Show"), group_columns.visible); group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2)); @@ -187,7 +184,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) list_vpacker.pack_start (rhs_pane1, true, true); global_hpacker.pack_start (scroller, true, true); - global_hpacker.pack_start (out_packer, false, false); + global_hpacker.pack_start (out_packer, false, false, 12); list_hpane.add1(list_vpacker); list_hpane.add2(global_hpacker); @@ -201,19 +198,20 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) rhs_pane1.set_data ("collapse-direction", (gpointer) 0); list_hpane.set_data ("collapse-direction", (gpointer) 1); - rhs_pane1.signal_button_release_event().connect (bind (sigc::ptr_fun (pane_handler), static_cast(&rhs_pane1))); - list_hpane.signal_button_release_event().connect (bind (sigc::ptr_fun (pane_handler), static_cast(&list_hpane))); - global_vpacker.pack_start (list_hpane, true, true); add (global_vpacker); set_name ("MixerWindow"); - set_title (_("ardour: mixer")); - set_wmclass (_("ardour_mixer"), "Ardour"); + + WindowTitle title(Glib::get_application_name()); + title += _("Mixer"); + set_title (title.get_string()); + + set_wmclass (X_("ardour_mixer"), "Ardour"); add_accel_group (ActionManager::ui_manager->get_accel_group()); - signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), static_cast(this))); + signal_delete_event().connect (mem_fun (*this, &Mixer_UI::hide_window)); add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); _plugin_selector = new PluginSelector (PluginManager::the_manager()); @@ -221,6 +219,31 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) signal_configure_event().connect (mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); _selection.RoutesChanged.connect (mem_fun(*this, &Mixer_UI::follow_strip_selection)); + + mix_group_display_button_box->show(); + mix_group_add_button->show(); + mix_group_remove_button->show(); + + global_hpacker.show(); + global_vpacker.show(); + scroller.show(); + scroller_base.show(); + scroller_hpacker.show(); + mixer_scroller_vpacker.show(); + list_vpacker.show(); + group_display_button_label.show(); + group_display_button.show(); + track_display_scroller.show(); + group_display_scroller.show(); + group_display_vbox.show(); + track_display_frame.show(); + group_display_frame.show(); + rhs_pane1.show(); + strip_packer.show(); + out_packer.show(); + list_hpane.show(); + track_display.show(); + group_display.show(); } Mixer_UI::~Mixer_UI () @@ -236,7 +259,7 @@ Mixer_UI::ensure_float (Window& win) void Mixer_UI::show_window () { - show_all (); + present (); /* now reset each strips width so the right widgets are shown */ MixerStrip* ms; @@ -246,10 +269,19 @@ Mixer_UI::show_window () for (ri = rows.begin(); ri != rows.end(); ++ri) { ms = (*ri)[track_columns.strip]; - ms->set_width (ms->get_width()); + ms->set_width (ms->get_width(), ms->width_owner()); } + _visible = true; } +bool +Mixer_UI::hide_window (GdkEventAny *ev) +{ + _visible = false; + return just_hide_it(ev, static_cast(this)); +} + + void Mixer_UI::add_strip (Session::RouteList& routes) { @@ -260,14 +292,17 @@ Mixer_UI::add_strip (Session::RouteList& routes) for (Session::RouteList::iterator x = routes.begin(); x != routes.end(); ++x) { boost::shared_ptr route = (*x); - if (route->hidden()) { + if (route->is_hidden()) { return; } strip = new MixerStrip (*this, *session, route); strips.push_back (strip); - strip->set_width (_strip_width); + if (strip->width_owner() != strip) { + strip->set_width (_strip_width, this); + } + show_strip (strip); no_track_list_redisplay = true; @@ -275,14 +310,14 @@ Mixer_UI::add_strip (Session::RouteList& routes) TreeModel::Row row = *(track_model->append()); row[track_columns.text] = route->name(); - row[track_columns.visible] = true; + row[track_columns.visible] = strip->marked_for_display(); row[track_columns.route] = route; row[track_columns.strip] = strip; no_track_list_redisplay = false; redisplay_track_list (); - route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip)); + route->NameChanged.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip)); strip->GoingAway.connect (bind (mem_fun(*this, &Mixer_UI::remove_strip), strip)); strip->signal_button_release_event().connect (bind (mem_fun(*this, &Mixer_UI::strip_button_release_event), strip)); @@ -345,15 +380,21 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip) void Mixer_UI::connect_to_session (Session* sess) { + session = sess; - string wintitle = _("ardour: mixer: "); - wintitle += session->name(); - set_title (wintitle); + XMLNode* node = ARDOUR_UI::instance()->mixer_settings(); + set_state (*node); + + WindowTitle title(session->name()); + title += _("Mixer"); + title += Glib::get_application_name(); + + set_title (title.get_string()); initial_track_display (); - session->going_away.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session)); + session->GoingAway.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session)); session->RouteAdded.connect (mem_fun(*this, &Mixer_UI::add_strip)); session->mix_group_added.connect (mem_fun(*this, &Mixer_UI::add_mix_group)); session->mix_group_removed.connect (mem_fun(*this, &Mixer_UI::mix_groups_changed)); @@ -362,6 +403,10 @@ Mixer_UI::connect_to_session (Session* sess) _plugin_selector->set_session (session); + if (_visible) { + show_window(); + } + start_updating (); } @@ -371,18 +416,23 @@ Mixer_UI::disconnect_from_session () ENSURE_GUI_THREAD(mem_fun(*this, &Mixer_UI::disconnect_from_session)); group_model->clear (); - set_title (_("ardour: mixer")); + _selection.clear (); + + WindowTitle title(Glib::get_application_name()); + title += _("Mixer"); + set_title (title.get_string()); + stop_updating (); } void Mixer_UI::show_strip (MixerStrip* ms) { - TreeModel::Children rows = track_model->children(); + TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; - + for (i = rows.begin(); i != rows.end(); ++i) { - + MixerStrip* strip = (*i)[track_columns.strip]; if (strip == ms) { (*i)[track_columns.visible] = true; @@ -394,7 +444,7 @@ Mixer_UI::show_strip (MixerStrip* ms) void Mixer_UI::hide_strip (MixerStrip* ms) { - TreeModel::Children rows = track_model->children(); + TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; for (i = rows.begin(); i != rows.end(); ++i) { @@ -404,37 +454,37 @@ Mixer_UI::hide_strip (MixerStrip* ms) (*i)[track_columns.visible] = false; break; } - } - } + } +} - gint - Mixer_UI::start_updating () - { - fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips)); - return 0; - } +gint +Mixer_UI::start_updating () +{ + fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips)); + return 0; +} - gint - Mixer_UI::stop_updating () - { - fast_screen_update_connection.disconnect(); - return 0; - } +gint +Mixer_UI::stop_updating () +{ + fast_screen_update_connection.disconnect(); + return 0; +} - void - Mixer_UI::fast_update_strips () - { - if (is_mapped () && session) { - for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - (*i)->fast_update (); - } - } - } +void +Mixer_UI::fast_update_strips () +{ + if (is_mapped () && session) { + for (list::iterator i = strips.begin(); i != strips.end(); ++i) { + (*i)->fast_update (); + } + } +} void Mixer_UI::set_all_strips_visibility (bool yn) { - TreeModel::Children rows = track_model->children(); + TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; no_track_list_redisplay = true; @@ -448,7 +498,7 @@ Mixer_UI::set_all_strips_visibility (bool yn) continue; } - if (strip->route()->master() || strip->route()->control()) { + if (strip->route()->is_master() || strip->route()->is_control()) { continue; } @@ -476,11 +526,11 @@ Mixer_UI::set_all_audio_visibility (int tracks, bool yn) continue; } - if (strip->route()->master() || strip->route()->control()) { + if (strip->route()->is_master() || strip->route()->is_control()) { continue; } - AudioTrack* at = strip->audio_track(); + boost::shared_ptr at = strip->audio_track(); switch (tracks) { case 0: @@ -542,12 +592,14 @@ Mixer_UI::hide_all_audiotracks () void Mixer_UI::track_list_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter) { + session->set_remote_control_ids(); redisplay_track_list (); } void Mixer_UI::track_list_delete (const Gtk::TreeModel::Path& path) { + session->set_remote_control_ids(); redisplay_track_list (); } @@ -578,7 +630,7 @@ Mixer_UI::redisplay_track_list () if (strip->packed()) { - if (strip->route()->master() || strip->route()->control()) { + if (strip->route()->is_master() || strip->route()->is_control()) { out_packer.reorder_child (*strip, -1); } else { strip_packer.reorder_child (*strip, -1); /* put at end */ @@ -586,22 +638,24 @@ Mixer_UI::redisplay_track_list () } else { - if (strip->route()->master() || strip->route()->control()) { + if (strip->route()->is_master() || strip->route()->is_control()) { out_packer.pack_start (*strip, false, false); } else { strip_packer.pack_start (*strip, false, false); } strip->set_packed (true); - strip->show_all (); + //strip->show(); } } else { - if (strip->route()->master() || strip->route()->control()) { + if (strip->route()->is_master() || strip->route()->is_control()) { /* do nothing, these cannot be hidden */ } else { - strip_packer.remove (*strip); - strip->set_packed (false); + if (strip->packed()) { + strip_packer.remove (*strip); + strip->set_packed (false); + } } } } @@ -641,7 +695,7 @@ Mixer_UI::show_track_list_menu () build_track_menu (); } - track_menu->popup (1, 0); + track_menu->popup (1, gtk_get_current_event_time()); } bool @@ -673,7 +727,7 @@ Mixer_UI::track_display_button_press (GdkEventButton* ev) MixerStrip* strip = (*iter)[track_columns.strip]; if (strip) { - if (!strip->route()->master() && !strip->route()->control()) { + if (!strip->route()->is_master() && !strip->route()->is_control()) { bool visible = (*iter)[track_columns.visible]; (*iter)[track_columns.visible] = !visible; } @@ -709,9 +763,9 @@ Mixer_UI::build_track_menu () } void -Mixer_UI::strip_name_changed (void* src, MixerStrip* mx) +Mixer_UI::strip_name_changed (MixerStrip* mx) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::strip_name_changed), src, mx)); + ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::strip_name_changed), mx)); TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator i; @@ -750,7 +804,7 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev) if (mix_group_context_menu == 0) { build_mix_group_context_menu (); } - mix_group_context_menu->popup (1, 0); + mix_group_context_menu->popup (1, ev->time); return true; } @@ -880,6 +934,16 @@ Mixer_UI::group_flags_changed (void* src, RouteGroup* group) } ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::group_flags_changed), src, group)); + + /* force an update of any mixer strips that are using this group, + otherwise mix group names don't change in mixer strips + */ + + for (list::iterator i = strips.begin(); i != strips.end(); ++i) { + if ((*i)->mix_group() == group) { + (*i)->mix_group_changed(0); + } + } TreeModel::iterator i; TreeModel::Children rows = group_model->children(); @@ -991,7 +1055,7 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev) using namespace Menu_Helpers; if (Keyboard::is_context_menu_event (ev)) { - ARDOUR_UI::instance()->add_route(); + ARDOUR_UI::instance()->add_route (this); return true; } @@ -1004,7 +1068,7 @@ Mixer_UI::set_strip_width (Width w) _strip_width = w; for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - (*i)->set_width (w); + (*i)->set_width (w, this); } } @@ -1048,6 +1112,12 @@ Mixer_UI::set_state (const XMLNode& node) } } + if ((prop = node.property ("show-mixer"))) { + if (prop->value() == "yes") { + _visible = true; + } + } + return 0; } @@ -1089,6 +1159,8 @@ Mixer_UI::get_state (void) node->add_property ("narrow-strips", _strip_width == Narrow ? "yes" : "no"); + node->add_property ("show-mixer", _visible ? "yes" : "no"); + return *node; }