ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/UI/ChatView.pm
Revision: 1.23
Committed: Tue Oct 28 12:20:36 2008 UTC (15 years, 9 months ago) by elmex
Branch: MAIN
CVS Tags: rel-2_03, rel-2_02, rel-2_05, rel-2_04, rel-2_0, rel-2_10, rel-0_9978
Changes since 1.22: +5 -3 lines
Log Message:
fixed tab update bug.

File Contents

# User Rev Content
1 root 1.12 package DC::UI::ChatView;
2 root 1.14
3 elmex 1.1 use strict;
4     use utf8;
5    
6 root 1.14 use Deliantra::Protocol::Constants;
7    
8 root 1.12 our @ISA = DC::UI::Dockable::;
9 elmex 1.1
10     sub new {
11     my $class = shift;
12    
13 root 1.10 my $self = $class->SUPER::new (
14     can_close => 1,
15 root 1.12 child => (my $vbox = new DC::UI::VBox),
16 elmex 1.13 @_,
17 root 1.10 );
18    
19 elmex 1.13 $self->update_info ($self->{info});
20    
21 root 1.12 $vbox->add ($self->{txt} = new DC::UI::TextScroller (
22 elmex 1.1 expand => 1,
23 root 1.20 font => $::FONT_PROP,
24 elmex 1.1 fontsize => $::CFG->{log_fontsize},
25 root 1.21 indent => -4.34, # hack
26 elmex 1.1 can_hover => 1,
27     can_events => 1,
28     max_par => $::CFG->{logview_max_par},
29 elmex 1.13 tooltip => $self->{text_tooltip},
30 elmex 1.1 ));
31    
32 root 1.12 $vbox->add (my $hb = DC::UI::HBox->new);
33 elmex 1.3
34 elmex 1.13 $hb->add (
35     $self->{say_command_label} =
36     DC::UI::Label->new (markup => $self->{say_command}));
37 root 1.10
38 root 1.12 $hb->add ($self->{input} = DC::UI::Entry->new (
39 elmex 1.13 expand => 1,
40     tooltip => $self->{entry_tooltip},
41 elmex 1.1 on_focus_in => sub {
42     my ($input, $prev_focus) = @_;
43    
44 elmex 1.15 $::MESSAGE_WINDOW->set_visibility (1);
45 elmex 1.1 delete $input->{refocus_map};
46    
47     if ($prev_focus == $::MAPWIDGET && $input->{auto_activated}) {
48     $input->{refocus_map} = 1;
49     }
50     delete $input->{auto_activated};
51    
52     0
53     },
54     on_activate => sub {
55     my ($input, $text) = @_;
56     $input->set_text ('');
57    
58 root 1.4 return unless $::CONN;
59    
60 elmex 1.1 if ($text =~ /^\/(.*)/) {
61     $::CONN->user_send ($1);
62 root 1.6 } elsif (length $text) {
63 elmex 1.2 my $say_cmd = $self->{say_command};
64 root 1.4 $::CONN->user_send ($say_cmd . $text);
65 root 1.6 } else {
66     $input->{refocus_map} = 1;
67 elmex 1.1 }
68 root 1.6 if (delete $input->{refocus_map}) {
69 root 1.7 $::MAPWIDGET->grab_focus;
70 elmex 1.1 }
71    
72     0
73     },
74 elmex 1.5 on_key_down => sub {
75     my ($input, $ev) = @_;
76 root 1.19
77 root 1.18 my $sym = $ev->{sym};
78 elmex 1.5 my $mod = $ev->{mod};
79    
80 root 1.18 if ($sym >= ord "0" && $sym <= ord "9" && $mod & DC::KMOD_ALT) {
81 elmex 1.5 $::MAPWIDGET->emit (key_down => $ev);
82     return 1;
83     }
84    
85     0
86     },
87 elmex 1.1 on_escape => sub {
88     $::MAPWIDGET->grab_focus;
89    
90     0
91     },
92     ));
93    
94 elmex 1.13 $self->{initiated} = 1; # for update_info
95 elmex 1.23 $self->update_tooltip;
96 elmex 1.13
97 elmex 1.1 $self
98     }
99    
100 elmex 1.13 # (private) This method updates the channel info associated with this chat view.
101     sub update_info {
102     my ($self, $info) = @_;
103     $self->{title} = $info->{title};
104     $self->{text_tooltip} = $info->{tooltip};
105     $self->{say_command} = $info->{reply};
106     $self->{entry_tooltip} =
107     $info->{entry_tooltip}
108     || "Enter a message and press enter to send it to the channel '$info->{title}'.";
109    
110     if ($self->{initiated}) {
111     $self->{say_command_label}->set_markup ($self->{say_command});
112     $self->set_title ($self->{title});
113 elmex 1.23 $self->update_tooltip;
114 elmex 1.13 }
115     }
116    
117 elmex 1.23 # updates only the
118 elmex 1.16 sub update_tooltip {
119     my ($self) = @_;
120     my $t = $self->{text_tooltip}
121     . (defined $self->{dockbar_pos}
122     ? "\n\n<small>Alt+"
123 root 1.17 . ($self->{dockbar_pos} == 9 ? '0' : $self->{dockbar_pos} + 1)
124 elmex 1.16 . " - activates this tab.\n"
125     . "Return - toggles activity of the entry."
126     . "</small>"
127     : "");
128     $self->{c_tab}->set_tooltip ($t);
129 elmex 1.23 $self->{txt}->{tooltip} = $self->{text_tooltip};
130     $self->{input}->{tooltip} = $self->{entry_tooltip};
131 elmex 1.16 }
132    
133     sub set_dockbar_pos {
134     my ($self, @a) = @_;
135     $self->SUPER::set_dockbar_pos (@a);
136     $self->update_tooltip;
137     }
138    
139 elmex 1.13 # (private) This method overloads the set_dockbar_tab_active method of
140     # the Dockbar to capture the activation event of the tab. Mainly used
141     # to remove highlightin.
142     sub set_dockbar_tab_active {
143     my ($self, $active) = @_;
144     if ($active) {
145     $self->set_inactive_fg (undef); # reset inactive color
146     }
147     $self->SUPER::set_dockbar_tab_active ($active);
148     }
149    
150     # This method renders a message to the text field and sets highlighting
151     # and does other stuff that a message can cause.
152 elmex 1.1 sub message {
153     my ($self, $para) = @_;
154    
155 elmex 1.13 if ($self->is_docked && !$self->is_docked_active) {
156     if (($para->{color_flags} & NDI_COLOR_MASK) == NDI_RED) {
157 elmex 1.15 $self->set_inactive_fg ([1, 0, 0]);
158 elmex 1.13 } else {
159     $self->set_inactive_fg ([0.6, 0.6, 1]);
160     }
161     }
162    
163 root 1.22 $self->select_my_tab if $para->{color_flags} & NDI_REPLY;
164     $self->clear_log if $para->{color_flags} & NDI_CLEAR;
165 elmex 1.13
166 elmex 1.1 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
167    
168 root 1.20 $para->{markup} = "<span foreground='#ffffff'><tt>$time </tt></span>$para->{markup}";
169 elmex 1.1
170 root 1.22 # boy this is ugly
171     $para->{markup} =~ s%\n%\n<tt> </tt>%g;
172    
173 elmex 1.1 my $txt = $self->{txt};
174     $txt->add_paragraph ($para);
175 root 1.22
176     $txt->scroll_to_bottom unless $para->{color_flags} & NDI_CLEAR;
177 elmex 1.1 }
178    
179 elmex 1.13 # This method is called when
180     sub activate {
181 elmex 1.1 my ($self, $preset) = @_;
182    
183 elmex 1.13 $self->SUPER::activate ();
184    
185 elmex 1.1 $self->{input}->{auto_activated} = 1;
186     $self->{input}->grab_focus;
187    
188     if ($preset && $self->{input}->get_text eq '') {
189     $self->{input}->set_text ($preset);
190     }
191     }
192    
193 elmex 1.13 # sets the fontsize of the chats textview
194 elmex 1.1 sub set_fontsize {
195     my ($self, $size) = @_;
196     $self->{txt}->set_fontsize ($size);
197     }
198    
199 elmex 1.13 # sets the maximum of paragraphs shown
200 root 1.14 sub set_max_par {
201 elmex 1.1 my ($self, $max_par) = @_;
202     $self->{txt}{max_par} = $max_par;
203     }
204 root 1.6
205 elmex 1.13 # clears the text log
206 root 1.10 sub clear_log {
207 elmex 1.9 my ($self) = @_;
208 root 1.10
209 elmex 1.9 $self->{txt}->clear;
210     }
211 root 1.10
212     1