const int PannerUI::pan_bar_height = 30;
-PannerUI::PannerUI (boost::shared_ptr<IO> io, Session& s)
- : _io (io),
- _session (s),
+PannerUI::PannerUI (Session& s)
+ : _session (s),
hAdjustment(0.0, 0.0, 0.0),
vAdjustment(0.0, 0.0, 0.0),
panning_viewport(hAdjustment, vAdjustment),
{
ignore_toggle = false;
pan_menu = 0;
+ pan_astate_menu = 0;
+ pan_astyle_menu = 0;
in_pan_update = false;
pan_automation_style_button.set_name ("MixerAutomationModeButton");
pan_automation_style_button.unset_flags (Gtk::CAN_FOCUS);
pan_automation_state_button.unset_flags (Gtk::CAN_FOCUS);
- using namespace Menu_Helpers;
- pan_astate_menu.items().push_back (MenuElem (_("Manual"),
- bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Off)));
- pan_astate_menu.items().push_back (MenuElem (_("Play"),
- bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Play)));
- pan_astate_menu.items().push_back (MenuElem (_("Write"),
- bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Write)));
- pan_astate_menu.items().push_back (MenuElem (_("Touch"),
- bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Touch)));
-
- pan_astyle_menu.items().push_back (MenuElem (_("Trim")));
- pan_astyle_menu.items().push_back (MenuElem (_("Abs")));
-
- pan_astate_menu.set_name ("ArdourContextMenu");
- pan_astyle_menu.set_name ("ArdourContextMenu");
-
pan_automation_style_button.signal_button_press_event().connect (mem_fun(*this, &PannerUI::pan_automation_style_button_event), false);
pan_automation_state_button.signal_button_press_event().connect (mem_fun(*this, &PannerUI::pan_automation_state_button_event), false);
panner = 0;
set_width(Narrow);
+}
+
+void
+PannerUI::set_io (boost::shared_ptr<IO> io)
+{
+ connections.clear ();
+
+ if (pan_astyle_menu) {
+ delete pan_astyle_menu;
+ pan_astyle_menu = 0;
+ }
- _io->panner().Changed.connect (mem_fun(*this, &PannerUI::panner_changed));
- _io->panner().LinkStateChanged.connect (mem_fun(*this, &PannerUI::update_pan_linkage));
- _io->panner().StateChanged.connect (mem_fun(*this, &PannerUI::update_pan_state));
+ if (pan_astate_menu) {
+ delete pan_astate_menu;
+ pan_astate_menu = 0;
+ }
+
+ _io = io;
+
+ connections.push_back (_io->panner().Changed.connect (mem_fun(*this, &PannerUI::panner_changed)));
+ connections.push_back (_io->panner().LinkStateChanged.connect (mem_fun(*this, &PannerUI::update_pan_linkage)));
+ connections.push_back (_io->panner().StateChanged.connect (mem_fun(*this, &PannerUI::update_pan_state)));
+
+ if (panner) {
+ delete panner;
+ panner = 0;
+ }
+
+ setup_pan ();
pan_changed (0);
update_pan_sensitive ();
pan_automation_state_changed ();
}
+void
+PannerUI::build_astate_menu ()
+{
+ using namespace Menu_Helpers;
+
+ if (pan_astate_menu == 0) {
+ pan_astate_menu = new Menu;
+ pan_astate_menu->set_name ("ArdourContextMenu");
+ } else {
+ pan_astate_menu->items().clear ();
+ }
+
+ pan_astate_menu->items().push_back (MenuElem (_("Manual"),
+ bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Off)));
+ pan_astate_menu->items().push_back (MenuElem (_("Play"),
+ bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Play)));
+ pan_astate_menu->items().push_back (MenuElem (_("Write"),
+ bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Write)));
+ pan_astate_menu->items().push_back (MenuElem (_("Touch"),
+ bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Touch)));
+
+}
+
+void
+PannerUI::build_astyle_menu ()
+{
+ using namespace Menu_Helpers;
+
+ if (pan_astyle_menu == 0) {
+ pan_astyle_menu = new Menu;
+ pan_astyle_menu->set_name ("ArdourContextMenu");
+ } else {
+ pan_astyle_menu->items().clear();
+ }
+
+ pan_astyle_menu->items().push_back (MenuElem (_("Trim")));
+ pan_astyle_menu->items().push_back (MenuElem (_("Abs")));
+}
+
PBD::Controllable*
PannerUI::get_controllable()
{
bool
PannerUI::panning_link_button_press (GdkEventButton* ev)
{
- cerr << "link press\n";
return true;
}
bool
PannerUI::panning_link_button_release (GdkEventButton* ev)
{
- cerr << "link release\n";
if (!ignore_toggle) {
_io->panner().set_linked (!_io->panner().linked());
}
bool x = _io->panner().linked();
bool bx = panning_link_button.get_active();
-
+
if (x != bx) {
ignore_toggle = true;
if (pan_menu) {
delete pan_menu;
}
-
+
+ if (pan_astyle_menu) {
+ delete pan_astyle_menu;
+ }
+
+ if (pan_astate_menu) {
+ delete pan_astate_menu;
+ }
}
{
ENSURE_GUI_THREAD (mem_fun(*this, &PannerUI::panner_changed));
setup_pan ();
+ pan_changed (0);
}
void
break;
case 2:
+ /* bring pan bar state up to date */
update_pan_bars (false);
break;
switch (ev->button) {
case 1:
- pan_astate_menu.popup (1, ev->time);
+ if (pan_astate_menu == 0) {
+ build_astate_menu ();
+ }
+ pan_astate_menu->popup (1, ev->time);
break;
default:
break;
switch (ev->button) {
case 1:
- pan_astyle_menu.popup (1, ev->time);
+ if (pan_astyle_menu == 0) {
+ build_astyle_menu ();
+ }
+ pan_astyle_menu->popup (1, ev->time);
break;
default:
break;
pan_watching.disconnect();
if (x) {
- pan_watching = ARDOUR_UI::RapidScreenUpdate.connect (mem_fun (*this, &PannerUI::effective_pan_display));
+ pan_watching = ARDOUR_UI::RapidScreenUpdate.connect (mem_fun (*this, &PannerUI::effective_pan_display));
}
}