summaryrefslogtreecommitdiff
path: root/gtk2_ardour/mixer_ui.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-09-05 23:09:10 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-09-05 23:09:10 +0000
commit222a85ca1074f30d9aea4a770900785d15420a84 (patch)
treecdca3566f684def1cebb4322dc21ed6a4674c836 /gtk2_ardour/mixer_ui.cc
parentb8e813c455f58150f9c2bd44b2a9d08b4393310b (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.cc65
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 {