From 0c714fe3de350d2aed77f445d718e95ba9065b57 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 17 Jun 2012 11:48:51 +0000 Subject: [PATCH] Simplify management of waveform visibility / shape / scale; fixes #4727, I think. git-svn-id: svn://localhost/ardour2/branches/3.0@12743 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_region_view.cc | 155 +++++++++---------------------- gtk2_ardour/audio_region_view.h | 15 +-- gtk2_ardour/audio_streamview.cc | 51 ---------- gtk2_ardour/audio_streamview.h | 6 -- 4 files changed, 47 insertions(+), 180 deletions(-) diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index cb40dd8f9c..c3fc279991 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -83,9 +83,9 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , end_xfade_out (0) , end_xfade_rect (0) , _amplitude_above_axis(1.0) - , _flags(0) , fade_color(0) { + Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context()); } AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr r, double spu, @@ -104,9 +104,9 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , end_xfade_out (0) , end_xfade_rect (0) , _amplitude_above_axis(1.0) - , _flags(0) , fade_color(0) { + Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context()); } AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_ptr other_region) @@ -123,7 +123,6 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt , end_xfade_out (0) , end_xfade_rect (0) , _amplitude_above_axis (other._amplitude_above_axis) - , _flags (other._flags) , fade_color(0) { Gdk::Color c; @@ -133,6 +132,8 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt c.set_rgb_p (r/255.0, g/255.0, b/255.0); init (c, true); + + Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context()); } void @@ -143,17 +144,7 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd) RegionView::init (basic_color, wfd); - XMLNode *node; - _amplitude_above_axis = 1.0; - _flags = 0; - - if ((node = _region->extra_xml ("GUI")) != 0) { - set_flags (node); - } else { - _flags = WaveformVisible; - store_flags (); - } compute_colors (basic_color); @@ -230,6 +221,10 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd) set_colors (); + setup_waveform_visibility (); + setup_waveform_shape (); + setup_waveform_scale (); + /* XXX sync mark drag? */ } @@ -765,8 +760,8 @@ AudioRegionView::set_samples_per_unit (gdouble spu) { RegionView::set_samples_per_unit (spu); - if (_flags & WaveformVisible) { - for (uint32_t n=0; n < waves.size(); ++n) { + if (Config->get_show_waveforms ()) { + for (uint32_t n = 0; n < waves.size(); ++n) { waves[n]->property_samples_per_unit() = spu; } } @@ -818,25 +813,20 @@ AudioRegionView::set_colors () } void -AudioRegionView::set_waveform_visible (bool yn) +AudioRegionView::setup_waveform_visibility () { - if (((_flags & WaveformVisible) != yn)) { - if (yn) { - for (uint32_t n=0; n < waves.size(); ++n) { - /* make sure the zoom level is correct, since we don't update - this when waveforms are hidden. - */ - waves[n]->property_samples_per_unit() = samples_per_unit; - waves[n]->show(); - } - _flags |= WaveformVisible; - } else { - for (uint32_t n=0; n < waves.size(); ++n) { - waves[n]->hide(); - } - _flags &= ~WaveformVisible; + if (Config->get_show_waveforms ()) { + for (uint32_t n = 0; n < waves.size(); ++n) { + /* make sure the zoom level is correct, since we don't update + this when waveforms are hidden. + */ + waves[n]->property_samples_per_unit() = samples_per_unit; + waves[n]->show(); + } + } else { + for (uint32_t n = 0; n < waves.size(); ++n) { + waves[n]->hide(); } - store_flags (); } } @@ -971,10 +961,10 @@ AudioRegionView::create_one_wave (uint32_t which, bool /*direct*/) wave->property_zero_color() = ARDOUR_UI::config()->canvasvar_ZeroLine.get(); wave->property_zero_line() = true; wave->property_region_start() = _region->start(); - wave->property_rectified() = (bool) (_flags & WaveformRectified); - wave->property_logscaled() = (bool) (_flags & WaveformLogScaled); + wave->property_rectified() = Config->get_waveform_shape() == Rectified; + wave->property_logscaled() = Config->get_waveform_scale() == Logarithmic; - if (!(_flags & WaveformVisible)) { + if (!Config->get_show_waveforms ()) { wave->hide(); } @@ -1079,90 +1069,18 @@ AudioRegionView::remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent */* } void -AudioRegionView::store_flags() +AudioRegionView::setup_waveform_shape () { - XMLNode *node = new XMLNode ("GUI"); - - node->add_property ("waveform-visible", (_flags & WaveformVisible) ? "yes" : "no"); - node->add_property ("waveform-rectified", (_flags & WaveformRectified) ? "yes" : "no"); - node->add_property ("waveform-logscaled", (_flags & WaveformLogScaled) ? "yes" : "no"); - - _region->add_extra_xml (*node); -} - -void -AudioRegionView::set_flags (XMLNode* node) -{ - XMLProperty *prop; - - if ((prop = node->property ("waveform-visible")) != 0) { - if (string_is_affirmative (prop->value())) { - _flags |= WaveformVisible; - } - } - - if ((prop = node->property ("waveform-rectified")) != 0) { - if (string_is_affirmative (prop->value())) { - _flags |= WaveformRectified; - } - } - - if ((prop = node->property ("waveform-logscaled")) != 0) { - if (string_is_affirmative (prop->value())) { - _flags |= WaveformLogScaled; - } + for (vector::iterator wave = waves.begin(); wave != waves.end() ; ++wave) { + (*wave)->property_rectified() = Config->get_waveform_shape() == Rectified; } } void -AudioRegionView::set_waveform_shape (WaveformShape shape) +AudioRegionView::setup_waveform_scale () { - bool yn; - - /* this slightly odd approach is to leave the door open to - other "shapes" such as spectral displays, etc. - */ - - switch (shape) { - case Rectified: - yn = true; - break; - - default: - yn = false; - break; - } - - if (yn != (bool) (_flags & WaveformRectified)) { - for (vector::iterator wave = waves.begin(); wave != waves.end() ; ++wave) { - (*wave)->property_rectified() = yn; - } - - if (yn) { - _flags |= WaveformRectified; - } else { - _flags &= ~WaveformRectified; - } - store_flags (); - } -} - -void -AudioRegionView::set_waveform_scale (WaveformScale scale) -{ - bool yn = (scale == Logarithmic); - - if (yn != (bool) (_flags & WaveformLogScaled)) { - for (vector::iterator wave = waves.begin(); wave != waves.end() ; ++wave) { - (*wave)->property_logscaled() = yn; - } - - if (yn) { - _flags |= WaveformLogScaled; - } else { - _flags &= ~WaveformLogScaled; - } - store_flags (); + for (vector::iterator wave = waves.begin(); wave != waves.end() ; ++wave) { + (*wave)->property_logscaled() = Config->get_waveform_scale() == Logarithmic; } } @@ -1811,3 +1729,14 @@ AudioRegionView::drag_end () _hidden_xfades.clear (); } +void +AudioRegionView::parameter_changed (string const & p) +{ + if (p == "show-waveforms") { + setup_waveform_visibility (); + } else if (p == "waveform-scale") { + setup_waveform_scale (); + } else if (p == "waveform-shape") { + setup_waveform_shape (); + } +} diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index ad5107c953..ee03fdbc80 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -80,13 +80,6 @@ class AudioRegionView : public RegionView void unhide_envelope (); ///< Dangerous! void update_envelope_visibility (); - void set_waveform_visible (bool yn); - void set_waveform_shape (ARDOUR::WaveformShape); - void set_waveform_scale (ARDOUR::WaveformScale); - - bool waveform_rectified() const { return _flags & WaveformRectified; } - bool waveform_logscaled() const { return _flags & WaveformLogScaled; } - bool waveform_visible() const { return _flags & WaveformVisible; } void add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event); void remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event); @@ -165,7 +158,6 @@ class AudioRegionView : public RegionView double _amplitude_above_axis; - uint32_t _flags; uint32_t fade_color; void reset_fade_shapes (); @@ -183,8 +175,6 @@ class AudioRegionView : public RegionView void create_one_wave (uint32_t, bool); void peaks_ready_handler (uint32_t); - void set_flags (XMLNode *); - void store_flags (); void set_colors (); void compute_colors (Gdk::Color const &); @@ -203,6 +193,11 @@ class AudioRegionView : public RegionView private: void setup_fade_handle_positions (); + void parameter_changed (std::string const &); + void setup_waveform_visibility (); + void setup_waveform_shape (); + void setup_waveform_scale (); + /** A ScopedConnection for each PeaksReady callback (one per channel). Each member * may be 0 if no connection exists. */ diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 123cb5eb64..80ed198ab1 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -60,8 +60,6 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv) { color_handler (); _amplitude_above_axis = 1.0; - - Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioStreamView::parameter_changed, this, _1), gui_context()); } int @@ -132,10 +130,6 @@ AudioStreamView::create_region_view (boost::shared_ptr r, bool wait_for_ region_view->set_sensitive (false); } - region_view->set_waveform_scale (Config->get_waveform_scale ()); - region_view->set_waveform_shape (Config->get_waveform_shape ()); - region_view->set_waveform_visible (Config->get_show_waveforms ()); - return region_view; } @@ -208,38 +202,6 @@ AudioStreamView::redisplay_track () layer_regions(); } -void -AudioStreamView::set_show_waveforms (bool yn) -{ - for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { - AudioRegionView* const arv = dynamic_cast(*i); - if (arv) { - arv->set_waveform_visible (yn); - } - } -} - -void -AudioStreamView::set_waveform_shape (WaveformShape shape) -{ - for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { - AudioRegionView* const arv = dynamic_cast(*i); - if (arv) - arv->set_waveform_shape (shape); - } -} - -void -AudioStreamView::set_waveform_scale (WaveformScale scale) -{ - for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { - AudioRegionView* const arv = dynamic_cast(*i); - if (arv) { - arv->set_waveform_scale (scale); - } - } -} - void AudioStreamView::setup_rec_box () { @@ -572,16 +534,3 @@ AudioStreamView::color_handler () } } } - -void -AudioStreamView::parameter_changed (string const & p) -{ - if (p == "show-waveforms") { - set_show_waveforms (Config->get_show_waveforms ()); - } else if (p == "waveform-scale") { - set_waveform_scale (Config->get_waveform_scale ()); - } else if (p == "waveform-shape") { - set_waveform_shape (Config->get_waveform_shape ()); - } -} - diff --git a/gtk2_ardour/audio_streamview.h b/gtk2_ardour/audio_streamview.h index 18bc703650..a36c57b552 100644 --- a/gtk2_ardour/audio_streamview.h +++ b/gtk2_ardour/audio_streamview.h @@ -56,8 +56,6 @@ class AudioStreamView : public StreamView int set_amplitude_above_axis (gdouble app); gdouble get_amplitude_above_axis () { return _amplitude_above_axis; } - void set_show_waveforms (bool yn); - void show_all_fades (); void hide_all_fades (); @@ -77,10 +75,6 @@ class AudioStreamView : public StreamView void color_handler (); - void parameter_changed (std::string const &); - void set_waveform_shape (ARDOUR::WaveformShape); - void set_waveform_scale (ARDOUR::WaveformScale); - double _amplitude_above_axis; std::map, bool> rec_data_ready_map;