summaryrefslogtreecommitdiffstats
path: root/qtruby/rubylib/examples/qt-examples/aclock/aclock.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qtruby/rubylib/examples/qt-examples/aclock/aclock.rb')
-rw-r--r--qtruby/rubylib/examples/qt-examples/aclock/aclock.rb113
1 files changed, 113 insertions, 0 deletions
diff --git a/qtruby/rubylib/examples/qt-examples/aclock/aclock.rb b/qtruby/rubylib/examples/qt-examples/aclock/aclock.rb
new file mode 100644
index 00000000..a2cdc378
--- /dev/null
+++ b/qtruby/rubylib/examples/qt-examples/aclock/aclock.rb
@@ -0,0 +1,113 @@
+#!/usr/bin/env ruby -w
+
+require 'Qt'
+
+# an analog clock widget using an internal QTimer
+class AnalogClock < Qt::Widget
+ slots 'setTime(const QTime&)', 'drawClock(QPainter*)', 'timeout()'
+
+ def initialize(*k)
+ super(*k)
+
+ @time = Qt::Time::currentTime
+ @internalTimer = Qt::Timer.new(self)
+ connect(@internalTimer, SIGNAL('timeout()'), self, SLOT('timeout()'))
+ @internalTimer.start(5000)
+ end
+
+ def mousePressEvent(e)
+ if isTopLevel
+ topLeft = geometry.topLeft - frameGeometry.topLeft
+ @clickPos = e.pos + topLeft
+ end
+ end
+
+ def mouseMoveEvent(e)
+ if isTopLevel
+ move(e.globalPos - @clickPos) unless @clickPos.nil?
+ end
+ end
+
+ def setTime(t)
+ # erm. huh?
+ timeout()
+ end
+
+ # The QTimer::timeout() signal is received by this slot.
+ def timeout
+ new_time = Qt::Time::currentTime
+ @time = @time.addSecs 5
+ unless new_time.minute == @time.minute
+ if autoMask
+ updateMask
+ else
+ update
+ end
+ end
+ end
+
+ def paintEvent(blah)
+ unless autoMask
+ paint = Qt::Painter.new(self)
+ paint.setBrush(colorGroup.foreground)
+ drawClock(paint)
+ paint.end
+ end
+ end
+
+ # If clock is transparent, we use updateMask() instead of paintEvent()
+ def updateMask
+ bm = Qt::Bitmap.new(size)
+ bm.fill(color0) # transparent
+
+ paint = Qt::Painter.new
+ paint.begin(bm, self)
+ paint.setBrush(color1) # use non-transparent color
+ paint.setPen(color1)
+
+ drawClock(paint)
+
+ paint.end
+ setMask(bm)
+ end
+
+ # The clock is painted using a 1000x1000 square coordinate system, in
+ # the centered square, as big as possible. The painter's pen and
+ # brush colors are used.
+ def drawClock(paint)
+ paint.save
+
+ paint.setWindow(-500,-500, 1000,1000)
+
+ v = paint.viewport
+ d = [v.width, v.height].min
+ vpx = (v.left + (v.width-d)) / 2
+ vpy = (v.top - (v.height-d)) / 2
+ paint.setViewport(vpx, vpy, d, d)
+
+ paint.save
+ paint.rotate(30*(@time.hour%12-3) + @time.minute/2)
+ pts = Qt::PointArray.new(4, [-20,0, 0,-20, 300,0, 0,20])
+ paint.drawConvexPolygon(pts)
+ paint.restore
+
+ paint.save
+ paint.rotate((@time.minute-15)*6)
+ pts = Qt::PointArray.new(4, [-10,0, 0,-10, 400,0, 0,10])
+ paint.drawConvexPolygon(pts)
+ paint.restore;
+
+ 12.times {
+ paint.drawLine(440,0, 460,0)
+ paint.rotate(30)
+ }
+
+ paint.restore
+ end
+
+ def setAutoMask(background)
+ setBackgroundMode(background ? PaletteForeground : PaletteBackground)
+ Qt::Widget::setAutoMask(background)
+ end
+
+end