make rendering of the editor summary view a bit more efficient, enable key event handling there and make "p" do what it does in the main canvas (position the playhead) - this needs to be dynamic to follow bindings eventually

git-svn-id: svn://localhost/ardour2/branches/3.0@13073 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis
2012-07-24 02:58:28 +00:00
parent 6805a33f82
commit 4bcc3d377c
2 changed files with 98 additions and 55 deletions

View File

@@ -18,6 +18,7 @@
*/
#include "ardour/session.h"
#include "time_axis_view.h"
#include "streamview.h"
#include "editor_summary.h"
@@ -56,7 +57,8 @@ EditorSummary::EditorSummary (Editor* e)
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), boost::bind (&EditorSummary::playhead_position_changed, this, _1), gui_context());
add_events (Gdk::POINTER_MOTION_MASK);
add_events (Gdk::POINTER_MOTION_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
set_flags (get_flags() | Gtk::CAN_FOCUS);
}
/** Connect to a session.
@@ -80,57 +82,6 @@ EditorSummary::set_session (Session* s)
}
}
/** Handle an expose event.
* @param event Event from GTK.
*/
bool
EditorSummary::on_expose_event (GdkEventExpose* event)
{
CairoWidget::on_expose_event (event);
if (_session == 0) {
return false;
}
cairo_t* cr = gdk_cairo_create (get_window()->gobj());
/* Render the view rectangle. If there is an editor visual pending, don't update
the view rectangle now --- wait until the expose event that we'll get after
the visual change. This prevents a flicker.
*/
if (_editor->pending_visual_change.idle_handler_id < 0) {
get_editor (&_view_rectangle_x, &_view_rectangle_y);
}
cairo_move_to (cr, _view_rectangle_x.first, _view_rectangle_y.first);
cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.first);
cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.second);
cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.second);
cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.first);
cairo_set_source_rgba (cr, 1, 1, 1, 0.25);
cairo_fill_preserve (cr);
cairo_set_line_width (cr, 1);
cairo_set_source_rgba (cr, 1, 1, 1, 0.5);
cairo_stroke (cr);
/* Playhead */
cairo_set_line_width (cr, 1);
/* XXX: colour should be set from configuration file */
cairo_set_source_rgba (cr, 1, 0, 0, 1);
double const p = playhead_frame_to_position (_editor->playhead_cursor->current_frame);
cairo_move_to (cr, p, 0);
cairo_line_to (cr, p, get_height());
cairo_stroke (cr);
_last_playhead = p;
cairo_destroy (cr);
return true;
}
/** Render the required regions to a cairo context.
* @param cr Context.
*/
@@ -212,7 +163,7 @@ EditorSummary::render (cairo_t* cr)
cairo_set_line_width (cr, 1);
cairo_set_source_rgb (cr, 1, 1, 0);
double const p = (_session->current_start_frame() - _start) * _x_scale;
const double p = (_session->current_start_frame() - _start) * _x_scale;
cairo_move_to (cr, p, 0);
cairo_line_to (cr, p, get_height());
cairo_stroke (cr);
@@ -221,6 +172,39 @@ EditorSummary::render (cairo_t* cr)
cairo_move_to (cr, q, 0);
cairo_line_to (cr, q, get_height());
cairo_stroke (cr);
/* Render the view rectangle. If there is an editor visual pending, don't update
the view rectangle now --- wait until the expose event that we'll get after
the visual change. This prevents a flicker.
*/
if (_editor->pending_visual_change.idle_handler_id < 0) {
get_editor (&_view_rectangle_x, &_view_rectangle_y);
}
cairo_move_to (cr, _view_rectangle_x.first, _view_rectangle_y.first);
cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.first);
cairo_line_to (cr, _view_rectangle_x.second, _view_rectangle_y.second);
cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.second);
cairo_line_to (cr, _view_rectangle_x.first, _view_rectangle_y.first);
cairo_set_source_rgba (cr, 1, 1, 1, 0.25);
cairo_fill_preserve (cr);
cairo_set_line_width (cr, 1);
cairo_set_source_rgba (cr, 1, 1, 1, 0.5);
cairo_stroke (cr);
/* Playhead */
cairo_set_line_width (cr, 1);
/* XXX: colour should be set from configuration file */
cairo_set_source_rgba (cr, 1, 0, 0, 1);
const double ph= playhead_frame_to_position (_editor->playhead_cursor->current_frame);
cairo_move_to (cr, ph, 0);
cairo_line_to (cr, ph, get_height());
cairo_stroke (cr);
_last_playhead = ph;
}
/** Render a region for the summary.
@@ -304,6 +288,55 @@ EditorSummary::centre_on_click (GdkEventButton* ev)
set_editor (ex, ey);
}
bool
EditorSummary::on_enter_notify_event (GdkEventCrossing*)
{
grab_focus ();
Keyboard::magic_widget_grab_focus ();
cerr << "ES enter, grabbed focus\n";
return false;
}
bool
EditorSummary::on_leave_notify_event (GdkEventCrossing*)
{
Keyboard::magic_widget_drop_focus ();
cerr << "ES leave\n";
return false;
}
bool
EditorSummary::on_key_press_event (GdkEventKey* key)
{
gint x, y;
switch (key->keyval) {
case GDK_p:
if (_session) {
get_pointer (x, y);
_session->request_locate ((framepos_t) x / _x_scale, _session->transport_rolling());
return true;
}
break;
default:
break;
}
return false;
}
bool
EditorSummary::on_key_release_event (GdkEventKey* key)
{
switch (key->keyval) {
case GDK_p:
return true;
default:
break;
}
return false;
}
/** Handle a button press.
* @param ev GTK event.
*/
@@ -953,3 +986,9 @@ EditorSummary::playhead_frame_to_position (framepos_t t) const
{
return (t - _start) * _x_scale;
}
framepos_t
EditorSummary::position_to_playhead_frame_to_position (double pos) const
{
return _start + (pos * _x_scale);
}

View File

@@ -57,13 +57,16 @@ private:
TO_LEFT_OR_RIGHT,
OTHERWISE_OUTSIDE
};
bool on_expose_event (GdkEventExpose *);
void on_size_request (Gtk::Requisition *);
bool on_button_press_event (GdkEventButton *);
bool on_button_release_event (GdkEventButton *);
bool on_motion_notify_event (GdkEventMotion *);
bool on_scroll_event (GdkEventScroll *);
bool on_key_press_event (GdkEventKey*);
bool on_key_release_event (GdkEventKey*);
bool on_enter_notify_event (GdkEventCrossing*);
bool on_leave_notify_event (GdkEventCrossing*);
void centre_on_click (GdkEventButton *);
void render (cairo_t *);
@@ -84,6 +87,7 @@ private:
void route_gui_changed (std::string);
bool suspending_editor_updates () const;
double playhead_frame_to_position (framepos_t) const;
framepos_t position_to_playhead_frame_to_position (double pos) const;
void set_overlays_dirty (int, int, int, int);
framepos_t _start; ///< start frame of the overview