From da144ab5edb5bb629a8300c2cbf93c7f87947a83 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 17 Feb 2011 16:43:55 +0000 Subject: more progress on speakers/vbap etc. etc (still a work in progress) git-svn-id: svn://localhost/ardour2/branches/3.0@8887 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/speaker_dialog.cc | 37 ++++++++++++++++++++----------------- gtk2_ardour/speaker_dialog.h | 6 ++++-- 2 files changed, 24 insertions(+), 19 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/speaker_dialog.cc b/gtk2_ardour/speaker_dialog.cc index 33200e99e0..8cdac45a45 100644 --- a/gtk2_ardour/speaker_dialog.cc +++ b/gtk2_ardour/speaker_dialog.cc @@ -33,13 +33,13 @@ using namespace Gtkmm2ext; SpeakerDialog::SpeakerDialog () : ArdourDialog (_("Speaker Configuration")) + , aspect_frame ("", 0.5, 0.5, 1.0, false) , azimuth_adjustment (0, 0.0, 360.0, 10.0, 1.0) , azimuth_spinner (azimuth_adjustment) , add_speaker_button (_("Add Speaker")) , use_system_button (_("Use System")) { - set_size_request (400, 200); side_vbox.set_homogeneous (false); side_vbox.set_border_width (9); @@ -48,14 +48,20 @@ SpeakerDialog::SpeakerDialog () side_vbox.pack_start (add_speaker_button, false, false); side_vbox.pack_start (use_system_button, false, false); + aspect_frame.set_size_request (200, 200); + aspect_frame.set_shadow_type (SHADOW_NONE); + aspect_frame.add (darea); + hbox.set_spacing (6); hbox.set_border_width (6); - hbox.pack_start (darea, true, true); + hbox.pack_start (aspect_frame, true, true); hbox.pack_start (side_vbox, false, false); get_vbox()->pack_start (hbox); get_vbox()->show_all (); + darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK); + darea.signal_size_allocate().connect (sigc::mem_fun (*this, &SpeakerDialog::darea_size_allocate)); darea.signal_expose_event().connect (sigc::mem_fun (*this, &SpeakerDialog::darea_expose_event)); darea.signal_button_press_event().connect (sigc::mem_fun (*this, &SpeakerDialog::darea_button_press_event)); @@ -66,9 +72,9 @@ SpeakerDialog::SpeakerDialog () } void -SpeakerDialog::set_speakers (const Speakers& s) +SpeakerDialog::set_speakers (boost::shared_ptr s) { - speakers = s; + speakers = *s; } Speakers @@ -226,7 +232,7 @@ SpeakerDialog::darea_button_press_event (GdkEventButton *ev) switch (ev->button) { case 1: case 2: - find_closest_object (ev->x, ev->y, drag_index); + drag_index = find_closest_object (ev->x, ev->y); drag_x = (int) floor (ev->x); drag_y = (int) floor (ev->y); state = (GdkModifierType) ev->state; @@ -288,39 +294,36 @@ SpeakerDialog::darea_button_release_event (GdkEventButton *ev) } int -SpeakerDialog::find_closest_object (gdouble x, gdouble y, int& which) +SpeakerDialog::find_closest_object (gdouble x, gdouble y) { float distance; float best_distance = FLT_MAX; - int pwhich = -1; + int n = 0; + int which = -1; - which = 0; - pwhich = 0; - - for (vector::iterator i = speakers.speakers().begin(); i != speakers.speakers().end(); ++i, ++pwhich) { + for (vector::iterator i = speakers.speakers().begin(); i != speakers.speakers().end(); ++i, ++n) { Speaker& candidate (*i); - CartesianVector c; - + candidate.angles().cartesian (c); cart_to_gtk (c); distance = sqrt ((c.x - x) * (c.x - x) + (c.y - y) * (c.y - y)); + if (distance < best_distance) { best_distance = distance; - which = pwhich; + which = n; } } - if (best_distance > 20) { // arbitrary - return 0; + return -1; } - return 1; + return which; } bool diff --git a/gtk2_ardour/speaker_dialog.h b/gtk2_ardour/speaker_dialog.h index 9a04896e7f..0ce99ac8d7 100644 --- a/gtk2_ardour/speaker_dialog.h +++ b/gtk2_ardour/speaker_dialog.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "ardour/speakers.h" @@ -35,12 +36,13 @@ class SpeakerDialog : public ArdourDialog SpeakerDialog (); ARDOUR::Speakers get_speakers() const; - void set_speakers (const ARDOUR::Speakers&); + void set_speakers (boost::shared_ptr); private: ARDOUR::Speakers speakers; Gtk::HBox hbox; Gtk::VBox side_vbox; + Gtk::AspectFrame aspect_frame; Gtk::DrawingArea darea; Gtk::Adjustment azimuth_adjustment; Gtk::SpinButton azimuth_spinner; @@ -63,7 +65,7 @@ class SpeakerDialog : public ArdourDialog void clamp_to_circle (double& x, double& y); void gtk_to_cart (PBD::CartesianVector& c) const; void cart_to_gtk (PBD::CartesianVector& c) const; - int find_closest_object (gdouble x, gdouble y, int& which); + int find_closest_object (gdouble x, gdouble y); }; #endif /* __ardour_gtk_speaker_dialog_h__ */ -- cgit v1.2.3