summaryrefslogtreecommitdiffstats
path: root/qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit90825e2392b2d70e43c7a25b8a3752299a933894 (patch)
treee33aa27f02b74604afbfd0ea4f1cfca8833d882a /qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb
downloadtdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.tar.gz
tdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebindings@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb')
-rw-r--r--qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb212
1 files changed, 212 insertions, 0 deletions
diff --git a/qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb b/qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb
new file mode 100644
index 00000000..86c66f76
--- /dev/null
+++ b/qtruby/rubylib/examples/qt-examples/chart/chartform_canvas.rb
@@ -0,0 +1,212 @@
+class ChartForm
+
+ def drawElements()
+ list = @canvas.allItems()
+ list.each do |it|
+ it.dispose
+ end
+
+ # 360 * 16 for pies Qt works with 16ths of degrees
+ scaleFactor = @chartType == PIE ? 5760 :
+ @chartType == VERTICAL_BAR ? @canvas.height() :
+ @canvas.width()
+ biggest = 0.0
+ count = 0
+ total = 0.0
+ scales = Array.new(MAX_ELEMENTS)
+
+ for i in 0...MAX_ELEMENTS
+ if @elements[i].isValid()
+ value = @elements[i].value()
+ count += 1
+ total += value
+ if value > biggest
+ biggest = value
+ end
+ scales[i] = @elements[i].value() * scaleFactor
+ end
+ end
+
+ if count > 0
+ # 2nd loop because of total and biggest
+ for i in 0...MAX_ELEMENTS
+ if @elements[i].isValid()
+ if @chartType == PIE
+ scales[i] = (@elements[i].value() * scaleFactor) / total
+ else
+ scales[i] = (@elements[i].value() * scaleFactor) / biggest
+ end
+ end
+ end
+
+ case @chartType
+ when PIE
+ drawPieChart( scales, total, count )
+ when VERTICAL_BAR:
+ drawVerticalBarChart( scales, total, count )
+ when HORIZONTAL_BAR:
+ drawHorizontalBarChart( scales, total, count )
+ end
+ end
+
+ @canvas.update()
+ end
+
+
+ def drawPieChart( scales, total, i )
+ width = @canvas.width().to_f
+ height = @canvas.height().to_f
+ size = width > height ? height : width
+ x = width / 2
+ y = height / 2
+ angle = 0
+
+ for i in 0...MAX_ELEMENTS
+ if @elements[i].isValid()
+ extent = scales[i]
+ arc = Qt::CanvasEllipse.new( size, size, angle, extent, @canvas )
+ arc.setX( x )
+ arc.setY( y )
+ arc.setZ( 0 )
+ arc.setBrush( Qt::Brush.new( @elements[i].valueColor(),
+ @elements[i].valuePattern() ) )
+ arc.show()
+ angle += extent
+ label = @elements[i].label()
+ if !label.empty? || @addValues != NO
+ label = valueLabel( label, @elements[i].value(), total )
+ text = CanvasText.new( i, label, @font, @canvas )
+ proX = @elements[i].proX( PIE ).to_f
+ proY = @elements[i].proY( PIE ).to_f
+ if proX < 0 || proY < 0
+ # Find the centre of the pie segment
+ rect = arc.boundingRect()
+ proX = ( rect.width() / 2 ) + rect.x()
+ proY = ( rect.height() / 2 ) + rect.y()
+ # Centre text over the centre of the pie segment
+ rect = text.boundingRect()
+ proX -= ( rect.width() / 2 )
+ proY -= ( rect.height() / 2 )
+ # Make proportional
+ proX /= width
+ proY /= height
+ end
+ text.setColor( @elements[i].labelColor() )
+ text.setX( proX * width )
+ text.setY( proY * height )
+ text.setZ( 1 )
+ text.show()
+ @elements[i].setProX( PIE, proX )
+ @elements[i].setProY( PIE, proY )
+ end
+ end
+ end
+ end
+
+
+ def drawVerticalBarChart(scales, total, count )
+ width = @canvas.width().to_f
+ height = @canvas.height().to_f
+ prowidth = width / count
+ x = 0
+ pen = Qt::Pen.new
+ pen.style = NoPen
+
+ for i in 0...MAX_ELEMENTS
+ if @elements[i].isValid()
+ extent = scales[i]
+ y = height - extent
+ rect = Qt::CanvasRectangle.new(x, y, prowidth, extent, @canvas )
+ rect.setBrush( Qt::Brush.new( @elements[i].valueColor(),
+ @elements[i].valuePattern() ) )
+ rect.setPen( pen )
+ rect.setZ( 0 )
+ rect.show()
+ label = @elements[i].label()
+ if !label.empty? || @addValues != NO
+ proX = @elements[i].proX( VERTICAL_BAR ).to_f
+ proY = @elements[i].proY( VERTICAL_BAR ).to_f
+ if proX < 0 || proY < 0
+ proX = x / width
+ proY = y / height
+ end
+ label = valueLabel( label, @elements[i].value(), total )
+ text = CanvasText.new( i, label, @font, @canvas )
+ text.setColor( @elements[i].labelColor() )
+ text.setX( proX * width )
+ text.setY( proY * height )
+ text.setZ( 1 )
+ text.show()
+ @elements[i].setProX( VERTICAL_BAR, proX )
+ @elements[i].setProY( VERTICAL_BAR, proY )
+ end
+ x += prowidth
+ end
+ end
+ end
+
+
+ def drawHorizontalBarChart(scales, total, count )
+ width = @canvas.width().to_f
+ height = @canvas.height().to_f
+ proheight = height / count
+ y = 0
+ pen = Qt::Pen.new
+ pen.style = NoPen
+
+ for i in 0...MAX_ELEMENTS
+ if @elements[i].isValid()
+ extent = scales[i]
+ rect = Qt::CanvasRectangle.new(0, y, extent, proheight, @canvas )
+ rect.setBrush( Qt::Brush.new( @elements[i].valueColor(),
+ @elements[i].valuePattern() ) )
+ rect.setPen( pen )
+ rect.setZ( 0 )
+ rect.show()
+ label = @elements[i].label()
+ if !label.empty? || @addValues != NO
+ proX = @elements[i].proX( HORIZONTAL_BAR ).to_f
+ proY = @elements[i].proY( HORIZONTAL_BAR ).to_f
+ if proX < 0 || proY < 0
+ proX = 0
+ proY = y / height
+ end
+ label = valueLabel( label, @elements[i].value(), total )
+ text = CanvasText.new( i, label, @font, @canvas )
+ text.setColor( @elements[i].labelColor() )
+ text.setX( proX * width )
+ text.setY( proY * height )
+ text.setZ( 1 )
+ text.show()
+ @elements[i].setProX( HORIZONTAL_BAR, proX )
+ @elements[i].setProY( HORIZONTAL_BAR, proY )
+ end
+ y += proheight
+ end
+ end
+ end
+
+
+ def valueLabel(label, value, total )
+ if @addValues == NO
+ return label
+ end
+
+ newLabel = label
+ if !label.empty?
+ if @chartType == VERTICAL_BAR
+ newLabel += "\n"
+ else
+ newLabel += ' '
+ end
+ end
+ if @addValues == YES
+ newLabel += "%.#{@decimalPlaces}f" % value
+ elsif @addValues == AS_PERCENTAGE
+ newLabel += "%.#{@decimalPlaces}f%s" % [(value / total) * 100, '%']
+ end
+ return newLabel
+ end
+
+end
+