--- deliantra/Deliantra-Client/DC/MapWidget.pm 2006/05/25 00:26:19 1.36 +++ deliantra/Deliantra-Client/DC/MapWidget.pm 2006/06/08 18:18:16 1.52 @@ -16,12 +16,27 @@ z => -1, can_focus => 1, list => glGenList, + + smooth_matrix => [ + 0.05, 0.13, 0.05, + 0.13, 0.30, 0.13, + 0.05, 0.13, 0.05, + ], + @_ ); $self->{completer} = new CFClient::MapWidget::Command:: command => $self->{command}, can_focus => 1, + tooltip => "The Command Completer\n\n" + . "This is your central interface to send text commands to the server. " + . "To enter a verbatim command to send to the server, just type the command, " + . "followed by a space, and press return. " + . "Typing the initial letters of words (or just any letters) displays guesses " + . "for commands you might want to use.\n" + . "You can use the cursor-up and cursor-down keys to select between those guesses.\n" + . "Right-Click opens a menu where you cna select further options, sich as redefining keybindings.", ; $self @@ -33,9 +48,7 @@ (my $data = $command) =~ s/\\//g; $tooltip =~ s/^\s+//; - $tooltip = "$data\n\n$tooltip"; - $tooltip =~ s/\s+$//; $self->{completer}{command}{$command} = [$data, $tooltip, $widget, $cb, ++$self->{command_id}]; @@ -52,7 +65,16 @@ $self->focus_in; - if ($ev->{button} == 2) { + if ($ev->{button} == 1) { + my $sw = int $::WIDTH / (32 * $::CFG->{map_scale}) + 0.99; + my $sh = int $::HEIGHT / (32 * $::CFG->{map_scale}) + 0.99; + + my $fx = int +($ev->{x} - $::CFG->{map_shift_x}) / (32 * $::CFG->{map_scale}) - 0.5 * $sw + 0.99; + my $fy = int +($ev->{y} - $::CFG->{map_shift_y}) / (32 * $::CFG->{map_scale}) - 0.5 * $sh + 0.99; + + $::CONN->send (sprintf "lookat %d %d", $fx, $fy); + + } elsif ($ev->{button} == 2) { my ($ox, $oy) = ($ev->{x}, $ev->{y}); my ($bw, $bh) = ($::CFG->{map_shift_x}, $::CFG->{map_shift_y}); @@ -67,18 +89,28 @@ $self->update; }; } + + 1 } sub button_up { my ($self, $ev, $x, $y) = @_; delete $self->{motion}; + + 1 } sub mouse_motion { my ($self, $ev, $x, $y) = @_; - $self->{motion}->($ev, $x, $y) if $self->{motion}; + if ($self->{motion}) { + $self->{motion}->($ev, $x, $y); + } else { + return 0; + } + + 1 } sub size_request { @@ -114,7 +146,7 @@ sub key_down { my ($self, $ev) = @_; - return unless $::CONN; + return 0 unless $::CONN; my $mod = $ev->{mod}; my $sym = $ev->{sym}; @@ -126,8 +158,11 @@ $::CONN->user_send ("take"); } elsif ($uni == ord " ") { $::CONN->user_send ("apply"); + } elsif ($uni == ord ".") { + $::CONN->user_send ($self->{completer}{last_command}) + if exists $self->{completer}{last_command}; } elsif ($uni == ord "\t") { - # TODO: toggle inventory + $::INV_WINDOW->toggle_visibility; } elsif ($sym == CFClient::SDLK_KP_PLUS || $uni == ord "+") { $::CONN->user_send ("rotateshoottype +"); } elsif ($sym == CFClient::SDLK_KP_MINUS || $uni == ord "-") { @@ -148,24 +183,48 @@ } else { $::CONN->user_send ("$DIR{$sym}[1]"); } - } elsif ($ev->{unicode}) { + } elsif ($sym == CFClient::SDLK_INSERT && $mod & CFClient::KMOD_CTRL) { + $::BIND_EDITOR->set_binding (undef, undef, [], + sub { + my ($mod, $sym, $cmds) = @_; + $::CFG->{bindings}->{$mod}->{$sym} = $cmds; + }); + $::BIND_EDITOR->start; + $::BIND_EDITOR->show; + } elsif ($sym == CFClient::SDLK_INSERT && not ($mod & CFClient::KMOD_CTRL)) { + $::BIND_EDITOR->stop; + $::BIND_EDITOR->ask_for_bind_and_commit; + $::BIND_EDITOR->hide; + } elsif (my $bind_cmd = $::CFG->{bindings}->{$mod}->{$sym}) { + $::CONN->user_send ($_) for @$bind_cmd; + } elsif ((ord 'a') <= $uni && $uni <= (ord 'z')) { $self->{completer}->key_down ($ev); $self->{completer}->show; + } else { + return 0; } + + 1 } sub key_up { my ($self, $ev) = @_; + my $res = 0; my $mod = $ev->{mod}; my $sym = $ev->{sym}; if (!($mod & CFClient::KMOD_SHIFT) && delete $self->{shft}) { $::CONN->user_send ("fire_stop"); + $res = 1; } + if (!($mod & CFClient::KMOD_CTRL ) && delete $self->{ctrl}) { $::CONN->user_send ("run_stop"); + $res = 1; } + + $res } sub draw { @@ -195,17 +254,14 @@ my ($w, $h, $data) = $::MAP->draw ($sx, $sy, 0, 0, $sw + 1, $sh + 1); if ($::CFG->{fow_enable}) { - if ($::CFG->{fow_smooth} && $CFClient::GL_VERSION >= 1.2) { # smooth fog of war + if ($::CFG->{fow_smooth} && $CFClient::OpenGL::GL_VERSION >= 1.2) { # smooth fog of war glConvolutionParameter (GL_CONVOLUTION_2D, GL_CONVOLUTION_BORDER_MODE, GL_CONSTANT_BORDER); glConvolutionFilter2D ( GL_CONVOLUTION_2D, GL_ALPHA, 3, 3, GL_ALPHA, GL_FLOAT, - pack "f*", - 0.05, 0.13, 0.05, - 0.13, 0.30, 0.13, - 0.05, 0.13, 0.05, + (pack "f*", @{ $self->{smooth_matrix} }), ); glEnable GL_CONVOLUTION_2D; } @@ -258,26 +314,26 @@ glEnd; glDisable GL_BLEND; - $self->{out_of_focus} ||= do { - my $label = new CFClient::UI::Label - x => 0, - y => 0, - z => 1, - ellipsise => 0, - text => "map out of focus (click map to play)"; - - $label->show; - $label->update; - - $CFClient::UI::ROOT->on_post_alloc ("$self$label" => sub { - $label->move ( - ($::WIDTH - $label->{w}) * 0.5, - ($::HEIGHT - $label->{h}) * 0.5, - ); - }); - - $label - }; +# $self->{out_of_focus} ||= do { +# my $label = new CFClient::UI::Label +# x => 0, +# y => 0, +# z => 1, +# ellipsise => 0, +# text => "map out of focus (click map to play)"; +# +# $label->show; +# $label->update; +# +# $CFClient::UI::ROOT->on_post_alloc ("$self$label" => sub { +# $label->move_abs ( +# ($::WIDTH - $label->{w}) * 0.5, +# ($::HEIGHT - $label->{h}) * 0.5, +# ); +# }); +# +# $label +# }; } } @@ -397,29 +453,53 @@ ]; $self->{entry} = new CFClient::UI::Entry - connect_changed => sub { + on_changed => sub { $self->update_labels; }, - connect_key_down => sub { + on_key_down => sub { my ($entry, $ev) = @_; my $self = $entry->{parent}{parent}; if ($ev->{sym} == 13) { if (exists $self->{select}) { + $self->{last_command} = $self->{select}; $::CONN->user_send ($self->{select}); + + unshift @{$self->{history}}, $self->{select}; + $self->{hist_ptr} = 0; + $self->hide; } } elsif ($ev->{sym} == 27) { + $self->{hist_ptr} = 0; $self->hide; return; } elsif ($ev->{sym} == CFClient::SDLK_DOWN) { - ++$self->{select_offset} - if $self->{select_offset} < $#{ $self->{last_match} || [] }; + if ($self->{hist_ptr} > 1) { + $self->{hist_ptr}--; + $self->{entry}->set_text ($self->{history}->[$self->{hist_ptr} - 1]); + } elsif ($self->{hist_ptr} > 0) { + $self->{hist_ptr}--; + $self->{entry}->set_text ($self->{hist_saveback}); + } else { + ++$self->{select_offset} + if $self->{select_offset} < $#{ $self->{last_match} || [] }; + } $self->update_labels; } elsif ($ev->{sym} == CFClient::SDLK_UP) { - --$self->{select_offset} - if $self->{select_offset}; + if ($self->{select_offset}) { + --$self->{select_offset} + } else { + unless ($self->{hist_ptr}) { + $self->{hist_saveback} = $self->{entry}->get_text; + } + if ($self->{hist_ptr} <= $#{$self->{history}}) { + $self->{hist_ptr}++; + } + $self->{entry}->set_text ($self->{history}->[$self->{hist_ptr} - 1]) + if exists $self->{history}->[$self->{hist_ptr} - 1]; + } $self->update_labels; } else { return 0; @@ -448,7 +528,7 @@ my ($self, $w, $h) = @_; $self->SUPER::size_allocate ($w, $h); - $self->move (($::WIDTH - $w) * 0.5, ($::HEIGHT - $h) * 0.6, 10); + $self->move_abs (($::WIDTH - $w) * 0.5, ($::HEIGHT - $h) * 0.6, 10); } sub show { @@ -468,7 +548,7 @@ sub key_down { my ($self, $ev) = @_; - $self->{entry}->key_down ($ev); + $self->{entry}->key_down ($ev) } sub update_labels { @@ -511,11 +591,11 @@ sort { $a->[1] <=> $b->[1] or $self->{command}{$a->[0]}[4] <=> $self->{command}{$b->[0]}[4] - or (length $a->[0]) <=> (length $b->[0]) + or (length $b->[0]) <=> (length $a->[0]) } @match; } - $self->{last_search} = $cmd; + $self->{last_search} = $text; $self->{last_match} = \@match; $self->{select_offset} = 0;