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

Comparing deliantra/Deliantra-Client/DC/Protocol.pm (file contents):
Revision 1.128 by root, Mon Jul 23 21:03:26 2007 UTC vs.
Revision 1.129 by root, Mon Jul 23 23:37:57 2007 UTC

127 $self->{widget}{$_[0]} 127 $self->{widget}{$_[0]}
128 }); 128 });
129 129
130 # widgetset new 130 # widgetset new
131 $self->connect_ext (ws_n => sub { 131 $self->connect_ext (ws_n => sub {
132 my ($arg) = @_; 132 my ($id) = @_;
133 133
134 $self->{widgetset}{$arg{id}} = { 134 $self->{widgetset}{$id} = {
135 w => {}, 135 w => {},
136 }; 136 };
137 }); 137 });
138 138
139 # widgetset destroy 139 # widgetset destroy
140 $self->connect_ext (ws_d => sub { 140 $self->connect_ext (ws_d => sub {
141 my ($arg) = @_; 141 my ($id) = @_;
142 142
143 my $ws = delete $self->{widgetset}{$arg{id}} 143 my $ws = delete $self->{widgetset}{$id}
144 or return; 144 or return;
145 145
146 $_->destroy 146 $_->destroy
147 for values %{$ws->{w}}; 147 for values %{$ws->{w}};
148 }); 148 });
149 149
150 # widgetset destroy 150 # widgetset create
151 $self->connect_ext (ws_c => sub { 151 $self->connect_ext (ws_c => sub {
152 my ($arg) = @_; 152 my ($ws, $id, $class, $args) = @_;
153
154 my $args = $arg->{args} || {};
155 153
156 for my $ev (grep /^on_/, keys %$args) { 154 for my $ev (grep /^on_/, keys %$args) {
157 $args->{$ev} = sub { 155 $args->{$ev} = sub {
158 my $id = shift->{s_id}; 156 my $id = shift->{s_id};
159 $self->send_exti_msg (w_e => id => $id, name => $ev, args => \@_); 157 $self->send_exti_msg (w_e => $id, $ev, \@_);
160 158
161 1 159 1
162 }; 160 };
163 } 161 }
164 162
165 if (my $widget = eval { 163 if (my $widget = eval {
166 local $SIG{__DIE__}; 164 local $SIG{__DIE__};
167 "CFPlus::UI::$arg->{class}"->new ( 165 "CFPlus::UI::$class"->new (
168 %$args, 166 %$args,
169 s_ws => $arg->{ws}, 167 s_ws => $ws,
170 s_id => $arg->{id}, 168 s_id => $id,
171 ) 169 )
172 } 170 }
173 ) { 171 ) {
174 $self->{widget}{$arg->{id}} 172 $self->{widget}{$id}
175 = $self->{widgetset}{$arg->{ws}}{w}{$arg->{id}} 173 = $self->{widgetset}{$ws}{w}{$id}
176 = $widget; 174 = $widget;
177 175
178 $widget->connect (on_destroy => sub { 176 $widget->connect (on_destroy => sub {
179 my ($widget) = @_; 177 my ($widget) = @_;
180 178
181 delete $self->{widget}{$widget->{s_id}}; 179 delete $self->{widget}{$widget->{s_id}};
182 delete $self->{widgetset}{$widget->{s_ws}}{$widget->{s_id}}; 180 delete $self->{widgetset}{$widget->{s_ws}}{$widget->{s_id}};
183 }); 181 });
184 } else { 182 } else {
185 warn "server failed creating client-side widget " . (CFPlus::to_json $arg) . ": $@\n"; 183 warn "server failed creating client-side widget " . (CFPlus::to_json $class) . ": $@\n";
186 $self->send_exti_msg (w_e => id => $arg->{id}, name => "destroy"); 184 $self->send_exti_msg (w_e => $id, "destroy");
187 } 185 }
188 }); 186 });
189 187
190 # widget call 188 # widget call
191 $self->connect_ext (w_c => sub { 189 $self->connect_ext (w_c => sub {
192 my ($arg) = @_; 190 my ($id, $rid, $method, $args) = @_;
193 191
194 my $w = $self->{widget}{$arg->{id}} 192 my $w = $self->{widget}{$id}
195 or return; 193 or return;
196 my $m = $arg->{name};
197 194
198 my $a = $arg->{args} || []; 195 $args ||= [];
199 196
200 if (exists $arg->{rid}) { 197 if ($rid) {
201 $self->send_exti_msg (w_r => rid => $arg->{rid}, res => [$w->$m (@$a)]); 198 $self->send_exti_msg (w_r => $rid, [$w->$method (@$args)]);
202 } else { 199 } else {
203 $w->$m (@$a); 200 $w->$method (@$args);
204 } 201 }
205 }); 202 });
206 203
207 # widget set 204 # widget set
208 $self->connect_ext (w_s => sub { 205 $self->connect_ext (w_s => sub {
209 my ($arg) = @_; 206 my ($id, $attr) = @_;
210 207
211 my $w = $self->{widget}{$arg->{id}} 208 my $w = $self->{widget}{$id}
212 or return; 209 or return;
213
214 my $attr = $arg->{attr};
215 210
216 for (my $i = 0; $i < $#$attr; $i += 2) { 211 for (my $i = 0; $i < $#$attr; $i += 2) {
217 my ($member, $value) = @$attr[$i, $i+1]; 212 my ($member, $value) = @$attr[$i, $i+1];
218 if (defined $value) { 213 if (defined $value) {
219 $w->{$member} = $value; 214 $w->{$member} = $value;
224 } 219 }
225 }); 220 });
226 221
227 # widget get 222 # widget get
228 $self->connect_ext (w_g => sub { 223 $self->connect_ext (w_g => sub {
229 my ($arg) = @_; 224 my ($id, $rid, $attr) = @_;
230 225
231 my $w = $self->{widget}{$arg->{id}} 226 my $w = $self->{widget}{$id}
232 or return; 227 or return;
233 228
234 $self->send_exti_msg (w_r => rid => $arg->{rid}, res => [map $w->{$_}, @{$arg->{attr}}]); 229 $self->send_exti_msg (w_r => $rid, [map $w->{$_}, @$attr]);
235 }); 230 });
236 231
237 # destroy widgets on logout 232 # destroy widgets on logout
238 $self->{on_stop_game_guard} = $self->{map_widget}{root}->connect (stop_game => sub { 233 $self->{on_stop_game_guard} = $self->{map_widget}{root}->connect (stop_game => sub {
239 for my $ws (values %{delete $self->{widgetset} || {}}) { 234 for my $ws (values %{delete $self->{widgetset} || {}}) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines