Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

QtViewImp.cxx

Go to the documentation of this file.
00001 
00012 // inconsistent dll linkage
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 /* virtual */
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 /* virtual */
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 ); // last argument was default color
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     // This part of the code makes sense only for TextReps. Nobody else
00637     // should call draw_Text with resize == true. It will not
00638     // work if the text rep draws the strings that appear on the bottom of
00639     // the display before the ones that appear near the top.
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     // fix the height if this is not top string
00650     int delta_y = i_y - static_cast < int > ( rect.getY () );
00651     if ( delta_y > 0 ) {
00652       h += delta_y;
00653     }
00654 
00655     // fix the width if this is not left positioned string
00656     int delta_x = i_x - static_cast < int > ( rect.getX () );
00657     if ( delta_x > 0 ) {
00658       w += delta_x;
00659     }
00660     // need a little extra of the width for some reason.
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 // angle not 0.0
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 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3