Bug 135381 - horizontal lines don't appear correctly
Summary: horizontal lines don't appear correctly
Status: RESOLVED FIXED
Alias: None
Product: ksysguard
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: Debian testing Linux
: NOR normal
Target Milestone: ---
Assignee: John Tapsell
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-10-10 05:01 UTC by Chris Moore
Modified: 2006-11-28 23:47 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Chris Moore 2006-10-10 05:01:30 UTC
Version:            (using KDE KDE 3.5.5)
Installed from:    Debian testing/unstable Packages
OS:                Linux

When I right-click a display in the system guard applet, select the 'grid' tab, check 'horizontal lines' and ask for 2 lines, I only see one line, right in the centre of the graph.

It's dividing the graph into 2 halves, but it's only 1 line, when I asked for 2.

If I ask for 3 lines, I see none at all.

If I ask for 4 lines, the graph doubles in size, obscuring the title, and I still see no lines at all.

http://dooglus.rincevent.net/2006-10-10--04-55-47.png is a screenshot showing 3 disk usage graphs.  They each had a title on them before I added the horizontal lines.  Notice how the one with '4 lines' requested has lost its title.
Comment 1 John Tapsell 2006-11-23 12:45:16 UTC
Hmm, yeah heh.

Comment 2 John Tapsell 2006-11-28 22:45:21 UTC
SVN commit 608911 by johnflux:

Number of horizontal lines is off by one, plus it no longer tries to 'smart' about showing the top bar, plus fix integer rounding errors (   a*b/c  is better than a*(b/c)  
when using ints! )

CCBUG:135381


 M  +2 -2      FancyPlotterSettings.cc  
 M  +23 -14    SignalPlotter.cc  


--- branches/KDE/3.5/kdebase/ksysguard/gui/SensorDisplayLib/FancyPlotterSettings.cc #608910:608911
@@ -155,8 +155,8 @@
   boxLayout->addWidget( label, 1, 2 );
 
   mHorizontalLinesCount = new KIntNumInput( 0, groupBox );
-  mHorizontalLinesCount->setMinValue( 2 );
-  mHorizontalLinesCount->setMaxValue( 20 );
+  mHorizontalLinesCount->setMinValue( 1 );
+  mHorizontalLinesCount->setMaxValue( 100 );
   QWhatsThis::add( mHorizontalLinesCount, i18n( "Enter the number of horizontal lines here." ) );
   boxLayout->addWidget( mHorizontalLinesCount , 1, 3 );
   label->setBuddy( mHorizontalLinesCount );
--- branches/KDE/3.5/kdebase/ksysguard/gui/SensorDisplayLib/SignalPlotter.cc #608910:608911
@@ -429,21 +429,21 @@
         range = 1.0;
     }
     // Massage the range so that the grid shows some nice values.
-    double step = range / mHorizontalLinesCount;
+    double step = range / (mHorizontalLinesCount+1);
     double dim = pow( 10, floor( log10( step ) ) ) / 2;
-    range = dim * ceil( step / dim ) * mHorizontalLinesCount;
+    range = dim * ceil( step / dim ) * (mHorizontalLinesCount+1);
   }
   double maxValue = minValue + range;
 
   int top = 0;
