--- deliantra/Deliantra-Client/bin/pclient 2006/04/08 22:25:37 1.37
+++ 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,8 +43,12 @@
our $ALT_ENTER_MESSAGE;
+our $TOPLEVEL;
+
our $tw; # Test widget #d#
+my $last_refresh;
+
sub init_screen {
$SDL_APP = new SDL::App
-flags => SDL_ANYFORMAT | SDL_HWSURFACE,
@@ -59,27 +63,47 @@
-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);
# Test code #d#
- my $frm = new Crossfire::Client::Widget::Frame;
- $tw = new Crossfire::Client::Widget::Window;
- $frm->add (new Crossfire::Client::Widget::Label 0, 0, 10, $UIFONT, "Foo in the garden!");
- $tw->add ($frm);
-
- $tw->move (0, $HEIGHT - 120);
- $tw->activate;
- # Test code end #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;
@@ -114,6 +138,8 @@
mapw => 50,
maph => 37,
;
+
+ Crossfire::Client::lowdelay fileno $CONN->{fh};
}
sub stop_game {
@@ -129,26 +155,51 @@
glMatrixMode GL_PROJECTION;
glLoadIdentity;
- glOrtho 0, $WIDTH, $HEIGHT, 0, -100 , 100;
+ 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;
@@ -195,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 {
@@ -319,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";
@@ -336,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