using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
+using namespace Glib;
void
}
if (route->default_type() == ARDOUR::DataType::AUDIO)
- tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
+ tv = new AudioTimeAxisView (*this, *session, route, *track_canvas);
else if (route->default_type() == ARDOUR::DataType::MIDI)
- tv = new MidiTimeAxisView (*this, *session, route, track_canvas);
+ tv = new MidiTimeAxisView (*this, *session, route, *track_canvas);
else
throw unknown_type();
-
+
+ //cerr << "Editor::handle_new_route() called on " << route->name() << endl;//DEBUG
#if 0
if (route_display_model->children().size() == 0) {
#else
row = *(route_display_model->append ());
#endif
+
+ // cerr << route->name() << " marked for display ? " << tv->marked_for_display() << endl;
row[route_display_columns.text] = route->name();
row[route_display_columns.visible] = tv->marked_for_display();
row[route_display_columns.tv] = tv;
row[route_display_columns.route] = route;
-
+
track_views.push_back (tv);
ignore_route_list_reorder = true;
if (rtv->route()->order_key(N_("editor")) == -1) {
rtv->route()->set_order_key (N_("editor"), route_display_model->children().size()-1);
}
+ rtv->effective_gain_display ();
}
ignore_route_list_reorder = false;
-
+
tv->set_old_order_key (route_display_model->children().size() - 1);
route->gui_changed.connect (mem_fun(*this, &Editor::handle_gui_changes));
if (show_editor_mixer_when_tracks_arrive) {
show_editor_mixer (true);
}
-
- editor_mixer_button.set_sensitive(true);
editor_list_button.set_sensitive(true);
}
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::handle_gui_changes), what, src));
if (what == "track_height") {
+ /* Optional :make tracks change height while it happens, instead
+ of on first-idle
+ */
+ //track_canvas->update_now ();
redisplay_route_list ();
}
-}
+ if (what == "visible_tracks") {
+ redisplay_route_list ();
+ }
+}
void
Editor::remove_route (TimeAxisView *tv)
{
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::remove_route), tv));
+ TrackViewList::iterator i;
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator ri;
- /* find the track view that's being deleted */
- TrackViewList::iterator i = find (track_views.begin(), track_views.end(), tv);
-
- /* set up `nearby' to be a suitable nearby track to select once
- this one has gong */
- TrackViewList::iterator nearby = track_views.end ();
- if (i != track_views.end()) {
-
- nearby = i;
-
- if (nearby != track_views.begin()) {
- /* go to the previous track if there is one */
- nearby--;
- } else {
- /* otherwise the next track */
- nearby++;
- }
-
- /* and remove the track view that's going */
- track_views.erase (i);
+ if (tv == entered_track) {
+ entered_track = 0;
+ }
- if (nearby != track_views.end()) {
- /* we've got another track to select, so select it */
- set_selected_track (**nearby, Selection::Set);
- } else {
- /* we've got no other track, so the editor mixer will disappear */
- editor_mixer_button.set_active (false);
- ActionManager::uncheck_toggleaction ("<Actions>/Editor/show-editor-mixer");
- editor_mixer_button.set_sensitive (false);
- editor_list_button.set_sensitive (false);
+ /* Decrement old order keys for tracks `above' the one that is being removed */
+ for (ri = rows.begin(); ri != rows.end(); ++ri) {
+ TimeAxisView* v = (*ri)[route_display_columns.tv];
+ if (v->old_order_key() > tv->old_order_key()) {
+ v->set_old_order_key (v->old_order_key() - 1);
}
}
break;
}
}
+
+ if ((i = find (track_views.begin(), track_views.end(), tv)) != track_views.end()) {
+ track_views.erase (i);
+ }
+
+ /* since the editor mixer goes away when you remove a route, set the
+ * button to inactive and untick the menu option
+ */
+
+ ActionManager::uncheck_toggleaction ("<Actions>/Editor/show-editor-mixer");
}
void
break;
}
}
+}
+
+void
+Editor::update_route_visibility ()
+{
+ 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];
+ (*i)[route_display_columns.visible] = tv->marked_for_display ();
+ cerr << "marked " << tv->name() << " for display = " << tv->marked_for_display() << endl;
+ }
+
+ no_route_list_redisplay = false;
+ redisplay_route_list ();
}
void
-Editor::hide_track_in_display (TimeAxisView& tv)
+Editor::hide_track_in_display (TimeAxisView& tv, bool temponly)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
for (i = rows.begin(); i != rows.end(); ++i) {
if ((*i)[route_display_columns.tv] == &tv) {
(*i)[route_display_columns.visible] = false;
+ // if (temponly) {
+ tv.set_marked_for_display (false);
+ // }
break;
}
}
uint32_t position;
uint32_t order;
int n;
-
+
if (no_route_list_redisplay) {
return;
}
if (visible) {
tv->set_marked_for_display (true);
position += tv->show_at (position, n, &edit_controls_vbox);
+ tv->clip_to_viewport ();
} else {
tv->hide ();
}
full_canvas_height = position;
- /* make sure the cursors stay on top of every newly added track */
-
- cursor_group->raise_to_top ();
-
- reset_scrolling_region ();
+ vertical_adjustment.set_upper (position + canvas_timebars_vsize);
+ if ((vertical_adjustment.get_value() + canvas_height) > vertical_adjustment.get_upper()) {
+ /*
+ We're increasing the size of the canvas while the bottom is visible.
+ We scroll down to keep in step with the controls layout.
+ */
+ vertical_adjustment.set_value (position + canvas_timebars_vsize - canvas_height);
+ }
if (Config->get_sync_all_route_ordering() && !ignore_route_list_reorder) {
ignore_route_order_sync = true;
otherwise.
*/
- reset_scrolling_region ();
+ //reset_scrolling_region ();
}
void
Editor::build_route_list_menu ()
{
- using namespace Menu_Helpers;
+ using namespace Menu_Helpers;
using namespace Gtk;
route_list_menu = new Menu;
void
Editor::set_all_tracks_visibility (bool yn)
{
- TreeModel::Children rows = route_display_model->children();
+ TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
no_route_list_redisplay = true;
void
Editor::set_all_audio_visibility (int tracks, bool yn)
{
- TreeModel::Children rows = route_display_model->children();
+ TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
no_route_list_redisplay = true;
Editor::route_list_delete (const Gtk::TreeModel::Path& path)
{
session->set_remote_control_ids();
+ ignore_route_list_reorder = true;
redisplay_route_list ();
+ ignore_route_list_reorder = false;
+}
+
+void
+Editor::route_list_display_drag_data_received (const RefPtr<Gdk::DragContext>& context,
+ int x, int y,
+ const SelectionData& data,
+ guint info, guint time)
+{
+ cerr << "RouteLD::dddr target = " << data.get_target() << endl;
+
+ if (data.get_target() == "GTK_TREE_MODEL_ROW") {
+ cerr << "Delete drag data drop to treeview\n";
+ route_list_display.on_drag_data_received (context, x, y, data, info, time);
+ return;
+ }
+ cerr << "some other kind of drag\n";
+ context->drag_finish (true, false, time);
+}
+
+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;
+}
+
+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);
+ }
}