ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/UI/MessageWindow.pm
Revision: 1.21
Committed: Fri Aug 31 08:15:45 2007 UTC (16 years, 11 months ago) by elmex
Branch: MAIN
Changes since 1.20: +3 -21 lines
Log Message:
removed useless comments and implemented NDI_CLEAR

File Contents

# Content
1 package CFPlus::UI::MessageWindow;
2
3 use strict;
4 use utf8;
5
6 use Scalar::Util qw/weaken/;
7 use CFPlus::UI::ChatView;
8 use Crossfire::Protocol::Constants;
9
10 our @ISA = CFPlus::UI::Toplevel::;
11
12 our %channel_info;
13
14 sub clr_def($) { "<span foreground=\"#fff\">$_[0]</span>" }
15 sub clr_act($) { "<span foreground=\"#fff\">$_[0]</span>" }
16 sub clr_hlt($) { "<span foreground=\"#aaf\">$_[0]</span>" }
17 sub clr_hlt2($) { "<span foreground=\"#f00\">$_[0]</span>" }
18
19 sub new {
20 my $class = shift;
21
22 my $self = $class->SUPER::new (
23 name => "message_window",
24 title => "Messages",
25 border_bg => [1, 1, 1, 1],
26 x => "max",
27 y => 0,
28 force_w => $::WIDTH * 0.4,
29 force_h => $::HEIGHT * 0.5,
30 child => (my $nb = CFPlus::UI::Notebook->new (expand => 1)),
31 has_close_button => 1
32 );
33
34 $self->{nb} = $nb;
35 $self->{chatviews} = {};
36
37 $nb->connect (page_changed => sub {
38 my ($nb, $page) = @_;
39 $self->set_current_tab ($page);
40 });
41 $nb->connect (c_add => sub {
42 $self->update_tabs;
43 });
44
45 my $l = $self->{main_log} =
46 CFPlus::UI::ChatView->new (expand => 1, say_command => '');
47 $l->{_tab_label} =
48 $l->{c_tab} =
49 CFPlus::UI::Button->new (
50 markup => "Log", tooltip => "This is the main log of the server."
51 );
52
53 $nb->add ($l);
54 $nb->set_current_page ($l);
55
56 $self
57 }
58
59 sub add_chat {
60 my ($self, $id) = @_;
61
62 my $chatviews = $self->{chatviews};
63 my $chaninfo = $self->{channel_info}->{$id};
64 my $nb = $self->{nb};
65
66 my $cv = $chatviews->{$id} =
67 CFPlus::UI::ChatView->new (
68 expand => 1,
69 say_command => $chaninfo->{reply},
70 entry_tooltip => $chaninfo->{tooltip},
71 text_tooltip => "Conversation with $chaninfo->{title}"
72 );
73
74 my $bb = CFPlus::UI::ButtonBin->new (tooltip => $chaninfo->{tooltip});
75 $cv->{c_tab} = $bb;
76
77 $bb->add (my $vb = CFPlus::UI::Box->new);
78 $vb->add (
79 my $b = CFPlus::UI::Label->new (
80 expand => 1, markup => clr_def ($chaninfo->{title}), valign => 0, align => 0
81 )
82 );
83
84 $cv->{_chat_id} = $id;
85 $cv->{_tab_label} = $b;
86 weaken $cv->{_tab_label};
87
88 $vb->add (
89 my $b = CFPlus::UI::ImageButton->new (
90 path => 'x1_close.png',
91 scale => 0.3
92 )
93 );
94 $b->connect (activate => sub {
95 my $b = shift;
96
97 my @chld = $nb->pages;
98 my $cur = pop @chld;
99 while (@chld && $cur != $cv) {
100 $cur = pop @chld;
101 }
102 $cur = pop @chld;
103 $nb->remove ($cv);
104 $nb->set_current_page ($cur);
105
106 delete $chatviews->{$id};
107 0
108 });
109
110 my $preadd = $nb->get_current_page;
111 $nb->add ($cv);
112 $nb->set_current_page ($preadd);
113 }
114
115 sub touch_channel {
116 my ($self, $id) = @_;
117
118 if (not exists $self->{chatviews}->{$id}) {
119 $self->add_chat ($id);
120 }
121 }
122
123 sub highlight_channel {
124 my ($self, $id, $hlt_func) = @_;
125
126 $hlt_func ||= \&clr_hlt;
127
128 my $cv = $self->{chatviews}->{$id};
129
130 # the clr_hlt2 has a "higher priority"
131 unless ($cv->{_channel_highlighted} eq \&clr_hlt2) {
132 $cv->{_channel_highlighted} = $hlt_func;
133 }
134
135 $self->update_tabs;
136 }
137
138 sub set_current_tab {
139 my ($self, $page) = @_;
140
141 for ($self->{nb}->pages) {
142 next if $_ eq $page;
143 $_->{_active} = 0;
144 }
145 $page->{_active} = 1;
146
147 $self->update_tabs;
148 }
149
150 sub update_tabs {
151 my ($self) = @_;
152
153 my $i = 1;
154 for ($self->{nb}->pages) {
155 if ($i <= 10) {
156 $_->{_tab_pos} = $i++;
157 } else {
158 $_->{_tab_pos} = undef;
159 }
160
161 my $tab = $_->{_tab_label};
162 next unless $tab;
163
164 my ($label, $tooltip) =
165 ("Log", "This is the main log of the server.");
166
167 if (defined $_->{_chat_id}) {
168 my $chinfo = $self->{channel_info}->{$_->{_chat_id}};
169 $label = $chinfo->{title};
170 $tooltip = $chinfo->{tooltip};
171
172 if ($_->{_active}) {
173 $_->{_channel_highlighted} = 0;
174 }
175 }
176
177 $_->{c_tab}->set_tooltip (
178 $tooltip
179 . (defined $_->{_tab_pos}
180 ? "\n\n<small>Alt+"
181 . ($_->{_tab_pos} == 10 ? '0' : $_->{_tab_pos})
182 . " - activates this tab.\n"
183 . "Return - toggles activity of the entry."
184 . "</small>"
185 : "")
186 );
187
188 my $hltfunc = $_->{_channel_highlighted}
189 || ($_->{_active} ? \&clr_act : \&clr_def);
190
191 $tab->set_markup (
192 $hltfunc->($label . (defined $_->{_tab_pos} ? "\-$_->{_tab_pos}" : ""))
193 );
194 }
195 }
196
197 sub add_channel {
198 my ($self, $info) = @_;
199
200 $self->{channel_info}->{$info->{id}} = $info;
201 $self->touch_channel ($info->{id});
202 }
203
204 sub message {
205 my ($self, $para) = @_;
206
207 #d# require Data::Dumper;
208 #d# print "FOO[".Data::Dumper->Dump ([$para])."]\n";
209
210 my $id = $para->{type};
211
212 if (exists $self->{channel_info}->{$id}) {
213 $self->touch_channel ($id);
214
215 if (my $cv = $self->{chatviews}->{$id}) {
216
217 if ($cv != $self->{nb}->get_current_page) {
218
219 if (($para->{color_flags} & NDI_COLOR_MASK) == NDI_RED) {
220 $self->highlight_channel ($id, \&clr_hlt2);
221 } else {
222 $self->highlight_channel ($id);
223 }
224 }
225
226 if ($para->{color_flags} & NDI_REPLY) {
227 $self->{nb}->set_current_page ($cv);
228 }
229
230 if ($para->{color_flags} & NDI_CLEAR) {
231 $cv->clear;
232 }
233 }
234
235 $self->{chatviews}->{$id}->message ($para);
236
237 } else {
238 $self->{main_log}->message ($para);
239 }
240 }
241
242 sub activate_console {
243 my ($self, $preset) = @_;
244
245 $self->{main_log}->activate_console ($preset);
246 }
247
248 sub activate_current {
249 my ($self) = @_;
250
251 $self->{nb}->get_current_page->activate_console;
252 }
253
254 sub set_fontsize {
255 my ($self, $size) = @_;
256
257 for (values %{$self->{chatviews}}, $self->{main_log}) {
258 $_->set_fontsize ($size);
259 }
260 }
261
262 sub set_max_para {
263 my ($self, $max_par) = @_;
264
265 for (values %{$self->{chatviews}}, $self->{main_log}) {
266 $_->set_max_para ($max_par);
267 }
268 }
269
270 sub user_switch_to_page {
271 my ($self, $page) = @_;
272
273 $page = $page eq '0' ? 10 : $page;
274
275 my @tabs = $self->{nb}->pages;
276
277 for (my $i = 0; $i < ($page - 1); $i++) {
278 shift @tabs;
279 }
280
281 my $page = shift @tabs;
282 return unless $page;
283
284 $self->{nb}->set_current_page ($page);
285 }
286
287 1;
288