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");
//set_size_request_to_display_given_text (pan_automation_style_button, X_("0"), 2, 2);
pan_bar_packer.set_size_request (-1, 61);
- panning_viewport.set_size_request (64, 61);
-
+ panning_viewport.set_size_request (-1, 61);
panning_viewport.set_name (X_("BaseFrame"));
ARDOUR_UI::instance()->tooltips().set_tip (panning_link_button,
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 (_("Off"),
- 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);
pan_vbox.pack_start (panning_viewport, Gtk::PACK_SHRINK);
pan_vbox.pack_start (panning_link_box, Gtk::PACK_SHRINK);
- pack_start (pan_vbox, true, false);
+ pack_start (pan_vbox, true, true);
panner = 0;
set_width(Narrow);
+}
- _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));
+void
+PannerUI::set_io (boost::shared_ptr<IO> io)
+{
+ connections.clear ();
+
+ if (pan_astyle_menu) {
+ delete pan_astyle_menu;
+ pan_astyle_menu = 0;
+ }
+
+ 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()
+{
+ return pan_bars[0]->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;
{
switch (w) {
case Wide:
- panning_viewport.set_size_request (64, 61);
- if (panner) {
- panner->set_size_request (63, 61);
- }
- for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
- (*i)->set_size_request (63, pan_bar_height);
- }
panning_link_button.set_label (_("link"));
break;
case Narrow:
- panning_viewport.set_size_request (34, 61);
- if (panner) {
- panner->set_size_request (33, 61);
- }
- for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
- (*i)->set_size_request (33, pan_bar_height);
- }
panning_link_button.set_label (_("L"));
break;
}
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
pan_adjustments.pop_back ();
}
+ /* stick something into the panning viewport so that it redraws */
+
+ EventBox* eb = manage (new EventBox());
+ panning_viewport.remove ();
+ panning_viewport.add (*eb);
+ panning_viewport.show_all ();
+
} else if (nouts == 2) {
vector<Adjustment*>::size_type asz;
bc->event_widget().signal_button_release_event().connect
(bind (mem_fun(*this, &PannerUI::pan_button_event), (uint32_t) asz));
- pan_bars.push_back (bc);
- switch (_width) {
- case Wide:
- bc->set_size_request (63, pan_bar_height);
- break;
- case Narrow:
- bc->set_size_request (33, pan_bar_height);
- break;
- }
+ bc->set_size_request (-1, pan_bar_height);
+ pan_bars.push_back (bc);
pan_bar_packer.pack_start (*bc, false, false);
}
} else {
- int w = 0;
-
- switch (_width) {
- case Wide:
- w = 63;
- break;
- case Narrow:
- w = 33;
- break;
- }
-
if (panner == 0) {
- panner = new Panner2d (_io->panner(), w, 61);
+ panner = new Panner2d (_io->panner(), 61);
panner->set_name ("MixerPanZone");
panner->show ();
}
update_pan_sensitive ();
panner->reset (_io->n_inputs());
- panner->set_size_request (w, 61);
+ panner->set_size_request (-1, 61);
/* and finally, add it to the panner frame */
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));
}
}
switch (state) {
case Off:
- sstr = (shrt ? "O" : _("O"));
+ sstr = (shrt ? "M" : _("M"));
break;
case Play:
sstr = (shrt ? "P" : _("P"));