From c5e35789ed5df60a248bf513bae0a7dab9b1411b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 30 Nov 2010 03:10:01 +0000 Subject: add GUI elements to control 2in/2out panning. Probably not perfect. REQUIRES FULL COMPILE due to waf bug (bug has been located but not fixed) git-svn-id: svn://localhost/ardour2/branches/3.0@8130 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour3_ui_dark.rc.in | 3 +- gtk2_ardour/ardour_ui.cc | 2 + gtk2_ardour/panner_ui.cc | 103 +++++++++++++++++++++++++++++++++++++- gtk2_ardour/panner_ui.h | 16 ++++++ 4 files changed, 121 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/ardour3_ui_dark.rc.in b/gtk2_ardour/ardour3_ui_dark.rc.in index ee49bf2468..95db9030d4 100644 --- a/gtk2_ardour/ardour3_ui_dark.rc.in +++ b/gtk2_ardour/ardour3_ui_dark.rc.in @@ -1400,7 +1400,7 @@ style "location_rows_clock" = "default_clock_display" style "pan_slider" { - font_name = "@FONT_NORMAL@" + font_name = "@FONT_SMALLER@" fg[NORMAL] = { 0.22, 0.73, 0.22 } fg[ACTIVE] = { 0.22, 0.73, 0.22 } @@ -1840,6 +1840,7 @@ widget "*LocationAddRangeButton*" style:highest "default_button" widget "*LocationEditRemoveButton" style:highest "location_row_button" widget "*LocationEditRemoveButton*" style:highest "location_row_button" widget "*PanSlider" style:highest "pan_slider" +widget "*PanSlider*" style:highest "pan_slider" widget "*PanningLinkButton" style:highest "mixer_red_active_button" widget "*PanningLinkButton.*" style:highest "mixer_red_active_button" widget "*PanningLinkDirectionButton" style:highest "very_small_button" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index e969f31cf1..ce27c6a3b8 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -288,7 +288,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) GainMeter::setup_slider_pix (); RouteTimeAxisView::setup_slider_pix (); SendProcessorEntry::setup_slider_pix (); + PannerUI::setup_slider_pix (); SessionEvent::create_per_thread_pool ("GUI", 512); + } catch (failed_constructor& err) { error << string_compose (_("could not initialize %1."), PROGRAM_NAME) << endmsg; diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index 358e99c88b..b8dcfc9077 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -45,7 +45,8 @@ using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; -const int PannerUI::pan_bar_height = 30; +const int PannerUI::pan_bar_height = 20; +Glib::RefPtr PannerUI::_poswidth_slider; PannerUI::PannerUI (Session* s) : _current_nouts (-1) @@ -55,6 +56,8 @@ PannerUI::PannerUI (Session* s) , panning_viewport(hAdjustment, vAdjustment) , panning_up_arrow (Gtk::ARROW_UP, Gtk::SHADOW_OUT) , panning_down_arrow (Gtk::ARROW_DOWN, Gtk::SHADOW_OUT) + , _position_adjustment (0.5, 0.0, 1.0, 0.01, 0.1) + , _width_adjustment (0.0, -1.0, 1.0, 0.01, 0.1) , panning_link_button (_("link")) , pan_automation_style_button ("") , pan_automation_state_button ("") @@ -67,6 +70,10 @@ PannerUI::PannerUI (Session* s) pan_astate_menu = 0; pan_astyle_menu = 0; in_pan_update = false; + _position_fader = 0; + _width_fader = 0; + _ignore_width_change = false; + _ignore_position_change = false; pan_automation_style_button.set_name ("MixerAutomationModeButton"); pan_automation_state_button.set_name ("MixerAutomationPlaybackButton"); @@ -122,7 +129,7 @@ PannerUI::PannerUI (Session* s) pan_vbox.set_spacing (2); pan_vbox.pack_start (panning_viewport, Gtk::PACK_SHRINK); pan_vbox.pack_start (panning_link_box, Gtk::PACK_SHRINK); - + pack_start (pan_vbox, true, true); twod_panner = 0; @@ -265,6 +272,12 @@ PannerUI::update_pan_linkage () } } +void +PannerUI::on_size_allocate (Allocation& a) +{ + HBox::on_size_allocate (a); +} + void PannerUI::set_width (Width w) { @@ -296,6 +309,8 @@ PannerUI::~PannerUI () delete pan_menu; delete pan_astyle_menu; delete pan_astate_menu; + delete _position_fader; + delete _width_fader; } @@ -471,6 +486,39 @@ PannerUI::setup_pan () panning_viewport.add (pan_bar_packer); panning_viewport.show_all (); + if (npans == 2) { + /* add position and width controls */ + if (_position_fader == 0) { + _position_fader = new BarController (_position_adjustment, _panner->direction_control()); + _position_fader->set_size_request (-1, pan_bar_height/2); + _position_fader->set_name ("PanSlider"); + ARDOUR_UI::instance()->set_tip (_position_fader, _("Pan Position")); + _position_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &PannerUI::position_adjusted)); + _panner->direction_control()->Changed.connect (connections, invalidator (*this), boost::bind (&PannerUI::show_position, this), gui_context()); + show_position(); + + _width_fader = new BarController (_width_adjustment, _panner->width_control()); + _width_fader->set_size_request (-1, pan_bar_height/2); + _width_fader->set_name ("PanSlider"); + _width_fader->set_style (BarController::CenterOut); + ARDOUR_UI::instance()->set_tip (_width_fader, _("Stereo Image Width")); + _width_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &PannerUI::width_adjusted)); + _panner->width_control()->Changed.connect (connections, invalidator (*this), boost::bind (&PannerUI::show_width, this), gui_context()); + show_width(); + + poswidth_box.pack_start (*_position_fader, true, true); + poswidth_box.pack_start (*_width_fader, true, true); + } + pan_vbox.pack_start (poswidth_box, false, false); + poswidth_box.show_all (); + cerr << "Packed poswidth and mde it visible\n"; + } else { + if (_position_fader) { + pan_vbox.remove (poswidth_box); + cerr << "Hid poswidth\n"; + } + } + } else { if (!twod_panner) { @@ -924,3 +972,54 @@ PannerUI::bar_spinner_activate (bool a) { _bar_spinner_active = a; } + +void +PannerUI::setup_slider_pix () +{ + _poswidth_slider = ::get_icon ("fader_belt_h_thin"); + assert (_poswidth_slider); +} + +void +PannerUI::show_width () +{ + float const value = _panner->width_control()->get_value (); + + if (_width_adjustment.get_value() != value) { + _ignore_width_change = true; + _width_adjustment.set_value (value); + _ignore_width_change = false; + } +} + +void +PannerUI::width_adjusted () +{ + if (_ignore_width_change) { + return; + } + + _panner->width_control()->set_value (_width_adjustment.get_value()); +} + +void +PannerUI::show_position () +{ + float const value = _panner->direction_control()->get_value (); + + if (_position_adjustment.get_value() != value) { + _ignore_position_change = true; + _position_adjustment.set_value (value); + _ignore_position_change = false; + } +} + +void +PannerUI::position_adjusted () +{ + if (_ignore_position_change) { + return; + } + + _panner->direction_control()->set_value (_position_adjustment.get_value()); +} diff --git a/gtk2_ardour/panner_ui.h b/gtk2_ardour/panner_ui.h index 4c0039a8d3..bf2d4bb0c4 100644 --- a/gtk2_ardour/panner_ui.h +++ b/gtk2_ardour/panner_ui.h @@ -79,6 +79,9 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr boost::shared_ptr get_controllable(); void set_mono (bool); + void on_size_allocate (Gtk::Allocation &); + + static void setup_slider_pix (); private: friend class MixerStrip; @@ -106,8 +109,21 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr Gtk::EventBox panning_down; Gtk::Arrow panning_down_arrow; Gtk::VBox pan_vbox; + Gtk::VBox poswidth_box; Width _width; + Gtk::Adjustment _position_adjustment; + Gtk::Adjustment _width_adjustment; + Gtkmm2ext::BarController* _position_fader; + Gtkmm2ext::BarController* _width_fader; + static Glib::RefPtr _poswidth_slider; + bool _ignore_width_change; + bool _ignore_position_change; + void width_adjusted (); + void show_width (); + void position_adjusted (); + void show_position (); + Gtk::ToggleButton panning_link_button; Gtk::Button panning_link_direction_button; Gtk::HBox panning_link_box; -- cgit v1.2.3