diff --git a/gtk2_ardour/trigger_ui.cc b/gtk2_ardour/trigger_ui.cc index b6c529e7fd..5069426354 100644 --- a/gtk2_ardour/trigger_ui.cc +++ b/gtk2_ardour/trigger_ui.cc @@ -35,6 +35,7 @@ #include "ardour/region.h" #include "ardour/triggerbox.h" +#include "gtkmm/sizegroup.h" #include "gtkmm2ext/utils.h" #include "audio_region_properties_box.h" @@ -73,6 +74,7 @@ static std::string longest_launch; TriggerUI::TriggerUI () : _renaming (false) + , _color_button (ArdourButton::Element (ArdourButton::just_led_default_elements | ArdourButton::ColorBox)) , _follow_action_button (ArdourButton::led_default_elements) , _velocity_adjustment(1.,0.,1.0,0.01,0.1) , _velocity_slider (&_velocity_adjustment, boost::shared_ptr(), 24/*length*/, 12/*girth*/ ) @@ -207,11 +209,22 @@ TriggerUI::TriggerUI () _load_button.set_text (_("Load")); _load_button.signal_clicked.connect (sigc::mem_fun (*this, (&TriggerUI::choose_sample))); + _color_button.set_name("FollowAction"); + _color_button.signal_clicked.connect (sigc::mem_fun (*this, (&TriggerUI::choose_color))); + + _follow_size_group = Gtk::SizeGroup::create (Gtk::SIZE_GROUP_VERTICAL); + _follow_size_group->add_widget(_name_frame); + _follow_size_group->add_widget(_load_button); + _follow_size_group->add_widget(_color_button); + _follow_size_group->add_widget(_velocity_slider); + _follow_size_group->add_widget(_follow_count_spinner); + int row=0; Gtk::Label *label; attach(_name_frame, 0, 2, row, row+1, Gtk::FILL, Gtk::SHRINK ); - attach(_load_button, 2, 3, row, row+1, Gtk::FILL, Gtk::SHRINK ); row++; + attach(_load_button, 2, 3, row, row+1, Gtk::FILL, Gtk::SHRINK ); + attach(_color_button, 3, 4, row, row+1, Gtk::FILL, Gtk::SHRINK ); row++; label = manage(new Gtk::Label(_("Velocity Sense:"))); label->set_alignment(1.0, 0.5); attach(*label, 0, 1, row, row+1, Gtk::FILL, Gtk::SHRINK ); @@ -257,6 +270,32 @@ TriggerUI::~TriggerUI () { } +void +TriggerUI::choose_color () +{ + _color_dialog.get_colorsel()->set_has_opacity_control (false); + _color_dialog.get_colorsel()->set_has_palette (true); + _color_dialog.get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (_color_dialog, &Gtk::Dialog::response), Gtk::RESPONSE_ACCEPT)); + _color_dialog.get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (_color_dialog, &Gtk::Dialog::response), Gtk::RESPONSE_CANCEL)); + + Gdk::Color c = ARDOUR_UI_UTILS::gdk_color_from_rgba(trigger()->color()); + + _color_dialog.get_colorsel()->set_previous_color (c); + _color_dialog.get_colorsel()->set_current_color (c); + + switch (_color_dialog.run()) { + case Gtk::RESPONSE_ACCEPT: { + c = _color_dialog.get_colorsel()->get_current_color(); + color_t ct = ARDOUR_UI_UTILS::gdk_color_to_rgba(c); + trigger()->set_color(ct); + } break; + default: + break; + } + + _color_dialog.hide (); +} + void TriggerUI::choose_sample () { @@ -489,6 +528,7 @@ TriggerUI::set_trigger (ARDOUR::TriggerReference tr) PropertyChange pc; pc.add (Properties::name); + pc.add (Properties::color); pc.add (Properties::use_follow); pc.add (Properties::legato); pc.add (Properties::quantization); @@ -659,6 +699,9 @@ TriggerUI::trigger_changed (PropertyChange pc) if (pc.contains (Properties::name)) { _name_label.set_text (trigger()->name()); } + if (pc.contains (Properties::color)) { + _color_button.set_custom_led_color (trigger()->color()); + } if (pc.contains (Properties::quantization)) { BBT_Offset bbo (trigger()->quantization()); _quantize_button.set_active (quantize_length_to_string (bbo)); diff --git a/gtk2_ardour/trigger_ui.h b/gtk2_ardour/trigger_ui.h index cf280760f3..a3eec30f0b 100644 --- a/gtk2_ardour/trigger_ui.h +++ b/gtk2_ardour/trigger_ui.h @@ -48,6 +48,7 @@ class TriggerUI : public Gtk::Table //, public sigc::trackable static std::string launch_style_to_string (ARDOUR::Trigger::LaunchStyle); private: + void choose_color (); void choose_sample (); void sample_chosen (int r); @@ -64,6 +65,8 @@ class TriggerUI : public Gtk::Table //, public sigc::trackable bool entry_button_press (GdkEventButton*); void disconnect_entry_signals (); + Gtk::ColorSelectionDialog _color_dialog; + ARDOUR::TriggerReference tref; ARDOUR::TriggerPtr trigger() const; @@ -74,6 +77,9 @@ class TriggerUI : public Gtk::Table //, public sigc::trackable Gtk::EventBox _namebox; ArdourWidgets::Frame _name_frame; + Glib::RefPtr _follow_size_group; + ArdourWidgets::ArdourButton _color_button; + sigc::connection _file_chooser_connection; Gtk::FileChooserDialog* _file_chooser; ArdourWidgets::ArdourButton _load_button; diff --git a/libs/widgets/wscript b/libs/widgets/wscript index 1a1b24f5db..7616142d86 100644 --- a/libs/widgets/wscript +++ b/libs/widgets/wscript @@ -36,6 +36,7 @@ widgets_sources = [ 'ardour_spinner.cc', 'barcontroller.cc', 'binding_proxy.cc', + 'color_button.cc', 'eventboxext.cc', 'choice.cc', 'fastmeter.cc',