From 4bcc3d377c04587e24895ed987159ef1d9cc1828 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 24 Jul 2012 02:58:28 +0000 Subject: 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 --- gtk2_ardour/editor_summary.cc | 145 +++++++++++++++++++++++++++--------------- gtk2_ardour/editor_summary.h | 8 ++- 2 files changed, 98 insertions(+), 55 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc index d04e2e7d60..d7943fed7d 100644 --- a/gtk2_ardour/editor_summary.cc +++ b/gtk2_ardour/editor_summary.cc @@ -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); +} diff --git a/gtk2_ardour/editor_summary.h b/gtk2_ardour/editor_summary.h index 0af8be5c91..c1afc3237f 100644 --- a/gtk2_ardour/editor_summary.h +++ b/gtk2_ardour/editor_summary.h @@ -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 -- cgit v1.2.3