13
0

don't display elevation if panner does not support it.

This commit is contained in:
Robin Gareus 2014-01-12 03:56:35 +01:00
parent f9b8300ec6
commit 261638a5a0
2 changed files with 22 additions and 17 deletions

View File

@ -74,6 +74,7 @@ Panner2d::Panner2d (boost::shared_ptr<PannerShell> p, int32_t h)
, width (0)
, height (h)
, last_width (0)
, have_elevation (false)
{
panner_shell->Changed.connect (connections, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context());
@ -82,6 +83,7 @@ Panner2d::Panner2d (boost::shared_ptr<PannerShell> p, int32_t h)
drag_target = 0;
set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
handle_state_change ();
handle_position_change ();
}
@ -200,6 +202,14 @@ Panner2d::handle_state_change ()
{
panconnect.drop_connections();
panner_shell->panner()->SignalPositionChanged.connect (panconnect, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
set<Evoral::Parameter> params = panner_shell->panner()->what_can_be_automated();
set<Evoral::Parameter>::iterator p = params.find(PanElevationAutomation);
bool elev = have_elevation;
have_elevation = (p == params.end()) ? false : true;
if (elev != have_elevation) {
handle_position_change();
}
queue_draw ();
}
@ -237,8 +247,12 @@ Panner2d::handle_position_change ()
uint32_t n;
double w = panner_shell->pannable()->pan_width_control->get_value();
if (have_elevation) {
position.position = AngularVector (panner_shell->pannable()->pan_azimuth_control->get_value() * 360.0,
panner_shell->pannable()->pan_elevation_control->get_value() * 90.0);
} else {
position.position = AngularVector (panner_shell->pannable()->pan_azimuth_control->get_value() * 360.0, 0);
}
for (uint32_t i = 0; i < signals.size(); ++i) {
signals[i]->position = panner_shell->panner()->signal_position (i);
@ -480,7 +494,9 @@ Panner2d::on_expose_event (GdkEventExpose *event)
if (signal->visible) {
signal->position.cartesian (c);
PBD::AngularVector sp = signal->position;
if (!have_elevation) sp.ele = 0;
sp.cartesian (c);
cart_to_gtk (c);
cairo_new_path (cr);
@ -607,11 +623,8 @@ Panner2d::on_button_press_event (GdkEventButton *ev)
}
}
drag_x = ev->x;
drag_y = ev->y;
state = (GdkModifierType) ev->state;
return handle_motion (drag_x, drag_y, state);
return handle_motion (ev->x, ev->y, state);
break;
default:
@ -686,14 +699,11 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
}
if (need_move) {
set<Evoral::Parameter> params = panner_shell->panner()->what_can_be_automated();
set<Evoral::Parameter>::iterator p = params.find(PanElevationAutomation);
CartesianVector cp (evx, evy, 0.0);
AngularVector av;
gtk_to_cart (cp);
if (p == params.end()) {
if (!have_elevation) {
clamp_to_circle (cp.x, cp.y);
cp.angular (av);
if (drag_target == &position) {

View File

@ -108,9 +108,6 @@ class Panner2d : public Gtk::DrawingArea
Target position;
Target *drag_target;
int drag_x;
int drag_y;
bool allow_speaker_motion;
int width;
int height;
double radius;
@ -119,9 +116,7 @@ class Panner2d : public Gtk::DrawingArea
double voffset;
double last_width;
bool did_move;
gint compute_x (float);
gint compute_y (float);
bool have_elevation;
Target *find_closest_object (gdouble x, gdouble y, bool& is_signal);