make waveform gradient depth continuously variable. color probably needs adjusting...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 17 Apr 2013 01:23:50 +0000 (21:23 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 17 Apr 2013 01:23:50 +0000 (21:23 -0400)
gtk2_ardour/theme_manager.cc
gtk2_ardour/theme_manager.h
gtk2_ardour/ui_config_vars.h
libs/canvas/canvas/wave_view.h
libs/canvas/wave_view.cc

index f1538c98e974834bf759348ac7f78c9fb964117a..8a350fca498a4bef88d7ffaf3d305ac7adeeed0c 100644 (file)
@@ -58,7 +58,9 @@ ThemeManager::ThemeManager()
        , light_button (_("Light Theme"))
        , reset_button (_("Restore Defaults"))
        , flat_buttons (_("Draw \"flat\" buttons"))
-       , gradient_waveforms (_("Draw waveforms with color gradient"))
+       , waveform_gradient_depth (0, 1.0, 0.1)
+       , waveform_gradient_depth_label (_("Waveforms color gradient depth"))
+         
 {
        set_title (_("Theme Manager"));
 
@@ -94,10 +96,18 @@ ThemeManager::ThemeManager()
        vbox->pack_start (theme_selection_hbox, PACK_SHRINK);
        vbox->pack_start (reset_button, PACK_SHRINK);
        vbox->pack_start (flat_buttons, PACK_SHRINK);
-       vbox->pack_start (gradient_waveforms, PACK_SHRINK);
+
+       Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox());
+       hbox->set_spacing (6);
+       hbox->pack_start (waveform_gradient_depth, true, true);
+       hbox->pack_start (waveform_gradient_depth_label, false, false);
+
+       vbox->pack_start (*hbox, PACK_SHRINK);
        vbox->pack_start (scroller);
        add (*vbox);
 
+       waveform_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED);
+
        color_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ThemeManager::button_press_event), false);
 
        color_dialog.get_colorsel()->set_has_opacity_control (true);
@@ -109,7 +119,7 @@ ThemeManager::ThemeManager()
        light_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_light_theme_button_toggled));
        reset_button.signal_clicked().connect (sigc::mem_fun (*this, &ThemeManager::reset_canvas_colors));
        flat_buttons.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_flat_buttons_toggled));
-       gradient_waveforms.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_gradient_waveforms_toggled));
+       waveform_gradient_depth.signal_value_changed().connect (sigc::mem_fun (*this, &ThemeManager::on_waveform_gradient_depth_change));
 
        set_size_request (-1, 400);
        setup_theme ();
@@ -247,11 +257,13 @@ ThemeManager::on_flat_buttons_toggled ()
 }
 
 void
-ThemeManager::on_gradient_waveforms_toggled ()
+ThemeManager::on_waveform_gradient_depth_change ()
 {
-       ARDOUR_UI::config()->gradient_waveforms.set (gradient_waveforms.get_active());
+       double v = waveform_gradient_depth.get_value();
+
+       ARDOUR_UI::config()->waveform_gradient_depth.set (v);
        ARDOUR_UI::config()->set_dirty ();
-       ArdourCanvas::WaveView::set_gradient_waveforms (gradient_waveforms.get_active());
+       ArdourCanvas::WaveView::set_global_gradient_depth (v);
 }
 
 void
@@ -363,7 +375,7 @@ ThemeManager::setup_theme ()
        }
        
        flat_buttons.set_active (ARDOUR_UI::config()->flat_buttons.get());
-       gradient_waveforms.set_active (ARDOUR_UI::config()->gradient_waveforms.get());
+       waveform_gradient_depth.set_value (ARDOUR_UI::config()->waveform_gradient_depth.get());
        
        load_rc_file(rcfile, false);
 }
index d08713dc3e3c987820f7b9869f29934c82627d53..225f26ee79cb6b5d4140578266ff004eb32a7144 100644 (file)
@@ -26,6 +26,7 @@
 #include <gtkmm/colorselection.h>
 #include <gtkmm/radiobutton.h>
 #include <gtkmm/button.h>
+#include <gtkmm/scale.h>
 #include <gtkmm/rc.h>
 #include "ardour_window.h"
 #include "ui_config.h"
@@ -43,7 +44,7 @@ class ThemeManager : public ArdourWindow
        void on_dark_theme_button_toggled ();
        void on_light_theme_button_toggled ();
        void on_flat_buttons_toggled ();
-       void on_gradient_waveforms_toggled ();
+        void on_waveform_gradient_depth_change ();
 
   private:
        struct ColorDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
@@ -70,7 +71,8 @@ class ThemeManager : public ArdourWindow
        Gtk::RadioButton light_button;
        Gtk::Button reset_button;
        Gtk::CheckButton flat_buttons;
-       Gtk::CheckButton gradient_waveforms;
+        Gtk::HScale waveform_gradient_depth;
+        Gtk::Label waveform_gradient_depth_label;
 
        bool button_press_event (GdkEventButton*);
 };
