using namespace std;
using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
using namespace PBD;
using namespace Gtk;
using namespace Gtkmm2ext;
, _ignore_reorder (false)
, _no_redisplay (false)
, _adding_routes (false)
+ , _route_deletion_in_progress (false)
, _menu (0)
, old_focus (0)
, selection_countdown (0)
_display.set_headers_visible (true);
_display.get_selection()->set_mode (SELECTION_SINGLE);
_display.get_selection()->set_select_function (sigc::mem_fun (*this, &EditorRoutes::selection_filter));
+ _display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &EditorRoutes::selection_changed));
_display.set_reorderable (true);
_display.set_name (X_("EditGroupList"));
_display.set_rules_hint (true);
active_col->set_fixed_width (30);
active_col->set_alignment (ALIGN_CENTER);
- _model->signal_row_deleted().connect (sigc::mem_fun (*this, &EditorRoutes::route_deleted));
+ _model->signal_row_deleted().connect (sigc::mem_fun (*this, &EditorRoutes::row_deleted));
_model->signal_rows_reordered().connect (sigc::mem_fun (*this, &EditorRoutes::reordered));
_display.signal_button_press_event().connect (sigc::mem_fun (*this, &EditorRoutes::button_press), false);
/* show or hide the TimeAxisView */
if (visible) {
position += tv->show_at (position, n, &_editor->edit_controls_vbox);
- tv->clip_to_viewport ();
} else {
tv->hide ();
}
_editor->reset_controls_layout_height (position);
_editor->reset_controls_layout_width ();
- _editor->full_canvas_height = position + _editor->canvas_timebars_vsize;
- _editor->vertical_adjustment.set_upper (_editor->full_canvas_height);
+ _editor->_full_canvas_height = position;
- if ((_editor->vertical_adjustment.get_value() + _editor->_canvas_height) > _editor->vertical_adjustment.get_upper()) {
+ if ((_editor->vertical_adjustment.get_value() + _editor->_visible_canvas_height) > _editor->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.
*/
- _editor->vertical_adjustment.set_value (_editor->full_canvas_height - _editor->_canvas_height);
+ _editor->vertical_adjustment.set_value (_editor->_full_canvas_height - _editor->_visible_canvas_height);
}
}
void
-EditorRoutes::route_deleted (Gtk::TreeModel::Path const &)
+EditorRoutes::row_deleted (Gtk::TreeModel::Path const &)
{
- /* this happens as the second step of a DnD within the treeview as well
- as when a row/route is actually deleted.
+ /* this happens as the second step of a DnD within the treeview, and
+ when a route is actually removed. we don't differentiate between
+ the two cases.
+
+ note that the sync_orders_keys() step may not actually change any
+ RID's (e.g. the last track may be removed, so all other tracks keep
+ the same RID), which means that no redisplay would happen. so we
+ have to force a redisplay.
*/
+
DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n");
+
+ DisplaySuspender ds;
sync_order_keys_from_treeview ();
}
void
EditorRoutes::reordered (TreeModel::Path const &, TreeModel::iterator const &, int* /*what*/)
{
+ /* reordering implies that RID's will change, so sync_order_keys() will
+ cause a redisplay.
+ */
+
DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview reordered\n");
sync_order_keys_from_treeview ();
}
return;
}
+ DisplaySuspender ds;
TreeIter iter;
if ((iter = _model->get_iter (path))) {
_editor->selection->tracks.clear();
}
- suspend_redisplay ();
+ DisplaySuspender ds;
_display.set_model (Glib::RefPtr<ListStore>());
update_input_active_display ();
update_active_display ();
- resume_redisplay ();
_display.set_model (_model);
/* now update route order keys from the treeview/track display order */
/* Optional :make tracks change height while it happens, instead
of on first-idle
*/
- //update_canvas_now ();
redisplay ();
}
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator ri;
+ bool found = false;
for (ri = rows.begin(); ri != rows.end(); ++ri) {
if ((*ri)[_columns.tv] == tv) {
+ PBD::Unwinder<bool> uw (_route_deletion_in_progress, true);
_model->erase (ri);
+ found = true;
break;
}
}
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i;
- suspend_redisplay ();
+ DisplaySuspender ds ();
for (i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[_columns.tv];
*/
sync_order_keys_from_treeview ();
-
- resume_redisplay ();
}
void
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i;
- suspend_redisplay ();
+ DisplaySuspender ds;
for (i = rows.begin(); i != rows.end(); ++i) {
row[_columns.visible] = false;
}
-
- resume_redisplay ();
-
- /* XXX this seems like a hack and half, but its not clear where to put this
- otherwise.
- */
-
- //reset_scrolling_region ();
}
void
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i;
- suspend_redisplay ();
+ DisplaySuspender ds;
for (i = rows.begin(); i != rows.end(); ++i) {
*/
sync_order_keys_from_treeview ();
-
- resume_redisplay ();
}
void
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i;
- suspend_redisplay ();
+ DisplaySuspender ds;
for (i = rows.begin(); i != rows.end(); ++i) {
*/
sync_order_keys_from_treeview ();
-
- resume_redisplay ();
}
void
//Scroll editor canvas to selected track
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
- // Get the model row.
Gtk::TreeModel::Row row = *_model->get_iter (path);
-
TimeAxisView *tv = row[_columns.tv];
- int y_pos = tv->y_position();
-
- //Clamp the y pos so that we do not extend beyond the canvas full height.
- if (_editor->full_canvas_height - y_pos < _editor->_canvas_height){
- y_pos = _editor->full_canvas_height - _editor->_canvas_height;
- }
-
- //Only scroll to if the track is visible
- if(y_pos != -1){
- _editor->reset_y_origin (y_pos);
+ if (tv) {
+ _editor->ensure_time_axis_view_is_visible (*tv, true);
}
}
return false;
}
+void
+EditorRoutes::selection_changed ()
+{
+ if (_display.get_selection()->count_selected_rows() > 0) {
+
+ TreeIter iter;
+ TreeView::Selection::ListHandle_Path rows = _display.get_selection()->get_selected_rows ();
+ TrackViewList selected;
+
+ _editor->get_selection().clear_regions ();
+
+ for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) {
+
+ if ((iter = _model->get_iter (*i))) {
+
+ TimeAxisView* tv = (*iter)[_columns.tv];
+ selected.push_back (tv);
+ }
+
+ }
+
+ _editor->get_selection().set (selected);
+ _editor->ensure_time_axis_view_is_visible (*(selected.front()), true);
+
+ } else {
+ _editor->get_selection().clear_tracks ();
+ }
+}
+
bool
EditorRoutes::selection_filter (Glib::RefPtr<TreeModel> const &, TreeModel::Path const&, bool /*selected*/)
{
void
EditorRoutes::initial_display ()
{
- suspend_redisplay ();
+ DisplaySuspender ds;
_model->clear ();
if (!_session) {
- resume_redisplay ();
return;
}
_editor->add_routes (r);
}
-
- resume_redisplay ();
}
void
}
}
- suspend_redisplay ();
+ DisplaySuspender ds;
TreeModel::Children rows = _model->children ();
for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView* tv = (*i)[_columns.tv];
(*i)[_columns.visible] = (show.find (tv) != show.end());
}
-
- resume_redisplay ();
}
-