summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/editor_summary.cc145
-rw-r--r--gtk2_ardour/editor_summary.h8
2 files changed, 98 insertions, 55 deletions
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