#include "pbd/error.h"
#include "pbd/convert.h"
+#include "pbd/stacktrace.h"
#include <gtkmm2ext/doi.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/selector.h>
+#include "canvas/canvas.h"
#include "canvas/rectangle.h"
#include "canvas/debug.h"
, display_menu (0)
, parent (rent)
, selection_group (0)
+ , _ghost_group (0)
, _hidden (false)
, in_destructor (false)
, _size_menu (0)
, _resize_drag_start (-1)
, _preresize_cursor (0)
, _have_preresize_cursor (false)
- , _ghost_group (0)
, _ebox_release_can_act (true)
{
if (extra_height == 0) {
}
_canvas_display = new Group (ed.get_trackview_group (), ArdourCanvas::Duple (0.0, 0.0));
+ CANVAS_DEBUG_NAME (_canvas_display, "main for TAV");
_canvas_display->hide(); // reveal as needed
selection_group = new Group (_canvas_display);
+ CANVAS_DEBUG_NAME (selection_group, "selection for TAV");
selection_group->set_data (X_("timeselection"), (void *) 1);
selection_group->hide();
_ghost_group = new Group (_canvas_display);
+ CANVAS_DEBUG_NAME (_ghost_group, "ghost for TAV");
_ghost_group->lower_to_bottom();
_ghost_group->show();
controls_table.set_no_show_all ();
HSeparator* separator = manage (new HSeparator());
+ separator->set_name("TrackSeparator");
+ separator->set_size_request(-1, 1);
+ separator->show();
controls_vbox.pack_start (controls_table, false, false);
controls_vbox.show ();
+ controls_hbox.pack_start (controls_vbox, true, true);
+ controls_hbox.show ();
+
//controls_ebox.set_name ("TimeAxisViewControlsBaseUnselected");
- controls_ebox.add (controls_vbox);
+ controls_ebox.add (controls_hbox);
controls_ebox.add_events (Gdk::BUTTON_PRESS_MASK|
Gdk::BUTTON_RELEASE_MASK|
Gdk::POINTER_MOTION_MASK|
controls_ebox.signal_leave_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_leave));
controls_ebox.show ();
- controls_hbox.pack_start (controls_ebox, true, true);
- controls_hbox.show ();
-
- time_axis_vbox.pack_start (controls_hbox, true, true);
+ time_axis_vbox.pack_start (controls_ebox, true, true, 0);
time_axis_vbox.pack_end (*separator, false, false);
time_axis_vbox.show();
}
for (list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i) {
- delete (*i)->rect;
+ delete (*i)->rect;
delete (*i)->start_trim;
delete (*i)->end_trim;
{
switch (ev->direction) {
case GDK_SCROLL_UP:
- if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
/* See Editor::_stepping_axis_view for notes on this hack */
Editor& e = dynamic_cast<Editor&> (_editor);
if (!e.stepping_axis_view ()) {
e.stepping_axis_view()->step_height (false);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
- _editor.scroll_tracks_up_line();
+ _editor.scroll_up_one_track();
return true;
}
break;
case GDK_SCROLL_DOWN:
- if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
/* See Editor::_stepping_axis_view for notes on this hack */
Editor& e = dynamic_cast<Editor&> (_editor);
if (!e.stepping_axis_view ()) {
e.stepping_axis_view()->step_height (true);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
- _editor.scroll_tracks_down_line();
+ _editor.scroll_down_one_track();
return true;
}
break;
TimeAxisView::controls_ebox_motion (GdkEventMotion* ev)
{
if (_resize_drag_start >= 0) {
- /* (ab)use the DragManager to do autoscrolling; adjust the event coordinates
- into the world coordinate space that DragManager::motion_handler is expecting,
- and then fake a DragManager motion event so that when maybe_autoscroll
- asks DragManager for the current pointer position it will get the correct
- answers.
+
+ /* (ab)use the DragManager to do autoscrolling - basically we
+ * are pretending that the drag is taking place over the canvas
+ * (which perhaps in the glorious future, when track headers
+ * and the canvas are unified, will actually be true.)
*/
- int tx, ty;
- controls_ebox.translate_coordinates (*control_parent, ev->x, ev->y, tx, ty);
- ev->y = ty;
- _editor.drags()->motion_handler ((GdkEvent *) ev, false);
- _editor.maybe_autoscroll (false, true, false, ev->y_root < _resize_drag_start);
- /* now do the actual TAV resize */
+ _editor.maybe_autoscroll (false, true, true);
+
+ /* now schedule the actual TAV resize */
int32_t const delta = (int32_t) floor (ev->y_root - _resize_drag_start);
_editor.add_to_idle_resize (this, delta);
_resize_drag_start = ev->y_root;
maybe_set_cursor (ev->y);
}
+ gdk_event_request_motions(ev);
return true;
}
/* resize the selection rect */
show_selection (_editor.get_selection().time);
}
+
+ _editor.override_visible_track_count ();
}
bool
* and is in stacked or expanded * region display mode, otherwise 0.
*/
std::pair<TimeAxisView*, double>
-TimeAxisView::covers_y_position (double y)
+TimeAxisView::covers_y_position (double y) const
{
if (hidden()) {
return std::make_pair ((TimeAxisView *) 0, 0);
break;
}
- return std::make_pair (this, l);
+ return std::make_pair (const_cast<TimeAxisView*>(this), l);
}
for (Children::const_iterator i = children.begin(); i != children.end(); ++i) {
return std::make_pair ((TimeAxisView *) 0, 0);
}
+bool
+TimeAxisView::covered_by_y_range (double y0, double y1) const
+{
+ if (hidden()) {
+ return false;
+ }
+
+ /* if either the top or bottom of the axisview is in the vertical
+ * range, we cover it.
+ */
+
+ if ((y0 < _y_position && y1 < _y_position) ||
+ (y0 >= _y_position + height && y1 >= _y_position + height)) {
+ return false;
+ }
+
+ for (Children::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->covered_by_y_range (y0, y1)) {
+ return true;
+ }
+ }
+
+ return true;
+}
uint32_t
TimeAxisView::preset_height (Height h)