]> mj.ucw.cz Git - anim.git/blob - a.pl
Added a skeleton of the animator module.
[anim.git] / a.pl
1 #!/usr/bin/perl -W
2
3 use strict;
4 use warnings;
5
6 use Gtk2 -init;
7 use Cairo;
8
9 use AA;
10 use AA::Graph;
11 use AA::Net;
12 use AA::Anim;
13
14 my $v = AA::NetV->new('v');
15 $v->Set('x', 100);
16 $v->Set('y0', 100);
17 $v->Set('label', '1');
18
19 my $w = AA::NetV->new('w');
20 $w->Bind('x', AA::Anim->ticker(200, 600, 200));
21 $w->Set('y0', 100);
22 $w->Set('label', '2');
23
24 my $e = AA::Edge->new('e', $v, $w);
25 $e->Set('arrow', 1);
26
27 $v->Set("h", 1);
28 $w->Set("h", 2);
29
30 AA->calculate;
31
32 ### G T K ###
33
34 my $area = Gtk2::DrawingArea->new();
35 my $cairo;
36
37 my $pixmap;
38 my ($lastw, $lasth, $lastd) = (-1, -1, -1);
39 my ($pixw, $pixh) = (-1, -1);
40 sub draw($) {
41         my ($force) = @_;
42         my $win = $area->window;
43         my $wgc = Gtk2::Gdk::GC->new($win);
44         my $alloc = $area->allocation;
45         my $w = $alloc->width;
46         my $h = $alloc->height;
47         my $d = $win->get_depth;
48         # print "Area $w x $h x $d, xx=$xx\n";
49
50         if (!defined($pixmap) || $lastw != $w || $lasth != $h || $lastd != $d) {
51                 ($lastw, $lasth, $lastd) = ($w, $h, $d);
52                 if ($w/$h >= 4/3) {
53                         $pixh = $h;
54                         $pixw = int($h/3*4);
55                 } else {
56                         $pixw = $w;
57                         $pixh = int($w/4*3);
58                 }
59                 print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n";
60
61                 $pixmap = Gtk2::Gdk::Pixmap->new($win, $pixw, $pixh, $d);
62                 $cairo = Gtk2::Gdk::Cairo::Context->create($pixmap);
63                 $cairo->select_font_face('URW Palladio L', 'normal', 'normal');
64                 my $scale = $pixw/1024;
65                 $cairo->scale($scale, $scale);
66         }
67
68         if ($force) {
69                 $wgc->set_rgb_background(0);
70                 $wgc->set_rgb_foreground(0);
71                 $win->draw_rectangle($wgc, 1, 0, 0, $w, $h);
72         }
73
74         $cairo->rectangle(0, 0, 1024, 768);
75         $cairo->set_source_rgb(0, 0, 0);
76         $cairo->fill;
77
78         AA->draw($cairo);
79
80         $win->draw_drawable($wgc, $pixmap, 0, 0, 0, 0, $pixw, $pixh);
81 }
82
83 sub step() {
84         AA::Anim->step;
85         draw(0);
86 }
87
88 my $window = Gtk2::Window->new ('toplevel');
89
90 my $timer;
91 my $stopped = 1;
92 my $fullscreen = 0;
93 $area->signal_connect("expose-event" => sub {
94         draw(1);
95         if (!defined $timer) {
96                 $timer = Glib::Timeout->add(30, sub { $stopped || step(); return 1; });
97         }
98 });
99 $area->set_flags('can-focus');
100 # $area->add_events('key-press-mask');
101 $area->signal_connect('key-press-event' => sub {
102         my ($w, $evt) = @_;
103         my $k = Gtk2::Gdk::keyval_name(0, $evt->keyval);
104         print "Pressed key $k\n";
105         if ($k eq "Escape") {
106                 Gtk2->main_quit;
107         } elsif ($k eq "space") {
108                 $stopped = !$stopped;
109         } elsif ($k eq "f") {
110                 if ($fullscreen = !$fullscreen) {
111                         $window->fullscreen;
112                 } else {
113                         $window->unfullscreen;
114                 }
115         }
116 });
117
118 $window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
119 $window->set_title("Brum");
120 $window->set_wmclass("brum", "Brum");
121 $window->set_default_size(640, 480);
122 $window->add ($area);
123 $window->show_all;
124
125 Gtk2->main;