From: Martin Mares Date: Sat, 27 Oct 2007 12:40:47 +0000 (+0200) Subject: Added base of UI. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=aeda2bb680749488d2985d3091851db9c2f155dd;p=anim.git Added base of UI. --- diff --git a/AA.pm b/AA.pm index 631958a..b2dc926 100644 --- 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 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; diff --git a/AA/Graph.pm b/AA/Graph.pm index 4621062..dbd17f5 100644 --- a/AA/Graph.pm +++ b/AA/Graph.pm @@ -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 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 59829c7..d8df74d 100755 --- 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;