Mercurial > hg > octave-nkf
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; |