#include "region_view.h"
#include "rgb_macros.h"
#include "keyboard.h"
+#include "editor_routes.h"
+#include "editor_cursors.h"
+#include "mouse_cursors.h"
+#include "route_time_axis.h"
using namespace std;
using namespace ARDOUR;
_moved (false),
_view_rectangle_x (0, 0),
_view_rectangle_y (0, 0),
- _zoom_dragging (false)
+ _zoom_dragging (false),
+ _old_follow_playhead (false)
{
Region::RegionPropertyChanged.connect (region_property_connection, invalidator (*this), boost::bind (&CairoWidget::set_dirty, this), gui_context());
_editor->playhead_cursor->PositionChanged.connect (position_connection, invalidator (*this), ui_bind (&EditorSummary::playhead_position_changed, this, _1), gui_context());
/* compute start and end points for the summary */
- nframes_t const session_length = _session->current_end_frame() - _session->current_start_frame ();
+ framecnt_t const session_length = _session->current_end_frame() - _session->current_start_frame ();
double const theoretical_start = _session->current_start_frame() - session_length * _overhang_fraction;
_start = theoretical_start > 0 ? theoretical_start : 0;
_end = _session->current_end_frame() + session_length * _overhang_fraction;
_zoom_position = get_position (ev->x, ev->y);
_zoom_dragging = true;
_editor->_dragging_playhead = true;
+ _old_follow_playhead = _editor->follow_playhead ();
+ _editor->set_follow_playhead (false);
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
_move_dragging = true;
_moved = false;
_editor->_dragging_playhead = true;
+ _old_follow_playhead = _editor->follow_playhead ();
+ _editor->set_follow_playhead (false);
}
}
{
switch (p) {
case LEFT:
- get_window()->set_cursor (*_editor->left_side_trim_cursor);
+ get_window()->set_cursor (*_editor->_cursors->resize_left);
break;
case LEFT_TOP:
- get_window()->set_cursor (Gdk::Cursor (Gdk::TOP_LEFT_CORNER));
+ get_window()->set_cursor (*_editor->_cursors->resize_top_left);
break;
case TOP:
- get_window()->set_cursor (Gdk::Cursor (Gdk::TOP_SIDE));
+ get_window()->set_cursor (*_editor->_cursors->resize_top);
break;
case RIGHT_TOP:
- get_window()->set_cursor (Gdk::Cursor (Gdk::TOP_RIGHT_CORNER));
+ get_window()->set_cursor (*_editor->_cursors->resize_top_right);
break;
case RIGHT:
- get_window()->set_cursor (*_editor->right_side_trim_cursor);
+ get_window()->set_cursor (*_editor->_cursors->resize_right);
break;
case RIGHT_BOTTOM:
- get_window()->set_cursor (Gdk::Cursor (Gdk::BOTTOM_RIGHT_CORNER));
+ get_window()->set_cursor (*_editor->_cursors->resize_bottom_right);
break;
case BOTTOM:
- get_window()->set_cursor (Gdk::Cursor (Gdk::BOTTOM_SIDE));
+ get_window()->set_cursor (*_editor->_cursors->resize_bottom);
break;
case LEFT_BOTTOM:
- get_window()->set_cursor (Gdk::Cursor (Gdk::BOTTOM_LEFT_CORNER));
+ get_window()->set_cursor (*_editor->_cursors->resize_bottom_left);
break;
case INSIDE:
- get_window()->set_cursor (Gdk::Cursor (Gdk::FLEUR));
+ get_window()->set_cursor (*_editor->_cursors->move);
+ break;
+ case TO_LEFT_OR_RIGHT:
+ get_window()->set_cursor (*_editor->_cursors->expand_left_right);
+ break;
+ case BELOW_OR_ABOVE:
+ get_window()->set_cursor (*_editor->_cursors->expand_up_down);
break;
default:
get_window()->set_cursor ();
}
set_editor (xr, y);
- set_cursor (INSIDE);
+ set_cursor (_start_position);
} else if (_zoom_dragging) {
_move_dragging = false;
_zoom_dragging = false;
_editor->_dragging_playhead = false;
+ _editor->set_follow_playhead (_old_follow_playhead, false);
+
return true;
}
/* see comment in other set_editor () */
return;
}
-
+
set_editor_x (x);
set_editor_y (y);
}
the total height into `total_height' and the height of complete tracks into
`scale height'.
*/
+
+ /* Copy of target range for use below */
pair<double, double> yc = y;
+ /* Total height of all tracks */
double total_height = 0;
+ /* Height of any parts of tracks that aren't fully in the desired range */
+ double partial_height = 0;
+ /* Height of any tracks that are fully in the desired range */
double scale_height = 0;
+
+ _editor->_routes->suspend_redisplay ();
+
for (TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
if ((*i)->hidden()) {
continue;
}
-
+
double const h = (*i)->effective_height ();
+ total_height += h;
- if (yc.first >= 0 && yc.first < _track_height) {
- total_height += (_track_height - yc.first) * h / _track_height;
- } else if (yc.first < 0 && yc.second > _track_height) {
- total_height += h;
+ if (yc.first > 0 && yc.first < _track_height) {
+ partial_height += (_track_height - yc.first) * h / _track_height;
+ } else if (yc.first <= 0 && yc.second >= _track_height) {
scale_height += h;
- } else if (yc.second >= 0 && yc.second < _track_height) {
- total_height += yc.second * h / _track_height;
+ } else if (yc.second > 0 && yc.second < _track_height) {
+ partial_height += yc.second * h / _track_height;
break;
}
yc.second -= _track_height;
}
- /* hence required scale factor of the complete tracks to fit the required y range */
- double const scale = ((_editor->canvas_height() - _editor->get_canvas_timebars_vsize()) - (total_height - scale_height)) / scale_height;
+ /* Height that we will use for scaling; use the whole editor height unless there are not
+ enough tracks to fill it.
+ */
+ double const ch = min (total_height, _editor->canvas_height() - _editor->get_canvas_timebars_vsize());
+
+ /* hence required scale factor of the complete tracks to fit the required y range;
+ the amount of space they should take up divided by the amount they currently take up.
+ */
+ double const scale = (ch - partial_height) / scale_height;
yc = y;
continue;
}
- if (yc.first < 0 && yc.second > _track_height) {
- (*i)->set_height ((*i)->effective_height() * scale);
+ if (yc.first <= 0 && yc.second >= _track_height) {
+ (*i)->set_height (max (TimeAxisView::preset_height (HeightSmall), (uint32_t) ((*i)->effective_height() * scale)));
}
yc.first -= _track_height;
yc.second -= _track_height;
}
+ _editor->_routes->resume_redisplay ();
+
set_editor_y (y.first);
}
return sy;
}
+
+void
+EditorSummary::routes_added (list<RouteTimeAxisView*> const & r)
+{
+ /* Connect to gui_changed() on the routes so that we know when their colour has changed */
+ for (list<RouteTimeAxisView*>::const_iterator i = r.begin(); i != r.end(); ++i) {
+ (*i)->route()->gui_changed.connect (*this, invalidator (*this), ui_bind (&EditorSummary::route_gui_changed, this, _1), gui_context ());
+ }
+
+ set_dirty ();
+}
+
+void
+EditorSummary::route_gui_changed (string c)
+{
+ if (c == "color") {
+ set_dirty ();
+ }
+}