playhead_cursor->set_position (playhead_cursor->current_frame);
}
- _summary->set_bounds_dirty ();
+ _summary->set_overlays_dirty ();
instant_save ();
}
redisplay_tempo (true);
}
- _summary->set_bounds_dirty ();
+ _summary->set_overlays_dirty ();
//cerr << "Editor::idle_visual_changer () called ha v:l:u:ps:fpu = " << horizontal_adjustment.get_value() << ":" << horizontal_adjustment.get_lower() << ":" << horizontal_adjustment.get_upper() << ":" << horizontal_adjustment.get_page_size() << ":" << frames_per_unit << endl;//DEBUG
pending_visual_change.idle_handler_id = -1;
void set_position (nframes64_t);
void set_length (double units);
void set_y_axis (double position);
+
+ sigc::signal<void, nframes64_t> PositionChanged;
};
class Editor : public PublicEditor
reset_hscrollbar_stepping ();
update_fixed_rulers();
redisplay_tempo (false);
- _summary->set_bounds_dirty ();
+ _summary->set_overlays_dirty ();
Resized (); /* EMIT_SIGNAL */
controls_layout.get_vadjustment()->set_value (vertical_adjustment.get_value());
if (pending_visual_change.idle_handler_id < 0) {
- _summary->set_bounds_dirty ();
+ _summary->set_overlays_dirty ();
}
}
redisplay_tempo (true);
if (pending_visual_change.idle_handler_id < 0) {
- _summary->set_bounds_dirty ();
+ _summary->set_overlays_dirty ();
}
#ifndef GTKOSX
void
EditorCursor::set_position (nframes64_t frame)
{
+ PositionChanged (frame);
+
double new_pos = editor.frame_to_unit (frame);
if (new_pos != points.front().get_x()) {
_height (64),
_x_scale (1),
_y_scale (1),
+ _last_playhead (-1),
_move_dragging (false),
_moved (false),
_zoom_dragging (false)
_session->RegionRemoved.connect (sigc::hide (mem_fun (*this, &EditorSummary::set_dirty)));
_session->EndTimeChanged.connect (mem_fun (*this, &EditorSummary::set_dirty));
_session->StartTimeChanged.connect (mem_fun (*this, &EditorSummary::set_dirty));
+ _editor->playhead_cursor->PositionChanged.connect (mem_fun (*this, &EditorSummary::playhead_position_changed));
set_dirty ();
}
);
}
+ cairo_t* cr = gdk_cairo_create (get_window()->gobj());
+
/* Render the view rectangle */
pair<double, double> x;
pair<double, double> y;
get_editor (&x, &y);
- cairo_t* cr = gdk_cairo_create (get_window()->gobj());
-
cairo_move_to (cr, x.first, y.first);
cairo_line_to (cr, x.second, y.first);
cairo_line_to (cr, x.second, y.second);
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 = _editor->playhead_cursor->current_frame * _x_scale;
+ cairo_move_to (cr, p, 0);
+ cairo_line_to (cr, p, _height);
+ cairo_stroke (cr);
+ _last_playhead = p;
+
cairo_destroy (cr);
return true;
queue_draw ();
}
-/** Set the summary so that just the view boundary markers will be re-rendered */
+/** Set the summary so that just the overlays (viewbox, playhead etc.) will be re-rendered */
void
-EditorSummary::set_bounds_dirty ()
+EditorSummary::set_overlays_dirty ()
{
- ENSURE_GUI_THREAD (mem_fun (*this, &EditorSummary::set_bounds_dirty));
+ ENSURE_GUI_THREAD (mem_fun (*this, &EditorSummary::set_overlays_dirty));
queue_draw ();
}
yr.first -= amount;
yr.second -= amount;
}
+
}
set_editor (xr, yr);
}
}
}
+
+void
+EditorSummary::playhead_position_changed (nframes64_t p)
+{
+ if (int (p * _x_scale) != int (_last_playhead)) {
+ set_overlays_dirty ();
+ }
+}
+
+
void set_session (ARDOUR::Session *);
void set_dirty ();
- void set_bounds_dirty ();
+ void set_overlays_dirty ();
private:
void centre_on_click (GdkEventButton *);
void render_region (RegionView*, cairo_t*, nframes_t, double) const;
void get_editor (std::pair<double, double> *, std::pair<double, double> *) const;
void set_editor (std::pair<double, double> const &, std::pair<double, double> const &);
+ void playhead_position_changed (nframes64_t);
Editor* _editor; ///< our editor
ARDOUR::Session* _session; ///< our session
int _height; ///< pixmap height
double _x_scale; ///< pixels per frame for the x axis of the pixmap
double _y_scale;
+ double _last_playhead;
std::pair<double, double> _start_editor_x;
std::pair<double, double> _start_editor_y;