summaryrefslogtreecommitdiffstats
path: root/PerlTQt/examples/aclock/AnalogClock.pm
diff options
context:
space:
mode:
Diffstat (limited to 'PerlTQt/examples/aclock/AnalogClock.pm')
-rw-r--r--PerlTQt/examples/aclock/AnalogClock.pm137
1 files changed, 137 insertions, 0 deletions
diff --git a/PerlTQt/examples/aclock/AnalogClock.pm b/PerlTQt/examples/aclock/AnalogClock.pm
new file mode 100644
index 0000000..0a52c44
--- /dev/null
+++ b/PerlTQt/examples/aclock/AnalogClock.pm
@@ -0,0 +1,137 @@
+package AnalogClock;
+use TQt;
+use TQt::isa qw(TQt::Widget);
+use TQt::slots
+ setTime => ['const TQTime&'],
+ drawClock => ['TQPainter*'],
+ timeout => [];
+use TQt::attributes qw(
+ clickPos
+ _time
+);
+
+#
+# Constructs an analog clock widget that uses an internal TQTimer
+#
+
+sub NEW {
+ shift->SUPER::NEW(@_);
+ _time = TQt::Time::currentTime(); # get current time
+ my $internalTimer = TQt::Timer(this); # create internal timer
+ this->connect($internalTimer, TQT_SIGNAL('timeout()'), TQT_SLOT('timeout()'));
+ $internalTimer->start(5000); # emit signal every 5 seconds
+}
+
+sub mousePressEvent {
+ my $e = shift;
+ if(isTopLevel()) {
+ # Lack of operators is really noticable here
+ my $topLeft = TQt::Point(
+ geometry()->topLeft->x - frameGeometry()->topLeft->x,
+ geometry()->topLeft->y - frameGeometry()->topLeft->y
+ );
+ clickPos = TQt::Point($e->pos->x + $topLeft->x,
+ $e->pos->y + $topLeft->y);
+ }
+}
+
+sub mouseMoveEvent {
+ my $e = shift;
+ if(isTopLevel()) {
+ move(TQt::Point($e->globalPos->x - clickPos->x,
+ $e->globalPos->y - clickPos->y));
+ }
+}
+
+sub setTime {
+ my $t = shift;
+ timeout();
+}
+
+#
+# The TQTimer::timeout() signal is received by this slot.
+#
+
+sub timeout {
+ my $new_time = TQt::Time::currentTime(); # get the current time
+ _time = _time->addSecs(5);
+ if($new_time->minute != _time->minute) { # minute has changed
+ if(autoMask()) {
+ updateMask();
+ } else {
+ update();
+ }
+ }
+}
+
+sub paintEvent {
+ return if autoMask();
+ my $paint = TQt::Painter(this);
+ $paint->setBrush(colorGroup()->foreground);
+ drawClock($paint);
+}
+
+# If clock is transparent, we use updateMask()
+# instead of paintEvent()
+
+sub updateMask { # paint clock mask
+ my $bm = TQt::Bitmap(size());
+ $bm->fill(&color0); # transparent
+
+ my $paint = TQt::Painter;
+ $paint->begin($bm, this);
+ $paint->setBrush(&color1); # use non-transparent color
+ $paint->setPen(&color1);
+
+ drawClock($paint);
+
+ $paint->end;
+ setMask($bm);
+}
+
+#
+# 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.
+#
+sub drawClock {
+ my $paint = shift;
+ $paint->save;
+
+ $paint->setWindow(-500,-500, 1000,1000);
+
+ my $v = $paint->viewport;
+ my $d = min($v->width, $v->height);
+ $paint->setViewport($v->left + ($v->width-$d)/2,
+ $v->top - ($v->height-$d)/2, $d, $d);
+
+ # _time = TQt::Time::currentTime();
+ my $pts = TQt::PointArray();
+
+ $paint->save;
+ $paint->rotate(30*(_time->hour%12-3) + _time->minute/2);
+ $pts->setPoints([-20,0, 0,-20, 300,0, 0,20]);
+ $paint->drawConvexPolygon($pts);
+ $paint->restore;
+
+ $paint->save;
+ $paint->rotate((_time->minute-15)*6);
+ $pts->setPoints([-10,0, 0,-10, 400,0, 0,10]);
+ $paint->drawConvexPolygon($pts);
+ $paint->restore;
+
+ for(1 .. 12) {
+ $paint->drawLine(440,0, 460,0);
+ $paint->rotate(30);
+ }
+
+ $paint->restore;
+}
+
+sub setAutoMask {
+ my $b = shift;
+ setBackgroundMode($b ? &PaletteForeground : &PaletteBackground);
+ TQt::Widget::setAutoMask($b);
+}
+
+1;