X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmixer_ui.cc;h=e3f6cae6ac8b4165abb5698c735123997d9f1f9d;hb=29f0d9732eb68fcaa22219cedddddd47bcaa8c17;hp=39d753bf616b4afcd930758037adaf0f9d766a71;hpb=d6ce26e9e30b8455b69c322de25e258c66cf5594;p=ardour.git diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 39d753bf61..e3f6cae6ac 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -28,8 +28,8 @@ #include #include #include +#include -#include #include #include #include @@ -58,16 +58,20 @@ 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) { + session = 0; _strip_width = Wide; track_menu = 0; mix_group_context_menu = 0; no_track_list_redisplay = false; in_group_row_change = false; _visible = false; + ignore_route_reorder = false; + ignore_sync = false; + + Route::SyncOrderKeys.connect (mem_fun (*this, &Mixer_UI::sync_order_keys)); scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); scroller_base.set_name ("MixerWindow"); @@ -93,6 +97,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) track_model->signal_row_deleted().connect (mem_fun (*this, &Mixer_UI::track_list_delete)); track_model->signal_row_changed().connect (mem_fun (*this, &Mixer_UI::track_list_change)); + track_model->signal_rows_reordered().connect (mem_fun (*this, &Mixer_UI::track_list_reorder)); CellRendererToggle* track_list_visible_cell = dynamic_cast(track_display.get_column_cell_renderer (1)); track_list_visible_cell->property_activatable() = true; @@ -203,7 +208,11 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) add (global_vpacker); set_name ("MixerWindow"); - set_title (_("ardour: mixer")); + + 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()); @@ -216,6 +225,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 () @@ -231,7 +265,9 @@ Mixer_UI::ensure_float (Window& win) void Mixer_UI::show_window () { - show_all (); + present (); + + set_window_pos_and_size (); /* now reset each strips width so the right widgets are shown */ MixerStrip* ms; @@ -241,7 +277,7 @@ 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; } @@ -249,6 +285,8 @@ Mixer_UI::show_window () bool Mixer_UI::hide_window (GdkEventAny *ev) { + get_window_pos_and_size (); + _visible = false; return just_hide_it(ev, static_cast(this)); } @@ -264,14 +302,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; @@ -283,10 +324,12 @@ Mixer_UI::add_strip (Session::RouteList& routes) row[track_columns.route] = route; row[track_columns.strip] = strip; + strip->set_old_order_key (track_model->children().size() - 1); + 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)); @@ -314,6 +357,42 @@ Mixer_UI::remove_strip (MixerStrip* strip) } } +const char* +Mixer_UI::get_order_key() +{ + if (Config->get_sync_all_route_ordering()) { + return X_("editor"); + } else { + return X_("signal"); + } +} + +void +Mixer_UI::sync_order_keys () +{ + vector neworder; + TreeModel::Children rows = track_model->children(); + TreeModel::Children::iterator ri; + + if (ignore_sync || !session || (session->state_of_the_state() & Session::Loading) || rows.empty()) { + return; + } + + for (ri = rows.begin(); ri != rows.end(); ++ri) { + neworder.push_back (0); + } + + for (ri = rows.begin(); ri != rows.end(); ++ri) { + boost::shared_ptr route = (*ri)[track_columns.route]; + MixerStrip* strip = (*ri)[track_columns.strip]; + neworder[route->order_key (get_order_key())] = strip->old_order_key (); + } + + ignore_route_reorder = true; + track_model->reorder (neworder); + ignore_route_reorder = false; +} + void Mixer_UI::follow_strip_selection () { @@ -355,9 +434,11 @@ Mixer_UI::connect_to_session (Session* sess) XMLNode* node = ARDOUR_UI::instance()->mixer_settings(); set_state (*node); - string wintitle = _("ardour: mixer: "); - wintitle += session->name(); - set_title (wintitle); + WindowTitle title(session->name()); + title += _("Mixer"); + title += Glib::get_application_name(); + + set_title (title.get_string()); initial_track_display (); @@ -383,7 +464,12 @@ 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 (); } @@ -460,7 +546,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; } @@ -488,11 +574,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: @@ -551,6 +637,13 @@ Mixer_UI::hide_all_audiotracks () set_all_audio_visibility (1, false); } +void +Mixer_UI::track_list_reorder (const TreeModel::Path& path, const TreeModel::iterator& iter, int* new_order) +{ + session->set_remote_control_ids(); + redisplay_track_list (); +} + void Mixer_UI::track_list_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter) { @@ -590,9 +683,13 @@ Mixer_UI::redisplay_track_list () strip->set_marked_for_display (true); strip->route()->set_order_key (N_("signal"), order); + if (!ignore_route_reorder) { + strip->route()->set_order_key (get_order_key(), order); + } + 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 */ @@ -600,18 +697,18 @@ 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 { if (strip->packed()) { @@ -621,12 +718,18 @@ Mixer_UI::redisplay_track_list () } } } + + if (Config->get_sync_all_route_ordering() && !ignore_route_reorder) { + ignore_sync = true; + Route::SyncOrderKeys (); // EMIT SIGNAL + ignore_sync = false; + } } struct SignalOrderRouteSorter { bool operator() (boost::shared_ptr a, boost::shared_ptr b) { /* use of ">" forces the correct sort order */ - return a->order_key ("signal") < b->order_key ("signal"); + return a->order_key (Mixer_UI::get_order_key()) < b->order_key (Mixer_UI::get_order_key()); } }; @@ -689,7 +792,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; } @@ -725,9 +828,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; @@ -1017,7 +1120,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; } @@ -1030,41 +1133,46 @@ 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); } } +void +Mixer_UI::set_window_pos_and_size () +{ + resize (m_width, m_height); + move (m_root_x, m_root_y); +} + + void +Mixer_UI::get_window_pos_and_size () +{ + get_position(m_root_x, m_root_y); + get_size(m_width, m_height); +} int Mixer_UI::set_state (const XMLNode& node) { const XMLProperty* prop; XMLNode* geometry; - Gdk::Geometry g; - int x, y, xoff, yoff; if ((geometry = find_named_node (node, "geometry")) == 0) { - g.base_width = default_width; - g.base_height = default_height; - x = 1; - y = 1; - xoff = 0; - yoff = 21; + m_width = default_width; + m_height = default_height; + m_root_x = 1; + m_root_y = 1; } else { - g.base_width = atoi(geometry->property("x_size")->value().c_str()); - g.base_height = atoi(geometry->property("y_size")->value().c_str()); - x = atoi(geometry->property("x_pos")->value().c_str()); - y = atoi(geometry->property("y_pos")->value().c_str()); - xoff = atoi(geometry->property("x_off")->value().c_str()); - yoff = atoi(geometry->property("y_off")->value().c_str()); + m_width = atoi(geometry->property("x_size")->value().c_str()); + m_height = atoi(geometry->property("y_size")->value().c_str()); + m_root_x = atoi(geometry->property("x_pos")->value().c_str()); + m_root_y = atoi(geometry->property("y_pos")->value().c_str()); } - set_geometry_hints (global_vpacker, g, Gdk::HINT_BASE_SIZE); - set_default_size(g.base_width, g.base_height); - move (x, y); + set_window_pos_and_size (); if ((prop = node.property ("narrow-strips"))) { if (prop->value() == "yes") { @@ -1090,25 +1198,24 @@ Mixer_UI::get_state (void) if (is_realized()) { Glib::RefPtr win = get_window(); - - int x, y, xoff, yoff, width, height; - win->get_root_origin(x, y); - win->get_position(xoff, yoff); - win->get_size(width, height); + + get_window_pos_and_size (); XMLNode* geometry = new XMLNode ("geometry"); char buf[32]; - snprintf(buf, sizeof(buf), "%d", width); + snprintf(buf, sizeof(buf), "%d", m_width); geometry->add_property(X_("x_size"), string(buf)); - snprintf(buf, sizeof(buf), "%d", height); + snprintf(buf, sizeof(buf), "%d", m_height); geometry->add_property(X_("y_size"), string(buf)); - snprintf(buf, sizeof(buf), "%d", x); + snprintf(buf, sizeof(buf), "%d", m_root_x); geometry->add_property(X_("x_pos"), string(buf)); - snprintf(buf, sizeof(buf), "%d", y); + snprintf(buf, sizeof(buf), "%d", m_root_y); geometry->add_property(X_("y_pos"), string(buf)); - snprintf(buf, sizeof(buf), "%d", xoff); + + // written only for compatibility, they are not used. + snprintf(buf, sizeof(buf), "%d", 0); geometry->add_property(X_("x_off"), string(buf)); - snprintf(buf, sizeof(buf), "%d", yoff); + snprintf(buf, sizeof(buf), "%d", 0); geometry->add_property(X_("y_off"), string(buf)); snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast(&rhs_pane1)->gobj()));