]> mj.ucw.cz Git - anim.git/commitdiff
Added base of UI.
authorMartin Mares <mj@ucw.cz>
Sat, 27 Oct 2007 12:40:47 +0000 (14:40 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 27 Oct 2007 12:40:47 +0000 (14:40 +0200)
AA.pm
AA/Gfx.pm [new file with mode: 0644]
AA/Graph.pm
AA/UI.pm [new file with mode: 0644]
a.pl

diff --git a/AA.pm b/AA.pm
index 631958a8885cea69a92a3af2a9e83b8d249982d1..b2dc926bdc69b7cd05cca4531321c0b201314e76 100644 (file)
--- a/AA.pm
+++ b/AA.pm
@@ -6,7 +6,7 @@ our $PI = 3.1415926535;
 our $TWOPI = 2*$PI;
 
 our %known_objs = ( );
-our $debug = 1;
+our $debug = 0;
 our $record_dep_obj;
 our $record_dep_attr;
 our $record_deps;
diff --git a/AA/Gfx.pm b/AA/Gfx.pm
new file mode 100644 (file)
index 0000000..6a1eadc
--- /dev/null
+++ b/AA/Gfx.pm
@@ -0,0 +1,22 @@
+package AA::Background;
+
+@ISA = ('AA');
+
+sub new($$) {
+       my ($class, $id) = @_;
+       my $b = AA::new($class, $id);
+       $b->DefSet('d', 0);
+       $b->DefSet('color', [0, 0, 0]);
+       return $b;
+}
+
+sub Draw($$) {
+       my ($b, $cairo) = @_;
+       $cairo->select_font_face('URW Palladio L', 'normal', 'normal');         # default for all objs
+       $cairo->new_path;
+       $cairo->rectangle(0, 0, 1024, 768);
+       $cairo->set_source_rgb(@{$b->Get('color')});
+       $cairo->fill;
+}
+
+1;
index 46210622a13603999c8c109eec5f7884c55ab38b..dbd17f50b924bc81e3d8a0d9492577d414b2011a 100644 (file)
@@ -25,7 +25,8 @@ sub Draw($$) {
        my $grad = $v->Get('gradient');
        my @col = @{$v->Get('color')};
 
-       $cairo->arc($x, $y, $r, 0, $AA::TWOPI);
+       $cairo->new_path;
+
        if ($grad) {
                my $lg = Cairo::RadialGradient->create($x, $y, 0, $x, $y, $r);
                $lg->add_color_stop_rgb(0, @col);
@@ -37,9 +38,9 @@ sub Draw($$) {
        } else {
                $cairo->set_source_rgb(@col);
        }
-       $cairo->fill;
-
        $cairo->arc($x, $y, $r, 0, $AA::TWOPI);
+       $cairo->fill_preserve;
+
        $cairo->set_source_rgb(@{$v->Get('rim-color')});
        $cairo->set_line_width($v->Get('rim'));
        $cairo->stroke;
@@ -67,13 +68,15 @@ sub new($$$$) {
        $e->DefSet('arrow', 0);
        $e->DefSet('arrow-dist', 20);
        $e->DefSet('arrow-span', 6);
+       $e->DefSet('overshoot', 3);
        $e->DefBind('ends', sub {
+               my $over = $e->Get('overshoot');
                my $x1 = $v->Get('x');
                my $y1 = $v->Get('y');
-               my $r1 = $v->Get('r');
+               my $r1 = $v->Get('r') - $over;
                my $x2 = $w->Get('x');
                my $y2 = $w->Get('y');
-               my $r2 = $w->Get('r');
+               my $r2 = $w->Get('r') - $over;
                my $dx = $x2 - $x1;
                my $dy = $y2 - $y1;
                my $d = sqrt($dx*$dx + $dy*$dy);
diff --git a/AA/UI.pm b/AA/UI.pm
new file mode 100644 (file)
index 0000000..c20318e
--- /dev/null
+++ b/AA/UI.pm
@@ -0,0 +1,193 @@
+package AA::UI;
+
+sub new($$) {
+       my ($class, $name) = @_;
+       if ($name eq "") {
+               return AA::UI::GTK->new;
+       } elsif ($name =~ /\.pdf$/) {
+               return AA::UI::PDF->new($name);
+       } elsif ($name =~ /\.png$/) {
+               return AA::UI::PNG->new($name);
+       }
+}
+
+package AA::UI::GTK;
+
+@ISA = ('AA::UI');
+
+sub new($) {
+       my ($class) = @_;
+       my $ui = {
+       };
+       return bless($ui, $class);
+}
+
+my $u_scenario;
+my $u_scene;
+
+my $window;
+my $cairo;
+my $area;
+my $pixmap;
+my $timer;
+my $stopped = 1;
+my $fullscreen = 0;
+my ($lastw, $lasth, $lastd) = (-1, -1, -1);
+my ($pixw, $pixh) = (-1, -1);
+
+sub draw($) {
+       my ($force) = @_;
+       my $win = $area->window;
+       my $wgc = Gtk2::Gdk::GC->new($win);
+       my $alloc = $area->allocation;
+       my $w = $alloc->width;
+       my $h = $alloc->height;
+       my $d = $win->get_depth;
+       # print "Area $w x $h x $d, xx=$xx\n";
+
+       if (!defined($pixmap) || $lastw != $w || $lasth != $h || $lastd != $d) {
+               ($lastw, $lasth, $lastd) = ($w, $h, $d);
+               if ($w/$h >= 4/3) {
+                       $pixh = $h;
+                       $pixw = int($h/3*4);
+               } else {
+                       $pixw = $w;
+                       $pixh = int($w/4*3);
+               }
+               print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n";
+
+               $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);
+       }
+
+       if ($force) {
+               $wgc->set_rgb_background(0);
+               $wgc->set_rgb_foreground(0);
+               $win->draw_rectangle($wgc, 1, 0, 0, $w, $h);
+       }
+
+       $cairo->rectangle(0, 0, 1024, 768);
+       $cairo->set_source_rgb(0, 0, 0);
+       $cairo->fill;
+
+       AA->calculate;
+       AA->draw($cairo);
+
+       $win->draw_drawable($wgc, $pixmap, 0, 0, 0, 0, $pixw, $pixh);
+}
+
+sub step() {
+       AA::Anim->step;
+       draw(0);
+}
+
+sub prepare() {
+       $window = Gtk2::Window->new ('toplevel');
+       $area = Gtk2::DrawingArea->new();
+       $area->signal_connect("expose-event" => sub {
+               draw(1);
+               if (!defined $timer) {
+                       $timer = Glib::Timeout->add(30, sub { $stopped || step(); return 1; });
+               }
+       });
+       $area->set_flags('can-focus');
+       # $area->add_events('key-press-mask');
+       $area->signal_connect('key-press-event' => sub {
+               my ($w, $evt) = @_;
+               my $k = Gtk2::Gdk::keyval_name(0, $evt->keyval);
+               print "Pressed key $k\n";
+               if ($k eq "Escape") {
+                       Gtk2->main_quit;
+               } elsif ($k eq "space") {
+                       $stopped = !$stopped;
+               } elsif ($k eq "f") {
+                       if ($fullscreen = !$fullscreen) {
+                               $window->fullscreen;
+                       } else {
+                               $window->unfullscreen;
+                       }
+               } elsif ($k eq "Right") {
+                       if ($u_scene+1 < @$u_scenario) {
+                               $u_scene++;
+                               &{$u_scenario->[$u_scene]};
+                               draw(0);
+                       }
+               }
+       });
+
+       $window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
+       $window->set_title("Brum");
+       $window->set_wmclass("brum", "Brum");
+       $window->set_default_size(640, 480);
+       $window->add ($area);
+       $window->show_all;
+}
+
+sub RunScenario($$$) {
+       my ($ui, $scenario, $live) = @_;
+       $u_scenario = $scenario;
+       $u_scene = 0;
+       &{$scenario->[0]};
+       prepare();
+       Gtk2->main;
+}
+
+package AA::UI::PDF;
+
+@ISA = ('AA::UI');
+
+sub new($$) {
+       my ($class, $name) = @_;
+       my $ui = { };
+       $ui->{SURF} = Cairo::PdfSurface->create($name, 512, 384) or die "Unable to create PDF surface $name\n";
+       $ui->{CAIRO} = Cairo::Context->create($ui->{SURF});
+       $ui->{CAIRO}->scale(.5, .5);
+       return bless($ui, $class);
+}
+
+sub RunScenario($$$) {
+       my ($ui, $scenario) = @_;
+       my $page = 0;
+       foreach my $s (@$scenario) {
+               $page++;
+               print "### Page $page ###\n";
+               &$s();
+               AA->calculate;
+               AA->draw($ui->{CAIRO});
+               $ui->{CAIRO}->show_page;
+       }
+}
+
+package AA::UI::PNG;
+
+@ISA = ('AA::UI');
+
+sub new($$) {
+       my ($class, $name) = @_;
+       my $ui = { };
+       $ui->{NAME} = $name;
+       $ui->{SURF} = Cairo::ImageSurface->create('argb32', 1024, 768) or die "Unable to create image surface $name\n";
+       $ui->{CAIRO} = Cairo::Context->create($ui->{SURF});
+       return bless($ui, $class);
+}
+
+sub RunScenario($$$) {
+       my ($ui, $scenario) = @_;
+       my $cairo = $ui->{CAIRO};
+       my $page = 0;
+       foreach my $s (@$scenario) {
+               $page++;
+               print "### Page $page ###\n";
+               &$s();
+               AA->calculate;
+               AA->draw($cairo);
+               $cairo->show_page;
+               my $name = sprintf($ui->{NAME}, $page);
+               $ui->{SURF}->write_to_png($name) or die "Unable to write to $name\n";
+       }
+}
+
+1;
diff --git a/a.pl b/a.pl
index 59829c7f22767669ee606ec47f0bece6d89a910b..d8df74d3f041f8f1811de63848eea0d5a29006f9 100755 (executable)
--- a/a.pl
+++ b/a.pl
@@ -7,10 +7,16 @@ use Gtk2 -init;
 use Cairo;
 
 use AA;
+use AA::Gfx;
+use AA::UI;
 use AA::Graph;
 use AA::Net;
 use AA::Anim;
 
+my $ui = AA::UI->new('');
+
+my $back = AA::Background->new('bg');
+
 my $v = AA::NetV->new('v');
 $v->Set('x', 100);
 $v->Set('y0', 100);
@@ -24,102 +30,18 @@ $w->Set('label', '2');
 my $e = AA::Edge->new('e', $v, $w);
 $e->Set('arrow', 1);
 
-$v->Set("h", 1);
-$w->Set("h", 2);
-
-AA->calculate;
-
-### G T K ###
-
-my $area = Gtk2::DrawingArea->new();
-my $cairo;
-
-my $pixmap;
-my ($lastw, $lasth, $lastd) = (-1, -1, -1);
-my ($pixw, $pixh) = (-1, -1);
-sub draw($) {
-       my ($force) = @_;
-       my $win = $area->window;
-       my $wgc = Gtk2::Gdk::GC->new($win);
-       my $alloc = $area->allocation;
-       my $w = $alloc->width;
-       my $h = $alloc->height;
-       my $d = $win->get_depth;
-       # print "Area $w x $h x $d, xx=$xx\n";
-
-       if (!defined($pixmap) || $lastw != $w || $lasth != $h || $lastd != $d) {
-               ($lastw, $lasth, $lastd) = ($w, $h, $d);
-               if ($w/$h >= 4/3) {
-                       $pixh = $h;
-                       $pixw = int($h/3*4);
-               } else {
-                       $pixw = $w;
-                       $pixh = int($w/4*3);
-               }
-               print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n";
-
-               $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);
+my $scenario = [
+       sub {
+               $v->Set("h", 1);
+               $w->Set("h", 1);
+       },
+       sub {
+               $v->Set("h", 1);
+               $w->Set("h", 2);
        }
+];
 
-       if ($force) {
-               $wgc->set_rgb_background(0);
-               $wgc->set_rgb_foreground(0);
-               $win->draw_rectangle($wgc, 1, 0, 0, $w, $h);
-       }
-
-       $cairo->rectangle(0, 0, 1024, 768);
-       $cairo->set_source_rgb(0, 0, 0);
-       $cairo->fill;
-
-       AA->draw($cairo);
-
-       $win->draw_drawable($wgc, $pixmap, 0, 0, 0, 0, $pixw, $pixh);
-}
-
-sub step() {
-       AA::Anim->step;
-       draw(0);
-}
-
-my $window = Gtk2::Window->new ('toplevel');
-
-my $timer;
-my $stopped = 1;
-my $fullscreen = 0;
-$area->signal_connect("expose-event" => sub {
-       draw(1);
-       if (!defined $timer) {
-               $timer = Glib::Timeout->add(30, sub { $stopped || step(); return 1; });
-       }
-});
-$area->set_flags('can-focus');
-# $area->add_events('key-press-mask');
-$area->signal_connect('key-press-event' => sub {
-       my ($w, $evt) = @_;
-       my $k = Gtk2::Gdk::keyval_name(0, $evt->keyval);
-       print "Pressed key $k\n";
-       if ($k eq "Escape") {
-               Gtk2->main_quit;
-       } elsif ($k eq "space") {
-               $stopped = !$stopped;
-       } elsif ($k eq "f") {
-               if ($fullscreen = !$fullscreen) {
-                       $window->fullscreen;
-               } else {
-                       $window->unfullscreen;
-               }
-       }
-});
+$ui->RunScenario($scenario, 1);
 
-$window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
-$window->set_title("Brum");
-$window->set_wmclass("brum", "Brum");
-$window->set_default_size(640, 480);
-$window->add ($area);
-$window->show_all;
+exit 0;
 
-Gtk2->main;