- else {
-// select point
- int sz = points.size();
- int last_point = hot_point;
- if( sz > 0 ) {
- SketcherPoint *pt = points[hot_point=0];
- double dist = DISTANCE(output_x,output_y, pt->x,pt->y);
- for( int i=1; i<sz; ++i ) {
- pt = points[i];
- double d = DISTANCE(output_x,output_y, pt->x,pt->y);
- if( d >= dist ) continue;
- dist = d; hot_point = i;
- }
- pt = points[hot_point];
- float px = (pt->x - track_w / 2) * projector_z + projector_x;
- float py = (pt->y - track_h / 2) * projector_z + projector_y;
- dist = DISTANCE(px, py, cursor_x,cursor_y);
- if( dist >= HANDLE_W ) hot_point = -1;
- }
- if( hot_point != last_point ) {
- SketcherPoint *pt = 0;
- if( hot_point >= 0 && hot_point < sz ) {
- pt = points[hot_point];
- point_list->set_point(hot_point, PT_X, pt->x = output_x);
- point_list->set_point(hot_point, PT_Y, pt->y = output_y);
+ if( (state & AltMask) ) { // create new curve
+ ci = plugin->new_curve(cv->pen, cv->radius, cv->color);
+ curve_list->update(ci);
+ point_list->update(-1);
+ break;
+ }
+ SketcherPoint *pt = 0; // select point
+ int last_point = pi; pi = -1;
+ int n = points.size();
+ double dist = DBL_MAX;
+ for( int i=0; i<n; ++i ) {
+ SketcherPoint *p = points[i];
+ double d = DISTANCE(output_x,output_y, p->x,p->y);
+ if( d < dist ) { dist = d; pi = i; pt = p; }
+ }
+ if( pt ) {
+ float px = (pt->x - track_w / 2) * projector_z + projector_x;
+ float py = (pt->y - track_h / 2) * projector_z + projector_y;
+ float pix = DISTANCE(px, py, cursor_x,cursor_y);
+ if( pix >= HANDLE_W ) { pi = -1; pt = 0; }
+ }
+ if( pi != last_point )
+ point_list->set_selected(pi);
+ break; }
+ case RIGHT_BUTTON: {
+ if( (state & ShiftMask) ) { // create new curve point
+ ++new_points;
+ pi = plugin->new_point(cv, PTY_CURVE,
+ output_x, output_y, pi+1);
+ point_list->update(pi);
+ break;
+ }
+ SketcherPoint *pt = 0; // select point
+ double dist = DBL_MAX;
+ ci = -1;
+ for( int i=0; i<curves.size(); ++i ) {
+ SketcherCurve *crv = curves[i];
+ int pts = crv->points.size();
+ for( int k=0; k<pts; ++k ) {
+ SketcherPoint *p = crv->points[k];
+ double d = DISTANCE(output_x,output_y, p->x,p->y);
+ if( d < dist ) {
+ dist = d;
+ pt = p; pi = k;
+ cv = crv; ci = i;