summaryrefslogtreecommitdiffstats
path: root/qtruby/rubylib/examples/qt-examples/progress/progress.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/progress/progress.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/progress/progress.rb')
-rw-r--r--qtruby/rubylib/examples/qt-examples/progress/progress.rb275
1 files changed, 275 insertions, 0 deletions
diff --git a/qtruby/rubylib/examples/qt-examples/progress/progress.rb b/qtruby/rubylib/examples/qt-examples/progress/progress.rb
new file mode 100644
index 00000000..02116958
--- /dev/null
+++ b/qtruby/rubylib/examples/qt-examples/progress/progress.rb
@@ -0,0 +1,275 @@
+#!/usr/bin/env ruby -w
+
+require 'Qt'
+
+class AnimatedThingy < Qt::Label
+ attr_accessor :label, :step
+ attr_accessor :ox0, :oy0, :ox1, :oy1
+ attr_accessor :x0, :y0, :x1, :y1
+ attr_accessor :dx0, :dx1, :dy0, :dy1
+ NQIX = 10
+
+ def initialize(*k)
+ super(*k)
+ @label = k[1] + "\n... and wasting CPU\nwith this animation!\n"
+ @step = 0
+ @ox0, @oy0, @ox1, @oy1 = *Array.new(4) { Array.new(10, 0) }
+ @x0 = @y0 = @x1 = @y1 = 0
+ @dx0 = rand(8)+2
+ @dy0 = rand(8)+2
+ @dx1 = rand(8)+2
+ @dy1 = rand(8)+2
+ end
+
+ def show
+ startTimer(100) unless isVisible
+ super
+ end
+
+ def hide
+ super
+ killTimers()
+ end
+
+ def sizeHint
+ Qt::Size.new(120,100)
+ end
+
+ def inc(x, dx, b)
+ x += dx
+ if x < 0
+ x = 0
+ dx = rand(8) + 2
+ elsif x >= b
+ x = b-1
+ dx = -(rand(8)+2)
+ end
+ yield x, dx
+ end
+
+ def timerEvent(e)
+ p = Qt::Painter.new(self)
+ pn = p.pen
+ pn.setWidth(2)
+ pn.setColor(backgroundColor)
+ p.setPen(pn)
+
+ @step = (@step + 1) % NQIX
+
+ p.drawLine(@ox0[@step], @oy0[@step], @ox1[@step], @oy1[@step])
+
+ inc(@x0, @dx0, width) { |x,dx| @x0, @dx0 = x, dx }
+ inc(@y0, @dy0, height) { |y,dy| @y0, @dy0 = y, dy }
+ inc(@x1, @dx1, width) { |x,dx| @x1, @dx1 = x, dx }
+ inc(@y1, @dy1, height) { |y,dy| @y1, @dy1 = y, dy }
+ @ox0[@step] = @x0
+ @oy0[@step] = @y0
+ @ox1[@step] = @x1
+ @oy1[@step] = @y1
+
+ c = Qt::Color.new
+ c.setHsv( (@step*255)/NQIX, 255, 255 ) # rainbow effect
+ pn.setColor(c)
+ pn.setWidth(2)
+ p.setPen(pn)
+ p.drawLine(@ox0[@step], @oy0[@step], @ox1[@step], @oy1[@step])
+ p.setPen(colorGroup().text())
+ p.drawText(rect(), AlignCenter, @label)
+ p.end()
+ end
+
+ def paintEvent(event)
+ p = Qt::Painter.new(self)
+ pn = p.pen()
+ pn.setWidth(2)
+ p.setPen(pn)
+ p.setClipRect(event.rect())
+ 0.upto(NQIX-1) do |i|
+ c = Qt::Color.new()
+ c.setHsv( (i*255)/NQIX, 255, 255 ) # rainbow effect
+ pn.setColor(c)
+ p.setPen(pn)
+ p.drawLine(@ox0[i], @oy0[i], @ox1[i], @oy1[i])
+ end
+ p.setPen(colorGroup().text())
+ p.drawText(rect(), AlignCenter, @label)
+ p.end
+ end
+end
+
+class CPUWaster < Qt::Widget
+ attr_accessor :menubar, :file, :options, :rects, :pb
+ attr_accessor :td_id , :ld_id, :dl_id, :cl_id, :md_id
+ attr_accessor :got_stop, :timer_driven, :default_label
+ slots 'drawItemRects(int)', 'doMenuItem(int)', 'stopDrawing()', 'timerDriven()'
+ slots 'loopDriven()', 'defaultLabel()', 'customLabel()', 'toggleMinimumDuration()'
+
+ FIRST_DRAW_ITEM = 1000
+ LAST_DRAW_ITEM = 1006
+
+ def initialize(*k)
+ super(*k)
+
+ @menubar = Qt::MenuBar.new(self, "menu")
+ @pb = nil
+
+ @file = Qt::PopupMenu.new
+ @menubar.insertItem( "&File", file )
+ FIRST_DRAW_ITEM.upto(LAST_DRAW_ITEM) {
+ |i| file.insertItem( "#{drawItemRects(i)} Rectangles", i)
+ }
+ connect( menubar, SIGNAL('activated(int)'), self, SLOT('doMenuItem(int)') )
+ @file.insertSeparator
+ @file.insertItem("Quit", $qApp, SLOT('quit()'))
+ @options = Qt::PopupMenu.new
+ @menubar.insertItem("&Options", options)
+ @td_id = options.insertItem("Timer driven", self, SLOT('timerDriven()'))
+ @ld_id = options.insertItem("Loop driven", self, SLOT('loopDriven()'))
+ @options.insertSeparator
+ @dl_id = options.insertItem("Default label", self, SLOT('defaultLabel()'))
+ @cl_id = options.insertItem("Custom label", self, SLOT('customLabel()'))
+ @options.insertSeparator
+ @md_id = options.insertItem("No minimum duration", self, SLOT('toggleMinimumDuration()'))
+ @options.setCheckable true
+
+ loopDriven
+ defaultLabel
+
+ setFixedSize(400, 300)
+ setBackgroundColor(black)
+ end
+
+ def drawItemRects(id)
+ n = id - FIRST_DRAW_ITEM - 1
+ r = 100
+ n.downto(0) { |n|
+ r *= (n%3 != 0) ? 5 : 4
+ }
+ r
+ end
+
+ def doMenuItem(id)
+ draw drawItemRects(id) if id >= FIRST_DRAW_ITEM && id <= LAST_DRAW_ITEM
+ end
+
+ def stopDrawing
+ @got_stop = true
+ end
+
+ def timerDriven
+ @timer_driven = true
+ @options.setItemChecked(@td_id, true)
+ @options.setItemChecked(@ld_id, false)
+ end
+
+ def loopDriven
+ @timer_driven = false
+ @options.setItemChecked(@td_id, false)
+ @options.setItemChecked(@ld_id, true)
+ end
+
+ def defaultLabel
+ @default_label = true
+ @options.setItemChecked(@dl_id, true)
+ @options.setItemChecked(@cl_id, false)
+ end
+
+ def customLabel
+ @default_label = false
+ @options.setItemChecked(@dl_id, false)
+ @options.setItemChecked(@cl_id, true)
+ end
+
+ def toggleMinimumDuration
+ checked = @options.isItemChecked(@md_id)
+ @options.setItemChecked(@md_id, !checked)
+ end
+
+ def timerEvent(e)
+ @pb.setProgress( @pb.totalSteps - @rects ) if @rects % 100 == 0
+ @rects -= 1
+
+ painter = Qt::Painter.new(self)
+
+ ww = width
+ wh = height
+
+ if ww > 8 and wh > 8
+ c = Qt::Color.new(rand(255), rand(255), rand(255))
+ x = rand(ww - 8)
+ y = rand(wh - 8)
+ w = rand(ww - x)
+ h = rand(wh - y)
+ painter.fillRect(x, y, w, h, Qt::Brush.new(c))
+ end
+
+ painter.end()
+
+ if @rects == 0 || @got_stop
+ @pb.setProgress(@pb.totalSteps)
+ painter = Qt::Painter.new(self)
+ painter.fillRect(0, 0, width(), height(), Qt::Brush.new(backgroundColor))
+ painter.end()
+ enableDrawingItems(true)
+ killTimers()
+ @pb = nil
+ end
+ end
+
+ def newProgressDialog(label, steps, modal)
+ d = Qt::ProgressDialog.new(label, "Cancel", steps, self, "progress", modal)
+ d.setMinimumDuration(0) if @options.isItemChecked(@md_id)
+ d.setLabel( AnimatedThingy.new(d, label) ) unless @default_label
+ d.show
+ d
+ end
+
+ def enableDrawingItems(yes)
+ FIRST_DRAW_ITEM.upto(LAST_DRAW_ITEM) {
+ |i| menubar.setItemEnabled(i, yes)
+ }
+ end
+
+ def draw(n)
+ if timer_driven
+ unless @pb.nil?
+ warn("This cannot happen!")
+ return
+ end
+ @rects = n
+ @pb = newProgressDialog("Drawing rectangles.\nUsing timer event.", n, false)
+ @pb.setCaption("Please Wait")
+ connect(@pb, SIGNAL('cancelled()'), self, SLOT('stopDrawing()'))
+ enableDrawingItems(false)
+ startTimer(0)
+ @got_stop = false
+ else
+ lpb = newProgressDialog("Drawing rectangles.\nUsing loop.", n, true)
+ lpb.setCaption("Please Wait")
+
+ painter = Qt::Painter.new(self)
+ 0.upto(n) { |i|
+ if (i % 100) == 0
+ lpb.setProgress(i)
+ break if lpb.wasCancelled
+ end
+ cw, ch = width, height
+ c = Qt::Color.new(rand(255), rand(255), rand(255))
+ x = rand(cw - 8)
+ y = rand(cw - 8)
+ w = rand(cw - x)
+ h = rand(cw - y)
+ painter.fillRect(x, y, w, h, Qt::Brush.new(c))
+ }
+ lpb.cancel
+ painter.fillRect(0, 0, width, height, Qt::Brush.new(backgroundColor))
+ painter.end()
+ end
+ end
+end
+
+a = Qt::Application.new(ARGV)
+w = CPUWaster.new
+w.show
+a.setMainWidget(w)
+a.exec