-  if ( mShowTopBar && h > ( mFontSize + 2 + mHorizontalLinesCount * 10 ) ) {
+  if ( mShowTopBar && h > ( mFontSize/*top bar size*/ + 2/*padding*/ +5/*smallest reasonable size for a graph*/ ) ) {
     /* Draw horizontal bar with current sensor values at top of display. */
     p.setPen( mHorizontalLinesColor );
     int x0 = w / 2;
     p.setFont( QFont( p.font().family(), mFontSize ) );
     top = p.fontMetrics().height();
     h -= top;
-    int h0 = top - 2;
+    int h0 = top - 2; // h0 is our new top.  It's at least 5 pixels high
     p.drawText(0, 0, x0, top - 2, Qt::AlignCenter, mTitle );
 
     p.drawLine( x0 - 1, 1, x0 - 1, h0 );
@@ -607,26 +607,35 @@
     delete[] prevVals;
   }
 
-  /* Draw horizontal lines and values. Lines are drawn when the
-   * height is greater than 10 times hCount + 1, values are shown
-   * when width is greater than 60 */
-  if ( mShowHorizontalLines && h > ( 10 * ( mHorizontalLinesCount + 1 ) ) ) {
+  /* Draw horizontal lines and values. Lines are always drawn.
+   * Values are only draw when width is greater than 60 */
+  if ( mShowHorizontalLines ) {
     p.setPen( mHorizontalLinesColor );
     p.setFont( QFont( p.font().family(), mFontSize ) );
     QString val;
-    for ( uint y = 1; y < mHorizontalLinesCount; y++ ) {
-      p.drawLine( 0, top + y * ( h / mHorizontalLinesCount ), w - 2,
-                  top + y * ( h / mHorizontalLinesCount ) );
+
+    /* top = 0 or  font.height    depending on whether there's a topbar or not
+     * h = graphing area.height   - i.e. the actual space we have to draw inside
+     *
+     * Note we are drawing from 0,0 as the top left corner.  So we have to add on top to get to the top of where we are drawing
+     * so top+h is the height of the widget
+     */ 
+    for ( uint y = 1; y <= mHorizontalLinesCount; y++ ) {
+
+      int y_coord =  top + (y * h) / (mHorizontalLinesCount+1);  //Make sure it's y*h first to avoid rounding bugs
+      p.drawLine( 0, y_coord, w - 2, y_coord );
+
       if ( mShowLabels && h > ( mFontSize + 1 ) * ( mHorizontalLinesCount + 1 )
            && w > 60 ) {
-        val = QString( "%1" ).arg( maxValue - y * ( range / mHorizontalLinesCount ) );
-        p.drawText( 6, top + y * ( h / mHorizontalLinesCount ) - 1, val );
+        val = QString::number(maxValue - (y * range) / (mHorizontalLinesCount+1 ) );
+        p.drawText( 6, y_coord  - 1, val );  //draw the text one pixel raised above the line
       }
     }
 
+    //Draw the bottom most (minimum) number as well
     if ( mShowLabels && h > ( mFontSize + 1 ) * ( mHorizontalLinesCount + 1 )
          && w > 60 ) {
-      val = QString( "%1" ).arg( minValue );
+      val = QString::number( minValue );
       p.drawText( 6, top + h - 2, val );
     }
   }
Comment 3 John Tapsell 2006-11-28 22:50:19 UTC
SVN commit 608912 by johnflux:

 Number of horizontal lines is off by one, plus it no longer tries to 'smart' about showing the top bar, plus fix integer rounding errors (   a*b/c  is better than 
a*(b/c) when using ints! ) 

This was fixed in kde 3.5 as well in commit revision 608911 so closing bug

BUG: 135381 



 M  +2 -2      FancyPlotterSettings.cc  
 M  +19 -11    SignalPlotter.cc  


--- trunk/KDE/kdebase/workspace/ksysguard/gui/SensorDisplayLib/FancyPlotterSettings.cc #608911:608912
@@ -166,8 +166,8 @@
   boxLayout->addWidget( label, 1, 2 );
 
   mHorizontalLinesCount = new KIntNumInput( 0, groupBox );
-  mHorizontalLinesCount->setMinimum( 2 );
-  mHorizontalLinesCount->setMaximum( 20 );
+  mHorizontalLinesCount->setMinimum( 1 );
+  mHorizontalLinesCount->setMaximum( 100 );
   mHorizontalLinesCount->setWhatsThis( i18n( "Enter the number of horizontal lines here." ) );
   boxLayout->addWidget( mHorizontalLinesCount , 1, 3 );
   label->setBuddy( mHorizontalLinesCount );
--- trunk/KDE/kdebase/workspace/ksysguard/gui/SensorDisplayLib/SignalPlotter.cc #608911:608912
@@ -434,9 +434,9 @@
         range = 1.0;
     }
     // Massage the range so that the grid shows some nice values.
-    double step = range / mHorizontalLinesCount;
+    double step = range / (mHorizontalLinesCount+1);
     double dim = pow( 10, floor( log10( step ) ) ) / 2;
-    range = dim * ceil( step / dim ) * mHorizontalLinesCount;
+    range = dim * ceil( step / dim ) * (mHorizontalLinesCount+1);
   }
   double maxValue = minValue + range;
 
@@ -445,7 +445,7 @@
     int x0 = w / 2;
     top = p.fontMetrics().height();
     //Before we continue, check if there's enough room.  So enough room for a bar at the top, plus horizontal lines each of a size with room for a scale
-    if( h <= (top + 2 + mHorizontalLinesCount * qMax(10, top)) ) {
+    if( h <= (top/*top bar size*/ + 2/*padding*/ +5/*smallest reasonable size for a graph*/ ) ) {
       top = 0;
     } else {
       h -= top;
@@ -644,16 +644,23 @@
     }
   }
 
-  /* Draw horizontal lines and values. Lines are drawn when the
-   * height is greater than 10 times hCount + 1, values are shown
-   * when width is greater than 60 */
+  /* Draw horizontal lines and values. Lines are always drawn.
+   * Values are only draw when width is greater than 60 */
   int fontheight = p.fontMetrics().height();
-  if ( mShowHorizontalLines && h > ( 10 * ( mHorizontalLinesCount + 1 ) ) ) { 
+  if ( mShowHorizontalLines ) { 
     QString val;
-    for ( uint y = 1; y < mHorizontalLinesCount; y++ ) {
+    /* top = 0 or  font.height    depending on whether there's a topbar or not
+     * h = graphing area.height   - i.e. the actual space we have to draw inside
+     *
+     * Note we are drawing from 0,0 as the top left corner.  So we have to add on top to get to the top of where we are drawing
+     * so top+h is the height of the widget
+     */
+
+    for ( uint y = 1; y <= mHorizontalLinesCount; y++ ) {
+      int y_coord =  top + (y * h) / (mHorizontalLinesCount+1);  //Make sure it's y*h first to avoid rounding bugs
+
       p.setPen( mHorizontalLinesColor );
-      p.drawLine( 0, top + y * ( h / mHorizontalLinesCount ), w - 2,
-                  top + y * ( h / mHorizontalLinesCount ) );
+      p.drawLine( 0, y_coord, w - 2, y_coord);
       if ( mShowLabels && h > ( fontheight + 1 ) * ( mHorizontalLinesCount + 1 )
            && w > 60 ) {
 	double value = (maxValue - y * ( range / mHorizontalLinesCount ))/mScaleDownBy;
@@ -661,10 +668,11 @@
         QString number = KGlobal::locale()->formatNumber( value, (value >= 100)?0:2);
         val = QString( "%1 %2" ).arg( number, mUnit );
         p.setPen( mFontColor );
-        p.drawText( 6, top + y * ( h / mHorizontalLinesCount ) - 2, val );
+        p.drawText( 6, y_coord - 2, val );
       }
     }
 
+    //Draw the bottom most (minimum) number as well
     if ( mShowLabels && h > ( fontheight + 1 ) * ( mHorizontalLinesCount + 1 )
          && w > 60 ) {
       int value = (int)(minValue / mScaleDownBy);
Comment 4 John Tapsell 2006-11-28 22:55:56 UTC
Thanks Chris Moore for reporting this.

High quality bug reports such as these really do make a huge difference.  
Comment 5 Chris Moore 2006-11-28 23:47:00 UTC
John Tapsell <johnflux@gmail.com> writes:

> Thanks Chris Moore for reporting this.
>
> High quality bug reports such as these really do make a huge
> difference.


Not a problem.  High quality fixes such as these make a huge
difference to whether I continue using the software or not.  I'm not
particularly fussed whether I use KDE or GNOME, but if I find bugs I
report against KDE get fixed and GNOME bugs don't, then I'm sure I'll
find myself running KDE most of the time (he says from his XFCE4
session)...