]> mj.ucw.cz Git - anim.git/blobdiff - AA/UI.pm
Better player controls.
[anim.git] / AA / UI.pm
index f1d63b36f9c969b36d43a4cdccd38e5ebc6eb633..d74f544e93cd4b7f2f1b6881d4bcaf46ca03ae6c 100644 (file)
--- a/AA/UI.pm
+++ b/AA/UI.pm
@@ -35,6 +35,7 @@ my $u_scene;
 my $u_frame;
 my $u_direction;
 my @u_scenes = ();
+my @u_last_frame = ();
 
 my $window;
 my $cairo;
@@ -71,7 +72,6 @@ sub draw($) {
 
                $pixmap = Gtk2::Gdk::Pixmap->new($win, $pixw, $pixh, $d);
                $cairo = Gtk2::Gdk::Cairo::Context->create($pixmap);
-               $cairo->select_font_face('URW Palladio L', 'normal', 'normal');
                my $scale = $pixw/1024;
                $cairo->scale($scale, $scale);
        }
@@ -107,18 +107,22 @@ sub step() {
        # FIXME: the timer still runs
        if (@u_scenes) {
                if ($u_direction > 0) {
-                       if ($u_frame < @{$u_scenes[$u_scene]}-1) {
+                       if ($u_frame < $u_last_frame[$u_scene]) {
                                $u_frame++;
-                       } elsif ($movie && $u_scene < @u_scenes - 1) {
+                       } elsif ($u_scene < @u_scenes - 1) {
                                $u_scene++;
                                $u_frame = 0;
                        }
+                       if ($u_frame == $u_last_frame[$u_scene]) {
+                               $u_direction = 0 unless $movie;
+                       }
                } elsif ($u_direction < 0) {
                        if ($u_frame) {
                                $u_frame--;
-                       } elsif ($movie && $u_scene) {
+                       } elsif ($u_scene) {
                                $u_scene--;
-                               $u_frame = @{$u_scenes[$u_scene]} - 1;
+                               $u_frame = $u_last_frame[$u_scene];
+                               $u_direction = 0 unless $movie;
                        }
                }
                return if ($u_scene == $last_scene && $u_frame == $last_frame);
@@ -153,11 +157,18 @@ sub prepare() {
                        }
                } elsif ($k eq "space" || $k eq "Right" || $k eq "Page_Down") {
                        if (@u_scenes) {
-                               if ($u_direction > 0 && $u_scene+1 < @u_scenes) {
-                                       $u_scene++;
-                                       $u_frame = 0;
+                               if ($stopped || $k eq "Page_Down") {
+                                       if ($u_scene+1 < @u_scenes) {
+                                               $u_scene++;
+                                               $u_frame = $u_last_frame[$u_scene];
+                                       }
+                                       $u_direction = 0;
+                               } elsif ($u_direction > 0) {
+                                       $u_frame = $u_last_frame[$u_scene];
+                                       $u_direction = 0;
+                               } else {
+                                       $u_direction = 1;
                                }
-                               $u_direction = 1;
                                draw(0);
                        } else {
                                while (AA::Anim->step) { AA->calculate; }
@@ -169,37 +180,44 @@ sub prepare() {
                                }
                        }
                } elsif ($k eq "BackSpace" || $k eq "Left" || $k eq "Page_Up") {
-                       if (@u_scenes && $u_scene) {
-                               if (!$u_frame || $u_direction < 0) {
-                                       $u_scene--;
-                                       $u_frame = @{$u_scenes[$u_scene]}-1;
+                       if (@u_scenes) {
+                               if ($stopped || $k eq "Page_Up") {
+                                       if ($u_scene > 0) {
+                                               $u_scene--;
+                                               $u_frame = $u_last_frame[$u_scene];
+                                       }
+                                       $u_direction = 0;
+                               } elsif ($u_direction < 0) {
+                                       $u_frame = 0;
+                               } else {
+                                       $u_direction = -1;
                                }
-                               $u_direction = -1;
                                draw(0);
                        }
                } elsif ($k eq "Home" || $k eq "0") {
                        if (@u_scenes) {
                                $u_scene = 0;
                                $u_frame = 0;
-                               $u_direction = 1;
+                               $u_direction = 0;
                                draw(0);
                        }
                } elsif ($k eq "End" || $k eq "9") {
                        if (@u_scenes) {
                                $u_scene = $#u_scenes;
-                               $u_frame = @{$u_scenes[$u_scene]}-1;
-                               $u_direction = 1;
+                               $u_frame = $u_last_frame[$u_scene];
+                               $u_direction = 0;
                                draw(0);
                        }
                } elsif ($k eq "p") {
                        $stopped = !$stopped;
+                       $u_direction = 0 if $stopped;
                        print "Stopped is $stopped\n" if $debug;
                } elsif ($k eq "m") {
                        $movie = !$movie;
                        print "Movie mode is $movie\n" if $debug;
                } elsif ($k eq "Return") {
                        if (@u_scenes) {
-                               $u_frame = ($u_direction > 0) ? @{$u_scenes[$u_scene]}-1 : 0;
+                               $u_frame = ($u_direction > 0) ? $u_last_frame[$u_scene] : 0;
                        } else {
                                while (AA::Anim->step) { AA->calculate; }
                        }
@@ -230,6 +248,7 @@ sub RunScenario($$) {
                                push @$show, AA::Scene->new();
                        }
                        push @u_scenes, $show;
+                       push @u_last_frame, scalar @$show - 1;
                }
                print "Ready.\n";
        } else {