From e39a8fc9681a35b95e6d0f9b4e1a9b31d932f262 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 1 Jun 2012 00:41:28 +0000 Subject: Make faders visually desensitised when their tracks are in automation-play. git-svn-id: svn://localhost/ardour2/branches/3.0@12518 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/gain_meter.cc | 10 ++++- gtk2_ardour/gain_meter.h | 3 +- gtk2_ardour/icons/fader_belt_desensitised.png | Bin 0 -> 2949 bytes gtk2_ardour/icons/fader_belt_h_desensitised.png | Bin 0 -> 2372 bytes .../icons/fader_belt_h_thin_desensitised.png | Bin 0 -> 929 bytes gtk2_ardour/option_editor.cc | 6 +++ gtk2_ardour/option_editor.h | 1 + gtk2_ardour/processor_box.cc | 15 +++++-- gtk2_ardour/processor_box.h | 3 +- gtk2_ardour/route_time_axis.cc | 8 +++- gtk2_ardour/route_time_axis.h | 1 + libs/gtkmm2ext/gtkmm2ext/pixfader.h | 17 ++++--- libs/gtkmm2ext/gtkmm2ext/slider_controller.h | 4 +- libs/gtkmm2ext/pixfader.cc | 50 +++++++++++++-------- libs/gtkmm2ext/slider_controller.cc | 19 +++++--- 15 files changed, 98 insertions(+), 39 deletions(-) create mode 100644 gtk2_ardour/icons/fader_belt_desensitised.png create mode 100644 gtk2_ardour/icons/fader_belt_h_desensitised.png create mode 100644 gtk2_ardour/icons/fader_belt_h_thin_desensitised.png diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 9f4e286f3a..166d29ef2c 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -62,6 +62,7 @@ sigc::signal GainMeterBase::ResetGroupPeakDisplays; GainMeter::MetricPatterns GainMeter::metric_patterns; Glib::RefPtr GainMeter::slider; +Glib::RefPtr GainMeter::slider_desensitised; void @@ -70,10 +71,15 @@ GainMeter::setup_slider_pix () if ((slider = ::get_icon ("fader_belt")) == 0) { throw failed_constructor(); } + + if ((slider_desensitised = ::get_icon ("fader_belt_desensitised")) == 0) { + throw failed_constructor(); + } } GainMeterBase::GainMeterBase (Session* s, const Glib::RefPtr& pix, + const Glib::RefPtr& pix_desensitised, bool horizontal, int fader_length) : gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0.0, 1.0, 0.01, 0.1) @@ -95,11 +101,13 @@ GainMeterBase::GainMeterBase (Session* s, if (horizontal) { gain_slider = manage (new HSliderController (pix, + pix_desensitised, &gain_adjustment, fader_length, false)); } else { gain_slider = manage (new VSliderController (pix, + pix_desensitised, &gain_adjustment, fader_length, false)); @@ -839,7 +847,7 @@ GainMeterBase::on_theme_changed() } GainMeter::GainMeter (Session* s, int fader_length) - : GainMeterBase (s, slider, false, fader_length) + : GainMeterBase (s, slider, slider_desensitised, false, fader_length) , gain_display_box(true, 0) , hbox(true, 2) { diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index e706606c76..4536bb691b 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -65,7 +65,7 @@ namespace Gtk { class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr { public: - GainMeterBase (ARDOUR::Session*, const Glib::RefPtr& pix, + GainMeterBase (ARDOUR::Session*, const Glib::RefPtr&, const Glib::RefPtr &, bool horizontal, int); virtual ~GainMeterBase (); @@ -231,6 +231,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox std::vector _types; static Glib::RefPtr slider; + static Glib::RefPtr slider_desensitised; }; #endif /* __ardour_gtk_gain_meter_h__ */ diff --git a/gtk2_ardour/icons/fader_belt_desensitised.png b/gtk2_ardour/icons/fader_belt_desensitised.png new file mode 100644 index 0000000000..9c7094e039 Binary files /dev/null and b/gtk2_ardour/icons/fader_belt_desensitised.png differ diff --git a/gtk2_ardour/icons/fader_belt_h_desensitised.png b/gtk2_ardour/icons/fader_belt_h_desensitised.png new file mode 100644 index 0000000000..d2952d051e Binary files /dev/null and b/gtk2_ardour/icons/fader_belt_h_desensitised.png differ diff --git a/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png b/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png new file mode 100644 index 0000000000..c92f38f679 Binary files /dev/null and b/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png differ diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index 3e1fa73ca3..ca8fa0a2cf 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -176,7 +176,13 @@ FaderOption::FaderOption (string const & i, string const & n, sigc::slot throw failed_constructor (); } + _pix_desensitised = ::get_icon (X_("fader_belt_h_desensitised")); + if (_pix_desensitised == 0) { + throw failed_constructor (); + } + _db_slider = manage (new HSliderController (_pix, + _pix_desensitised, &_db_adjustment, 115, false)); diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index c70e6c6bab..5d6a48a024 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -362,6 +362,7 @@ private: Gtk::Adjustment _db_adjustment; Gtkmm2ext::HSliderController* _db_slider; Glib::RefPtr _pix; + Glib::RefPtr _pix_desensitised; Gtk::Entry _db_display; Gtk::Label _label; Gtk::HBox _box; diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index d9c21dcc9b..c698aeed06 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -91,6 +91,7 @@ RefPtr ProcessorBox::rename_action; RefPtr ProcessorBox::edit_action; RefPtr ProcessorBox::edit_generic_action; Glib::RefPtr ProcessorEntry::_slider_pixbuf; +Glib::RefPtr ProcessorEntry::_slider_pixbuf_desensitised; ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr p, Width w) : _button (ArdourButton::led_default_elements) @@ -121,7 +122,13 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr p = _processor->what_can_be_automated (); for (set::iterator i = p.begin(); i != p.end(); ++i) { - Control* c = new Control (_slider_pixbuf, _processor->automation_control (*i), _processor->describe_parameter (*i)); + Control* c = new Control ( + _slider_pixbuf, + _slider_pixbuf_desensitised, + _processor->automation_control (*i), + _processor->describe_parameter (*i) + ); + _controls.push_back (c); if (boost::dynamic_pointer_cast (_processor) == 0) { @@ -301,6 +308,8 @@ ProcessorEntry::setup_slider_pix () { _slider_pixbuf = ::get_icon ("fader_belt_h_thin"); assert (_slider_pixbuf); + _slider_pixbuf_desensitised = ::get_icon ("fader_belt_h_thin_desensitised"); + assert (_slider_pixbuf_desensitised); } void @@ -398,10 +407,10 @@ ProcessorEntry::toggle_control_visibility (Control* c) _parent->update_gui_object_state (this); } -ProcessorEntry::Control::Control (Glib::RefPtr s, boost::shared_ptr c, string const & n) +ProcessorEntry::Control::Control (Glib::RefPtr s, Glib::RefPtr sd, boost::shared_ptr c, string const & n) : _control (c) , _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0, 1, 0.01, 0.1) - , _slider (s, &_adjustment, 0, false) + , _slider (s, sd, &_adjustment, 0, false) , _button (ArdourButton::Element (ArdourButton::Text | ArdourButton::Indicator)) , _ignore_ui_adjustment (false) , _visible (false) diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index 0e6582bb2f..a8a84e636c 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -140,6 +140,7 @@ protected: virtual void setup_visuals (); static Glib::RefPtr _slider_pixbuf; + static Glib::RefPtr _slider_pixbuf_desensitised; private: void led_clicked(); @@ -157,7 +158,7 @@ private: class Control { public: - Control (Glib::RefPtr, boost::shared_ptr, std::string const &); + Control (Glib::RefPtr, Glib::RefPtr, boost::shared_ptr, std::string const &); void set_pixel_width (int); void set_visible (bool); diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index d1a97630d5..fc898b8f75 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -86,6 +86,7 @@ using namespace std; using std::list; Glib::RefPtr RouteTimeAxisView::slider; +Glib::RefPtr RouteTimeAxisView::slider_desensitised; void RouteTimeAxisView::setup_slider_pix () @@ -93,6 +94,10 @@ RouteTimeAxisView::setup_slider_pix () if ((slider = ::get_icon ("fader_belt_h")) == 0) { throw failed_constructor (); } + + if ((slider_desensitised = ::get_icon ("fader_belt_h_desensitised")) == 0) { + throw failed_constructor (); + } } RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, Canvas& canvas) @@ -112,7 +117,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, Canvas& c , playlist_action_menu (0) , mode_menu (0) , color_mode_menu (0) - , gm (sess, slider, true, 115) + , gm (sess, slider, slider_desensitised, true, 115) { } @@ -124,6 +129,7 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) gm.set_controls (_route, _route->shared_peak_meter(), _route->amp()); gm.get_level_meter().set_no_show_all(); gm.get_level_meter().setup_meters(50); + gm.update_gain_sensitive (); string str = gui_property ("height"); if (!str.empty()) { diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 3cfd8c8774..f18d3361e0 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -296,6 +296,7 @@ protected: GainMeterBase gm; static Glib::RefPtr slider; + static Glib::RefPtr slider_desensitised; XMLNode* underlay_xml_node; bool set_underlay_state(); diff --git a/libs/gtkmm2ext/gtkmm2ext/pixfader.h b/libs/gtkmm2ext/gtkmm2ext/pixfader.h index e32fe7550b..9f1e4b75ca 100644 --- a/libs/gtkmm2ext/gtkmm2ext/pixfader.h +++ b/libs/gtkmm2ext/gtkmm2ext/pixfader.h @@ -32,7 +32,7 @@ namespace Gtkmm2ext { class PixFader : public Gtk::DrawingArea { public: - PixFader (Glib::RefPtr belt_image, Gtk::Adjustment& adjustment, int orientation, int); + PixFader (Glib::RefPtr, Glib::RefPtr, Gtk::Adjustment& adjustment, int orientation, int); virtual ~PixFader (); void set_fader_length (int); @@ -58,10 +58,17 @@ class PixFader : public Gtk::DrawingArea HORIZ=2, }; - private: - Cairo::RefPtr belt_context; - Cairo::RefPtr belt_surface; - Glib::RefPtr pixbuf; + private: + + enum State { + NORMAL, + DESENSITISED, + STATES + }; + + Cairo::RefPtr belt_context[STATES]; + Cairo::RefPtr belt_surface[STATES]; + Glib::RefPtr pixbuf[STATES]; int span, girth; int _orien; float left_r; diff --git a/libs/gtkmm2ext/gtkmm2ext/slider_controller.h b/libs/gtkmm2ext/gtkmm2ext/slider_controller.h index d6afefbdfc..64dd977e9b 100644 --- a/libs/gtkmm2ext/gtkmm2ext/slider_controller.h +++ b/libs/gtkmm2ext/gtkmm2ext/slider_controller.h @@ -39,7 +39,7 @@ namespace Gtkmm2ext { class SliderController : public Gtkmm2ext::PixFader { public: - SliderController (Glib::RefPtr image, Gtk::Adjustment* adj, int orientation, int); + SliderController (Glib::RefPtr, Glib::RefPtr, Gtk::Adjustment* adj, int orientation, int); virtual ~SliderController () {} @@ -66,6 +66,7 @@ class VSliderController : public SliderController { public: VSliderController (Glib::RefPtr image, + Glib::RefPtr image_desensitised, Gtk::Adjustment *adj, int, bool with_numeric = true); }; @@ -74,6 +75,7 @@ class HSliderController : public SliderController { public: HSliderController (Glib::RefPtr image, + Glib::RefPtr image_desensitised, Gtk::Adjustment *adj, int, bool with_numeric = true); }; diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc index e146f7aa60..02597f331e 100644 --- a/libs/gtkmm2ext/pixfader.cc +++ b/libs/gtkmm2ext/pixfader.cc @@ -28,14 +28,19 @@ using namespace Gtkmm2ext; using namespace Gtk; using namespace std; -PixFader::PixFader (Glib::RefPtr belt, Gtk::Adjustment& adj, int orientation, int fader_length) - +PixFader::PixFader ( + Glib::RefPtr belt, + Glib::RefPtr belt_desensitised, + Gtk::Adjustment& adj, + int orientation, + int fader_length + ) : adjustment (adj), - pixbuf (belt), _orien(orientation) { - Cairo::Format format; - + pixbuf[NORMAL] = belt; + pixbuf[DESENSITISED] = belt_desensitised; + dragging = false; default_value = adjustment.get_value(); last_drawn = -1; @@ -44,9 +49,9 @@ PixFader::PixFader (Glib::RefPtr belt, Gtk::Adjustment& adj, int or view.y = 0; if (orientation == VERT) { - view.width = girth = pixbuf->get_width(); + view.width = girth = pixbuf[0]->get_width(); } else { - view.height = girth = pixbuf->get_height(); + view.height = girth = pixbuf[0]->get_height(); } set_fader_length (fader_length); @@ -56,16 +61,21 @@ PixFader::PixFader (Glib::RefPtr belt, Gtk::Adjustment& adj, int or adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); - if (pixbuf->get_has_alpha()) { - format = Cairo::FORMAT_ARGB32; - } else { - format = Cairo::FORMAT_RGB24; - } - belt_surface = Cairo::ImageSurface::create (format, pixbuf->get_width(), pixbuf->get_height()); - belt_context = Cairo::Context::create (belt_surface); - Gdk::Cairo::set_source_pixbuf (belt_context, pixbuf, 0.0, 0.0); - belt_context->paint(); + for (int i = 0; i < STATES; ++i) { + Cairo::Format format; + + if (pixbuf[i]->get_has_alpha()) { + format = Cairo::FORMAT_ARGB32; + } else { + format = Cairo::FORMAT_RGB24; + } + belt_surface[i] = Cairo::ImageSurface::create (format, pixbuf[i]->get_width(), pixbuf[i]->get_height()); + belt_context[i] = Cairo::Context::create (belt_surface[i]); + Gdk::Cairo::set_source_pixbuf (belt_context[i], pixbuf[i], 0.0, 0.0); + belt_context[i]->paint(); + } + left_r = 0; left_g = 0; left_b = 0; @@ -96,6 +106,8 @@ PixFader::set_border_colors (uint32_t left, uint32_t right) bool PixFader::on_expose_event (GdkEventExpose* ev) { + int const pi = get_sensitive() ? NORMAL : DESENSITISED; + Cairo::RefPtr context = get_window()->create_cairo_context(); int srcx, srcy; int const ds = display_span (); @@ -103,9 +115,9 @@ PixFader::on_expose_event (GdkEventExpose* ev) /* account for fader lengths that are shorter than the fader pixbuf */ if (_orien == VERT) { - offset_into_pixbuf += pixbuf->get_height() / 2 - view.height; + offset_into_pixbuf += pixbuf[pi]->get_height() / 2 - view.height; } else { - offset_into_pixbuf += pixbuf->get_width() / 2 - view.width; + offset_into_pixbuf += pixbuf[pi]->get_width() / 2 - view.width; } context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height); @@ -122,7 +134,7 @@ PixFader::on_expose_event (GdkEventExpose* ev) /* fader */ context->save(); - context->set_source (belt_surface, -srcx, -srcy); + context->set_source (belt_surface[pi], -srcx, -srcy); context->rectangle (0, 0, get_width(), get_height()); context->clip (); context->paint(); diff --git a/libs/gtkmm2ext/slider_controller.cc b/libs/gtkmm2ext/slider_controller.cc index f86fd19820..c55697a2ee 100644 --- a/libs/gtkmm2ext/slider_controller.cc +++ b/libs/gtkmm2ext/slider_controller.cc @@ -28,9 +28,14 @@ using namespace Gtkmm2ext; using namespace PBD; -SliderController::SliderController (Glib::RefPtr image, Gtk::Adjustment *adj, int orientation, int fader_length) - - : PixFader (image, *adj, orientation, fader_length), +SliderController::SliderController ( + Glib::RefPtr image, + Glib::RefPtr image_desensitised, + Gtk::Adjustment *adj, + int orientation, + int fader_length + ) + : PixFader (image, image_desensitised, *adj, orientation, fader_length), spin (*adj, 0, 2) { spin.set_name ("SliderControllerValue"); @@ -55,11 +60,11 @@ SliderController::on_button_press_event (GdkEventButton *ev) return PixFader::on_button_press_event (ev); } -VSliderController::VSliderController (Glib::RefPtr image, +VSliderController::VSliderController (Glib::RefPtr image, Glib::RefPtr image_desensitised, Gtk::Adjustment *adj, int fader_length, bool with_numeric) - : SliderController (image, adj, VERT, fader_length) + : SliderController (image, image_desensitised, adj, VERT, fader_length) { if (with_numeric) { spin_frame.add (spin); @@ -70,11 +75,11 @@ VSliderController::VSliderController (Glib::RefPtr image, } } -HSliderController::HSliderController (Glib::RefPtr image, +HSliderController::HSliderController (Glib::RefPtr image, Glib::RefPtr image_desensitised, Gtk::Adjustment *adj, int fader_length, bool with_numeric) - : SliderController (image, adj, HORIZ, fader_length) + : SliderController (image, image_desensitised, adj, HORIZ, fader_length) { if (with_numeric) { spin_frame.add (spin); -- cgit v1.2.3