projects
/
ardour.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'export-dialog' into cairocanvas
[ardour.git]
/
gtk2_ardour
/
speaker_dialog.cc
diff --git
a/gtk2_ardour/speaker_dialog.cc
b/gtk2_ardour/speaker_dialog.cc
index e265b2ed1b234b88f1b24954e158ecf0f24d8ade..3578682422a0842e270c2384f249bf3eb335d401 100644
(file)
--- a/
gtk2_ardour/speaker_dialog.cc
+++ b/
gtk2_ardour/speaker_dialog.cc
@@
-33,8
+33,8
@@
using namespace Gtk;
using namespace Gtkmm2ext;
SpeakerDialog::SpeakerDialog ()
using namespace Gtkmm2ext;
SpeakerDialog::SpeakerDialog ()
- : Ardour
Dialog
(_("Speaker Configuration"))
- , aspect_frame ("", 0.5, 0.5, 1.
0
, false)
+ : Ardour
Window
(_("Speaker Configuration"))
+ , aspect_frame ("", 0.5, 0.5, 1.
5
, false)
, azimuth_adjustment (0, 0.0, 360.0, 10.0, 1.0)
, azimuth_spinner (azimuth_adjustment)
, add_speaker_button (_("Add Speaker"))
, azimuth_adjustment (0, 0.0, 360.0, 10.0, 1.0)
, azimuth_spinner (azimuth_adjustment)
, add_speaker_button (_("Add Speaker"))
@@
-49,14
+49,14
@@
SpeakerDialog::SpeakerDialog ()
side_vbox.set_spacing (6);
side_vbox.pack_start (add_speaker_button, false, false);
side_vbox.set_spacing (6);
side_vbox.pack_start (add_speaker_button, false, false);
- aspect_frame.set_size_request (
2
00, 200);
+ aspect_frame.set_size_request (
3
00, 200);
aspect_frame.set_shadow_type (SHADOW_NONE);
aspect_frame.add (darea);
hbox.set_spacing (6);
hbox.set_border_width (6);
hbox.pack_start (aspect_frame, true, true);
aspect_frame.set_shadow_type (SHADOW_NONE);
aspect_frame.add (darea);
hbox.set_spacing (6);
hbox.set_border_width (6);
hbox.pack_start (aspect_frame, true, true);
- hbox.pack_start (side_vbox,
true, tru
e);
+ hbox.pack_start (side_vbox,
false, fals
e);
HBox* current_speaker_hbox = manage (new HBox);
current_speaker_hbox->set_spacing (4);
HBox* current_speaker_hbox = manage (new HBox);
current_speaker_hbox->set_spacing (4);
@@
-64,9
+64,11
@@
SpeakerDialog::SpeakerDialog ()
current_speaker_hbox->pack_start (azimuth_spinner, true, true);
current_speaker_hbox->pack_start (remove_speaker_button, true, true);
current_speaker_hbox->pack_start (azimuth_spinner, true, true);
current_speaker_hbox->pack_start (remove_speaker_button, true, true);
- get_vbox()->pack_start (hbox);
- get_vbox()->pack_start (*current_speaker_hbox, true, true);
- get_vbox()->show_all ();
+ VBox* vbox = manage (new VBox);
+ vbox->pack_start (hbox);
+ vbox->pack_start (*current_speaker_hbox, true, true);
+ vbox->show_all ();
+ add (*vbox);
darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
@@
-89,7
+91,7
@@
SpeakerDialog::SpeakerDialog ()
}
void
}
void
-SpeakerDialog::set_speakers (boost::shared_ptr<Speakers> s)
+SpeakerDialog::set_speakers (boost::shared_ptr<Speakers> s)
{
_speakers = s;
}
{
_speakers = s;
}
@@
-130,7
+132,7
@@
SpeakerDialog::darea_expose_event (GdkEventExpose* event)
cairo_stroke (cr);
/* vertical line of "crosshairs" */
cairo_stroke (cr);
/* vertical line of "crosshairs" */
-
+
cairo_move_to (cr, width/2+0.5, 0.5);
cairo_line_to (cr, width/2+0.5, height+0.5);
cairo_stroke (cr);
cairo_move_to (cr, width/2+0.5, 0.5);
cairo_line_to (cr, width/2+0.5, height+0.5);
cairo_stroke (cr);
@@
-141,9
+143,9
@@
SpeakerDialog::darea_expose_event (GdkEventExpose* event)
cairo_stroke (cr);
float arc_radius;
cairo_stroke (cr);
float arc_radius;
-
+
cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
-
+
if (height < 100) {
cairo_set_font_size (cr, 10);
arc_radius = 2.0;
if (height < 100) {
cairo_set_font_size (cr, 10);
arc_radius = 2.0;
@@
-154,17
+156,23
@@
SpeakerDialog::darea_expose_event (GdkEventExpose* event)
int n = 0;
for (vector<Speaker>::iterator i = speakers->speakers().begin(); i != speakers->speakers().end(); ++i) {
int n = 0;
for (vector<Speaker>::iterator i = speakers->speakers().begin(); i != speakers->speakers().end(); ++i) {
-
+
Speaker& s (*i);
CartesianVector c (s.coords());
Speaker& s (*i);
CartesianVector c (s.coords());
-
+
cart_to_gtk (c);
cart_to_gtk (c);
-
+
+ /* We have already moved our plotting origin to x_origin, y_origin,
+ so compensate for that.
+ */
+ c.x -= x_origin;
+ c.y -= y_origin;
+
x = (gint) floor (c.x);
y = (gint) floor (c.y);
x = (gint) floor (c.x);
y = (gint) floor (c.y);
-
+
/* XXX need to shift circles so that they are centered on the circle */
/* XXX need to shift circles so that they are centered on the circle */
-
+
cairo_arc (cr, x, y, arc_radius, 0, 2.0 * M_PI);
if (selected_index == n) {
cairo_set_source_rgb (cr, 0.8, 0.8, 0.2);
cairo_arc (cr, x, y, arc_radius, 0, 2.0 * M_PI);
if (selected_index == n) {
cairo_set_source_rgb (cr, 0.8, 0.8, 0.2);
@@
-173,11
+181,15
@@
SpeakerDialog::darea_expose_event (GdkEventExpose* event)
}
cairo_close_path (cr);
cairo_fill (cr);
}
cairo_close_path (cr);
cairo_fill (cr);
-
+
cairo_move_to (cr, x + 6, y + 6);
cairo_move_to (cr, x + 6, y + 6);
-
+
char buf[256];
char buf[256];
- snprintf (buf, sizeof (buf), "%d:%d", n+1, (int) lrint (s.angles().azi));
+ if (n == selected_index) {
+ snprintf (buf, sizeof (buf), "%d:%d", n+1, (int) lrint (s.angles().azi));
+ } else {
+ snprintf (buf, sizeof (buf), "%d", n + 1);
+ }
cairo_show_text (cr, buf);
++n;
}
cairo_show_text (cr, buf);
++n;
}
@@
-185,14
+197,14
@@
SpeakerDialog::darea_expose_event (GdkEventExpose* event)
cairo_destroy (cr);
return true;
cairo_destroy (cr);
return true;
-
+
}
void
SpeakerDialog::cart_to_gtk (CartesianVector& c) const
{
/* "c" uses a coordinate space that is:
}
void
SpeakerDialog::cart_to_gtk (CartesianVector& c) const
{
/* "c" uses a coordinate space that is:
-
+
center = 0.0
dimension = 2.0 * 2.0
so max values along each axis are -1..+1
center = 0.0
dimension = 2.0 * 2.0
so max values along each axis are -1..+1
@@
-205,8
+217,8
@@
SpeakerDialog::cart_to_gtk (CartesianVector& c) const
0,height
*/
0,height
*/
- c.x = (width / 2) * (c.x + 1);
- c.y = (height / 2) * (1 - c.y);
+ c.x = (width / 2) * (c.x + 1)
+ x_origin
;
+ c.y = (height / 2) * (1 - c.y)
+ y_origin
;
/* XXX z-axis not handled - 2D for now */
}
/* XXX z-axis not handled - 2D for now */
}
@@
-214,8
+226,8
@@
SpeakerDialog::cart_to_gtk (CartesianVector& c) const
void
SpeakerDialog::gtk_to_cart (CartesianVector& c) const
{
void
SpeakerDialog::gtk_to_cart (CartesianVector& c) const
{
- c.x = (
c.x
/ (width / 2.0)) - 1.0;
- c.y = -((
c.y
/ (height / 2.0)) - 1.0);
+ c.x = (
(c.x - x_origin)
/ (width / 2.0)) - 1.0;
+ c.y = -((
(c.y - y_origin)
/ (height / 2.0)) - 1.0);
/* XXX z-axis not handled - 2D for now */
}
/* XXX z-axis not handled - 2D for now */
}
@@
-237,12
+249,19
@@
SpeakerDialog::darea_size_allocate (Gtk::Allocation& alloc)
width = alloc.get_width();
height = alloc.get_height();
width = alloc.get_width();
height = alloc.get_height();
+ /* The allocation will (should) be rectangualar, but make the basic
+ drawing square; space to the right of the square is for over-hanging
+ text labels.
+ */
+ width = height;
+
if (height > 100) {
width -= 20;
height -= 20;
}
if (height > 100) {
width -= 20;
height -= 20;
}
- x_origin = (alloc.get_width() - width) / 2;
+ /* Put the x origin to the left of the rectangular allocation */
+ x_origin = (alloc.get_width() - width) / 3;
y_origin = (alloc.get_height() - height) / 2;
}
y_origin = (alloc.get_height() - height) / 2;
}
@@
-253,7
+272,7
@@
SpeakerDialog::darea_button_press_event (GdkEventButton *ev)
if (!speakers) {
return false;
}
if (!speakers) {
return false;
}
-
+
GdkModifierType state;
if (ev->type == GDK_2BUTTON_PRESS && ev->button == 1) {
GdkModifierType state;
if (ev->type == GDK_2BUTTON_PRESS && ev->button == 1) {
@@
-300,7
+319,7
@@
SpeakerDialog::darea_button_release_event (GdkEventButton *ev)
if (!speakers) {
return false;
}
if (!speakers) {
return false;
}
-
+
gint x, y;
GdkModifierType state;
bool ret = false;
gint x, y;
GdkModifierType state;
bool ret = false;
@@
-312,7
+331,7
@@
SpeakerDialog::darea_button_release_event (GdkEventButton *ev)
state = (GdkModifierType) ev->state;
if (Keyboard::modifier_state_contains (state, Keyboard::TertiaryModifier)) {
state = (GdkModifierType) ev->state;
if (Keyboard::modifier_state_contains (state, Keyboard::TertiaryModifier)) {
-
+
for (vector<Speaker>::iterator i = speakers->speakers().begin(); i != speakers->speakers().end(); ++i) {
/* XXX DO SOMETHING TO SET SPEAKER BACK TO "normal" */
}
for (vector<Speaker>::iterator i = speakers->speakers().begin(); i != speakers->speakers().end(); ++i) {
/* XXX DO SOMETHING TO SET SPEAKER BACK TO "normal" */
}
@@
-338,14
+357,14
@@
SpeakerDialog::darea_button_release_event (GdkEventButton *ev)
break;
}
break;
}
-
+
drag_index = -1;
return ret;
}
int
drag_index = -1;
return ret;
}
int
-SpeakerDialog::find_closest_object (gdouble x, gdouble y)
+SpeakerDialog::find_closest_object (gdouble x, gdouble y)
{
boost::shared_ptr<Speakers> speakers = _speakers.lock ();
if (!speakers) {
{
boost::shared_ptr<Speakers> speakers = _speakers.lock ();
if (!speakers) {
@@
-361,7
+380,7
@@
SpeakerDialog::find_closest_object (gdouble x, gdouble y)
Speaker& candidate (*i);
CartesianVector c;
Speaker& candidate (*i);
CartesianVector c;
-
+
candidate.angles().cartesian (c);
cart_to_gtk (c);
candidate.angles().cartesian (c);
cart_to_gtk (c);
@@
-375,7
+394,7
@@
SpeakerDialog::find_closest_object (gdouble x, gdouble y)
}
}
}
}
- if (best_distance > 20) { // arbitrary
+ if (best_distance > 20) { // arbitrary
return -1;
}
return -1;
}
@@
-449,7
+468,7
@@
SpeakerDialog::handle_motion (gint evx, gint evy, GdkModifierType state)
/* position actual signal on circle */
clamp_to_circle (cp.x, cp.y);
/* position actual signal on circle */
clamp_to_circle (cp.x, cp.y);
-
+
/* generate an angular representation and set drag target (GUI) position */
AngularVector a;
/* generate an angular representation and set drag target (GUI) position */
AngularVector a;
@@
-460,7
+479,7
@@
SpeakerDialog::handle_motion (gint evx, gint evy, GdkModifierType state)
queue_draw ();
}
queue_draw ();
}
- }
+ }
return true;
}
return true;
}
@@
-472,7
+491,7
@@
SpeakerDialog::add_speaker ()
if (!speakers) {
return;
}
if (!speakers) {
return;
}
-
+
speakers->add_speaker (PBD::AngularVector (0, 0, 0));
queue_draw ();
}
speakers->add_speaker (PBD::AngularVector (0, 0, 0));
queue_draw ();
}
@@
-484,7
+503,7
@@
SpeakerDialog::set_selected (int i)
if (!speakers) {
return;
}
if (!speakers) {
return;
}
-
+
if (i == selected_index) {
return;
}
if (i == selected_index) {
return;
}
@@
-493,10
+512,10
@@
SpeakerDialog::set_selected (int i)
queue_draw ();
selected_speaker_connection.disconnect ();
queue_draw ();
selected_speaker_connection.disconnect ();
-
+
azimuth_spinner.set_sensitive (selected_index != -1);
remove_speaker_button.set_sensitive (selected_index != -1);
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 (
if (selected_index != -1) {
azimuth_adjustment.set_value (speakers->speakers()[selected_index].angles().azi);
speakers->speakers()[selected_index].PositionChanged.connect (
@@
-520,7
+539,7
@@
SpeakerDialog::azimuth_changed ()
if (ignore_azimuth_change) {
return;
}
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;
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;
@@
-535,20
+554,20
@@
SpeakerDialog::speaker_position_changed ()
if (!speakers) {
return;
}
if (!speakers) {
return;
}
-
+
assert (selected_index != -1);
if (ignore_speaker_position_change) {
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 ();
}
ignore_azimuth_change = true;
azimuth_adjustment.set_value (speakers->speakers()[selected_index].angles().azi);
ignore_azimuth_change = false;
queue_draw ();
}
-
+
void
SpeakerDialog::remove_speaker ()
{
void
SpeakerDialog::remove_speaker ()
{
@@
-556,11
+575,11
@@
SpeakerDialog::remove_speaker ()
if (!speakers) {
return;
}
if (!speakers) {
return;
}
-
+
assert (selected_index != -1);
speakers->remove_speaker (speakers->speakers()[selected_index].id);
set_selected (-1);
assert (selected_index != -1);
speakers->remove_speaker (speakers->speakers()[selected_index].id);
set_selected (-1);
-
+
queue_draw ();
}
queue_draw ();
}