diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-09-05 23:09:10 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-09-05 23:09:10 +0000 |
commit | 222a85ca1074f30d9aea4a770900785d15420a84 (patch) | |
tree | cdca3566f684def1cebb4322dc21ed6a4674c836 /gtk2_ardour/mixer_ui.cc | |
parent | b8e813c455f58150f9c2bd44b2a9d08b4393310b (diff) |
optionally tie together editor+mixer display orders; provide GUI control for timecode-is-synced; make Ctrl-w close any dialog
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2422 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/mixer_ui.cc')
-rw-r--r-- | gtk2_ardour/mixer_ui.cc | 65 |
1 files changed, 61 insertions, 4 deletions
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index b40ace3766..8648574600 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -23,6 +23,7 @@ #include <gtkmm/accelmap.h> #include <pbd/convert.h> +#include <pbd/stacktrace.h> #include <glibmm/thread.h> #include <gtkmm2ext/gtk_ui.h> @@ -58,15 +59,21 @@ using namespace std; using PBD::atoi; + 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"); @@ -92,6 +99,7 @@ Mixer_UI::Mixer_UI () 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<CellRendererToggle*>(track_display.get_column_cell_renderer (1)); track_list_visible_cell->property_activatable() = true; @@ -277,7 +285,7 @@ Mixer_UI::add_strip (Session::RouteList& routes) strip = new MixerStrip (*this, *session, route); strips.push_back (strip); - + if (strip->width_owner() != strip) { strip->set_width (_strip_width, this); } @@ -292,11 +300,14 @@ Mixer_UI::add_strip (Session::RouteList& routes) row[track_columns.visible] = strip->marked_for_display(); 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)); + 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)); @@ -325,6 +336,33 @@ Mixer_UI::remove_strip (MixerStrip* strip) } void +Mixer_UI::sync_order_keys () +{ + vector<int> 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> route = (*ri)[track_columns.route]; + MixerStrip* strip = (*ri)[track_columns.strip]; + neworder[route->order_key (X_("signal"))] = strip->old_order_key (); + } + + ignore_route_reorder = true; + track_model->reorder (neworder); + ignore_route_reorder = false; +} + + +void Mixer_UI::follow_strip_selection () { for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) { @@ -359,7 +397,6 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip) void Mixer_UI::connect_to_session (Session* sess) { - session = sess; XMLNode* node = ARDOUR_UI::instance()->mixer_settings(); @@ -569,6 +606,13 @@ Mixer_UI::hide_all_audiotracks () } 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) { session->set_remote_control_ids(); @@ -602,10 +646,17 @@ Mixer_UI::redisplay_track_list () } bool visible = (*i)[track_columns.visible]; + + boost::shared_ptr<Route> route = (*i)[track_columns.route]; if (visible) { strip->set_marked_for_display (true); - strip->route()->set_order_key (N_("signal"), order); + + if (!ignore_route_reorder) { + strip->route()->set_order_key (N_("signal"), order); + } + + strip->set_old_order_key (order); if (strip->packed()) { @@ -638,6 +689,12 @@ 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 { |