1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
package DigitalClock;
use strict;
use Qt;
use Qt::isa qw(Qt::LCDNumber);
use Qt::slots
stopDate => [],
showTime => [];
use Qt::attributes qw(
showingColon
normalTimer
showDateTimer
);
#
# Constructs a DigitalClock widget
#
sub NEW {
shift->SUPER::NEW(@_);
showingColon = 0;
setFrameStyle(&Panel | &Raised);
setLineWidth(2);
showTime();
normalTimer = startTimer(500);
showDateTimer = -1;
}
#
# Handles timer events and the digital clock widget.
# There are two different timers; one timer for updating the clock
# and another one for switching back from date mode to time mode
#
sub timerEvent {
my $e = shift;
if($e->timerId == showDateTimer) { # stop showing date
stopDate();
} elsif(showDateTimer == -1) { # normal timer
showTime();
}
}
#
# Enters date mode when the left mouse button is pressed
#
sub mousePressEvent {
my $e = shift;
showDate() if $e->button == &LeftButton;
}
#
# Shows the durrent date in the internal lcd widget.
# Fires a timer to stop showing the date.
#
sub showDate {
return if showDateTimer != -1; # already showing date
my $date = Qt::Date::currentDate();
my $s = sprintf("%2d %2d", $date->month, $date->day);
display($s); # sets the LCD number/text
showDateTimer = startTimer(2000); # keep this state for 2 secs
}
#
# Stops showing the date.
#
sub stopDate {
killTimer(showDateTimer);
showDateTimer = -1;
showTime();
}
#
# Shows the current time in the internal lcd widget.
#
sub showTime {
showingColon = !showingColon;
my $s = substr(Qt::Time::currentTime()->toString, 0, 5);
$s =~ s/^0/ /;
$s =~ s/:/ / unless showingColon;
display($s);
}
1;
|