diff options
Diffstat (limited to 'qtruby/rubylib/examples/qt-examples/aclock/aclock.rb')
-rw-r--r-- | qtruby/rubylib/examples/qt-examples/aclock/aclock.rb | 113 |
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 |