--- deliantra/Deliantra-Client/DC/MapWidget.pm 2006/05/30 14:35:09 1.45 +++ deliantra/Deliantra-Client/DC/MapWidget.pm 2006/06/11 20:09:12 1.55 @@ -16,6 +16,13 @@ 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, + ], + @_ ); @@ -58,7 +65,23 @@ $self->focus_in; - if ($ev->{button} == 2) { + if ($ev->{button} == 1) { + my $x = int +($ev->{x} - $::CFG->{map_shift_x}) / (32 * $::CFG->{map_scale}); + my $y = int +($ev->{y} - $::CFG->{map_shift_y}) / (32 * $::CFG->{map_scale}); + + $x += int 0.5 * ($::MAP->w - $self->{sw} - 1); + $y += int 0.5 * ($::MAP->h - $self->{sh} - 1); + + $x -= int 0.5 * $::MAP->w; + $y -= int 0.5 * $::MAP->h; + + $x += 1; + $y += 1; + + $::CONN->send ("lookat $x $y") + if $::CONN; + + } elsif ($ev->{button} == 2) { my ($ox, $oy) = ($ev->{x}, $ev->{y}); my ($bw, $bh) = ($::CFG->{map_shift_x}, $::CFG->{map_shift_y}); @@ -73,18 +96,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 { @@ -120,7 +153,7 @@ sub key_down { my ($self, $ev) = @_; - return unless $::CONN; + return 0 unless $::CONN; my $mod = $ev->{mod}; my $sym = $ev->{sym}; @@ -167,28 +200,38 @@ $::BIND_EDITOR->show; } elsif ($sym == CFClient::SDLK_INSERT && not ($mod & CFClient::KMOD_CTRL)) { $::BIND_EDITOR->stop; - $::BIND_EDITOR->ask_for_bind (1); + $::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 { @@ -204,16 +247,18 @@ glNewList $self->{list}; if ($::MAP) { - my $sw = int $::WIDTH / (32 * $::CFG->{map_scale}) + 0.99; - my $sh = int $::HEIGHT / (32 * $::CFG->{map_scale}) + 0.99; + my $sw = $self->{sw} = int $::WIDTH / (32 * $::CFG->{map_scale}) + 0.99; + my $sh = $self->{sh} = int $::HEIGHT / (32 * $::CFG->{map_scale}) + 0.99; - my $sx = $::CFG->{map_shift_x} / $::CFG->{map_scale}; my $sx0 = $sx & 31; $sx = ($sx - $sx0) / 32; - my $sy = $::CFG->{map_shift_y} / $::CFG->{map_scale}; my $sy0 = $sy & 31; $sy = ($sy - $sy0) / 32; + my $sx = $::CFG->{map_shift_x} / $::CFG->{map_scale}; + my $sy = $::CFG->{map_shift_y} / $::CFG->{map_scale}; + my $sx0 = $self->{sx0} = ($sx & 31) - 32; $sx = $self->{sx} = ($sx - $sx0) / 32; + my $sy0 = $self->{sy0} = ($sy & 31) - 32; $sy = $self->{sy} = ($sy - $sy0) / 32; glPushMatrix; glScale $::CFG->{map_scale}, $::CFG->{map_scale}; - glTranslate $sx0 - 32, $sy0 - 32, 0; + glTranslate $sx0, $sy0; my ($w, $h, $data) = $::MAP->draw ($sx, $sy, 0, 0, $sw + 1, $sh + 1); @@ -225,10 +270,7 @@ 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; } @@ -432,18 +474,41 @@ 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; @@ -492,7 +557,7 @@ sub key_down { my ($self, $ev) = @_; - $self->{entry}->key_down ($ev); + $self->{entry}->key_down ($ev) } sub update_labels {