00001
00012
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016
00017 #include "QtViewImp.h"
00018
00019 #include "DrawBorder.h"
00020 #include "PlotterEvent.h"
00021 #include "QtFont.h"
00022
00023 #include "axes/Range.h"
00024 #include "graphics/Color.h"
00025 #include "plotters/PlotterBase.h"
00026
00027 #include <qapplication.h>
00028 #include <qpainter.h>
00029 #include <qpointarray.h>
00030
00031 #include <cassert>
00032
00033 using namespace hippodraw;
00034
00035 using std::vector;
00036
00037 std::map < hippodraw::Line::Style, Qt::PenStyle > QtViewImp::s_line_style;
00038
00039 QtViewImp::
00040 QtViewImp ( PlotterBase * plotter )
00041 : ViewBase ( plotter ),
00042 m_inspector ( 0 ),
00043 m_painter ( 0 ),
00044 m_font_default ( "helvetica" )
00045 {
00046 if ( s_line_style.empty () ) {
00047 s_line_style [ Line::Solid ] = Qt::SolidLine;
00048 s_line_style [ Line::Dash ] = Qt::DashLine;
00049 s_line_style [ Line::Dot ] = Qt::DotLine;
00050 s_line_style [ Line::DashDot ] = Qt::DashDotLine;
00051 s_line_style [ Line::DashDotDot ] = Qt::DashDotDotLine;
00052 s_line_style [ Line::Invisible ] = Qt::NoPen;
00053 }
00054 }
00055
00056 void
00057 QtViewImp::
00058 setInspector ( QObject * inspector )
00059 {
00060 m_inspector = inspector;
00061 }
00062
00063 void
00064 QtViewImp::
00065 update ( const Observable * display )
00066 {
00067 if ( display == 0 ) return;
00068
00069 if ( m_inspector != 0 ) {
00070 Observable * o = const_cast < Observable * > ( display );
00071 PlotterBase * plotter = dynamic_cast < PlotterBase * > ( o );
00072 PlotterEvent * event = new PlotterEvent ( plotter );
00073 QApplication::removePostedEvents ( m_inspector );
00074 QApplication::postEvent ( m_inspector, event );
00075 }
00076
00077 }
00078
00079
00080 HippoRectangle QtViewImp::getMarginRect () const
00081 {
00082 return m_plotter->getMarginRect();
00083 }
00084
00085 void QtViewImp::endPlot ()
00086 {
00087 }
00088
00089 float QtViewImp::userToDrawX ( double xx ) const
00090 {
00091 return m_plotter->userToMarginX( xx );
00092 }
00093
00094 float QtViewImp::userToDrawY ( double yy ) const
00095 {
00096 return m_plotter->userToInvertedMarginY( yy );
00097 }
00098
00099 float QtViewImp::userToDrawColor ( double c ) const
00100 {
00101 return m_plotter->userToMarginColor( c );
00102 }
00103
00104 void
00105 QtViewImp::
00106 transformAndFill ( QPointArray & array,
00107 const std::vector< double > & x,
00108 const std::vector< double > & y,
00109 int (QtViewImp::* xfunc) ( double ) const,
00110 int (QtViewImp::* yfunc) ( double ) const )
00111 {
00112
00113 unsigned int size = x.size();
00114 assert ( size == y.size() );
00115
00116 for ( unsigned int i = 0; i < size; i++ ) {
00117 int ix = (this->*xfunc) ( x[i] );
00118 int iy = (this->*yfunc) ( y[i] );
00119 array.setPoint ( i , ix, iy );
00120 }
00121
00122 }
00123
00124 void
00125 QtViewImp::
00126 drawViewMethod ( const std::vector< double > & x,
00127 const std::vector< double > & y,
00128 int style,
00129 int color )
00130 {
00131
00132 unsigned int size = x.size();
00133 assert ( size == y.size() );
00134
00135 QPointArray array ( size );
00136 transformAndFill ( array, x, y,
00137 &QtViewImp::toCanvasX, &QtViewImp::toCanvasY );
00138
00139 m_painter->drawLineSegments ( array );
00140
00141 }
00142
00143
00144 void
00145 QtViewImp::
00146 drawMethod ( const std::vector < double > & x,
00147 const std::vector < double > & y,
00148 int style,
00149 int color )
00150 {
00151
00152 unsigned int size = x.size();
00153 assert ( size == y.size() );
00154
00155 QPointArray array ( size );
00156 transformAndFill ( array, x, y,
00157 &QtViewImp::toViewX, &QtViewImp::toViewY );
00158
00159 m_painter->drawPolyline ( array, 0, -1 );
00160 }
00161
00162
00163
00164 void
00165 QtViewImp::
00166 drawPoints ( const std::vector<double> & x,
00167 const std::vector<double> & y,
00168 hippodraw::Symbol::Type type,
00169 float sym_size,
00170 const Color & color )
00171 {
00172 m_painter->save();
00173
00174 int i_sym_size = (int)(sym_size/2);
00175
00176 int rgb[3];
00177 rgb[0] = color.getRed();
00178 rgb[1] = color.getGreen();
00179 rgb[2] = color.getBlue();
00180 QColor qcolor ( rgb[0], rgb[1], rgb[2] );
00181
00182 m_painter->setPen ( qcolor );
00183
00184 QPointArray triangleArray ( 3 );
00185
00186 for (unsigned int i = 0; i < x.size(); i++)
00187 {
00188 int originX = toViewX ( x[i] );
00189 int originY = toViewY ( y[i] );
00190
00191 switch ( type )
00192 {
00193
00194
00195
00196 case Symbol::SOLIDSQUARE:
00197
00198 m_painter->fillRect ( ( toViewX (x[i]) - (i_sym_size) ),
00199 ( toViewY (y[i]) - (i_sym_size) ),
00200 (i_sym_size*2 + 1 ),
00201 (i_sym_size*2 + 1 ),
00202 ( qcolor ) );
00203
00204 break;
00205
00206
00207
00208 case Symbol::SQUARE:
00209 m_painter -> drawRect ( toViewX ( x[i] ) - i_sym_size,
00210 toViewY ( y[i] ) - i_sym_size,
00211 2*i_sym_size + 1,
00212 2*i_sym_size + 1 );
00213 break;
00214
00215 case Symbol::TRIANGLE:
00216 triangleArray.setPoint ( 0, ( toViewX (x[i]) ),
00217 ( toViewY (y[i]) + (i_sym_size) ) );
00218
00219 triangleArray.setPoint ( 1, ( toViewX (x[i]) + (i_sym_size) ),
00220 ( toViewY (y[i]) - (i_sym_size) ) );
00221
00222
00223 triangleArray.setPoint ( 2, ( toViewX (x[i]) - (i_sym_size) ),
00224 ( toViewY (y[i]) - (i_sym_size) ) );
00225
00226 m_painter -> setBrush ( Qt::NoBrush );
00227 m_painter->drawPolygon (triangleArray);
00228 break;
00229
00230 case Symbol::FILLED_TRIANGLE:
00231
00232 triangleArray.setPoint ( 0, ( toViewX (x[i]) ),
00233 ( toViewY (y[i]) + (i_sym_size) ) );
00234
00235 triangleArray.setPoint ( 1, ( toViewX (x[i]) + (i_sym_size) ),
00236 ( toViewY (y[i]) - (i_sym_size) ) );
00237
00238
00239 triangleArray.setPoint ( 2, ( toViewX (x[i]) - (i_sym_size) ),
00240 ( toViewY (y[i]) - (i_sym_size) ) );
00241
00242 m_painter->setBrush (qcolor);
00243
00244 m_painter->drawPolygon (triangleArray);
00245
00246 break;
00247
00248
00249 case Symbol::CIRCLE:
00250
00251 m_painter->drawEllipse ( ( toViewX (x[i]) - (i_sym_size) ),
00252 ( toViewY (y[i]) - (i_sym_size) ),
00253 ( i_sym_size*2 + 1 ),
00254 ( i_sym_size*2 + 1 ) );
00255
00256 break;
00257
00258
00259 case Symbol::FILLED_CIRCLE:
00260
00261 m_painter->setBrush (qcolor);
00262
00263 m_painter->drawPie ( ( toViewX (x[i]) - (i_sym_size) ),
00264 ( toViewY (y[i]) - (i_sym_size) ),
00265 ( i_sym_size*2 + 1 ),
00266 ( i_sym_size*2 + 1 ),
00267 ( 16 * 0 ),
00268 ( 16 * 360 ) );
00269
00270 break;
00271
00272 case Symbol::PLUS:
00273 m_painter -> drawLine ( originX - i_sym_size, originY,
00274 originX + i_sym_size, originY );
00275 m_painter -> drawLine ( originX, originY - i_sym_size,
00276 originX, originY + i_sym_size );
00277 break;
00278
00279 case Symbol::TIMES:
00280 m_painter -> drawLine ( originX - i_sym_size, originY - i_sym_size,
00281 originX + i_sym_size, originY + i_sym_size );
00282 m_painter -> drawLine ( originX + i_sym_size, originY - i_sym_size,
00283 originX - i_sym_size, originY + i_sym_size );
00284 break;
00285
00286 default:
00287 break;
00288
00289 }
00290 }
00291
00292 m_painter->restore();
00293
00294 }
00295
00298 void
00299 QtViewImp::
00300 drawPoints ( const std::vector< double > & x,
00301 const std::vector< double > & y,
00302 hippodraw::Symbol::Type type,
00303 float sym_size )
00304 {
00305
00306 }
00307
00315 void
00316 QtViewImp::
00317 drawPoints ( const std::vector< double > & x,
00318 const std::vector< double > & y,
00319 const std::vector< Color > & colors,
00320 hippodraw::Symbol::Type type,
00321 float sym_size )
00322 {
00323 m_painter->save();
00324
00325 int i_sym_size = (int)(sym_size/2);
00326
00327 if ( i_sym_size == 0 &&
00328 type == Symbol::SOLIDSQUARE ) {
00329 type = Symbol::SQUARE;
00330 }
00331
00332 QPointArray triangleArray ( 3 );
00333
00334 for (unsigned int i = 0; i < x.size(); i++)
00335 {
00336 int o_x = toViewX ( x[i] );
00337 int o_y = toViewY ( y[i] );
00338
00339 const Color & c = colors[i];
00340 QColor qcolor ( c.getRed (), c.getGreen(), c.getBlue () );
00341 m_painter->setPen ( qcolor );
00342
00343 switch ( type )
00344 {
00345 case Symbol::SOLIDSQUARE:
00346 m_painter->fillRect ( ( toViewX (x[i]) - (i_sym_size) ),
00347 ( toViewY (y[i]) - (i_sym_size) ),
00348 (i_sym_size*2 ),
00349 (i_sym_size*2 ),
00350 ( qcolor ) );
00351
00352 break;
00353
00354 case Symbol::SQUARE:
00355 m_painter -> drawRect ( o_x -i_sym_size, o_y - i_sym_size,
00356 2 * i_sym_size, 2 * i_sym_size );
00357 break;
00358
00359
00360
00361 case Symbol::TRIANGLE:
00362 triangleArray.setPoint ( 0, ( toViewX (x[i]) ),
00363 ( toViewY (y[i]) + (i_sym_size) ) );
00364
00365 triangleArray.setPoint ( 1, ( toViewX (x[i]) + (i_sym_size) ),
00366 ( toViewY (y[i]) - (i_sym_size) ) );
00367
00368
00369 triangleArray.setPoint ( 2, ( toViewX (x[i]) - (i_sym_size) ),
00370 ( toViewY (y[i]) - (i_sym_size) ) );
00371
00372 m_painter->setBrush ( Qt::NoBrush );
00373 m_painter->drawPolygon (triangleArray);
00374
00375 break;
00376
00377
00378
00379 case Symbol::FILLED_TRIANGLE:
00380
00381 triangleArray.setPoint ( 0, ( toViewX (x[i]) ),
00382 ( toViewY (y[i]) + (i_sym_size) ) );
00383
00384 triangleArray.setPoint ( 1, ( toViewX (x[i]) + (i_sym_size) ),
00385 ( toViewY (y[i]) - (i_sym_size) ) );
00386
00387
00388 triangleArray.setPoint ( 2, ( toViewX (x[i]) - (i_sym_size) ),
00389 ( toViewY (y[i]) - (i_sym_size) ) );
00390
00391 m_painter->setBrush (qcolor);
00392
00393 m_painter->drawPolygon (triangleArray);
00394
00395 break;
00396
00397
00398 case Symbol::CIRCLE:
00399
00400 m_painter->drawEllipse ( ( toViewX (x[i]) - (i_sym_size) ),
00401 ( toViewY (y[i]) - (i_sym_size) ),
00402 (i_sym_size*2 ),
00403 (i_sym_size*2 ) );
00404
00405 break;
00406
00407
00408 case Symbol::FILLED_CIRCLE:
00409
00410 m_painter->setBrush (qcolor);
00411
00412 m_painter->drawPie ( ( toViewX (x[i]) - (i_sym_size) ),
00413 ( toViewY (y[i]) - (i_sym_size) ),
00414 ( i_sym_size*2 ),
00415 ( i_sym_size*2 ),
00416 ( 16 * 0 ),
00417 ( 16 * 360 ) );
00418
00419 break;
00420
00421 case Symbol::PLUS:
00422 m_painter -> drawLine ( o_x - i_sym_size, o_y,
00423 o_x + i_sym_size, o_y );
00424 m_painter -> drawLine ( o_x, o_y - i_sym_size,
00425 o_x, o_y + i_sym_size );
00426 break;
00427
00428 case Symbol::TIMES:
00429 m_painter -> drawLine ( o_x - i_sym_size, o_y - i_sym_size,
00430 o_x + i_sym_size, o_y + i_sym_size );
00431 m_painter -> drawLine ( o_x + i_sym_size, o_y - i_sym_size,
00432 o_x - i_sym_size, o_y + i_sym_size );
00433 break;
00434
00435 default:
00436 break;
00437
00438 }
00439 }
00440
00441 m_painter->restore();
00442
00443 }
00444
00445 QPen
00446 QtViewImp::
00447 createPen ( const Color & color, float size, hippodraw::Line::Style style )
00448 {
00449 int rgb[3];
00450 rgb[0] = color.getRed();
00451 rgb[1] = color.getGreen();
00452 rgb[2] = color.getBlue();
00453 QColor qcolor ( rgb[0], rgb[1], rgb[2] );
00454
00455 unsigned int isize = static_cast < unsigned int > ( size );
00456 Qt::PenStyle pen_style = s_line_style [ style ];
00457
00458 return QPen ( qcolor, isize, pen_style );
00459 }
00460
00461 void
00462 QtViewImp::
00463 drawPolyLine ( const std::vector< double > & x,
00464 const std::vector< double > & y,
00465 hippodraw::Line::Style style,
00466 const Color & color,
00467 float size )
00468 {
00469 m_painter->save();
00470
00471 QPen pen = createPen ( color, size, style );
00472 m_painter->setPen ( pen );
00473 m_painter -> setBrush ( Qt::NoBrush );
00474 drawMethod ( x, y, style, 0 );
00475
00476 m_painter->restore();
00477
00478 }
00479
00480 void
00481 QtViewImp::
00482 drawLines ( const std::vector< double > & x,
00483 const std::vector< double > & y,
00484 hippodraw::Line::Style style,
00485 const Color & color,
00486 float size )
00487 {
00488
00489 m_painter->save();
00490
00491 QPen pen = createPen ( color, size, style );
00492 m_painter->setPen ( pen );
00493
00494 unsigned int xsize = x.size();
00495 assert ( xsize == y.size() );
00496
00497 QPointArray array ( xsize );
00498 transformAndFill ( array, x, y,
00499 &QtViewImp::toViewX, &QtViewImp::toViewY );
00500
00501 m_painter->drawLineSegments ( array );
00502
00503 m_painter->restore();
00504
00505 }
00506
00507 void
00508 QtViewImp::
00509 drawColorLines ( const std::vector< double > & x,
00510 const std::vector< double > & y,
00511 hippodraw::Line::Style style,
00512 const std::vector < Color > & colors,
00513 float size )
00514 {
00515 unsigned int ssize = x.size();
00516 assert ( ssize == y.size() );
00517 assert ( ssize == colors.size() );
00518
00519 for ( unsigned int i = 0; i < ssize; i+=2 ) {
00520
00521 m_painter->save();
00522 const Color & color = colors[i];
00523 QColor qcolor ( color.getRed (), color.getGreen (), color.getBlue() );
00524 QPen pen ( qcolor, static_cast < int > (size) );
00525 Qt::PenStyle pen_style = s_line_style [ style ];
00526 pen.setStyle ( pen_style );
00527 m_painter->setPen ( pen );
00528
00529 int x1 = toViewX ( x[i] );
00530 int x2 = toViewX ( x[i+1] );
00531 int y1 = toViewY ( y[i] );
00532 int y2 = toViewY ( y[i+1] );
00533
00534 m_painter->drawLine ( x1, y1, x2, y2 );
00535
00536 m_painter->restore();
00537
00538 }
00539
00540 }
00541
00542 void
00543 QtViewImp::
00544 drawViewLines ( const std::vector< double > & x,
00545 const std::vector< double > & y,
00546 hippodraw::Line::Style style,
00547 bool color,
00548 float size )
00549 {
00550
00551 m_painter->save();
00552
00553 QPen pen ( (m_painter->pen()).color(), (int)(size) );
00554 Qt::PenStyle pen_style = s_line_style [ style ];
00555 pen.setStyle ( pen_style );
00556 m_painter->setPen ( pen );
00557
00558 drawViewMethod ( x, y, style, 0 );
00559
00560 m_painter->restore();
00561
00562 }
00563
00564 void
00565 QtViewImp::
00566 drawViewLines ( const std::vector< double > & x,
00567 const std::vector< double > & y,
00568 hippodraw::Line::Style style,
00569 const Color & color,
00570 float size )
00571 {
00572
00573 m_painter->save();
00574
00575 QPen pen = createPen ( color, size, style );
00576 m_painter->setPen ( pen );
00577
00578 unsigned int xsize = x.size();
00579 assert ( xsize == y.size() );
00580
00581 QPointArray array ( xsize );
00582 transformAndFill ( array, x, y,
00583 &QtViewImp::toCanvasX, &QtViewImp::toCanvasY );
00584
00585 m_painter->drawLineSegments ( array );
00586
00587 m_painter->restore();
00588
00589 }
00590
00591 void
00592 QtViewImp::
00593 draw_Text ( const std::string &s,
00594 float xx, float yy, float fontsize,
00595 float angle, char xp, char yp, bool resize,
00596 QFont & font )
00597 {
00598 int i_x = static_cast< int > ( xx );
00599 int i_y = static_cast< int > ( yy );
00600 int i_font = static_cast < int > ( fontsize );
00601
00602 if ( fontsize > 0 ) {
00603 font.setPointSize( i_font );
00604 font.setPixelSize( i_font );
00605 }
00606
00607 if ( m_painter == 0 ) return;
00608
00609 m_painter->setFont ( font );
00610
00611 QString qstring ( s.c_str() );
00612
00613 QFontMetrics metrics1 ( font );
00614 QRect new_rect1 = metrics1.boundingRect ( qstring );
00615 int h1 = new_rect1.height ();
00616
00617 if ( fontsize > 0 ) {
00618 while ( h1 >= fontsize ){
00619
00620 i_font-- ;
00621
00622 if ( i_font < 1 ) break;
00623
00624 font.setPixelSize ( i_font );
00625
00626 QFontMetrics metrics2 ( font );
00627 QRect new_rect2 = metrics2.boundingRect ( qstring );
00628 int h2 = new_rect2.height ();
00629
00630 h1 = h2;
00631 }
00632 }
00633
00634 if ( resize == true ) {
00635
00636
00637
00638
00639
00640
00641 QFontMetrics metrics ( font );
00642 QRect new_rect = metrics.boundingRect ( qstring );
00643
00644 int w = new_rect.width ();
00645 int h = new_rect.height ();
00646
00647 HippoRectangle rect = getDrawRect ();
00648
00649
00650 int delta_y = i_y - static_cast < int > ( rect.getY () );
00651 if ( delta_y > 0 ) {
00652 h += delta_y;
00653 }
00654
00655
00656 int delta_x = i_x - static_cast < int > ( rect.getX () );
00657 if ( delta_x > 0 ) {
00658 w += delta_x;
00659 }
00660
00661 setDrawRect ( rect.getX (), rect.getY (), 1.2 * w, 2. * h );
00662 }
00663
00664 HippoRectangle rect = getDrawRect ();
00665
00666 int i_w = static_cast < int > ( rect.getWidth () );
00667 int i_h = static_cast < int > ( rect.getHeight () );
00668
00669 QRect text_rect = m_painter->boundingRect ( 0, 0,
00670 i_h, i_w,
00671 Qt::AlignLeft | Qt::AlignTop,
00672 qstring );
00673 int dx = 0;
00674 int dy = 0;
00675
00676 if ( angle == 0.0 )
00677 {
00678
00679 switch ( xp ) {
00680 case 'l' :
00681 case 'L' :
00682 dx = i_x;
00683 break;
00684 case 'c' :
00685 case 'C' :
00686 dx = i_x - text_rect.width () / 2;
00687 break;
00688 case 'r' :
00689 case 'R' :
00690 dx = i_x - text_rect.width ();
00691 break;
00692 default:
00693 dx = i_x;
00694 }
00695
00696 switch ( yp ) {
00697 case 't' :
00698 case 'T' :
00699 dy = i_y;
00700 break;
00701 case 'c' :
00702 case 'C' :
00703 dy = i_y - text_rect.height () / 2;
00704 break;
00705 case 'b' :
00706 case 'B' :
00707 dy = i_y - text_rect.height ();
00708 break;
00709 default:
00710 dy = i_y;
00711 }
00712
00713 text_rect.moveBy ( dx, dy );
00714 text_rect.setWidth ( text_rect.width() + 2 );
00715 text_rect.setHeight ( text_rect.height() + 2 );
00716
00717 m_painter->drawText ( text_rect, Qt::AlignLeft | Qt::AlignTop,
00718 qstring );
00719 }
00720
00721 else
00722 {
00723 m_painter->save();
00724
00725 m_painter->translate ( i_x, i_y );
00726
00727 m_painter->rotate ( - angle );
00728
00729 switch ( xp ) {
00730 case 'l' :
00731 case 'L' :
00732 dx = 0;
00733 break;
00734 case 'c' :
00735 case 'C' :
00736 dx = 0 - text_rect.width () / 2;
00737 break;
00738 case 'r' :
00739 case 'R' :
00740 dx = 0 - text_rect.width ();
00741 break;
00742 default:
00743 dx = 0;
00744 }
00745
00746 switch ( yp ) {
00747 case 't' :
00748 case 'T' :
00749 dy = 0;
00750 break;
00751 case 'c' :
00752 case 'C' :
00753 dy = 0 - text_rect.height () / 2;
00754 break;
00755 case 'b' :
00756 case 'B' :
00757 dy = 0 - text_rect.height ();
00758 break;
00759 default:
00760 dy = 0;
00761 }
00762
00763 text_rect.moveBy ( dx, dy );
00764 text_rect.setWidth ( text_rect.width() + 2 );
00765 text_rect.setHeight ( text_rect.height() + 2 );
00766
00767 m_painter->drawText ( text_rect, Qt::AlignLeft | Qt::AlignTop,
00768 qstring );
00769
00770 m_painter->restore();
00771
00772 }
00773
00774 }
00775
00779 void
00780 QtViewImp::
00781 drawText ( const std::string &s,
00782 float xx, float yy,
00783 float fontsize, float angle,
00784 char xp, char yp, bool resize )
00785 {
00786 drawText ( s, xx, yy, fontsize, angle, xp, yp, resize, 0 );
00787 }
00788
00789 void
00790 QtViewImp::
00791 drawText ( const std::string &s,
00792 float xx, float yy,
00793 float fontsize, float angle,
00794 char xp, char yp, bool resize,
00795 const FontBase * font )
00796 {
00797 HippoRectangle rect = getDrawRect ();
00798
00799 if ( font != 0 ) {
00800 const QtFont * qtfont = dynamic_cast < const QtFont * > ( font );
00801 const QFont & qfont = qtfont -> font();
00802 QFont & qf = const_cast < QFont & > ( qfont );
00803
00804 draw_Text ( s,
00805 (xx + rect.getX()), (yy + rect.getY () ),
00806 fontsize, angle,
00807 xp, yp, resize, qf );
00808 }
00809 else {
00810 draw_Text ( s,
00811 (xx + rect.getX()), (yy + rect.getY () ),
00812 fontsize, angle,
00813 xp, yp, resize, m_font_default );
00814 }
00815 }
00816
00817 void
00818 QtViewImp::
00819 drawUserText ( const std::string &s,
00820 float xx, float yy,
00821 float fontsize, float angle,
00822 char xp, char yp )
00823 {
00824 HippoRectangle rect = getDrawRect ();
00825 draw_Text ( s,
00826 ( rect.getX () + userToDrawX ( xx ) ),
00827 ( rect.getY () + userToDrawY ( yy ) ),
00828 fontsize, angle, xp, yp, false, m_font_default );
00829 }
00830
00831 void
00832 QtViewImp::
00833 drawMag ( float xx, float yy, int mag, float fontsize )
00834 {
00835 drawMag ( xx, yy, mag, fontsize, m_font_default );
00836 }
00837
00838 void
00839 QtViewImp::
00840 drawMag ( float xx, float yy, int mag, float fontsize, QFont & font )
00841 {
00842 int i_font = static_cast< int> ( fontsize );
00843 m_painter->save();
00844
00845 font.setPointSize( i_font );
00846 m_painter->setFont ( font );
00847
00848 m_painter->translate ( xx, yy );
00849
00850 QString qs1 ( "x10" );
00851 m_painter->drawText ( 0, 0, qs1);
00852
00853 m_painter->translate ( (qs1.length() * fontsize * 3 / 4), -fontsize/2 );
00854
00855 QString str ( "%1" );
00856 QString qs2 = str.arg ( mag );
00857 m_painter->drawText ( 0, 0, qs2 );
00858
00859 m_painter->restore();
00860
00861 }
00862
00863 void
00864 QtViewImp::
00865 drawSquare ( double x1, double y1, double x2, double y2,
00866 int red, int green, int blue )
00867 {
00868 int x = toViewX ( x1 );
00869 int w = toViewX ( x2 ) - x + 1;
00870 int y = toViewY ( y2 );
00871 int h = toViewY ( y1 ) - y + 1;
00872
00873 const QColor color ( red, green, blue );
00874
00875 m_painter->fillRect ( x, y, w, h, color );
00876 }
00877
00878 void
00879 QtViewImp::
00880 drawViewSquare ( float x1, float y1, float x2, float y2,
00881 int red, int green, int blue )
00882 {
00883 int x = toCanvasX ( x1 );
00884 int w = toCanvasX ( x2 ) - x + 1;
00885 int y = toCanvasY ( y2 );
00886 int h = toCanvasY ( y1 ) - y + 1;
00887
00888 QColor color ( red, green, blue );
00889
00890 m_painter->fillRect ( x, y, w, h, color );
00891 }
00892
00893 void QtViewImp::setCrossX ( double val )
00894 {
00895 m_plotter->setCrossX ( val );
00896 }
00897
00898 void QtViewImp::setCrossY ( double val )
00899 {
00900 m_plotter->setCrossY ( val );
00901 }
00902
00903
00904 void
00905 QtViewImp::
00906 setDefaultFont ( const QFont& font )
00907 {
00908 m_font_default = font;
00909 }
00910
00911 const QFont &
00912 QtViewImp::
00913 defaultFont()
00914 {
00915 return m_font_default;
00916 }