--- deliantra/Deliantra-Client/bin/pclient 2006/04/08 17:21:01 1.32 +++ deliantra/Deliantra-Client/bin/pclient 2006/04/09 17:39:56 1.46 @@ -32,7 +32,7 @@ our $HEIGHT; our $FULLSCREEN; -our $UIFONT; +our $FONTSIZE; our $SDL_TIMER; our $SDL_APP; @@ -43,7 +43,11 @@ our $ALT_ENTER_MESSAGE; -our $tw; +our $TOPLEVEL; + +our $tw; # Test widget #d# + +my $last_refresh; sub init_screen { $SDL_APP = new SDL::App @@ -59,38 +63,56 @@ -fullscreen => $FULLSCREEN, -resizeable => 0; + $last_refresh = SDL::GetTicks; + %GL_EXT = map +($_ => 1), split /\s+/, Crossfire::Client::gl_extensions; $GL_EXT{GL_ARB_texture_non_power_of_two} or warn "WARNING: non-power-of-two opengl extension required"; - $UIFONT = SDL::TTFOpenFont Crossfire::Client::find_rcfile "uifont.ttf", $HEIGHT / 40 - or die "TTFOpenFont: $!"; + $FONTSIZE = int $HEIGHT / 50; - $ALT_ENTER_MESSAGE = new Crossfire::Client::Widget::Label 0, $HEIGHT - $HEIGHT / 40, 10, $UIFONT, "Alt-Enter toggles fullscreen mode"; + $ALT_ENTER_MESSAGE = new Crossfire::Client::Widget::Label + 0, $FONTSIZE, $HEIGHT - $FONTSIZE, $FONTSIZE, + "Use Alt-Enter to toggle fullscreen mode"; $ALT_ENTER_MESSAGE->move (0, $HEIGHT - ($ALT_ENTER_MESSAGE->size_request)[1]); - $ALT_ENTER_MESSAGE->activate; + $TOPLEVEL->add ($ALT_ENTER_MESSAGE); - $tw = new Crossfire::Client::Widget::Window; - $tw->add (my $lbl = new Crossfire::Client::Widget::Label 0, $HEIGHT - $HEIGHT / 40, 10, $UIFONT, "Foo in the garden!"); -# $tw = new Crossfire::Client::Widget::Label 0, $HEIGHT - $HEIGHT / 40, 10, $UIFONT, "Foo in the garden!"; - - $tw->move (0, $HEIGHT - 50); - $tw->activate; + # Test code #d# + unless ($tw) { # haha... + $tw = new Crossfire::Client::Widget::Animator; + my $lbl1 = new Crossfire::Client::Widget::Label + 0, 0, 10, $FONTSIZE, "This is a\nTEST!\nOf a themed\nFrame!"; + my $lbl2 = new Crossfire::Client::Widget::Label + 0, 0, 10, $FONTSIZE, "LBL2"; + + my $vb = new Crossfire::Client::Widget::VBox; + my $f = new Crossfire::Client::Widget::FancyFrame; + my $f2 = new Crossfire::Client::Widget::FancyFrame; + $f->add ($lbl1); + $f2->add ($lbl2); + $vb->add ($f); + $vb->add ($f2, 1); + + $tw->add ($vb); + $tw->w (400); + $tw->h (300); + $tw->move ($WIDTH - 200, 0); + $tw->moveto (0, 0); + $TOPLEVEL->add ($tw); + +# $f->move ($WIDTH - 200, 0); +# $TOPLEVEL->add ($f); + } glClearColor 0, 0, 0, 0; glEnable GL_TEXTURE_2D; + glEnable GL_COLOR_MATERIAL; glShadeModel GL_FLAT; glDisable GL_DEPTH_TEST; glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; - glMatrixMode GL_PROJECTION; - glLoadIdentity; - glOrtho 0, $WIDTH, $HEIGHT, 0, -100 , 100; - - glMatrixMode GL_MODELVIEW; - $_->() for @GL_INIT; } @@ -112,7 +134,12 @@ host => $CFG->{host}, port => $CFG->{port}, user => $CFG->{user}, - pass => $CFG->{password}; + pass => $CFG->{password}, + mapw => 50, + maph => 37, + ; + + Crossfire::Client::lowdelay fileno $CONN->{fh}; } sub stop_game { @@ -125,23 +152,54 @@ sub force_refresh { glViewport 0, 0, $WIDTH, $HEIGHT; + + glMatrixMode GL_PROJECTION; + glLoadIdentity; + glOrtho 0, $WIDTH, $HEIGHT, 0, -6000 , 6000; + glMatrixMode GL_MODELVIEW; + glClear GL_COLOR_BUFFER_BIT; - $_->draw for @Crossfire::Client::Widget::ACTIVE_WIDGETS; + $TOPLEVEL->draw; SDL::GLSwapBuffers; } +my %ANIMATE; + my $refresh_handler; sub refresh { $refresh_handler ||= add Glib::Idle sub { + my $next_refresh = SDL::GetTicks; + my $interval = ($next_refresh - $last_refresh) * 0.001; + $last_refresh = $next_refresh; + force_refresh; - undef $refresh_handler; - 0 + $_->animate ($interval) for grep $_, values %ANIMATE; + + if (%ANIMATE) { + 1 + } else { + undef $refresh_handler; + 0 + } }; } +sub animation_start { + my ($widget) = @_; + $ANIMATE{$widget} = $widget; + Scalar::Util::weaken $ANIMATE{$widget}; + + refresh; +} + +sub animation_stop { + my ($widget) = @_; + delete $ANIMATE{$widget}; +} + %SDL_CB = ( SDL_QUIT() => sub { main_quit Gtk2; @@ -188,13 +246,13 @@ sub conn::map_scroll { my ($self, $dx, $dy) = @_; - refresh; +# refresh; } sub conn::map_clear { my ($self) = @_; - refresh; +# refresh; } sub conn::face_find { @@ -211,6 +269,12 @@ $face->{texture} = new_from_image Crossfire::Client::Texture delete $face->{image}; } +sub conn::query { + my ($self, $flags, $prompt) = @_; + + warn "<<<>>\n";#d# +} + sub gtk_add_cfg_field { my ($tbl, $cfg, $klbl, $key, $value) = @_; my $i = $cfg->{_i}++; @@ -306,11 +370,12 @@ ############################################################################# SDL::Init SDL_INIT_EVERYTHING; -SDL::TTFInit; + +$TOPLEVEL = Crossfire::Client::Widget::Toplevel->new; my $mapwidget = Crossfire::Client::Widget::MapWidget->new; -$mapwidget->activate; +$TOPLEVEL->add ($mapwidget); $mapwidget->focus_in; Crossfire::Client::read_cfg "$Crossfire::VARDIR/pclientrc"; @@ -323,6 +388,8 @@ port => 13327, }; +Crossfire::Client::set_font Crossfire::Client::find_rcfile "uifont.ttf"; + $FACECACHE = eval { Crossfire::load_ref "$Crossfire::VARDIR/pclient.faces" } || {}; run_config_dialog