From 212afd402c98e71e3ccc6ce3c8795234aef66f54 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 9 Jun 2016 15:35:56 -0400 Subject: color management and handling for VCAs --- gtk2_ardour/control_slave_ui.cc | 14 ++++++++++++ gtk2_ardour/control_slave_ui.h | 3 +++ gtk2_ardour/route_ui.cc | 19 ++++++++-------- gtk2_ardour/utils.cc | 1 - gtk2_ardour/vca_master_strip.cc | 49 ++++++++++++++++++++++++++++++++++++++++- gtk2_ardour/vca_master_strip.h | 3 +++ 6 files changed, 78 insertions(+), 11 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/control_slave_ui.cc b/gtk2_ardour/control_slave_ui.cc index 12a3495293..3fd752c72f 100644 --- a/gtk2_ardour/control_slave_ui.cc +++ b/gtk2_ardour/control_slave_ui.cc @@ -84,10 +84,15 @@ ControlSlaveUI::set_stripable (boost::shared_ptr s) void ControlSlaveUI::update_vca_display () { + if (!_session || _session->deletion_in_progress()) { + return; + } + VCAList vcas (_session->vca_manager().vcas()); bool any = false; Gtkmm2ext::container_clear (*this); + master_connections.drop_connections (); for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { if (stripable->gain_control()->slaved_to ((*v)->gain_control())) { @@ -221,7 +226,16 @@ ControlSlaveUI::add_vca_button (boost::shared_ptr vca) vca_button->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); vca_button->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::specific_vca_button_release), vca->number()), false); vca_button->set_text (PBD::to_string (vca->number(), std::dec)); + vca_button->set_fixed_colors (vca->presentation_info().color(), vca->presentation_info().color ()); + + vca->presentation_info().PropertyChanged.connect (master_connections, invalidator (*this), boost::bind (&ControlSlaveUI::master_property_changed, this, _1), gui_context()); pack_start (*vca_button); vca_button->show (); } + +void +ControlSlaveUI::master_property_changed (PBD::PropertyChange const& /* what_changed */) +{ + update_vca_display (); +} diff --git a/gtk2_ardour/control_slave_ui.h b/gtk2_ardour/control_slave_ui.h index 1ce35720ec..3443e1a79a 100644 --- a/gtk2_ardour/control_slave_ui.h +++ b/gtk2_ardour/control_slave_ui.h @@ -27,6 +27,7 @@ #include #include "pbd/signals.h" +#include "pbd/properties.h" #include "ardour/session_handle.h" @@ -47,8 +48,10 @@ class ControlSlaveUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr private: boost::shared_ptr stripable; PBD::ScopedConnectionList connections; + PBD::ScopedConnectionList master_connections; ArdourButton initial_button; + void master_property_changed (PBD::PropertyChange const &); void update_vca_display (); void vca_menu_toggle (Gtk::CheckMenuItem*, uint32_t n); bool specific_vca_button_release (GdkEventButton* ev, uint32_t n); diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 7f43a9e251..b7b4b22fb6 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -63,6 +63,7 @@ #include "mixer_strip.h" #include "plugin_pin_dialog.h" #include "prompter.h" +#include "rgb_macros.h" #include "route_time_axis.h" #include "route_ui.h" #include "timers.h" @@ -2211,9 +2212,8 @@ RouteUI::route_color () const /* old v4.x or earlier session. Use this information */ - int component; + int red, green, blue; char colon; - PresentationInfo::color_t color = 0; stringstream ss (p); @@ -2224,16 +2224,17 @@ RouteUI::route_color () const decode to rgb .. */ - ss >> component; + ss >> red; ss >> colon; - color |= ((component >> 2) << 16); - ss >> component; + ss >> green; ss >> colon; - color |= ((component >> 2) << 8); - ss >> component; - color |= (component >> 2); + ss >> blue; - _route->presentation_info().set_color (color); + red >>= 2; + green >>= 2; + blue >>= 2; + + _route->presentation_info().set_color (RGBA_TO_UINT (red, green, blue, 255)); } set_color_from_rgba (c, _route->presentation_info().color()); diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 6ad6d9bb3c..6fb5caa7e5 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -313,7 +313,6 @@ ARDOUR_UI_UTILS::gdk_color_to_rgba (Gdk::Color const& c) return RGBA_TO_UINT (r,g,b,a); } - bool ARDOUR_UI_UTILS::relay_key_press (GdkEventKey* ev, Gtk::Window* win) { diff --git a/gtk2_ardour/vca_master_strip.cc b/gtk2_ardour/vca_master_strip.cc index 4c56832b23..4ef1e4adaf 100644 --- a/gtk2_ardour/vca_master_strip.cc +++ b/gtk2_ardour/vca_master_strip.cc @@ -17,6 +17,7 @@ */ #include +#include #include "pbd/convert.h" @@ -34,6 +35,7 @@ #include "mixer_ui.h" #include "tooltips.h" #include "ui_config.h" +#include "utils.h" #include "vca_master_strip.h" #include "i18n.h" @@ -55,6 +57,15 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr v) , delete_dialog (0) , control_slave_ui (s) { + + PresentationInfo::color_t c = _vca->presentation_info().color (); + + /* XXX need a (better) test of "has a color" */ + + if (c == 0) { + _vca->presentation_info().set_color (gdk_color_to_rgba (unique_random_color())); + } + control_slave_ui.set_stripable (boost::dynamic_pointer_cast (v)); gain_meter.set_controls (boost::shared_ptr(), @@ -96,6 +107,7 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr v) vertical_button.set_layout_font (UIConfiguration::instance().get_NormalBoldFont()); vertical_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::vertical_button_press)); vertical_button.set_fallthrough_to_parent (true); + vertical_button.set_active_color (_vca->presentation_info().color ()); set_tooltip (vertical_button, _("Click to show slaves only")); /* tooltip updated dynamically */ drop_button.set_text(_("drop")); @@ -145,6 +157,7 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr v) Mixer_UI::instance()->show_vca_change.connect (sigc::mem_fun (*this, &VCAMasterStrip::spill_change)); _vca->PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context()); + _vca->presentation_info().PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context()); _vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::self_delete, this), gui_context()); _vca->solo_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::solo_changed, this), gui_context()); @@ -372,6 +385,10 @@ VCAMasterStrip::vca_property_changed (PropertyChange const & what_changed) if (what_changed.contains (ARDOUR::Properties::name)) { update_vca_name (); } + + if (what_changed.contains (ARDOUR::Properties::color)) { + vertical_button.set_active_color (_vca->presentation_info().color ()); + } } void @@ -388,6 +405,7 @@ VCAMasterStrip::build_context_menu () context_menu = new Menu; MenuList& items = context_menu->items(); items.push_back (MenuElem (_("Rename"), sigc::mem_fun (*this, &VCAMasterStrip::start_name_edit))); + items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &VCAMasterStrip::start_color_edit))); items.push_back (SeparatorElem()); items.push_back (MenuElem (_("Drop All Slaves"), sigc::mem_fun (*this, &VCAMasterStrip::drop_all_slaves))); items.push_back (SeparatorElem()); @@ -445,7 +463,7 @@ VCAMasterStrip::drop_button_press () Gdk::Color VCAMasterStrip::color () const { - return gdk_color_from_rgb (_vca->presentation_info().color ()); + return gdk_color_from_rgba (_vca->presentation_info().color ()); } string @@ -453,3 +471,32 @@ VCAMasterStrip::state_id () const { return string_compose (X_("vms-%1"), _vca->number()); } + +void +VCAMasterStrip::start_color_edit () +{ + Gtk::ColorSelectionDialog* color_dialog = new Gtk::ColorSelectionDialog; + + color_dialog->get_colorsel()->set_has_opacity_control (false); + color_dialog->get_colorsel()->set_has_palette (true); + + Gdk::Color c = gdk_color_from_rgba (_vca->presentation_info().color ()); + + color_dialog->get_colorsel()->set_previous_color (c); + color_dialog->get_colorsel()->set_current_color (c); + + color_dialog->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &VCAMasterStrip::finish_color_edit), color_dialog)); + color_dialog->present (); +} + +void +VCAMasterStrip::finish_color_edit (int response, Gtk::ColorSelectionDialog* dialog) +{ + switch (response) { + case RESPONSE_OK: + _vca->presentation_info().set_color (gdk_color_to_rgba (dialog->get_colorsel()->get_current_color())); + break; + } + + delete_when_idle (dialog); +} diff --git a/gtk2_ardour/vca_master_strip.h b/gtk2_ardour/vca_master_strip.h index 63b5e7a896..7d1edf1acd 100644 --- a/gtk2_ardour/vca_master_strip.h +++ b/gtk2_ardour/vca_master_strip.h @@ -98,6 +98,9 @@ class VCAMasterStrip : public AxisView, public Gtk::EventBox void parameter_changed (std::string const& p); void set_button_names (); + + void start_color_edit (); + void finish_color_edit (int, Gtk::ColorSelectionDialog*); }; -- cgit v1.2.3