ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/user.pl
Revision: 1.20
Committed: Wed Jun 9 07:27:41 2004 UTC (19 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.19: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package user;
2
3 use List::Util;
4
5 use base KGS::Listener::User;
6
7 use Glib::Object::Subclass
8 Gtk2::Window;
9
10 use Gtk2::SimpleList;
11
12 sub new {
13 my ($self, %arg) = @_;
14 $self = $self->Glib::Object::new;
15 $self->{$_} = delete $arg{$_} for keys %arg;
16
17 $self->listen ($self->{conn});
18
19 $self->send (notify_add => name => $self->{name})
20 unless (lc $self->{name}) eq (lc $self->{app}{name});
21
22 gtk::state $self, "user::window", undef, window_size => [500, 500];
23
24 $self->event_name;
25
26 $self->signal_connect (destroy => sub { %{$_[0]} = () });
27 #$self->signal_connect (delete_event => sub { $self->destroy; 1 });
28 $self->signal_connect (delete_event => sub { $self->hide; 1 });
29
30 my $notebook = new Gtk2::Notebook;
31
32 $notebook->signal_connect (switch_page => sub {
33 my ($notebook, undef, $page) = @_;
34
35 $self->game_record if $page == 1;
36 $self->usergraph if $page == 2;
37 });
38
39 $self->add ($notebook);
40
41 $self->{chat} = new chat;
42 $self->{chat}->signal_connect(command => sub {
43 my ($chat, $cmd, $arg) = @_;
44 $self->{app}->do_command ($chat, $cmd, $arg, user => $self);
45 });
46
47 $self->{info_inlay} = $self->{chat}->new_switchable_inlay("Info:", sub { $self->draw_info(@_) }, 1);
48
49 $notebook->append_page ($self->{chat}, (new_with_mnemonic Gtk2::Label "_Chat"));
50
51 $self->{page_record} = new Gtk2::ScrolledWindow;
52 $self->{page_record}->set_policy ("automatic", "always");
53 $self->{page_record}->add ($self->{record_list} = Gtk2::SimpleList->new(
54 Time => "text",
55 White => "text",
56 Black => "text",
57 Size => "int",
58 H => "int",
59 Komi => "text",
60 Score => "text",
61 ));
62 my $i = 0;
63 $_->set_sort_column_id ($i++) for $self->{record_list}->get_columns;
64
65 $notebook->append_page ($self->{page_record}, (new_with_mnemonic Gtk2::Label "_Record"));
66
67 $self->{page_graph} = new Gtk2::Curve;
68 $notebook->append_page ($self->{page_graph}, (new_with_mnemonic Gtk2::Label "_Graph"));
69
70 $self->userinfo;
71
72 $self;
73 }
74
75 sub draw_info {
76 my ($self, $inlay) = @_;
77 return unless defined $self->{userinfo};
78 $inlay->append_text (
79 "<infoblock>"
80 . "\n<leader>Realname:</leader> " . (util::toxml $self->{userinfo}{realname})
81 . "\n<leader>Email:</leader> " . (util::toxml $self->{userinfo}{email})
82 . "\n<leader>Flags:</leader> " . (util::toxml $self->{userinfo}{user}->flags_string)
83 . "\n<leader>Rank:</leader> " . (util::toxml $self->{userinfo}{user}->rank_string)
84 . "\n<leader>Registered:</leader> " . (util::toxml util::date_string($self->{userinfo}{regdate}))
85 . "\n<leader>Last Login:</leader> " . (util::toxml util::date_string($self->{userinfo}{lastlogin}))
86 . "\n<leader>Comment:</leader>\n" . (util::toxml $self->{userinfo}{info})
87 . "\n<leader>Picture:</leader>"
88 . "</infoblock>\n"
89 );
90 if ($self->{userinfo}{user}->has_pic) {
91 $self->{app}->userpic ($self->{name}, sub {
92 $inlay->append_widget(gtk::image_from_data $_[0])
93 if $_[0];
94 });
95 }
96 }
97
98 sub join {
99 my ($self) = @_;
100
101 $self->show_all;
102 }
103
104 sub event_name {
105 my ($self) = @_;
106
107 $self->set_title ("KGS User $self->{name}");
108 }
109
110 sub event_userinfo {
111 my ($self) = @_;
112 $self->{info_inlay}->refresh;
113 }
114
115 sub event_game_record {
116 my ($self) = @_;
117
118 for (@{$self->{game_record}}) {
119 push @{$self->{record_list}->{data}},
120 [
121 util::date_string $_->{timestamp},
122 $_->{white}->as_string,
123 $_->{black}->as_string,
124 $_->size,
125 (sprintf "%.1d", $_->handicap),
126 $_->komi,
127 $_->score_string,
128 ];
129 }
130 }
131
132 sub event_usergraph {
133 my ($self) = @_;
134
135 my $graph = $self->{usergraph};
136
137 my $curve = $self->{page_graph};
138
139 if (@$graph) {
140 $curve->set_range (0, (scalar @graph) - 1, (List::Util::min @$graph) - 1, (List::Util::max @$graph) + 1);
141 $curve->set_vector (@$graph);
142 }
143 }
144
145 sub event_msg {
146 my ($self, $name, $message) = @_;
147
148 $self->{chat}->append_text ("\n<user>$name</user>: " . util::toxml $message);
149 }
150
151 sub destroy {
152 my ($self) = @_;
153
154 $self->send (notify_del => name => $self->{name})
155 unless (lc $self->{name}) eq (lc $self->{app}{name});
156
157 $self->SUPER::destroy;
158 }
159
160 1;
161