+ boost::shared_ptr<Speakers> speakers = _speakers.lock ();
+ if (!speakers) {
+ return;
+ }
+
+ speakers->add_speaker (PBD::AngularVector (0, 0, 0));
+ queue_draw ();
+}
+
+void
+SpeakerDialog::set_selected (int i)
+{
+ boost::shared_ptr<Speakers> speakers = _speakers.lock ();
+ if (!speakers) {
+ return;
+ }
+
+ if (i == selected_index) {
+ return;
+ }
+
+ selected_index = i;
+ queue_draw ();
+
+ selected_speaker_connection.disconnect ();
+
+ azimuth_spinner.set_sensitive (selected_index != -1);
+ remove_speaker_button.set_sensitive (selected_index != -1);
+
+ if (selected_index != -1) {
+ azimuth_adjustment.set_value (speakers->speakers()[selected_index].angles().azi);
+ speakers->speakers()[selected_index].PositionChanged.connect (
+ selected_speaker_connection, MISSING_INVALIDATOR,
+ boost::bind (&SpeakerDialog::speaker_position_changed, this),
+ gui_context ()
+ );
+ }
+}
+
+void
+SpeakerDialog::azimuth_changed ()
+{
+ boost::shared_ptr<Speakers> speakers = _speakers.lock ();
+ if (!speakers) {
+ return;
+ }
+
+ assert (selected_index != -1);
+
+ if (ignore_azimuth_change) {
+ return;
+ }
+
+ ignore_speaker_position_change = true;
+ speakers->move_speaker (speakers->speakers()[selected_index].id, PBD::AngularVector (azimuth_adjustment.get_value (), 0, 0));
+ ignore_speaker_position_change = false;
+
+ queue_draw ();
+}
+
+void
+SpeakerDialog::speaker_position_changed ()
+{
+ boost::shared_ptr<Speakers> speakers = _speakers.lock ();
+ if (!speakers) {
+ return;
+ }
+
+ assert (selected_index != -1);
+
+ if (ignore_speaker_position_change) {
+ return;
+ }
+
+ ignore_azimuth_change = true;
+ azimuth_adjustment.set_value (speakers->speakers()[selected_index].angles().azi);
+ ignore_azimuth_change = false;
+
+ queue_draw ();
+}
+
+void
+SpeakerDialog::remove_speaker ()
+{
+ boost::shared_ptr<Speakers> speakers = _speakers.lock ();
+ if (!speakers) {
+ return;
+ }
+
+ assert (selected_index != -1);
+
+ speakers->remove_speaker (speakers->speakers()[selected_index].id);
+ set_selected (-1);
+