--- deliantra/Deliantra-Client/DC/UI/MessageWindow.pm 2007/07/23 18:13:33 1.3 +++ deliantra/Deliantra-Client/DC/UI/MessageWindow.pm 2007/07/24 18:39:39 1.4 @@ -3,10 +3,17 @@ use strict; use utf8; +use Scalar::Util qw/weaken/; use CFPlus::UI::ChatView; our @ISA = CFPlus::UI::Toplevel::; +our %channel_info; + +sub add_channel_info { + my ($info) = @_; +} + sub new { my $class = shift; @@ -22,42 +29,113 @@ has_close_button => 1 ); - my $chatview = $self->{main_log} = CFPlus::UI::ChatView->new (expand => 1); - $nb->add_tab ("Log" => $chatview, "This is the main log of the server."); - $self->{nb} = $nb; - #d# $self->add_chat (foo => 'bar'); + $nb->add_tab ( + "Log", + $self->{main_log} = CFPlus::UI::ChatView->new (expand => 1, say_command => ''), + "This is the main log of the server." + ); + + $self->{nb} = $nb; + $self->{chatviews} = {}; $self } sub add_chat { - my ($self, $title, $cmdprefix) = @_; + my ($self, $id) = @_; + + my $chatviews = $self->{chatviews}; + my $chaninfo = $self->{channel_info}->{$id}; + my $nb = $self->{nb}; + + my $cv = $chatviews->{$id} = CFPlus::UI::ChatView->new (expand => 1, say_command => $chaninfo->{reply}); + my $bb = CFPlus::UI::ButtonBin->new; + $cv->{c_tab} = $bb; + + $bb->add (my $vb = CFPlus::UI::Box->new); + $bb->connect (activate => sub { $self->unhighlight_channel ($id); 0 }); + $vb->add ( + my $b = CFPlus::UI::Label->new ( + expand => 1, markup => $chaninfo->{title}, valign => 0, align => 0 + ) + ); + + $cv->{_tab_button} = $b; + weaken $cv->{_tab_button}; - my $nb = $self->{nb}; + $vb->add ( + my $b = CFPlus::UI::ImageButton->new ( + path => 'x1_close.png', + scale => 0.3 + ) + ); + $b->connect (activate => sub { + my $b = shift; - # only proof-of-concept code: - my $fo = CFPlus::UI::Button->new (markup => "test"); - my $vb = $fo->{c_tab} = CFPlus::UI::HBox->new; - $vb->add (my $b = CFPlus::UI::Button->new (expand => 1, markup => "FICKEN!!!!")); - $b->connect (activate => sub { $vb->emit ('activate'); 1 }); - $fo->connect (activate => sub { - my $fo = shift; my @chld = $nb->pages; my $cur = pop @chld; - while (@chld && $cur != $fo) { + while (@chld && $cur != $cv) { $cur = pop @chld; } $cur = pop @chld; - $nb->remove ($fo); + $nb->remove ($cv); $nb->set_current_page ($cur); + + delete $chatviews->{$id}; 0 }); - $nb->add ($fo); + + $nb->add ($cv); + $nb->set_current_page ($cv); +} + +sub touch_channel { + my ($self, $id) = @_; + if (my $cv = $self->{chatviews}->{$id}) { + if ($cv != $self->{nb}->get_current_page) { + $self->highlight_channel ($id); + } + } else { + $self->add_chat ($id); + } +} + +sub highlight_channel { + my ($self, $id) = @_; + my $cv = $self->{chatviews}->{$id}; + my $tab = $cv->{_tab_button}; + $tab->set_markup ("" . $self->{channel_info}->{$id}->{title} . ""); +} + +sub unhighlight_channel { + my ($self, $id) = @_; + my $cv = $self->{chatviews}->{$id}; + my $tab = $cv->{_tab_button}; + $tab->set_markup ($self->{channel_info}->{$id}->{title}); +} + +sub add_channel { + my ($self, $info) = @_; + $self->{channel_info}->{$info->{id}} = $info; + $self->touch_channel ($info->{id}); +} + +sub clear_channels { + my ($self) = @_; + # remove channel tabs here + $self->{channel_info} = {}; } sub message { my ($self, $para) = @_; - $self->{main_log}->message ($para); + my $id = $para->{type}; + + if ($self->{channel_info}->{$id}) { + $self->touch_channel ($id); + $self->{chatviews}->{$id}->message ($para); + } else { + $self->{main_log}->message ($para); + } } sub activate_console {