if (wait_for_data) {
if (audio_region()->audio_source(n)->peaks_ready (bind (mem_fun(*this, &AudioRegionView::peaks_ready_handler), n), data_ready_connection)) {
- // cerr << "\tData is ready\n";
- cerr << "\tData is ready\n";
// cerr << "\tData is ready\n";
create_one_wave (n, true);
} else {
range_mark_label (_("Range Markers")),
transport_mark_label (_("Loop/Punch Ranges")),
cd_mark_label (_("CD Markers")),
- edit_packer (3, 4, true),
+ edit_packer (4, 4, true),
/* the values here don't matter: layout widgets
reset them as needed.
transport_mark_label.set_no_show_all();
initialize_rulers ();
+ _summary = new EditorSummary (this);
initialize_canvas ();
selection->TimeChanged.connect (mem_fun(*this, &Editor::time_selection_changed));
time_canvas_event_box.add (time_canvas_vbox);
time_canvas_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
-
+
edit_packer.set_col_spacings (0);
edit_packer.set_row_spacings (0);
edit_packer.set_homogeneous (false);
edit_packer.set_border_width (0);
edit_packer.set_name ("EditorWindow");
-#ifndef THE_OLD_WAY
-
edit_packer.attach (ruler_label_event_box, 0, 1, 0, 1, FILL, SHRINK, 0, 0);
edit_packer.attach (time_button_event_box, 0, 1, 1, 2, FILL, SHRINK, 0, 0);
+ edit_packer.attach (*_summary , 1, 2, 2, 3, FILL|EXPAND, SHRINK, 0, 0);
edit_packer.attach (time_canvas_event_box, 1, 2, 0, 1, FILL|EXPAND, FILL, 0, 0);
- edit_packer.attach (controls_layout, 0, 1, 2, 3, FILL, FILL|EXPAND, 0, 0);
- edit_packer.attach (track_canvas_event_box, 1, 2, 1, 3, FILL|EXPAND, FILL|EXPAND, 0, 0);
-
- edit_packer.attach (zoom_box, 0, 1, 3, 4, FILL, FILL, 0, 0);
- edit_packer.attach (edit_hscrollbar, 1, 2, 3, 4, FILL|EXPAND, FILL, 0, 0);
+ edit_packer.attach (controls_layout, 0, 1, 3, 4, FILL, FILL|EXPAND, 0, 0);
+ edit_packer.attach (track_canvas_event_box, 1, 2, 1, 4, FILL|EXPAND, FILL|EXPAND, 0, 0);
- edit_packer.attach (edit_vscrollbar, 3, 4, 2, 3, FILL, FILL|EXPAND, 0, 0);
+ edit_packer.attach (zoom_box, 0, 1, 4, 5, FILL, FILL, 0, 0);
+ edit_packer.attach (edit_hscrollbar, 1, 2, 4, 5, FILL|EXPAND, FILL, 0, 0);
-#else
-
- edit_packer.attach (edit_vscrollbar, 0, 1, 0, 4, FILL, FILL|EXPAND, 0, 0);
-
- edit_packer.attach (ruler_label_event_box, 1, 2, 0, 1, FILL, SHRINK, 0, 0);
- edit_packer.attach (time_button_event_box, 1, 2, 1, 2, FILL, SHRINK, 0, 0);
- edit_packer.attach (time_canvas_event_box, 2, 3, 0, 1, FILL|EXPAND, FILL, 0, 0);
-
- edit_packer.attach (controls_layout, 1, 2, 2, 3, FILL, FILL|EXPAND, 0, 0);
- edit_packer.attach (track_canvas_event_box, 2, 3, 1, 3, FILL|EXPAND, FILL|EXPAND, 0, 0);
-
- edit_packer.attach (zoom_box, 1, 2, 3, 4, FILL, FILL, 0, 0);
- edit_packer.attach (edit_hscrollbar, 2, 3, 3, 4, FILL|EXPAND, FILL, 0, 0);
-#endif
+ edit_packer.attach (edit_vscrollbar, 3, 4, 3, 4, FILL, FILL|EXPAND, 0, 0);
bottom_hbox.set_border_width (2);
bottom_hbox.set_spacing (3);
/* register for undo history */
session->register_with_memento_command_factory(_id, this);
+ _summary->set_session (session);
+
start_updating ();
}
playhead_cursor->set_position (playhead_cursor->current_frame);
}
+ _summary->set_bounds_dirty ();
+
instant_save ();
}
_pending_locate_request = false;
}
+
+void
+Editor::region_view_added (RegionView *)
+{
+ _summary->set_dirty ();
+}
#include "editor_items.h"
#include "region_selection.h"
#include "canvas.h"
+#include "editor_summary.h"
namespace Gtkmm2ext {
class TearOff;
void located ();
bool _pending_locate_request;
+ EditorSummary* _summary;
+ void region_view_added (RegionView *);
+
friend class Drag;
friend class RegionDrag;
friend class RegionMoveDrag;
friend class RegionCreateDrag;
friend class RegionMotionDrag;
friend class RegionInsertDrag;
+
+ friend class EditorSummary;
};
#endif /* __ardour_editor_h__ */
reset_hscrollbar_stepping ();
update_fixed_rulers();
redisplay_tempo (false);
+ _summary->set_bounds_dirty ();
Resized (); /* EMIT_SIGNAL */
void
Editor::scroll_canvas_horizontally ()
{
- nframes64_t time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
-
/* horizontal scrolling only */
double x1, y1, x2, y2, x_delta;
_master_group->get_bounds (x1, y1, x2, y2);
update_fixed_rulers ();
redisplay_tempo (true);
+ _summary->set_bounds_dirty ();
+
#ifndef GTKOSX
if (!autoscroll_active) {
/* force rulers and canvas to move in lock step */
/* what? */
break;
}
-
+
return false;
}
ignore_route_list_reorder = false;
route->gui_changed.connect (mem_fun(*this, &Editor::handle_gui_changes));
+ tv->view()->RegionViewAdded.connect (mem_fun (*this, &Editor::region_view_added));
tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
}
editor_list_button.set_sensitive(true);
route_redisplay_does_not_sync_order_keys = false;
+
+ _summary->set_dirty ();
}
void
--- /dev/null
+#include "ardour/session.h"
+#include "time_axis_view.h"
+#include "streamview.h"
+#include "editor_summary.h"
+#include "gui_thread.h"
+#include "editor.h"
+#include "region_view.h"
+
+using namespace std;
+using namespace sigc;
+using namespace ARDOUR;
+
+EditorSummary::EditorSummary (Editor* e)
+ : _editor (e),
+ _session (0),
+ _pixmap (0),
+ _regions_dirty (true),
+ _width (512),
+ _height (64),
+ _pixels_per_frame (1)
+{
+
+}
+
+void
+EditorSummary::set_session (Session* s)
+{
+ _session = s;
+
+ Region::RegionPropertyChanged.connect (sigc::hide (mem_fun (*this, &EditorSummary::set_dirty)));
+
+ _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));
+
+ set_dirty ();
+}
+
+EditorSummary::~EditorSummary ()
+{
+ if (_pixmap) {
+ gdk_pixmap_unref (_pixmap);
+ }
+}
+
+bool
+EditorSummary::on_expose_event (GdkEventExpose* event)
+{
+ Gdk::Rectangle const exposure (
+ event->area.x, event->area.y, event->area.width, event->area.height
+ );
+
+ Gdk::Rectangle r = exposure;
+ Gdk::Rectangle content (0, 0, _width, _height);
+ bool intersects;
+ r.intersect (content, intersects);
+
+ if (intersects) {
+
+ GdkPixmap* p = get_pixmap (get_window()->gobj ());
+
+ gdk_draw_drawable (
+ get_window()->gobj(),
+ get_style()->get_fg_gc (Gtk::STATE_NORMAL)->gobj(),
+ p,
+ r.get_x(),
+ r.get_y(),
+ r.get_x(),
+ r.get_y(),
+ r.get_width(),
+ r.get_height()
+ );
+ }
+
+ cairo_t* cr = gdk_cairo_create (get_window()->gobj());
+
+ cairo_set_source_rgb (cr, 0, 1, 0);
+ cairo_set_line_width (cr, 2);
+
+ double const s = (_editor->leftmost_position () - _session->current_start_frame ()) * _pixels_per_frame;
+ cairo_move_to (cr, s, 0);
+ cairo_line_to (cr, s, _height);
+ cairo_stroke (cr);
+
+ double const e = s + _editor->current_page_frames() * _pixels_per_frame;
+ cairo_move_to (cr, e, 0);
+ cairo_line_to (cr, e, _height);
+ cairo_stroke (cr);
+
+ cairo_destroy (cr);
+
+ return true;
+}
+
+GdkPixmap *
+EditorSummary::get_pixmap (GdkDrawable* drawable)
+{
+ if (_regions_dirty) {
+
+ if (_pixmap) {
+ gdk_pixmap_unref (_pixmap);
+ }
+ _pixmap = gdk_pixmap_new (drawable, _width, _height, -1);
+
+ cairo_t* cr = gdk_cairo_create (_pixmap);
+ render (cr);
+ cairo_destroy (cr);
+
+ _regions_dirty = false;
+ }
+
+ return _pixmap;
+}
+
+void
+EditorSummary::render (cairo_t* cr)
+{
+ if (_session == 0) {
+ return;
+ }
+
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, _width, _height);
+ cairo_fill (cr);
+
+ int N = 0;
+
+ for (PublicEditor::TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
+ if ((*i)->view()) {
+ ++N;
+ }
+ }
+
+ nframes_t const start = _session->current_start_frame ();
+ _pixels_per_frame = static_cast<double> (_width) / (_session->current_end_frame() - start);
+ double const track_height = static_cast<double> (_height) / N;
+
+ cairo_set_line_width (cr, track_height);
+
+ int n = 0;
+ for (PublicEditor::TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
+ StreamView* s = (*i)->view ();
+ if (s) {
+
+ double const v = ((n % 2) == 0) ? 1 : 0.5;
+ cairo_set_source_rgb (cr, v, v, v);
+
+ s->foreach_regionview (bind (
+ mem_fun (*this, &EditorSummary::render_region),
+ cr,
+ start,
+ track_height * (n + 0.5)
+ ));
+ ++n;
+ }
+ }
+
+}
+
+void
+EditorSummary::render_region (RegionView* r, cairo_t* cr, nframes_t start, double y) const
+{
+ cairo_move_to (cr, (r->region()->position() - start) * _pixels_per_frame, y);
+ cairo_line_to (cr, (r->region()->position() - start + r->region()->length()) * _pixels_per_frame, y);
+ cairo_stroke (cr);
+}
+
+void
+EditorSummary::set_dirty ()
+{
+ ENSURE_GUI_THREAD (mem_fun (*this, &EditorSummary::set_dirty));
+
+ _regions_dirty = true;
+ queue_draw ();
+}
+
+void
+EditorSummary::set_bounds_dirty ()
+{
+ ENSURE_GUI_THREAD (mem_fun (*this, &EditorSummary::set_bounds_dirty));
+ queue_draw ();
+}
+
+void
+EditorSummary::on_size_request (Gtk::Requisition *req)
+{
+ req->width = 64;
+ req->height = 64;
+}
+
+void
+EditorSummary::on_size_allocate (Gtk::Allocation& alloc)
+{
+ Gtk::EventBox::on_size_allocate (alloc);
+
+ _width = alloc.get_width ();
+ _height = alloc.get_height ();
+
+ set_dirty ();
+}
+
+bool
+EditorSummary::on_button_press_event (GdkEventButton* ev)
+{
+ if (ev->button == 1) {
+
+ nframes_t f = (ev->x / _pixels_per_frame) + _session->current_start_frame();
+
+ nframes_t const h = _editor->current_page_frames () / 2;
+ if (f > h) {
+ f -= h;
+ } else {
+ f = 0;
+ }
+
+ _editor->reset_x_origin (f);
+ }
+
+ return true;
+}
--- /dev/null
+#ifndef __gtk_ardour_editor_summary_h__
+#define __gtk_ardour_editor_summary_h__
+
+#include <gtkmm/eventbox.h>
+
+namespace ARDOUR {
+ class Session;
+}
+
+class Editor;
+
+class EditorSummary : public Gtk::EventBox
+{
+public:
+ EditorSummary (Editor *);
+ ~EditorSummary ();
+
+ void set_session (ARDOUR::Session *);
+ void set_dirty ();
+ void set_bounds_dirty ();
+
+private:
+ bool on_expose_event (GdkEventExpose *);
+ void on_size_request (Gtk::Requisition *);
+ void on_size_allocate (Gtk::Allocation &);
+ bool on_button_press_event (GdkEventButton *);
+
+ void render (cairo_t *);
+ GdkPixmap* get_pixmap (GdkDrawable *);
+ void render_region (RegionView*, cairo_t*, nframes_t, double) const;
+
+ Editor* _editor;
+ ARDOUR::Session* _session;
+ GdkPixmap* _pixmap;
+ bool _regions_dirty;
+ int _width;
+ int _height;
+ double _pixels_per_frame;
+};
+
+#endif
_matrix->setup_scrollbars ();
}
+
editor_scrub.cc
editor_selection.cc
editor_selection_list.cc
+ editor_summary.cc
editor_tempodisplay.cc
editor_timefx.cc
engine_dialog.cc