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

Comparing deliantra/Deliantra-Client/DC.pm (file contents):
Revision 1.80 by elmex, Tue May 30 08:12:50 2006 UTC vs.
Revision 1.84 by elmex, Wed May 31 12:44:17 2006 UTC

203 203
204package CFClient::Item; 204package CFClient::Item;
205 205
206use strict; 206use strict;
207use Crossfire::Protocol::Constants; 207use Crossfire::Protocol::Constants;
208
209my $last_enter_count = 1;
208 210
209sub desc_string { 211sub desc_string {
210 my ($self) = @_; 212 my ($self) = @_;
211 213
212 my $desc = 214 my $desc =
238 my $weight = ($self->{nrof} || 1) * $self->{weight}; 240 my $weight = ($self->{nrof} || 1) * $self->{weight};
239 241
240 $weight < 0 ? "?" : $weight * 0.001 242 $weight < 0 ? "?" : $weight * 0.001
241} 243}
242 244
245sub do_n_dialog {
246 my ($cb) = @_;
247
248 my $w = new CFClient::UI::FancyFrame;
249 $w->add (my $vb = new CFClient::UI::VBox x => "center", y => "center");
250 $vb->add (new CFClient::UI::Label text => "Enter item count:");
251 $vb->add (my $entry = new CFClient::UI::Entry
252 text => $last_enter_count,
253 on_activate => sub {
254 my ($entry) = @_;
255 $last_enter_count = $entry->get_text;
256 $cb->($last_enter_count);
257 $w->hide;
258 $w = undef;
259 }
260 );
261 $entry->focus_in;
262 $w->show;
263
264}
265
243sub update_widgets { 266sub update_widgets {
244 my ($self) = @_; 267 my ($self) = @_;
245 268
246 my $button_cb = sub { 269 my $button_cb = sub {
247 my (undef, $ev, $x, $y) = @_; 270 my (undef, $ev, $x, $y) = @_;
248 271
272 my $targ = $::CONN->{player}{tag};
273
274 if ($self->{container} == $::CONN->{player}{tag}) {
275 $targ = $::CONN->{open_container};
276 }
277
249 if (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 1) { 278 if (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 1) {
250 my $targ = $::CONN->{player}{tag};
251
252 if ($self->{container} == $::CONN->{player}{tag}) {
253 $targ = $::CONN->{open_container};
254 }
255
256 $::CONN->send ("move $targ $self->{tag} 0") 279 $::CONN->send ("move $targ $self->{tag} 0")
257 if $targ || !($self->{flags} & F_LOCKED); 280 if $targ || !($self->{flags} & F_LOCKED);
258 } elsif ($ev->{button} == 1) { 281 } elsif ($ev->{button} == 1) {
259 $::CONN->send ("examine $self->{tag}"); 282 $::CONN->send ("examine $self->{tag}");
260 } elsif ($ev->{button} == 2) { 283 } elsif ($ev->{button} == 2) {
270 ["unlock", sub { $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) }], 293 ["unlock", sub { $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) }],
271 ) 294 )
272 : ( 295 : (
273 ["lock", sub { $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) }], 296 ["lock", sub { $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) }],
274 ["drop", sub { $::CONN->send ("move $::CONN->{open_container} $self->{tag} 0") }], 297 ["drop", sub { $::CONN->send ("move $::CONN->{open_container} $self->{tag} 0") }],
298 ["move n",
299 sub {
300 do_n_dialog (sub { $::CONN->send ("move $targ $self->{tag} $_[0]") })
301 }
302 ]
275 ) 303 )
276 ), 304 ),
277 ); 305 );
278 306
279 CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev); 307 CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev);
332 . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ") 360 . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ")
333 . "\n\n$tooltip_std" 361 . "\n\n$tooltip_std"
334 ); 362 );
335} 363}
336 364
337package CFClient::Recorder; 365package CFClient::Binder;
338
339our $RECORD_WINDOW;
340
341my $CMDBOX;
342my $CURRENT_CMDS;
343my $REC_BTN;
344 366
345my @ALLOWED_MODIFIER_KEYS = ( 367my @ALLOWED_MODIFIER_KEYS = (
346 (CFClient::SDLK_LSHIFT) => "LSHIFT", 368 (CFClient::SDLK_LSHIFT),
347 (CFClient::SDLK_LCTRL ) => "LCTRL", 369 (CFClient::SDLK_LCTRL ),
348 (CFClient::SDLK_LALT ) => "LALT", 370 (CFClient::SDLK_LALT ),
349 (CFClient::SDLK_LMETA ) => "LMETA", 371 (CFClient::SDLK_LMETA ),
350 372
351 (CFClient::SDLK_RSHIFT) => "RSHIFT", 373 (CFClient::SDLK_RSHIFT),
352 (CFClient::SDLK_RCTRL ) => "RCTRL", 374 (CFClient::SDLK_RCTRL ),
353 (CFClient::SDLK_RALT ) => "RALT", 375 (CFClient::SDLK_RALT ),
354 (CFClient::SDLK_RMETA ) => "RMETA", 376 (CFClient::SDLK_RMETA ),
355); 377);
356 378
357my %ALLOWED_MODIFIERS = ( 379my %ALLOWED_MODIFIERS = (
358 (CFClient::KMOD_LSHIFT) => "LSHIFT", 380 (CFClient::KMOD_LSHIFT) => "LSHIFT",
359 (CFClient::KMOD_LCTRL ) => "LCTRL", 381 (CFClient::KMOD_LCTRL ) => "LCTRL",
384 CFClient::SDLK_F14, 406 CFClient::SDLK_F14,
385 CFClient::SDLK_F15, 407 CFClient::SDLK_F15,
386); 408);
387 409
388# this binding dialog asks for a key-combo to be pressed 410# this binding dialog asks for a key-combo to be pressed
389# and if successful it binds the modifier+symbol to the 411# and if successful it calls the $cb with $mod and $sym as args.
390# supplied actions in $cmd.
391# (Bindings are stored in $::CFG->{bindings}->{$mod}->{$sym})
392sub open_binding_dialog { 412sub open_binding_dialog {
393 my ($cmd) = @_; 413 my ($cb) = @_;
394 414
395 my $w = new CFClient::UI::FancyFrame 415 my $w = new CFClient::UI::FancyFrame
396 title => "Bind Action", 416 title => "Bind Action",
397 x => "center", 417 x => "center",
398 y => "center"; 418 y => "center";
426 return; 446 return;
427 } 447 }
428 448
429 $entry->focus_out; 449 $entry->focus_out;
430 450
431 $::CFG->{bindings}->{$mod}->{$sym} = $cmd; 451 $cb->($mod, $sym);
432 $::STATUSBOX->add ("Bound actions to '".keycombo_to_name ($mod, $sym)."'. Don't forget 'Save Config'!");
433 452
434 $w->destroy 453 $w->destroy
435 }); 454 });
436 455
437 $entry->focus_in; 456 $entry->focus_in;
441sub keycombo_to_name { 460sub keycombo_to_name {
442 my ($mod, $sym) = @_; 461 my ($mod, $sym) = @_;
443 462
444 my $mods = join '+', 463 my $mods = join '+',
445 map { $ALLOWED_MODIFIERS{$_} } 464 map { $ALLOWED_MODIFIERS{$_} }
446 grep { $_ & $mod } 465 grep { ($_ + 0) & ($mod + 0) }
447 keys %ALLOWED_MODIFIERS; 466 keys %ALLOWED_MODIFIERS;
448 $mods .= "+" if $mods ne ''; 467 $mods .= "+" if $mods ne '';
449 468
450 return $mods . CFClient::SDL_GetKeyName ($sym); 469 return $mods . CFClient::SDL_GetKeyName ($sym);
451} 470}
452 471
453sub clear_command_list {
454 $CMDBOX->clear () if $CMDBOX;
455}
456
457sub set_command_list {
458 my ($list) = @_;
459
460 return unless $CMDBOX;
461
462 $CMDBOX->clear ();
463 $CURRENT_CMDS = $list;
464
465 my $idx = 0;
466
467 for (@$list) {
468 $CMDBOX->add (my $hb = new CFClient::UI::HBox);
469
470 my $i = $idx;
471 $hb->add (new CFClient::UI::Button
472 text => "delete",
473 tooltip => "Deletes the action from the record",
474 on_activate => sub {
475 $CMDBOX->remove ($hb);
476 $list->[$i] = undef;
477 });
478
479 $hb->add (new CFClient::UI::Label text => $_);
480
481 $idx++
482 }
483}
484
485# if $show is 1 the recorder will be shown
486sub start {
487 my ($show) = @_;
488
489 $RECORD_WINDOW->show if $show;
490
491 $REC_BTN->set_text ("stop recording");
492 $REC_BTN->{recording} = 1;
493 clear_command_list;
494 $::CONN->start_record;
495}
496
497# if $autobind is 1 the recorder will be automatically
498# jump into the binding query and hide the recorder window
499sub stop {
500 my ($autobind) = @_;
501
502 $REC_BTN->set_text ("start recording");
503 $REC_BTN->{recording} = 0;
504
505 my $rec = $::CONN->stop_record;
506 return unless ref $rec eq 'ARRAY';
507 set_command_list ($rec);
508
509 if ($autobind) {
510 open_binding_dialog ([ grep { defined $_ } @$CURRENT_CMDS ]);
511 $RECORD_WINDOW->hide;
512 }
513}
514
515sub make_window {
516 $RECORD_WINDOW = new CFClient::UI::FancyFrame
517 req_y => 1,
518 req_x => -1,
519 title => "Action Recorder";
520
521 $RECORD_WINDOW->add (my $vb = new CFClient::UI::VBox);
522 $vb->add ($REC_BTN = new CFClient::UI::Button
523 text => "start recording",
524 tooltip => "Start/Stops recording of actions."
525 ."(CTRL+Insert Starts the recorder, Insert Stops recorder and binds automatically)"
526 ."All subsequent actions after the recording started will be captured."
527 ."The actions are displayed after the record was stopped."
528 ."To bind the action you have to click on the 'Bind' button",
529 on_activate => sub {
530 my ($btn) = @_;
531
532 unless ($btn->{recording}) {
533 start;
534 } else {
535 stop;
536 }
537 });
538 $vb->add ($CMDBOX = new CFClient::UI::VBox);
539 $vb->add (new CFClient::UI::Button
540 text => "bind",
541 tooltip => "This opens a query where you have to press the key combination to bind the recorded actions",
542 on_activate => sub {
543 open_binding_dialog ([ grep { defined $_ } @$CURRENT_CMDS ]);
544 });
545
546 $RECORD_WINDOW
547}
548
5491; 4721;
550 473
551=back 474=back
552 475
553=head1 AUTHOR 476=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines