From 81eed21ddef4b5c0e2d90e00d5c817f452b377fa Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 16 Apr 2013 18:02:12 -0400 Subject: [PATCH] some rationalization of how global WaveView properties and per-WaveView properties interact --- libs/canvas/canvas/wave_view.h | 44 +++++++++++++++--------- libs/canvas/wave_view.cc | 61 ++++++++++++++++++++++++++-------- 2 files changed, 75 insertions(+), 30 deletions(-) diff --git a/libs/canvas/canvas/wave_view.h b/libs/canvas/canvas/wave_view.h index 63be77cfe4..94db1fe61f 100644 --- a/libs/canvas/canvas/wave_view.h +++ b/libs/canvas/canvas/wave_view.h @@ -56,8 +56,6 @@ public: void render (Rect const & area, Cairo::RefPtr) const; void compute_bounding_box () const; - void rebuild (); - void set_samples_per_pixel (double); void set_height (Distance); void set_channel (int); @@ -70,15 +68,22 @@ public: void set_zero_color (Color); void set_clip_color (Color); void set_amplitude (double); - double amplitude() const { return _amplitude; } void set_logscaled (bool); - bool logscaled() const { return _logscaled; } - void set_shape (Shape); - Shape shape() const; + double amplitude() const { return _amplitude; } + + /* currently missing because we don't need them (yet): + set_shape_independent(); + set_logscaled_independent() + */ static void set_gradient_waveforms (bool); - static bool gradient_waveforms() { return _gradient_waveforms; } + static void set_global_logscaled (bool); + static void set_global_shape (Shape); + + static bool gradient_waveforms() { return _gradient_waveforms; } + static bool global_logscaled() { return _global_logscaled; } + static Shape global_shape() { return _global_shape; } #ifdef CANVAS_COMPATIBILITY void*& property_gain_src () { @@ -137,16 +142,18 @@ private: void invalidate_image_cache (); boost::shared_ptr _region; - int _channel; + int _channel; double _samples_per_pixel; - Coord _height; - Color _wave_color; - bool _show_zero; - Color _zero_color; - Shape _shape; - Color _clip_color; - bool _logscaled; + Coord _height; + Color _wave_color; + bool _show_zero; + Color _zero_color; + Color _clip_color; + bool _logscaled; + Shape _shape; double _amplitude; + bool _shape_independent; + bool _logscaled_independent; /** The `start' value to use for the region; we can't use the region's * value as the crossfade editor needs to alter it. @@ -158,7 +165,12 @@ private: PBD::ScopedConnection invalidation_connection; static bool _gradient_waveforms; - static PBD::Signal0 InvalidateAllImages; + static bool _global_logscaled; + static Shape _global_shape; + + static PBD::Signal0 VisualPropertiesChanged; + + void handle_visual_property_change (); }; } diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc index b5b8fefa62..e1923cd2f8 100644 --- a/libs/canvas/wave_view.cc +++ b/libs/canvas/wave_view.cc @@ -41,7 +41,10 @@ using namespace ARDOUR; using namespace ArdourCanvas; bool WaveView::_gradient_waveforms = true; -PBD::Signal0 WaveView::InvalidateAllImages; +bool WaveView::_global_logscaled = false; +WaveView::Shape WaveView::_global_shape = WaveView::Normal; + +PBD::Signal0 WaveView::VisualPropertiesChanged; WaveView::WaveView (Group* parent, boost::shared_ptr region) : Item (parent) @@ -54,20 +57,35 @@ WaveView::WaveView (Group* parent, boost::shared_ptr region , _wave_color (0xffffffff) , _show_zero (true) , _zero_color (0xff0000ff) - , _shape (Normal) , _clip_color (0xff0000ff) - , _logscaled (false) + , _logscaled (_global_logscaled) + , _shape (_global_shape) , _amplitude (1.0) + , _shape_independent (false) + , _logscaled_independent (false) , _region_start (0) { - InvalidateAllImages.connect_same_thread (invalidation_connection, boost::bind (&WaveView::rebuild, this)); + VisualPropertiesChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_visual_property_change, this)); } void -WaveView::rebuild () +WaveView::handle_visual_property_change () { - invalidate_image_cache (); - _canvas->item_visual_property_changed (this); + bool changed = false; + + if (!_shape_independent && (_shape != global_shape())) { + _shape = global_shape(); + changed = true; + } + + if (!_logscaled_independent && (_logscaled != global_logscaled())) { + _logscaled = global_logscaled(); + changed = true; + } + + if (changed) { + invalidate_image_cache (); + } } void @@ -218,6 +236,7 @@ WaveView::invalidate_whole_cache () } _cache.clear (); + _canvas->item_visual_property_changed (this); } void @@ -226,6 +245,7 @@ WaveView::invalidate_image_cache () for (list::iterator i = _cache.begin(); i != _cache.end(); ++i) { (*i)->clear_image (); } + _canvas->item_visual_property_changed (this); } void @@ -240,7 +260,6 @@ WaveView::set_logscaled (bool yn) if (_logscaled != yn) { _logscaled = yn; invalidate_image_cache (); - _canvas->item_visual_property_changed (this); } } @@ -250,7 +269,6 @@ WaveView::set_amplitude (double a) if (_amplitude != a) { _amplitude = a; invalidate_image_cache (); - _canvas->item_visual_property_changed (this); } } @@ -260,7 +278,6 @@ WaveView::set_zero_color (Color c) if (_zero_color != c) { _zero_color = c; invalidate_image_cache (); - _canvas->item_visual_property_changed (this); } } @@ -270,7 +287,6 @@ WaveView::set_clip_color (Color c) if (_clip_color != c) { _clip_color = c; invalidate_image_cache (); - _canvas->item_visual_property_changed (this); } } @@ -280,7 +296,6 @@ WaveView::set_show_zero_line (bool yn) if (_show_zero != yn) { _show_zero = yn; invalidate_image_cache (); - _canvas->item_visual_property_changed (this); } } @@ -290,7 +305,25 @@ WaveView::set_shape (Shape s) if (_shape != s) { _shape = s; invalidate_image_cache (); - _canvas->item_visual_property_changed (this); + } +} + +void +WaveView::set_global_shape (Shape s) +{ + if (_global_shape != s) { + _global_shape = s; + VisualPropertiesChanged (); /* EMIT SIGNAL */ + } +} + +void +WaveView::set_global_logscaled (bool yn) +{ + if (_global_logscaled != yn) { + _global_logscaled = yn; + VisualPropertiesChanged (); /* EMIT SIGNAL */ + } } @@ -510,6 +543,6 @@ WaveView::set_gradient_waveforms (bool yn) { if (_gradient_waveforms != yn) { _gradient_waveforms = yn; - InvalidateAllImages (); /* EMIT SIGNAL */ + VisualPropertiesChanged (); /* EMIT SIGNAL */ } }