#include "region_view.h"
#include "rgb_macros.h"
#include "keyboard.h"
+#include "editor_routes.h"
+#include "editor_cursors.h"
+#include "mouse_cursors.h"
using namespace std;
using namespace ARDOUR;
/* 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;
{
/* how close the mouse has to be to the edge of the view rectangle to be considered `on it',
in pixels */
- int const edge_size = 8;
+
+ int x_edge_size = (_view_rectangle_x.second - _view_rectangle_x.first) / 4;
+ x_edge_size = min (x_edge_size, 8);
+ x_edge_size = max (x_edge_size, 1);
+
+ int y_edge_size = (_view_rectangle_y.second - _view_rectangle_y.first) / 4;
+ y_edge_size = min (y_edge_size, 8);
+ y_edge_size = max (y_edge_size, 1);
- bool const near_left = (std::abs (x - _view_rectangle_x.first) < edge_size);
- bool const near_right = (std::abs (x - _view_rectangle_x.second) < edge_size);
- bool const near_top = (std::abs (y - _view_rectangle_y.first) < edge_size);
- bool const near_bottom = (std::abs (y - _view_rectangle_y.second) < edge_size);
+ bool const near_left = (std::abs (x - _view_rectangle_x.first) < x_edge_size);
+ bool const near_right = (std::abs (x - _view_rectangle_x.second) < x_edge_size);
+ bool const near_top = (std::abs (y - _view_rectangle_y.first) < y_edge_size);
+ bool const near_bottom = (std::abs (y - _view_rectangle_y.second) < y_edge_size);
bool const within_x = _view_rectangle_x.first < x && x < _view_rectangle_x.second;
bool const within_y = _view_rectangle_y.first < y && y < _view_rectangle_y.second;
{
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) {
/* 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);
}
void
-EditorSummary::playhead_position_changed (nframes64_t p)
+EditorSummary::playhead_position_changed (framepos_t p)
{
if (_session && int (p * _x_scale) != int (_last_playhead)) {
set_overlays_dirty ();