]> Git trees. - libqmvoc.git/commitdiff
Several fixes:
authorJason Harris <kstars@30doradus.org>
Mon, 11 Dec 2006 02:06:47 +0000 (02:06 +0000)
committerJason Harris <kstars@30doradus.org>
Mon, 11 Dec 2006 02:06:47 +0000 (02:06 +0000)
+ implement KPlotObject::label(int) and KPlotObject::setLabel(int,
QString)

+ Add KPlotWidget::pixRect() accessor, returning the QRect of the plot
area in pixel coordinates.

+ Don't draw plot objects that lie outside the PixRect.

svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=612364

kdeeduplot/kplotobject.cpp
kdeeduplot/kplotobject.h
kdeeduplot/kplotwidget.cpp
kdeeduplot/kplotwidget.h

index 157ecd7882c5e52c08ff6dbe625fe6aeb67b0645..fbbee9d06f0541fdb8eb073576c53b8ed3e335ab 100644 (file)
@@ -136,92 +136,94 @@ void KPlotObject::draw( QPainter *painter, KPlotWidget *pw ) {
                foreach( KPlotPoint *pp, pList ) {
                        //q is the position of the point in screen pixel coordinates
                        QPointF q = pw->toScreen( pp->position() );
-                       double x1 = q.x() - size();
-                       double y1 = q.y() - size();
-                       QRectF qr = QRectF( x1, y1, 2*size(), 2*size() );
-
-                       //Mask out this rect in the plot for label avoidance
-                       pw->maskRect( qr, 2.0 );
-
-                       painter->setPen( pen() );
-                       painter->setBrush( brush() );
-
-                       switch ( pointStyle() ) {
-                       case CIRCLE:
-                               painter->drawEllipse( qr );
-                               break;
-
-                       case LETTER:
-                               painter->drawText( qr, Qt::AlignCenter, pp->label().left(1) );
-                               break;
-
-                       case TRIANGLE:
-                               {
-                                       QPolygonF tri;
-                                       tri << QPointF( q.x() - size(), q.y() + size() ) 
-                                                       << QPointF( q.x(), q.y() - size() ) 
-                                                       << QPointF( q.x() + size(), q.y() + size() );
-                                       painter->drawPolygon( tri );
+                       if ( pw->pixRect().contains( q.toPoint(), false ) ) {
+                               double x1 = q.x() - size();
+                               double y1 = q.y() - size();
+                               QRectF qr = QRectF( x1, y1, 2*size(), 2*size() );
+       
+                               //Mask out this rect in the plot for label avoidance
+                               pw->maskRect( qr, 2.0 );
+       
+                               painter->setPen( pen() );
+                               painter->setBrush( brush() );
+       
+                               switch ( pointStyle() ) {
+                               case CIRCLE:
+                                       painter->drawEllipse( qr );
                                        break;
-                               }
-
-                       case SQUARE:
-                               painter->drawRect( qr );
-                               break;
-
-                       case PENTAGON:
-                               {
-                                       QPolygonF pent;
-                                       pent << QPointF( q.x(), q.y() - size() ) 
-                                                        << QPointF( q.x() + size(), q.y() - 0.309*size() )
-                                                        << QPointF( q.x() + 0.588*size(), q.y() + size() )
-                                                        << QPointF( q.x() - 0.588*size(), q.y() + size() )
-                                                        << QPointF( q.x() - size(), q.y() - 0.309*size() );
-                                       painter->drawPolygon( pent );
+       
+                               case LETTER:
+                                       painter->drawText( qr, Qt::AlignCenter, pp->label().left(1) );
                                        break;
-                               }
-
-                       case HEXAGON:
-                               {
-                                       QPolygonF hex;
-                                       hex << QPointF( q.x(), q.y() + size() ) 
-                                                       << QPointF( q.x() + size(), q.y() + 0.5*size() )
-                                                       << QPointF( q.x() + size(), q.y() - 0.5*size() )
-                                                       << QPointF( q.x(), q.y() - size() )
-                                                       << QPointF( q.x() - size(), q.y() + 0.5*size() )
-                                                       << QPointF( q.x() - size(), q.y() - 0.5*size() );
-                                       painter->drawPolygon( hex );
+       
+                               case TRIANGLE:
+                                       {
+                                               QPolygonF tri;
+                                               tri << QPointF( q.x() - size(), q.y() + size() ) 
+                                                               << QPointF( q.x(), q.y() - size() ) 
+                                                               << QPointF( q.x() + size(), q.y() + size() );
+                                               painter->drawPolygon( tri );
+                                               break;
+                                       }
+       
+                               case SQUARE:
+                                       painter->drawRect( qr );
                                        break;
-                               }
-
-                       case ASTERISK:
-                               painter->drawLine( q, QPointF( q.x(), q.y() + size() ) );
-                               painter->drawLine( q, QPointF( q.x() + size(), q.y() + 0.5*size() ) );
-                               painter->drawLine( q, QPointF( q.x() + size(), q.y() - 0.5*size() ) );
-                               painter->drawLine( q, QPointF( q.x(), q.y() - size() ) );
-                               painter->drawLine( q, QPointF( q.x() - size(), q.y() + 0.5*size() ) );
-                               painter->drawLine( q, QPointF( q.x() - size(), q.y() - 0.5*size() ) );
-                               break;
-
-                       case STAR:
-                               {
-                                       QPolygonF star;
-                                       star << QPointF( q.x(), q.y() - size() ) 
-                                                        << QPointF( q.x() + 0.2245*size(), q.y() - 0.309*size() )
-                                                        << QPointF( q.x() + size(), q.y() - 0.309*size() )
-                                                        << QPointF( q.x() + 0.363*size(), q.y() + 0.118*size() )
-                                                        << QPointF( q.x() + 0.588*size(), q.y() + size() )
-                                                        << QPointF( q.x(), q.y() + 0.382*size() )
-                                                        << QPointF( q.x() - 0.588*size(), q.y() + size() )
-                                                        << QPointF( q.x() - 0.363*size(), q.y() + 0.118*size() )
-                                                        << QPointF( q.x() - size(), q.y() - 0.309*size() )
-                                                        << QPointF( q.x() - 0.2245*size(), q.y() - 0.309*size() );
-                                       painter->drawPolygon( star );
+       
+                               case PENTAGON:
+                                       {
+                                               QPolygonF pent;
+                                               pent << QPointF( q.x(), q.y() - size() ) 
+                                                               << QPointF( q.x() + size(), q.y() - 0.309*size() )
+                                                               << QPointF( q.x() + 0.588*size(), q.y() + size() )
+                                                               << QPointF( q.x() - 0.588*size(), q.y() + size() )
+                                                               << QPointF( q.x() - size(), q.y() - 0.309*size() );
+                                               painter->drawPolygon( pent );
+                                               break;
+                                       }
+       
+                               case HEXAGON:
+                                       {
+                                               QPolygonF hex;
+                                               hex << QPointF( q.x(), q.y() + size() ) 
+                                                               << QPointF( q.x() + size(), q.y() + 0.5*size() )
+                                                               << QPointF( q.x() + size(), q.y() - 0.5*size() )
+                                                               << QPointF( q.x(), q.y() - size() )
+                                                               << QPointF( q.x() - size(), q.y() + 0.5*size() )
+                                                               << QPointF( q.x() - size(), q.y() - 0.5*size() );
+                                               painter->drawPolygon( hex );
+                                               break;
+                                       }
+       
+                               case ASTERISK:
+                                       painter->drawLine( q, QPointF( q.x(), q.y() + size() ) );
+                                       painter->drawLine( q, QPointF( q.x() + size(), q.y() + 0.5*size() ) );
+                                       painter->drawLine( q, QPointF( q.x() + size(), q.y() - 0.5*size() ) );
+                                       painter->drawLine( q, QPointF( q.x(), q.y() - size() ) );
+                                       painter->drawLine( q, QPointF( q.x() - size(), q.y() + 0.5*size() ) );
+                                       painter->drawLine( q, QPointF( q.x() - size(), q.y() - 0.5*size() ) );
+                                       break;
+       
+                               case STAR:
+                                       {
+                                               QPolygonF star;
+                                               star << QPointF( q.x(), q.y() - size() ) 
+                                                               << QPointF( q.x() + 0.2245*size(), q.y() - 0.309*size() )
+                                                               << QPointF( q.x() + size(), q.y() - 0.309*size() )
+                                                               << QPointF( q.x() + 0.363*size(), q.y() + 0.118*size() )
+                                                               << QPointF( q.x() + 0.588*size(), q.y() + size() )
+                                                               << QPointF( q.x(), q.y() + 0.382*size() )
+                                                               << QPointF( q.x() - 0.588*size(), q.y() + size() )
+                                                               << QPointF( q.x() - 0.363*size(), q.y() + 0.118*size() )
+                                                               << QPointF( q.x() - size(), q.y() - 0.309*size() )
+                                                               << QPointF( q.x() - 0.2245*size(), q.y() - 0.309*size() );
+                                               painter->drawPolygon( star );
+                                               break;
+                                       }
+       
+                               default:
                                        break;
                                }
-
-                       default:
-                               break;
                        }
                }
        }
@@ -230,7 +232,8 @@ void KPlotObject::draw( QPainter *painter, KPlotWidget *pw ) {
        painter->setPen( labelPen() );
 
        foreach ( KPlotPoint *pp, pList ) {
-               if ( ! pp->label().isEmpty() ) {
+               QPoint q = pw->toScreen( pp->position() ).toPoint();
+               if ( pw->pixRect().contains(q, false) && ! pp->label().isEmpty() ) {
                        pw->placeLabel( painter, pp );
                }
        }
index 566087e53dee186bca66ebc7a36da58fa2096c7d..51d35439daa9618a115b6f3105bded0e0466d032 100644 (file)
@@ -192,14 +192,14 @@ public:
         * @return the label of point i
         * @param i the index of the point
         */
-       QString label( int i ) const;
+       inline QString label( int i ) const { if (pList.size() > i) return pList.at(i)->label(); }
 
        /**
         * Set the label text for point i
         * @param i the index of the point
         * @param n the new name
         */
-       void setLabel( int i, const QString &n );
+       inline void setLabel( int i, const QString &n ) { if (pList.size() > i) pList.at(i)->setLabel(n); }
 
        /**
         * @return true if points will be drawn for this object
index 77474af01dcce4189adc3d6bce432d7294119d36..fb6f5e7ed330d0a0046118f1ea6894199a19dc53 100644 (file)
@@ -330,39 +330,38 @@ void KPlotWidget::placeLabel( QPainter *painter, KPlotPoint *pp ) {
                }
        }
 
-       painter->drawText( bestRect, textFlags, pp->label() );
-
-       //Is a line needed to connect the label to the point?
-       if ( rbest > 2.0 ) {
-               //Draw a rectangle around the label 
-               painter->setBrush( QBrush() );
-               //QPen pen = painter->pen();
-               //pen.setStyle( Qt::DotLine );
-               //painter->setPen( pen );
-               painter->drawRoundRect( bestRect );
-
-               //Now connect the label to the point with a line.
-               //The line is drawn from the center of the near edge of the rectangle
-               float xline = bestRect.center().x();
-               if ( bestRect.left() > pos.x() )
-                       xline = bestRect.left();
-               if ( bestRect.right() < pos.x() )
-                       xline = bestRect.right();
-
-               float yline = bestRect.center().y();
-               if ( bestRect.top() > pos.y() )
-                       yline = bestRect.top();
-               if ( bestRect.bottom() < pos.y() )
-                       yline = bestRect.bottom();
-
-               //DEBUG
-               kDebug() << pp->label() << ": ( " << xline << ", " << yline << " )  " << bestRect << endl;
-
-               painter->drawLine( QPointF( xline, yline ), pos );
+       if ( ! bestRect.isNull() ) {
+               painter->drawText( bestRect, textFlags, pp->label() );
+
+               //Is a line needed to connect the label to the point?
+               if ( rbest > 2.0 ) {
+                       //Draw a rectangle around the label 
+                       painter->setBrush( QBrush() );
+                       //QPen pen = painter->pen();
+                       //pen.setStyle( Qt::DotLine );
+                       //painter->setPen( pen );
+                       painter->drawRoundRect( bestRect );
+       
+                       //Now connect the label to the point with a line.
+                       //The line is drawn from the center of the near edge of the rectangle
+                       float xline = bestRect.center().x();
+                       if ( bestRect.left() > pos.x() )
+                               xline = bestRect.left();
+                       if ( bestRect.right() < pos.x() )
+                               xline = bestRect.right();
+       
+                       float yline = bestRect.center().y();
+                       if ( bestRect.top() > pos.y() )
+                               yline = bestRect.top();
+                       if ( bestRect.bottom() < pos.y() )
+                               yline = bestRect.bottom();
+       
+                       painter->drawLine( QPointF( xline, yline ), pos );
+               }
+                                                                                               
+               //Mask the label's rectangle so other labels won't overlap it.
+               maskRect( bestRect );
        }
-                                                                                        
-       //Mask the label's rectangle so other labels won't overlap it.
-       maskRect( bestRect );
 }
 
 float KPlotWidget::rectCost ( const QRectF &r ) {
index 2e9ecd1d1fd87d3f7a32446fbb4383b0b5aeca8c..216889a37164b69dd87a7d91df9f4a2d9639a09a 100644 (file)
@@ -362,6 +362,8 @@ public:
         */
        KPlotAxis* axis( Axis a );
 
+       inline QRect& pixRect() { return PixRect; }
+
 public slots:
        /**
         * Toggle whether grid lines are drawn at major tickmarks.