package user;
use List::Util;
use base KGS::Listener::User;
use Glib::Object::Subclass
Gtk2::Window;
use Gtk2::SimpleList;
sub new {
my ($self, %arg) = @_;
$self = $self->Glib::Object::new;
$self->{$_} = delete $arg{$_} for keys %arg;
$self->listen ($self->{conn});
$self->send (notify_add => name => $self->{name})
unless (lc $self->{name}) eq (lc $self->{app}{name});
gtk::state $self, "user::window", undef, window_size => [500, 500];
$self->event_name;
$self->signal_connect (destroy => sub { %{$_[0]} = () });
#$self->signal_connect (delete_event => sub { $self->destroy; 1 });
$self->signal_connect (delete_event => sub { 1 });
my $notebook = new Gtk2::Notebook;
$notebook->signal_connect (switch_page => sub {
my ($notebook, undef, $page) = @_;
$self->game_record if $page == 1;
$self->usergraph if $page == 2;
});
$self->add ($notebook);
$self->{chat} = new chat;
$self->{chat}->signal_connect(command => sub {
my ($chat, $cmd, $arg) = @_;
$self->{app}->do_command ($chat, $cmd, $arg, user => $self);
});
$self->{info_inlay} = $self->{chat}->new_switchable_inlay("Info:", sub { $self->draw_info(@_) }, 1);
$notebook->append_page ($self->{chat}, (new_with_mnemonic Gtk2::Label "_Chat"));
$self->{page_record} = new Gtk2::ScrolledWindow;
$self->{page_record}->set_policy ("automatic", "always");
$self->{page_record}->add ($self->{record_list} = Gtk2::SimpleList->new(
Time => "text",
White => "text",
Black => "text",
Size => "int",
H => "int",
Komi => "text",
Score => "text",
));
my $i = 0;
$_->set_sort_column_id ($i++) for $self->{record_list}->get_columns;
$notebook->append_page ($self->{page_record}, (new_with_mnemonic Gtk2::Label "_Record"));
$self->{page_graph} = new Gtk2::Curve;
$notebook->append_page ($self->{page_graph}, (new_with_mnemonic Gtk2::Label "_Graph"));
$self->userinfo;
$self;
}
sub draw_info {
my ($self, $inlay) = @_;
return unless defined $self->{userinfo};
$inlay->append_text (
""
. "\nRealname: " . (util::toxml $self->{userinfo}{realname})
. "\nEmail: " . (util::toxml $self->{userinfo}{email})
. "\nFlags: " . (util::toxml $self->{userinfo}{user}->flags_string)
. "\nRank: " . (util::toxml $self->{userinfo}{user}->rank_string)
. "\nRegistered: " . (util::toxml util::date_string($self->{userinfo}{regdate}))
. "\nLast Login: " . (util::toxml util::date_string($self->{userinfo}{lastlogin}))
. "\nComment:\n" . (util::toxml $self->{userinfo}{info})
. "\nPicture:"
. "\n"
);
if ($self->{userinfo}{user}->has_pic) {
$self->{app}->userpic ($self->{name}, sub {
$inlay->append_widget(gtk::image_from_data $_[0])
if $_[0];
});
}
}
sub join {
my ($self) = @_;
$self->show_all;
}
sub event_name {
my ($self) = @_;
$self->set_title ("KGS User $self->{name}");
}
sub event_userinfo {
my ($self) = @_;
$self->{info_inlay}->refresh;
}
sub event_game_record {
my ($self) = @_;
for (@{$self->{game_record}}) {
push @{$self->{record_list}->{data}},
[
util::date_string $_->{timestamp},
$_->{white}->as_string,
$_->{black}->as_string,
$_->size,
(sprintf "%.1d", $_->handicap),
$_->komi,
$_->score_string,
];
}
}
sub event_usergraph {
my ($self) = @_;
my $graph = $self->{usergraph};
my $curve = $self->{page_graph};
if (@$graph) {
$curve->set_range (0, (scalar @graph) - 1, (List::Util::min @$graph) - 1, (List::Util::max @$graph) + 1);
$curve->set_vector (@$graph);
}
}
sub event_msg {
my ($self, $name, $message) = @_;
$self->{chat}->append_text ("\n$name: " . util::toxml $message);
}
sub destroy {
my ($self) = @_;
$self->send (notify_del => name => $self->{name})
unless (lc $self->{name}) eq (lc $self->{app}{name});
$self->SUPER::destroy;
}
1;