summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor.cc')
-rw-r--r--gtk2_ardour/editor.cc247
1 files changed, 150 insertions, 97 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 79895f4067..0d8a589349 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2000-2007 Paul Davis
+ Copyright (C) 2000-2009 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -36,6 +36,7 @@
#include "pbd/error.h"
#include "pbd/enumwriter.h"
#include "pbd/memento_command.h"
+#include "pbd/unknown_type.h"
#include <glibmm/miscutils.h>
#include <gtkmm/image.h>
@@ -97,6 +98,9 @@
#include "editor_drag.h"
#include "editor_group_tabs.h"
#include "automation_time_axis.h"
+#include "editor_route_list.h"
+#include "midi_time_axis.h"
+#include "mixer_strip.h"
#include "i18n.h"
@@ -298,9 +302,6 @@ Editor::Editor ()
_show_measures = true;
_show_waveforms_recording = true;
show_gain_after_trim = false;
- route_redisplay_does_not_sync_order_keys = false;
- route_redisplay_does_not_reset_order_keys = false;
- no_route_list_redisplay = false;
verbose_cursor_on = true;
route_removal = false;
show_automatic_regions_in_region_list = true;
@@ -314,7 +315,6 @@ Editor::Editor ()
editor_ruler_menu = 0;
no_ruler_shown_update = false;
route_group_menu = 0;
- route_list_menu = 0;
region_list_menu = 0;
marker_menu = 0;
start_end_marker_menu = 0;
@@ -531,51 +531,6 @@ Editor::Editor ()
bottom_hbox.set_border_width (2);
bottom_hbox.set_spacing (3);
-
- CellRendererPixbufToggle* rec_col_renderer = Gtk::manage( new CellRendererPixbufToggle() );
-
- rec_col_renderer->set_active_pixbuf(::get_icon("record_normal_red"));
- rec_col_renderer->set_inactive_pixbuf(::get_icon("record_disabled_grey"));
-
- rec_col_renderer->signal_toggled().connect(mem_fun(*this, &Editor::on_tv_rec_enable_toggled));
-
- Gtk::TreeViewColumn* rec_state_column = Gtk::manage(new Gtk::TreeViewColumn("Rec", *rec_col_renderer));
- rec_state_column->add_attribute(rec_col_renderer->property_active(), route_display_columns.rec_enabled);
- rec_state_column->add_attribute(rec_col_renderer->property_visible(), route_display_columns.is_track);
-
- route_display_model = ListStore::create(route_display_columns);
- route_list_display.set_model (route_display_model);
-
- route_list_display.append_column (*rec_state_column);
- route_list_display.append_column (_("Show"), route_display_columns.visible);
- route_list_display.append_column (_("Name"), route_display_columns.text);
-
- route_list_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
- route_list_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
- route_list_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
-
- route_list_display.set_headers_visible (true);
- route_list_display.set_name ("TrackListDisplay");
- route_list_display.get_selection()->set_mode (SELECTION_NONE);
- route_list_display.set_reorderable (true);
- route_list_display.set_rules_hint (true);
- route_list_display.set_size_request (100,-1);
- route_list_display.add_object_drag (route_display_columns.route.index(), "routes");
-
- CellRendererToggle* route_list_visible_cell = dynamic_cast<CellRendererToggle*>(route_list_display.get_column_cell_renderer (1));
-
- route_list_visible_cell->property_activatable() = true;
- route_list_visible_cell->property_radio() = false;
-
- route_display_model->signal_row_deleted().connect (mem_fun (*this, &Editor::route_list_delete));
- route_display_model->signal_row_changed().connect (mem_fun (*this, &Editor::route_list_change));
- route_display_model->signal_rows_reordered().connect (mem_fun (*this, &Editor::route_list_reordered));
-
- route_list_display.signal_button_press_event().connect (mem_fun (*this, &Editor::route_list_display_button_press), false);
-
- route_list_scroller.add (route_list_display);
- route_list_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
-
group_model = ListStore::create(group_columns);
route_group_display.set_model (group_model);
@@ -648,6 +603,7 @@ Editor::Editor ()
group_model->signal_row_changed().connect (mem_fun (*this, &Editor::route_group_row_change));
+ _route_list = new EditorRouteList (this);
route_group_display.set_name ("EditGroupList");
route_group_display.get_selection()->set_mode (SELECTION_SINGLE);
@@ -792,7 +748,7 @@ Editor::Editor ()
the_notebook.append_page (region_list_scroller, *nlabel);
nlabel = manage (new Label (_("Tracks/Busses")));
nlabel->set_angle (-90);
- the_notebook.append_page (route_list_scroller, *nlabel);
+ the_notebook.append_page (_route_list->widget (), *nlabel);
nlabel = manage (new Label (_("Snapshots")));
nlabel->set_angle (-90);
the_notebook.append_page (snapshot_display_scroller, *nlabel);
@@ -916,7 +872,6 @@ Editor::Editor ()
BasicUI::AccessAction.connect (mem_fun (*this, &Editor::access_action));
Config->ParameterChanged.connect (mem_fun (*this, &Editor::parameter_changed));
- Route::SyncOrderKeys.connect (mem_fun (*this, &Editor::sync_order_keys));
_last_normalization_value = 0;
@@ -938,25 +893,11 @@ Editor::~Editor()
}
#endif
+ delete _route_list;
delete track_canvas;
delete _drag;
}
-void
-Editor::on_tv_rec_enable_toggled(const Glib::ustring& path_string){
-
- // Get the model row that has been toggled.
- Gtk::TreeModel::Row row = *route_display_model->get_iter(Gtk::TreeModel::Path(path_string));
-
- TimeAxisView *tv = row[route_display_columns.tv];
- AudioTimeAxisView *atv = dynamic_cast<AudioTimeAxisView*> (tv);
-
- if(atv != 0 && atv->is_audio_track()){
- atv->get_diskstream()->set_record_enabled(!atv->get_diskstream()->record_enabled());
- }
-}
-
-
void
Editor::add_toplevel_controls (Container& cont)
{
@@ -1434,7 +1375,7 @@ Editor::connect_to_session (Session *t)
//tempo_map_changed (Change (0));
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
- initial_route_list_display ();
+ _route_list->initial_display ();
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(static_cast<TimeAxisView*>(*i))->set_samples_per_unit (frames_per_unit);
@@ -1442,30 +1383,6 @@ Editor::connect_to_session (Session *t)
start_scrolling ();
- /* don't show master bus in a new session */
-
- if (ARDOUR_UI::instance()->session_is_new ()) {
-
- TreeModel::Children rows = route_display_model->children();
- TreeModel::Children::iterator i;
-
- no_route_list_redisplay = true;
-
- for (i = rows.begin(); i != rows.end(); ++i) {
- TimeAxisView *tv = (*i)[route_display_columns.tv];
- RouteTimeAxisView *rtv;
-
- if ((rtv = dynamic_cast<RouteTimeAxisView*>(tv)) != 0) {
- if (rtv->route()->is_master()) {
- route_list_display.get_selection()->unselect (i);
- }
- }
- }
-
- no_route_list_redisplay = false;
- redisplay_route_list ();
- }
-
switch (snap_type) {
case SnapToRegionStart:
case SnapToRegionEnd:
@@ -4697,7 +4614,8 @@ void
Editor::use_visual_state (VisualState& vs)
{
no_save_visual = true;
- no_route_list_redisplay = true;
+
+ _route_list->suspend_redisplay ();
vertical_adjustment.set_value (vs.y_position);
@@ -4717,11 +4635,10 @@ Editor::use_visual_state (VisualState& vs)
if (!vs.track_states.empty()) {
- update_route_visibility ();
+ _route_list->update_visibility ();
}
- no_route_list_redisplay = false;
- redisplay_route_list ();
+ _route_list->resume_redisplay ();
no_save_visual = false;
}
@@ -5219,7 +5136,7 @@ Editor::first_idle ()
}
// first idle adds route children (automation tracks), so we need to redisplay here
- redisplay_route_list();
+ _route_list->redisplay ();
delete dialog;
@@ -5328,3 +5245,139 @@ Editor::axis_views_from_routes (list<Route*> r) const
return t;
}
+
+void
+Editor::handle_new_route (RouteList& routes)
+{
+ ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_new_route), routes));
+
+ RouteTimeAxisView *rtv;
+ list<RouteTimeAxisView*> new_views;
+
+ for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+ boost::shared_ptr<Route> route = (*x);
+
+ if (route->is_hidden()) {
+ continue;
+ }
+
+ DataType dt = route->input()->default_type();
+
+ if (dt == ARDOUR::DataType::AUDIO) {
+ rtv = new AudioTimeAxisView (*this, *session, route, *track_canvas);
+ } else if (dt == ARDOUR::DataType::MIDI) {
+ rtv = new MidiTimeAxisView (*this, *session, route, *track_canvas);
+ } else {
+ throw unknown_type();
+ }
+
+ new_views.push_back (rtv);
+ track_views.push_back (rtv);
+
+ rtv->effective_gain_display ();
+
+ rtv->view()->RegionViewAdded.connect (mem_fun (*this, &Editor::region_view_added));
+ rtv->view()->HeightChanged.connect (mem_fun (*this, &Editor::streamview_height_changed));
+
+ rtv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), rtv));
+ }
+
+ _route_list->routes_added (new_views);
+
+ if (show_editor_mixer_when_tracks_arrive) {
+ show_editor_mixer (true);
+ }
+
+ editor_list_button.set_sensitive (true);
+
+ _summary->set_dirty ();
+}
+
+void
+Editor::remove_route (TimeAxisView *tv)
+{
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::remove_route), tv));
+
+ TrackViewList::iterator i;
+ boost::shared_ptr<Route> route;
+ TimeAxisView* next_tv;
+
+ if (tv == entered_track) {
+ entered_track = 0;
+ }
+
+ if ((i = find (track_views.begin(), track_views.end(), tv)) != track_views.end()) {
+
+ i = track_views.erase (i);
+
+ if (track_views.empty()) {
+ next_tv = 0;
+ } else if (i == track_views.end()) {
+ next_tv = track_views.front();
+ } else {
+ next_tv = (*i);
+ }
+ }
+
+ if (current_mixer_strip && current_mixer_strip->route() == route) {
+
+ if (next_tv) {
+ set_selected_mixer_strip (*next_tv);
+ } else {
+ /* make the editor mixer strip go away setting the
+ * button to inactive (which also unticks the menu option)
+ */
+
+ ActionManager::uncheck_toggleaction ("<Actions>/Editor/show-editor-mixer");
+ }
+ }
+}
+
+void
+Editor::hide_track_in_display (TimeAxisView& tv, bool temponly)
+{
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (&tv);
+
+ if (rtv && current_mixer_strip && (rtv->route() == current_mixer_strip->route())) {
+ // this will hide the mixer strip
+ set_selected_mixer_strip (tv);
+ }
+
+ _route_list->hide_track_in_display (tv);
+}
+
+bool
+Editor::sync_track_view_list_and_route_list ()
+{
+ track_views = TrackSelection (_route_list->views ());
+
+ _summary->set_dirty ();
+ _group_tabs->set_dirty ();
+
+ return false; // do not call again (until needed)
+}
+
+void
+Editor::foreach_time_axis_view (sigc::slot<void,TimeAxisView&> theslot)
+{
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+ theslot (**i);
+ }
+}
+
+RouteTimeAxisView*
+Editor::get_route_view_by_id (PBD::ID& id)
+{
+ RouteTimeAxisView* v;
+
+ for(TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+ if((v = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
+ if(v->route()->id() == id) {
+ return v;
+ }
+ }
+ }
+
+ return 0;
+}
+