X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_report.h;h=9fdf5c7b4055e2f3db4299ea14498ddc0c8b2795;hb=154f9825ff72d691ba550de573948424b81a09a6;hp=8474688c486dc44d1ac3a2bb8e816bd128dd53ed;hpb=b9efb2ae21b785ef7273af22df1a8fcad168227f;p=ardour.git diff --git a/gtk2_ardour/export_report.h b/gtk2_ardour/export_report.h index 8474688c48..9fdf5c7b40 100644 --- a/gtk2_ardour/export_report.h +++ b/gtk2_ardour/export_report.h @@ -18,6 +18,7 @@ #include #include +#include #include "gtkmm2ext/cairo_widget.h" #include "gtkmm2ext/gui_thread.h" @@ -32,37 +33,40 @@ public: CimgArea (Cairo::RefPtr sf) : CairoWidget() , _surface(sf) - , _playhead(-1) - , _x0 (0) - , _aw (0) - , _highlight (false) { set_size_request (sf->get_width (), sf->get_height ()); } - virtual void render (cairo_t* cr, cairo_rectangle_t* r) - { - cairo_rectangle (cr, r->x, r->y, r->width, r->height); - cairo_clip (cr); +protected: + virtual void background (cairo_t* cr, cairo_rectangle_t* r) { cairo_set_source_surface (cr, _surface->cobj(), 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_paint (cr); + } - if (_playhead > 0 && _playhead < 1.0 && _aw > 0) { - if (_highlight) { - cairo_rectangle (cr, _x0, 0, _aw, _surface->get_height()); - cairo_set_source_rgba (cr, .4, .4, .6, .4); - cairo_fill (cr); - } + virtual void overlay (cairo_t* cr, cairo_rectangle_t* r) {} - const float x = _playhead * _aw; - const float h = _surface->get_height(); - cairo_set_source_rgba (cr, 1, 0, 0, 1); - cairo_set_line_width (cr, 1.5); - cairo_move_to (cr, _x0 + x, 0); - cairo_line_to (cr, _x0 + x, h); - cairo_stroke (cr); - } + virtual void render (Cairo::RefPtr const& ctx, cairo_rectangle_t* r) + { + ctx->rectangle (r->x, r->y, r->width, r->height); + ctx->clip (); + background (ctx->cobj(), r); + overlay (ctx->cobj(), r); + } + + Cairo::RefPtr _surface; +}; + +class CimgPlayheadArea : public CimgArea +{ +public: + CimgPlayheadArea (Cairo::RefPtr sf, float x0, float w, bool h = false) + : CimgArea (sf) + , _playhead(-1) + , _x0 (x0) + , _aw (w) + , _highlight (h) + { } void set_playhead (float pos) { @@ -78,15 +82,28 @@ public: _playhead = pos; } - void set_audition_axis (float x0, float w, bool h = false) { - _x0 = x0; - _aw = w; - _highlight = h; - } - sigc::signal seek_playhead; protected: + + virtual void overlay (cairo_t* cr, cairo_rectangle_t* r) { + if (_playhead > 0 && _playhead < 1.0 && _aw > 0) { + if (_highlight) { + cairo_rectangle (cr, _x0, 0, _aw, _surface->get_height()); + cairo_set_source_rgba (cr, .4, .4, .6, .4); + cairo_fill (cr); + } + + const float x = _playhead * _aw; + const float h = _surface->get_height(); + cairo_set_source_rgba (cr, 1, 0, 0, 1); + cairo_set_line_width (cr, 1.5); + cairo_move_to (cr, _x0 + x, 0); + cairo_line_to (cr, _x0 + x, h); + cairo_stroke (cr); + } + } + bool on_button_press_event (GdkEventButton *ev) { CairoWidget::on_button_press_event (ev); if (ev->button == 1 && _aw > 0 && ev->x >= _x0 && ev->x <= _x0 + _aw) { @@ -96,7 +113,6 @@ protected: } private: - Cairo::RefPtr _surface; float _playhead; float _x0, _aw; bool _highlight; @@ -113,24 +129,86 @@ private: } }; +class CimgWaveArea : public CimgPlayheadArea +{ +public: + CimgWaveArea ( + Cairo::RefPtr sf, + Cairo::RefPtr sf_log, + Cairo::RefPtr sf_rect, + Cairo::RefPtr sf_logrec, + float x0, float w) + : CimgPlayheadArea (sf, x0, w) + , _sf_log (sf_log) + , _sf_rect (sf_rect) + , _sf_logrec (sf_logrec) + , _logscale (false) + , _rectified (false) + { + } + + void set_logscale (bool en) { + _logscale = en; + set_dirty (); + } + + void set_rectified (bool en) { + _rectified = en; + set_dirty (); + } + +protected: + + virtual void background (cairo_t* cr, cairo_rectangle_t* r) { + if (_logscale && _rectified) { + cairo_set_source_surface (cr, _sf_logrec->cobj(), 0, 0); + } else if (_logscale) { + cairo_set_source_surface (cr, _sf_log->cobj(), 0, 0); + } else if (_rectified) { + cairo_set_source_surface (cr, _sf_rect->cobj(), 0, 0); + } else { + cairo_set_source_surface (cr, _surface->cobj(), 0, 0); + } + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint (cr); + } + +private: + Cairo::RefPtr _sf_log; + Cairo::RefPtr _sf_rect; + Cairo::RefPtr _sf_logrec; + bool _logscale; + bool _rectified; +}; + class ExportReport : public ArdourDialog { public: typedef boost::shared_ptr StatusPtr; ExportReport (ARDOUR::Session*, StatusPtr); + ExportReport (const std::string & title, const ARDOUR::AnalysisResults & ar); int run (); + void on_response (int response_id) { + Gtk::Dialog::on_response (response_id); + } + private: + void init (const ARDOUR::AnalysisResults &, bool); + void draw_waveform (Cairo::RefPtr& wave, + ARDOUR::ExportAnalysisPtr, uint32_t, int, size_t, int, int, bool, bool); + void open_folder (std::string); void audition (std::string, unsigned int, int); void stop_audition (); void play_audition (); void audition_active (bool); void audition_seek (int, float); - void audition_progress (ARDOUR::framecnt_t, ARDOUR::framecnt_t); + void audition_progress (ARDOUR::samplecnt_t, ARDOUR::samplecnt_t); void on_switch_page (GtkNotebookPage*, guint page_num); + void on_logscale_toggled (Gtk::ToggleButton*); + void on_rectivied_toggled (Gtk::ToggleButton*); - StatusPtr status; Gtk::Notebook pages; ARDOUR::Session* _session; Gtk::Button* stop_btn; @@ -144,8 +222,9 @@ private: unsigned int channels; }; - std::map > timeline; + std::map > timeline; std::map files; + std::list waves; int _audition_num; int _page_num;