comparison src/DLD-FUNCTIONS/fltk_backend.cc @ 9640:110863cd3371

more bug fixes in fltk zoom
author shaiay@users.sourceforge.net
date Mon, 14 Sep 2009 13:13:19 -0400
parents ee8a035f3997
children ecdb275bd41b
comparison
equal deleted inserted replaced
9639:8d79f36ebdde 9640:110863cd3371
87 mode (FL_DEPTH | FL_DOUBLE); 87 mode (FL_DEPTH | FL_DOUBLE);
88 } 88 }
89 89
90 ~OpenGL_fltk (void) { } 90 ~OpenGL_fltk (void) { }
91 91
92 void zoom (bool z) { in_zoom = z; } 92 void zoom (bool z)
93 {in_zoom = z; if (!in_zoom) hide_overlay ();}
93 bool zoom (void) { return in_zoom; } 94 bool zoom (void) { return in_zoom; }
94 void set_zoom_box (const Matrix& zb) { zoom_box = zb; } 95 void set_zoom_box (const Matrix& zb) { zoom_box = zb; }
95 96
96 private: 97 private:
97 double number; 98 double number;
229 status->color (FL_GRAY); 230 status->color (FL_GRAY);
230 status->textfont (FL_COURIER); 231 status->textfont (FL_COURIER);
231 status->textsize (10); 232 status->textsize (10);
232 status->box (FL_ENGRAVED_BOX); 233 status->box (FL_ENGRAVED_BOX);
233 234
234 // This allows us to have a valid OpenGL context right away 235 //This allows us to have a valid OpenGL context right away
235 canvas->mode (FL_DEPTH | FL_DOUBLE ); 236 canvas->mode (FL_DEPTH | FL_DOUBLE );
236 show (); 237 show ();
237 canvas->show (); 238 canvas->show ();
238 canvas->make_current (); 239 canvas->make_current ();
239 } 240 }
320 { 321 {
321 feval ("grid"); 322 feval ("grid");
322 mark_modified (); 323 mark_modified ();
323 } 324 }
324 325
325 void pixel2pos (int px, int py, double& xx, double& yy) const 326 void pixel2pos
326 { 327 (graphics_handle ax, int px, int py, double& xx, double& yy) const
327 graphics_object ax = gh_manager::get_object (fp.get_currentaxes ()); 328 {
328 329 pixel2pos ( gh_manager::get_object (ax), px, py, xx, yy);
330 }
331
332 void pixel2pos
333 (graphics_object ax, int px, int py, double& xx, double& yy) const
334 {
329 if (ax && ax.isa ("axes")) 335 if (ax && ax.isa ("axes"))
330 { 336 {
331 axes::properties& ap = 337 axes::properties& ap =
332 dynamic_cast<axes::properties&> (ax.get_properties ()); 338 dynamic_cast<axes::properties&> (ax.get_properties ());
333 ColumnVector pp = ap.pixel2coord (px, py); 339 ColumnVector pp = ap.pixel2coord (px, py);
362 } 368 }
363 } 369 }
364 return fp.get_currentaxes (); 370 return fp.get_currentaxes ();
365 } 371 }
366 372
367 void pixel2status (int px0, int py0, int px1 = -1, int py1 = -1) 373 void pixel2status
374 (graphics_handle ax, int px0, int py0, int px1 = -1, int py1 = -1)
375 {
376 pixel2status (gh_manager::get_object (ax), px0, py0, px1, py1);
377 }
378 void pixel2status
379 (graphics_object ax, int px0, int py0, int px1 = -1, int py1 = -1)
368 { 380 {
369 double x0, y0, x1, y1; 381 double x0, y0, x1, y1;
370 std::stringstream cbuf; 382 std::stringstream cbuf;
371 383
372 pixel2pos (px0, py0, x0, y0); 384 pixel2pos (ax, px0, py0, x0, y0);
373 cbuf << "[" << x0 << ", " << y0 << "]"; 385 cbuf << "[" << x0 << ", " << y0 << "]";
374 if (px1 >= 0) 386 if (px1 >= 0)
375 { 387 {
376 pixel2pos (px1, py1, x1, y1); 388 pixel2pos (ax, px1, py1, x1, y1);
377 cbuf << " -> ["<< x1 << ", " << y1 << "]"; 389 cbuf << " -> ["<< x1 << ", " << y1 << "]";
378 } 390 }
379 391
380 status->value (cbuf.str ().c_str ()); 392 status->value (cbuf.str ().c_str ());
381 status->redraw (); 393 status->redraw ();
403 } 415 }
404 416
405 int handle (int event) 417 int handle (int event)
406 { 418 {
407 static int px0,py0; 419 static int px0,py0;
420 static graphics_object ax0;
421
408 422
409 int retval = Fl_Window::handle (event); 423 int retval = Fl_Window::handle (event);
410 424
411 // we only handle events which are in the canvas area 425 // we only handle events which are in the canvas area
412 if (Fl::event_y () >= h() - status_h) 426 if (Fl::event_y () >= h() - status_h)
428 break; 442 break;
429 } 443 }
430 break; 444 break;
431 445
432 case FL_MOVE: 446 case FL_MOVE:
433 pixel2status (Fl::event_x (), Fl::event_y ()); 447 pixel2status (pixel2axes_or_ca (Fl::event_x (), Fl::event_y ()),
448 Fl::event_x (), Fl::event_y ());
434 break; 449 break;
435 450
436 case FL_PUSH: 451 case FL_PUSH:
437 if (Fl::event_button () == 1 || Fl::event_button () == 3) 452 if (Fl::event_button () == 1 || Fl::event_button () == 3)
438 { 453 {
439 px0 = Fl::event_x (); 454 px0 = Fl::event_x ();
440 py0 = Fl::event_y (); 455 py0 = Fl::event_y ();
456 ax0 = gh_manager::get_object (pixel2axes_or_ca (px0, py0));
441 return 1; 457 return 1;
442 } 458 }
443 break; 459 break;
444 460
445 case FL_DRAG: 461 case FL_DRAG:
446 pixel2status (px0, py0, Fl::event_x (), Fl::event_y ()); 462 pixel2status (ax0, px0, py0, Fl::event_x (), Fl::event_y ());
447 if (Fl::event_button () == 1) 463 if (Fl::event_button () == 1)
448 { 464 {
449 graphics_object ax = 465 if (ax0 && ax0.isa ("axes"))
450 gh_manager::get_object (pixel2axes_or_ca (px0, py0));
451 if (ax && ax.isa ("axes"))
452 { 466 {
453 axes::properties& ap = 467 axes::properties& ap =
454 dynamic_cast<axes::properties&> (ax.get_properties ()); 468 dynamic_cast<axes::properties&> (ax0.get_properties ());
455 469
456 double x0, y0, x1, y1; 470 double x0, y0, x1, y1;
457 pixel2pos (px0, py0, x0, y0); 471 pixel2pos (ax0, px0, py0, x0, y0);
458 pixel2pos (Fl::event_x (), Fl::event_y (), x1, y1); 472 pixel2pos (ax0, Fl::event_x (), Fl::event_y (), x1, y1);
459 px0 = Fl::event_x (); 473 px0 = Fl::event_x ();
460 py0 = Fl::event_y (); 474 py0 = Fl::event_y ();
461 475
462 ap.translate_view (x0 - x1, y0 - y1); 476 ap.translate_view (x0 - x1, y0 - y1);
463 mark_modified (); 477 mark_modified ();
471 zoom_box (0) = px0; 485 zoom_box (0) = px0;
472 zoom_box (1) = py0; 486 zoom_box (1) = py0;
473 zoom_box (2) = Fl::event_x (); 487 zoom_box (2) = Fl::event_x ();
474 zoom_box (3) = Fl::event_y (); 488 zoom_box (3) = Fl::event_y ();
475 canvas->set_zoom_box (zoom_box); 489 canvas->set_zoom_box (zoom_box);
476 canvas->redraw_overlay ();
477 } 490 }
478 491
479 break; 492 break;
480 493
481 case FL_MOUSEWHEEL: 494 case FL_MOUSEWHEEL:
496 const double factor = 509 const double factor =
497 (Fl::event_dy () > 0) ? 1.0 + zoom_speed : 1.0 - zoom_speed; 510 (Fl::event_dy () > 0) ? 1.0 + zoom_speed : 1.0 - zoom_speed;
498 511
499 // Get the point we're zooming about 512 // Get the point we're zooming about
500 double x1, y1; 513 double x1, y1;
501 pixel2pos (Fl::event_x (), Fl::event_y (), x1, y1); 514 pixel2pos (ax, Fl::event_x (), Fl::event_y (), x1, y1);
502 515
503 ap.zoom_about_point (x1, y1, factor, false); 516 ap.zoom_about_point (x1, y1, factor, false);
504 mark_modified (); 517 mark_modified ();
505 } 518 }
506 } 519 }
509 case FL_RELEASE: 522 case FL_RELEASE:
510 if (Fl::event_button () == 1) 523 if (Fl::event_button () == 1)
511 { 524 {
512 if ( Fl::event_clicks () == 1) 525 if ( Fl::event_clicks () == 1)
513 { 526 {
514 graphics_object ax = 527 if (ax0 && ax0.isa ("axes"))
515 gh_manager::get_object (pixel2axes_or_ca (Fl::event_x (),
516 Fl::event_y ()));
517 if (ax && ax.isa ("axes"))
518 { 528 {
519 axes::properties& ap = 529 axes::properties& ap =
520 dynamic_cast<axes::properties&> (ax.get_properties ()); 530 dynamic_cast<axes::properties&> (ax0.get_properties ());
521 ap.set_xlimmode("auto"); 531 ap.set_xlimmode("auto");
522 ap.set_ylimmode("auto"); 532 ap.set_ylimmode("auto");
523 ap.set_zlimmode("auto"); 533 ap.set_zlimmode("auto");
524 mark_modified (); 534 mark_modified ();
525 } 535 }
530 // end of drag -- zoom 540 // end of drag -- zoom
531 if (canvas->zoom ()) 541 if (canvas->zoom ())
532 { 542 {
533 canvas->zoom (false); 543 canvas->zoom (false);
534 double x0,y0,x1,y1; 544 double x0,y0,x1,y1;
535 graphics_object ax = 545 if (ax0 && ax0.isa ("axes"))
536 gh_manager::get_object (pixel2axes_or_ca (px0, py0));
537 if (ax && ax.isa ("axes"))
538 { 546 {
539 axes::properties& ap = 547 axes::properties& ap =
540 dynamic_cast<axes::properties&> (ax.get_properties ()); 548 dynamic_cast<axes::properties&> (ax0.get_properties ());
541 pixel2pos (px0, py0, x0, y0); 549 pixel2pos (ax0, px0, py0, x0, y0);
542 pixel2pos (Fl::event_x (), Fl::event_y (), x1, y1); 550 pixel2pos (ax0, Fl::event_x (), Fl::event_y (), x1, y1);
543 Matrix xl (1,2,0); 551 Matrix xl (1,2,0);
544 Matrix yl (1,2,0); 552 Matrix yl (1,2,0);
545 if (x0 < x1) 553 if (x0 < x1)
546 { 554 {
547 xl(0) = x0; 555 xl(0) = x0;