ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/Util.pm
Revision: 1.9
Committed: Fri Apr 7 19:58:55 2006 UTC (18 years, 1 month ago) by elmex
Branch: MAIN
Changes since 1.8: +31 -5 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 elmex 1.9 package Crossfire::Client::Util;
2 elmex 1.7 use strict;
3     use base 'Exporter';
4 elmex 1.8 use Data::Dumper;
5 elmex 1.9 our @EXPORT = qw(find_rcfile read_cfg write_cfg);
6     use SDL;
7     use SDL::App;
8     use SDL::Event;
9     use SDL::Surface;
10 elmex 1.7
11 elmex 1.2 use Gtk2;
12 elmex 1.1
13 elmex 1.7 sub find_rcfile($) {
14     my $path;
15    
16     for (@INC) {
17 elmex 1.9 $path = "$_/Crossfire/resources/$_[0]";
18 elmex 1.7 return $path if -r $path;
19     }
20    
21     die "FATAL: can't find required file $_[0]\n";
22     }
23    
24 elmex 1.1 sub read_cfg {
25     my ($file) = @_;
26    
27     open CFG, $file
28     or return;
29    
30 elmex 1.8 my $CFG;
31    
32 root 1.3 local $/;
33 elmex 1.8 $CFG = eval <CFG>;
34    
35     $::CFG = $CFG;
36 elmex 1.1
37     close CFG;
38     }
39    
40     sub write_cfg {
41     my ($file) = @_;
42    
43     open CFG, ">$file"
44     or return;
45    
46     {
47     local $Data::Dumper::Purity = 1;
48     $::CFG->{VERSION} = $::VERSION;
49     print CFG Data::Dumper->Dump ([$::CFG], [qw/CFG/]);
50     }
51    
52     close CFG;
53     }
54    
55 elmex 1.2
56     sub gtk_add_cfg_field {
57     my ($tbl, $cfg, $klbl, $key, $value) = @_;
58     my $i = $cfg->{_i}++;
59     $tbl->attach_defaults (my $lbl = Gtk2::Label->new ($klbl), 0, 1, $i, $i + 1);
60     $tbl->attach_defaults (my $ent = Gtk2::Entry->new, 1, 2, $i, $i + 1);
61 elmex 1.7 if ($key eq 'password') {
62     $ent->set_invisible_char ("*");
63     $ent->set (visibility => 0)
64     }
65 elmex 1.2 $ent->set_text ($value);
66     $ent->signal_connect (changed => sub {
67     my ($ent) = @_;
68     $cfg->{$key} = $ent->get_text;
69     });
70     }
71    
72     sub run_config_dialog {
73 elmex 1.4 my (%events) = @_;
74 elmex 1.2
75     my $w = Gtk2::Window->new;
76    
77     my @cfg = (
78 elmex 1.4 [qw/Host host/],
79     [qw/Port port/],
80 elmex 1.5 [qw/Username user/],
81 elmex 1.4 [qw/Password password/],
82 elmex 1.2 );
83    
84     my $cfg = {};
85    
86 elmex 1.9 my $a = SDL::ListModes (0, SDL_FULLSCREEN|SDL_HWSURFACE);
87     my @modes = map { [SDL::RectW ($_), SDL::RectH ($_)] } @$a;
88    
89 elmex 1.2 $w->add (my $vb = Gtk2::VBox->new);
90     $vb->pack_start (my $t = Gtk2::Table->new (2, scalar @cfg), 0, 0, 0);
91 elmex 1.9 my $selmode = $::CFG->{width} . 'x' . $::CFG->{height};
92     $t->attach_defaults (Gtk2::Label->new ("Modes"), 0, 1, 0, 1);
93     $t->attach_defaults (my $cb = Gtk2::ComboBox->new_text, 1, 2, 0, 1);
94     my $i = 0;
95     my $act = 0;
96     for (map { "$_->[0]x$_->[1]" } reverse @modes) {
97     if ($_ eq $selmode) { $act = $i }
98     $cb->append_text ($_);
99     $i++;
100     }
101     $cb->set_active ($act);
102     $cb->signal_connect (changed => sub {
103     my ($cb) = @_;
104     my $txt = $cb->get_active_text;
105     if ($txt =~ m/(\d+)x(\d+)/) {
106     $::CFG->{width} = $1;
107     $::CFG->{height} = $2;
108     }
109     });
110    
111     $cfg->{_i} = 1;
112 elmex 1.2 for (@cfg) {
113     gtk_add_cfg_field ($t, $cfg, $_->[0], $_->[1], $::CFG->{$_->[1]});
114     }
115    
116     $vb->pack_start (my $hb = Gtk2::HBox->new, 0, 0, 0);
117     $hb->pack_start (my $cb = Gtk2::Button->new ("save"), 1, 1, 5);
118     $cb->signal_connect (clicked => sub {
119     for (keys %$cfg) {
120     $::CFG->{$_} = $cfg->{$_}
121     if $_ ne '_i';
122     }
123 elmex 1.8 write_cfg "$Crossfire::VARDIR/pclientrc";
124 elmex 1.4 });
125     $hb->pack_start (my $cb = Gtk2::Button->new ("login"), 1, 1, 5);
126     $cb->signal_connect (clicked => sub {
127     for (keys %$cfg) {
128     $::CFG->{$_} = $cfg->{$_}
129     if $_ ne '_i';
130     }
131     my $cb = $events{login} || sub {};
132     $cb->($::CFG->{user}, $::CFG->{password});
133     });
134     $hb->pack_start (my $cb = Gtk2::Button->new ("logout"), 1, 1, 5);
135     $cb->signal_connect (clicked => sub {
136     my $cb = $events{login} || sub {};
137     $cb->();
138 elmex 1.2 });
139 elmex 1.5 $hb->pack_start (my $cb = Gtk2::Button->new ("quit"), 1, 1, 5);
140     $cb->signal_connect (clicked => sub { $w->destroy });
141 elmex 1.2
142     $w->show_all;
143    
144     $w->signal_connect (destroy => sub { Gtk2->main_quit });
145     }
146    
147 elmex 1.1 1;