]> www.fi.muni.cz Git - slotcarman.git/blobdiff - SCX/GUI.pm
Race state images; misc fixes.
[slotcarman.git] / SCX / GUI.pm
index 3d500f695f311902be9363ed6e21f498068b1296..da3f9f45eb6a9256625fe9dc37ae2191d0bce495 100755 (executable)
@@ -113,9 +113,10 @@ sub load_all_images {
        $self->{fuel_images} = [
                        load_image_set('img/fuel%d.svg', 8, int(0.6 * $h))
        ];
-       $self->{car_images} = load_image_dir('img/SCXCars', $h),
-       $self->{semaphore_images} => [
-                       load_image_set('img/semaphore%d.svg', 5, 2 * $h)
+       $self->{car_images} = load_images_glob('img/SCXCars/*', $h);
+       $self->{state_images} = load_images_glob('img/state*.svg', $h);
+       $self->{semaphore_images} = [
+                       load_image_set('img/semaphore%d.svg', 5, 1.5 * $h)
        ];
 };
 
@@ -135,11 +136,11 @@ sub load_image_set {
        return @rv;
 }
 
-sub load_image_dir {
-       my ($dir, $height) = @_;
+sub load_images_glob {
+       my ($glob, $height) = @_;
 
        my %rv;
-       for my $file (<$dir/*>) {
+       for my $file (glob($glob)) {
                $file = Encode::decode('utf-8', $file);
                my $name = $file;
                $name =~ s/.*\///;
@@ -175,6 +176,8 @@ sub set_label {
 sub set_image {
        my ($self, $prefix, $row, $imgset, $value) = @_;
 
+       return if !defined $value;
+
        ++$row if defined $row && $row =~ /\A\d+\z/xms;
 
        my $name = defined $row ? $prefix.$row : $prefix;
@@ -212,25 +215,43 @@ sub set_car_icon {
 sub set_lap {
        my ($self, $row, $text) = @_;
 
+       $text = '--' if !defined $text;
+
        $self->set_label('label_lap', $row, $text, 'lap');
 }
 
+sub set_distance {
+       my ($self, $row, $time, $lap_diff, $time_diff) = @_;
+
+       my $text = '--';
+
+       if (defined $time) {
+               $text = format_race_time($time);
+       } elsif (defined $time_diff) {
+               $text = '−' . format_lap_time($time_diff);
+       } elsif (defined $lap_diff) {
+               $text = '−' . $lap_diff . ' laps';
+       }
+
+       $self->set_label('label_distance', $row, $text);
+}
+
 sub set_laptime {
        my ($self, $row, $text) = @_;
 
-       $self->set_label('label_laptime', $row, $text);
+       $self->set_label('label_laptime', $row, format_lap_time($text));
 }
 
 sub set_avg_lap {
        my ($self, $row, $text) = @_;
 
-       $self->set_label('label_avg_lap', $row, $text);
+       $self->set_label('label_avg_lap', $row, format_lap_time($text));
 }
 
 sub set_best_lap {
        my ($self, $row, $text) = @_;
 
-       $self->set_label('label_best_lap', $row, $text);
+       $self->set_label('label_best_lap', $row, format_lap_time($text));
 }
 
 sub set_name {
@@ -239,14 +260,10 @@ sub set_name {
        $self->set_label('label_name', $row, $text);
 }
 
-sub enter_pit_lane {
-       my ($self, $row) = @_;
-       $self->set_laptime($row, 'PIT');
-}
+sub set_car_id {
+       my ($self, $row, $text) = @_;
 
-sub leave_pit_lane {
-       my ($self, $row) = @_;
-       $self->set_laptime($row, 'GO!');
+       $self->set_label('label_car_id', $row, $text);
 }
 
 sub show_semaphore {
@@ -272,17 +289,47 @@ sub rounds {
 sub time {
        my ($self, $text) = @_;
 
-       $self->set_label('label_time_global', undef, $text);
+       $self->set_label('label_time_global', undef, format_race_time($text));
 }
 
 sub best_lap {
        my ($self, $time, $who) = @_;
 
-       my $text = $time;
+       my $text = format_lap_time($time);
        $text .= ' by ' . $who
                if defined $who;
        $self->set_label('label_best_lap_global', undef, $text);
 }
 
+sub format_race_time {
+       my ($seconds) = @_;
+
+       return '--' if !defined $seconds;
+
+       my $hours = int($seconds / 3600);
+       $seconds -= 3600 * $hours;
+
+       my $mins = int($seconds / 60);
+       $seconds -= 60 * $mins;
+
+       return $hours
+               ? sprintf('%d:%02d:%04.1f', $hours, $mins, $seconds)
+               : sprintf('%d:%04.1f', $mins, $seconds);
+}
+
+sub format_lap_time {
+       my ($seconds) = @_;
+
+       return defined $seconds
+               ? sprintf('%.2f', $seconds)
+               : '--';
+}
+
+sub set_state {
+       my ($self, $num, $name) = @_;
+
+       $self->set_image('image_status', $num, 'state', 'state '.$name);
+}
+
 1;