summaryrefslogtreecommitdiff
path: root/gtk2_ardour/panner2d.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-01-12 21:41:02 +0100
committerRobin Gareus <robin@gareus.org>2014-01-12 21:41:02 +0100
commit0e77e578cc6001a8b5634f6eaad30f565906a472 (patch)
treea67e8164fc5240ab4e584373ab3a33ac53b9460e /gtk2_ardour/panner2d.cc
parent1eaa30b7257f006878c9b2c88ecbaea5bc36b174 (diff)
VBAP panner UI tweaks:
* fix mouse-grab of sentinel * make GUI more hemisphere like (circles at latitude) * change alpha slightly to show signal overlap
Diffstat (limited to 'gtk2_ardour/panner2d.cc')
-rw-r--r--gtk2_ardour/panner2d.cc118
1 files changed, 62 insertions, 56 deletions
diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc
index 1be1371ab8..c59523abe3 100644
--- a/gtk2_ardour/panner2d.cc
+++ b/gtk2_ardour/panner2d.cc
@@ -170,8 +170,8 @@ Panner2d::on_size_allocate (Gtk::Allocation& alloc)
hoffset = max ((double) (width - height), border);
voffset = max ((double) (height - width), border);
- hoffset /= 2.0;
- voffset /= 2.0;
+ hoffset = rint(hoffset / 2.0);
+ voffset = rint(voffset / 2.0);
DrawingArea::on_size_allocate (alloc);
}
@@ -294,8 +294,7 @@ Panner2d::find_closest_object (gdouble x, gdouble y, bool& is_signal)
float best_distance = FLT_MAX;
CartesianVector c;
- /* start with the position itself
- */
+ /* start with the position itself */
position.position.cartesian (c);
cart_to_gtk (c);
@@ -303,6 +302,7 @@ Panner2d::find_closest_object (gdouble x, gdouble y, bool& is_signal)
(c.y - y) * (c.y - y));
closest = &position;
+#if 0 // TODO signal grab -> change width, not position
for (Targets::const_iterator i = signals.begin(); i != signals.end(); ++i) {
candidate = *i;
@@ -317,6 +317,7 @@ Panner2d::find_closest_object (gdouble x, gdouble y, bool& is_signal)
best_distance = distance;
}
}
+#endif
is_signal = true;
@@ -421,60 +422,60 @@ Panner2d::on_expose_event (GdkEventExpose *event)
/* horizontal line of "crosshairs" */
cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
- cairo_move_to (cr, 0.0, radius);
- cairo_line_to (cr, diameter, radius);
+ cairo_move_to (cr, 0.0, rint(radius) - .5);
+ cairo_line_to (cr, diameter, rint(radius) - .5);
cairo_stroke (cr);
/* vertical line of "crosshairs" */
- cairo_move_to (cr, radius, 0);
- cairo_line_to (cr, radius, diameter);
+ cairo_move_to (cr, rint(radius) - .5, 0);
+ cairo_line_to (cr, rint(radius) - .5, diameter);
cairo_stroke (cr);
/* the circle on which signals live */
- cairo_set_line_width (cr, 2.0);
+ cairo_set_line_width (cr, 1.5);
cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 1.0);
cairo_arc (cr, radius, radius, radius, 0.0, 2.0 * M_PI);
cairo_stroke (cr);
- /* 3 other circles of smaller diameter circle on which signals live */
-
- cairo_set_line_width (cr, 1.0);
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
- cairo_arc (cr, radius, radius, radius * 0.75, 0, 2.0 * M_PI);
- cairo_stroke (cr);
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.85);
- cairo_arc (cr, radius, radius, radius * 0.50, 0, 2.0 * M_PI);
- cairo_stroke (cr);
- cairo_arc (cr, radius, radius, radius * 0.25, 0, 2.0 * M_PI);
- cairo_stroke (cr);
-
- if (signals.size() > 1) {
- /* arc to show "diffusion" */
-
- double width_angle = fabs (panner_shell->pannable()->pan_width_control->get_value()) * 2 * M_PI;
- double position_angle = (2 * M_PI) - panner_shell->pannable()->pan_azimuth_control->get_value() * 2 * M_PI;
-
- cairo_save (cr);
- cairo_translate (cr, radius, radius);
- cairo_rotate (cr, position_angle - (width_angle/2.0));
- cairo_move_to (cr, 0, 0);
- cairo_arc_negative (cr, 0, 0, radius, width_angle, 0.0);
- cairo_close_path (cr);
- if (panner_shell->pannable()->pan_width_control->get_value() >= 0.0) {
- /* normal width */
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.45);
+ for (uint32_t rad = 15; rad < 90; rad += 15) {
+ cairo_set_line_width (cr, .5 + (float)rad / 150.0);
+ if (rad == 45) {
+ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
} else {
- /* inverse width */
- cairo_set_source_rgba (cr, 1.0, 0.419, 0.419, 0.45);
+ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.8);
}
- cairo_fill (cr);
- cairo_restore (cr);
+ cairo_new_path (cr);
+ cairo_arc (cr, radius, radius, radius * sin(M_PI * (float) rad / 180.0), 0, 2.0 * M_PI);
+ cairo_stroke (cr);
}
if (!panner_shell->bypassed()) {
+ if (signals.size() > 1) {
+ /* arc to show "diffusion" */
+
+ double width_angle = fabs (panner_shell->pannable()->pan_width_control->get_value()) * 2 * M_PI;
+ double position_angle = (2 * M_PI) - panner_shell->pannable()->pan_azimuth_control->get_value() * 2 * M_PI;
+
+ cairo_save (cr);
+ cairo_translate (cr, radius, radius);
+ cairo_rotate (cr, position_angle - (width_angle/2.0));
+ cairo_move_to (cr, 0, 0);
+ cairo_arc_negative (cr, 0, 0, radius, width_angle, 0.0);
+ cairo_close_path (cr);
+ if (panner_shell->pannable()->pan_width_control->get_value() >= 0.0) {
+ /* normal width */
+ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.45);
+ } else {
+ /* inverse width */
+ cairo_set_source_rgba (cr, 1.0, 0.419, 0.419, 0.45);
+ }
+ cairo_fill (cr);
+ cairo_restore (cr);
+ }
+
double arc_radius;
cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
@@ -486,6 +487,18 @@ Panner2d::on_expose_event (GdkEventExpose *event)
arc_radius = 12.0;
}
+ /* draw position */
+
+ position.position.cartesian (c);
+ cart_to_gtk (c);
+
+ cairo_new_path (cr);
+ cairo_arc (cr, c.x, c.y, arc_radius + 1.0, 0, 2.0 * M_PI);
+ cairo_set_source_rgba (cr, 1.0, 0.419, 0.419, 0.85);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 1.0, 0.905, 0.905, 0.85);
+ cairo_stroke (cr);
+
/* signals */
if (signals.size() > 1) {
@@ -494,6 +507,9 @@ Panner2d::on_expose_event (GdkEventExpose *event)
if (signal->visible) {
+ /* TODO check for overlap - multiple src at same position
+ * -> visualize it properly
+ */
PBD::AngularVector sp = signal->position;
if (!have_elevation) sp.ele = 0;
sp.cartesian (c);
@@ -501,14 +517,16 @@ Panner2d::on_expose_event (GdkEventExpose *event)
cairo_new_path (cr);
cairo_arc (cr, c.x, c.y, arc_radius, 0, 2.0 * M_PI);
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.85);
+ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.75);
cairo_fill_preserve (cr);
- cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 1.0);
+ cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 0.8);
cairo_stroke (cr);
if (!small && !signal->text.empty()) {
- cairo_set_source_rgb (cr, 0.517, 0.772, 0.882);
- /* the +/- adjustments are a hack to try to center the text in the circle */
+ cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, .9);
+ /* the +/- adjustments are a hack to try to center the text in the circle
+ * TODO use pango get_pixel_size() -- see mono_panner.cc
+ */
if (small) {
cairo_move_to (cr, c.x - 1, c.y + 1);
} else {
@@ -575,18 +593,6 @@ Panner2d::on_expose_event (GdkEventExpose *event)
}
}
-
- /* draw position */
-
- position.position.cartesian (c);
- cart_to_gtk (c);
-
- cairo_new_path (cr);
- cairo_arc (cr, c.x, c.y, arc_radius, 0, 2.0 * M_PI);
- cairo_set_source_rgba (cr, 1.0, 0.419, 0.419, 0.85);
- cairo_fill_preserve (cr);
- cairo_set_source_rgba (cr, 1.0, 0.905, 0.905, 0.85);
- cairo_stroke (cr);
}
cairo_destroy (cr);