#include "ardour/io.h"
#include "ardour/dB.h"
#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/stop_signal.h>
#include <gtkmm2ext/barcontroller.h>
#include "midi++/manager.h"
#include "pbd/fastlog.h"
pan_automation_style_button.set_name ("MixerAutomationModeButton");
pan_automation_state_button.set_name ("MixerAutomationPlaybackButton");
- ARDOUR_UI::instance()->tooltips().set_tip (pan_automation_state_button, _("Pan automation mode"));
- ARDOUR_UI::instance()->tooltips().set_tip (pan_automation_style_button, _("Pan automation type"));
+ ARDOUR_UI::instance()->set_tip (pan_automation_state_button, _("Pan automation mode"));
+ ARDOUR_UI::instance()->set_tip (pan_automation_style_button, _("Pan automation type"));
//set_size_request_to_display_given_text (pan_automation_state_button, X_("O"), 2, 2);
//set_size_request_to_display_given_text (pan_automation_style_button, X_("0"), 2, 2);
panning_viewport.set_name (X_("BaseFrame"));
- ARDOUR_UI::instance()->tooltips().set_tip (panning_link_button,
+ ARDOUR_UI::instance()->set_tip (panning_link_button,
_("panning link control"));
- ARDOUR_UI::instance()->tooltips().set_tip (panning_link_direction_button,
+ ARDOUR_UI::instance()->set_tip (panning_link_direction_button,
_("panning link direction"));
pan_automation_style_button.unset_flags (Gtk::CAN_FOCUS);
pack_start (pan_vbox, true, true);
- panner = 0;
+ twod_panner = 0;
big_window = 0;
set_width(Narrow);
_panner = p;
- delete panner;
- panner = 0;
+ delete twod_panner;
+ twod_panner = 0;
if (!_panner) {
return;
}
- _panner->Changed.connect (connections, boost::bind (&PannerUI::panner_changed, this), gui_context());
- _panner->LinkStateChanged.connect (connections, boost::bind (&PannerUI::update_pan_linkage, this), gui_context());
- _panner->StateChanged.connect (connections, boost::bind (&PannerUI::update_pan_state, this), gui_context());
+ _panner->Changed.connect (connections, invalidator (*this), boost::bind (&PannerUI::panner_changed, this), gui_context());
+ _panner->LinkStateChanged.connect (connections, invalidator (*this), boost::bind (&PannerUI::update_pan_linkage, this), gui_context());
+ _panner->StateChanged.connect (connections, invalidator (*this), boost::bind (&PannerUI::update_pan_state, this), gui_context());
setup_pan ();
update_pan_sensitive ();
update_pan_linkage ();
pan_automation_state_changed ();
-
-#if WHERE_DOES_THIS_LIVE
- pan_bar_packer.show();
- panning_viewport.show();
- panning_up.show();
- panning_up_arrow.show();
- panning_down.show();
- panning_down_arrow.show();
- pan_vbox.show();
- panning_link_button.show();
- panning_link_direction_button.show();
- panning_link_box.show();
- pan_automation_style_button.show();
- pan_automation_state_button.show();
- show();
-#endif
}
void
{
ENSURE_GUI_THREAD (*this, &PannerUI::update_pan_linkage)
- bool x = _panner->linked();
- bool bx = panning_link_button.get_active();
+ bool const x = _panner->linked();
+ bool const bx = panning_link_button.get_active();
if (x != bx) {
delete (*i);
}
- delete panner;
+ delete twod_panner;
delete big_window;
delete pan_menu;
delete pan_astyle_menu;
return;
}
+ _pan_control_connections.drop_connections ();
+ for (uint32_t i = 0; i < _panner->npanners(); ++i) {
+ connect_to_pan_control (i);
+ }
+
_current_nouts = nouts;
_current_npans = npans;
pan_adjustments.pop_back ();
}
- delete panner;
- panner = 0;
+ delete twod_panner;
+ twod_panner = 0;
/* stick something into the panning viewport so that it redraws */
pan_adjustments.pop_back ();
}
- delete panner;
- panner = 0;
+ delete twod_panner;
+ twod_panner = 0;
while ((asz = pan_adjustments.size()) < npans) {
/* now set adjustment with current value of panner, then connect the signals */
pan_adjustments.back()->set_value(rx);
pan_adjustments.back()->signal_value_changed().connect (sigc::bind (sigc::mem_fun(*this, &PannerUI::pan_adjustment_changed), (uint32_t) asz));
-
- _panner->pan_control( asz )->Changed.connect (connections, boost::bind (&PannerUI::pan_value_changed, this, (uint32_t) asz), gui_context());
+ connect_to_pan_control (asz);
bc->set_name ("PanSlider");
bc->set_shadow_type (Gtk::SHADOW_NONE);
char buf[64];
snprintf (buf, sizeof (buf), _("panner for channel %zu"), asz + 1);
- ARDOUR_UI::instance()->tooltips().set_tip (bc->event_widget(), buf);
+ ARDOUR_UI::instance()->set_tip (bc->event_widget(), buf);
bc->event_widget().signal_button_release_event().connect
(sigc::bind (sigc::mem_fun(*this, &PannerUI::pan_button_event), (uint32_t) asz));
} else {
- if (!panner) {
- panner = new Panner2d (_panner, 61);
- panner->set_name ("MixerPanZone");
- panner->show ();
+ if (!twod_panner) {
+ twod_panner = new Panner2d (_panner, 61);
+ twod_panner->set_name ("MixerPanZone");
+ twod_panner->show ();
- panner->signal_button_press_event().connect
+ twod_panner->signal_button_press_event().connect
(sigc::bind (sigc::mem_fun(*this, &PannerUI::pan_button_event), (uint32_t) 0), false);
}
update_pan_sensitive ();
- panner->reset (npans);
+ twod_panner->reset (npans);
if (big_window) {
big_window->reset (npans);
}
- panner->set_size_request (-1, 61);
+ twod_panner->set_size_request (-1, 61);
/* and finally, add it to the panner frame */
panning_viewport.remove ();
- panning_viewport.add (*panner);
+ panning_viewport.add (*twod_panner);
panning_viewport.show_all ();
}
}
{
switch (ev->button) {
case 1:
- if (panner && ev->type == GDK_2BUTTON_PRESS) {
+ if (twod_panner && ev->type == GDK_2BUTTON_PRESS) {
if (!big_window) {
big_window = new Panner2dWindow (_panner, 400, _panner->npanners());
}
panning_link_button.set_sensitive (false);
break;
default:
- panning_link_direction_button.set_sensitive (true);
+ panning_link_direction_button.set_sensitive (_panner->linked ());
panning_link_button.set_sensitive (true);
}
- uint32_t nouts = _panner->nouts();
+ uint32_t const nouts = _panner->nouts();
switch (nouts) {
case 0:
{
if (!in_pan_update && which < _panner->npanners()) {
- float xpos;
float val = pan_adjustments[which]->get_value ();
- xpos = _panner->pan_control( which )->get_value();
+ float const xpos = _panner->pan_control(which)->get_value();
/* add a kinda-sorta detent for the middle */
if (!Panner::equivalent (val, xpos)) {
- _panner->streampanner(which).set_position (val);
+ _panner->pan_control(which)->set_value (val);
/* XXX
the panner objects have no access to the session,
so do this here. ick.
{
ENSURE_GUI_THREAD (*this, &PannerUI::pan_value_changed, which)
- if (_panner->npanners() > 1 && which < _panner->npanners()) {
+ if (twod_panner) {
+
+ float x;
+ float y;
+ _panner->streampanner(which).get_position (x, y);
+
+ in_pan_update = true;
+ twod_panner->move_puck (which, x, y);
+ in_pan_update = false;
+
+ } else if (_panner->npanners() > 0 && which < _panner->npanners()) {
float xpos;
float val = pan_adjustments[which]->get_value ();
}
break;
default:
- if (panner) {
- panner->set_sensitive (sensitive);
+ if (twod_panner) {
+ twod_panner->set_sensitive (sensitive);
}
if (big_window) {
big_window->set_sensitive (sensitive);
update_pan_sensitive ();
}
-
+
+void
+PannerUI::connect_to_pan_control (uint32_t i)
+{
+ _panner->pan_control(i)->Changed.connect (
+ _pan_control_connections, invalidator (*this), boost::bind (&PannerUI::pan_value_changed, this, i), gui_context ()
+ );
+}