index f64e1ca1416392372352ba0c29a360d893146a72..40a10d79a0ead8e5c03f2905d71e4dcac6f6718b 100644 (file)
@@ -19,5 +19,5 @@
 
 UI_CONFIG_VARIABLE(std::string, ui_rc_file, "ui-rc-file", "ardour3_ui_dark.rc")
 UI_CONFIG_VARIABLE(bool, flat_buttons, "flat-buttons", false)
-UI_CONFIG_VARIABLE(bool, gradient_waveforms, "gradient-waveforms", false)
+UI_CONFIG_VARIABLE(float, waveform_gradient_depth, "waveform-gradient-depth", 0.6)
 
index 44cc6f6f705db23aad21f07780461da6cadd4001..4fd45cff5daca8bc544cab5e3aa683b81ed42da7 100644 (file)
@@ -72,6 +72,8 @@ public:
         void set_clip_color (Color);
         void set_amplitude (double);
         void set_logscaled (bool);
+        void set_gradient_depth (double);
+        double gradient_depth() const { return _gradient_depth; }
         void set_shape (Shape);
         double amplitude() const { return _amplitude; }
         
@@ -80,13 +82,13 @@ public:
           set_logscaled_independent()
         */
 
-        static void set_gradient_waveforms (bool);
+        static void set_global_gradient_depth (double);
         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; }
+        static double  global_gradient_depth()  { return _global_gradient_depth; }
+        static bool    global_logscaled()  { return _global_logscaled; }
+        static Shape   global_shape()  { return _global_shape; }
 
 #ifdef CANVAS_COMPATIBILITY    
        void*& property_gain_src () {
@@ -154,9 +156,11 @@ private:
         Color  _clip_color;
         bool   _logscaled;
         Shape  _shape;
+        double _gradient_depth;
         double _amplitude;
         bool   _shape_independent;
         bool   _logscaled_independent;
+        bool   _gradient_depth_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.
@@ -167,9 +171,9 @@ private:
        
         PBD::ScopedConnection invalidation_connection;
 
-        static bool _gradient_waveforms;
-        static bool _global_logscaled;
-        static Shape _global_shape;
+        static double _global_gradient_depth;
+        static bool   _global_logscaled;
+        static Shape  _global_shape;
 
         static PBD::Signal0<void> VisualPropertiesChanged;
 
index f420c73980583cb611903f4ebc8bb5052278ecc0..6a2661262a3aa85e3f8dc5720be312b5694f0dda 100644 (file)
@@ -40,7 +40,7 @@ using namespace std;
 using namespace ARDOUR;
 using namespace ArdourCanvas;
 
-bool WaveView::_gradient_waveforms = true;
+double WaveView::_global_gradient_depth = 0.6;
 bool WaveView::_global_logscaled = false;
 WaveView::Shape WaveView::_global_shape = WaveView::Normal;
 
@@ -60,9 +60,11 @@ WaveView::WaveView (Group* parent, boost::shared_ptr<ARDOUR::AudioRegion> region
        , _clip_color (0xff0000ff)
        , _logscaled (_global_logscaled)
        , _shape (_global_shape)
+       , _gradient_depth (_global_gradient_depth)
        , _amplitude (1.0)
        , _shape_independent (false)
        , _logscaled_independent (false)
+       , _gradient_depth_independent (false)
        , _region_start (0)
 {
        VisualPropertiesChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_visual_property_change, this));
@@ -83,6 +85,11 @@ WaveView::handle_visual_property_change ()
                changed = true;
        }
 
+       if (!_gradient_depth_independent && (_gradient_depth != global_gradient_depth())) {
+               _gradient_depth = global_gradient_depth();
+               changed = true;
+       }
+       
        if (changed) {
                invalidate_image_cache ();
        }
@@ -482,8 +489,8 @@ WaveView::CacheEntry::image ()
 
                context->close_path ();
 
-               if (WaveView::gradient_waveforms()) {
-
+               if (_wave_view->gradient_depth() != 0.0) {
+                       
                        Cairo::RefPtr<Cairo::LinearGradient> gradient (Cairo::LinearGradient::create (0, 0, 0, _wave_view->_height));
                        
                        double stops[3];
@@ -508,7 +515,7 @@ WaveView::CacheEntry::image ()
                        double h, s, v;
                        color_to_hsv (_wave_view->_fill_color, h, s, v);
                        /* tone down the saturation */
-                       s *= 0.60;
+                       s *= 1.0 - _wave_view->gradient_depth();
                        Color center = hsv_to_color (h, s, v, a);
                        color_to_rgba (center, r, g, b, a);
                        gradient->add_color_stop_rgba (stops[1], r, g, b, a);
@@ -553,10 +560,10 @@ WaveView::CacheEntry::clear_image ()
 }
            
 void
-WaveView::set_gradient_waveforms (bool yn)
+WaveView::set_global_gradient_depth (double depth)
 {
-       if (_gradient_waveforms != yn) {
-               _gradient_waveforms = yn;
+       if (_global_gradient_depth != depth) {
+               _global_gradient_depth = depth;
                VisualPropertiesChanged (); /* EMIT SIGNAL */
        }
 }