ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/UI/MessageWindow.pm
(Generate patch)

Comparing deliantra/Deliantra-Client/DC/UI/MessageWindow.pm (file contents):
Revision 1.3 by elmex, Mon Jul 23 18:13:33 2007 UTC vs.
Revision 1.4 by elmex, Tue Jul 24 18:39:39 2007 UTC

1package CFPlus::UI::MessageWindow; 1package CFPlus::UI::MessageWindow;
2 2
3use strict; 3use strict;
4use utf8; 4use utf8;
5 5
6use Scalar::Util qw/weaken/;
6use CFPlus::UI::ChatView; 7use CFPlus::UI::ChatView;
7 8
8our @ISA = CFPlus::UI::Toplevel::; 9our @ISA = CFPlus::UI::Toplevel::;
10
11our %channel_info;
12
13sub add_channel_info {
14 my ($info) = @_;
15}
9 16
10sub new { 17sub new {
11 my $class = shift; 18 my $class = shift;
12 19
13 my $self = $class->SUPER::new ( 20 my $self = $class->SUPER::new (
20 force_h => $::HEIGHT * 0.5, 27 force_h => $::HEIGHT * 0.5,
21 child => (my $nb = CFPlus::UI::Notebook->new (expand => 1)), 28 child => (my $nb = CFPlus::UI::Notebook->new (expand => 1)),
22 has_close_button => 1 29 has_close_button => 1
23 ); 30 );
24 31
32 $nb->add_tab (
33 "Log",
25 my $chatview = $self->{main_log} = CFPlus::UI::ChatView->new (expand => 1); 34 $self->{main_log} = CFPlus::UI::ChatView->new (expand => 1, say_command => ''),
26 $nb->add_tab ("Log" => $chatview, "This is the main log of the server."); 35 "This is the main log of the server."
36 );
37
27 $self->{nb} = $nb; 38 $self->{nb} = $nb;
28 #d# $self->add_chat (foo => 'bar'); 39 $self->{chatviews} = {};
29 40
30 $self 41 $self
31} 42}
32 43
33sub add_chat { 44sub add_chat {
34 my ($self, $title, $cmdprefix) = @_; 45 my ($self, $id) = @_;
35 46
47 my $chatviews = $self->{chatviews};
48 my $chaninfo = $self->{channel_info}->{$id};
36 my $nb = $self->{nb}; 49 my $nb = $self->{nb};
37 50
38 # only proof-of-concept code: 51 my $cv = $chatviews->{$id} = CFPlus::UI::ChatView->new (expand => 1, say_command => $chaninfo->{reply});
39 my $fo = CFPlus::UI::Button->new (markup => "test"); 52 my $bb = CFPlus::UI::ButtonBin->new;
40 my $vb = $fo->{c_tab} = CFPlus::UI::HBox->new; 53 $cv->{c_tab} = $bb;
41 $vb->add (my $b = CFPlus::UI::Button->new (expand => 1, markup => "FICKEN!!!!")); 54
42 $b->connect (activate => sub { $vb->emit ('activate'); 1 }); 55 $bb->add (my $vb = CFPlus::UI::Box->new);
56 $bb->connect (activate => sub { $self->unhighlight_channel ($id); 0 });
57 $vb->add (
58 my $b = CFPlus::UI::Label->new (
59 expand => 1, markup => $chaninfo->{title}, valign => 0, align => 0
60 )
61 );
62
63 $cv->{_tab_button} = $b;
64 weaken $cv->{_tab_button};
65
66 $vb->add (
67 my $b = CFPlus::UI::ImageButton->new (
68 path => 'x1_close.png',
69 scale => 0.3
70 )
71 );
43 $fo->connect (activate => sub { 72 $b->connect (activate => sub {
44 my $fo = shift; 73 my $b = shift;
74
45 my @chld = $nb->pages; 75 my @chld = $nb->pages;
46 my $cur = pop @chld; 76 my $cur = pop @chld;
47 while (@chld && $cur != $fo) { 77 while (@chld && $cur != $cv) {
48 $cur = pop @chld; 78 $cur = pop @chld;
49 } 79 }
50 $cur = pop @chld; 80 $cur = pop @chld;
51 $nb->remove ($fo); 81 $nb->remove ($cv);
52 $nb->set_current_page ($cur); 82 $nb->set_current_page ($cur);
83
84 delete $chatviews->{$id};
53 0 85 0
54 }); 86 });
87
55 $nb->add ($fo); 88 $nb->add ($cv);
89 $nb->set_current_page ($cv);
90}
91
92sub touch_channel {
93 my ($self, $id) = @_;
94 if (my $cv = $self->{chatviews}->{$id}) {
95 if ($cv != $self->{nb}->get_current_page) {
96 $self->highlight_channel ($id);
97 }
98 } else {
99 $self->add_chat ($id);
100 }
101}
102
103sub highlight_channel {
104 my ($self, $id) = @_;
105 my $cv = $self->{chatviews}->{$id};
106 my $tab = $cv->{_tab_button};
107 $tab->set_markup ("<span foreground='#ff0000'>" . $self->{channel_info}->{$id}->{title} . "</span>");
108}
109
110sub unhighlight_channel {
111 my ($self, $id) = @_;
112 my $cv = $self->{chatviews}->{$id};
113 my $tab = $cv->{_tab_button};
114 $tab->set_markup ($self->{channel_info}->{$id}->{title});
115}
116
117sub add_channel {
118 my ($self, $info) = @_;
119 $self->{channel_info}->{$info->{id}} = $info;
120 $self->touch_channel ($info->{id});
121}
122
123sub clear_channels {
124 my ($self) = @_;
125 # remove channel tabs here
126 $self->{channel_info} = {};
56} 127}
57 128
58sub message { 129sub message {
59 my ($self, $para) = @_; 130 my ($self, $para) = @_;
131 my $id = $para->{type};
132
133 if ($self->{channel_info}->{$id}) {
134 $self->touch_channel ($id);
135 $self->{chatviews}->{$id}->message ($para);
136 } else {
60 $self->{main_log}->message ($para); 137 $self->{main_log}->message ($para);
138 }
61} 139}
62 140
63sub activate_console { 141sub activate_console {
64 my ($self, $preset) = @_; 142 my ($self, $preset) = @_;
65 $self->{main_log}->activate_console ($preset); 143 $self->{main_log}->activate_console ($preset);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines