--- deliantra/Deliantra-Client/DC/UI.pm 2006/05/23 23:14:46 1.226 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/05/24 03:29:20 1.227 @@ -2072,7 +2072,7 @@ active_fg => [0, 0, 0], bg => [0, 0, 0, 0.2], active_bg => [1, 1, 1, 0.5], - range => [0, 0, 100, 10], + range => [0, 0, 100, 10, 0], req_w => $::WIDTH / 80, req_h => $::WIDTH / 80, vertical => 0, @@ -2102,14 +2102,14 @@ $hi = $lo + 1 if $hi <= $lo; - $value = $lo if $value < $lo; - $value = $hi if $value > $hi; + $page = $hi - $lo if $page > $hi - $lo; + + $value = $lo if $value < $lo; + $value = $hi - $page if $value > $hi - $page; $value = $lo + $unit * int +($value - $lo + $unit * 0.5) / $unit if $unit; - $page = $hi - $lo if $page > $hi - $lo; - @{$self->{range}} = ($value, $lo, $hi, $page, $unit); if ($value != $old_value) { @@ -2131,6 +2131,9 @@ my ($self, $ev, $x, $y) = @_; $self->SUPER::button_down ($ev, $x, $y); + + $self->{click} = [$self->{range}[0], $self->{vertical} ? $y : $x]; + $self->mouse_motion ($ev, $x, $y); } @@ -2142,9 +2145,9 @@ my (undef, $lo, $hi, $page) = @{$self->{range}}; - $x = $x / ($w * (1 - 2 * $self->{inner_pad})) - $self->{inner_pad}; + $x = ($x - $self->{click}[1]) / ($w * $self->{scale}); - $self->set_value ($x * ($hi - $lo) + $lo); + $self->set_value ($self->{click}[0] + $x * ($hi - $page - $lo)); } } @@ -2155,21 +2158,18 @@ $self->set_value ($self->{range}[0]); my ($value, $lo, $hi, $page) = @{$self->{range}}; + my $range = ($hi - $page - $lo) || 1e-100; - my $inner_w = 1 - 2 * $self->{inner_pad}; - - $self->{scale} = ($inner_w / ($hi - $lo)) || 1; + my $knob_w = List::Util::min 1, $page / ($hi - $lo) || 0.1; - $page = $self->{scale} * $page || 10 / ($self->{w} || 1); - $value = $self->{scale} * ($value - $lo); + $self->{offset} = List::Util::max $self->{inner_pad}, $knob_w * 0.5; + $self->{scale} = 1 - 2 * $self->{offset} || 1e-100; - $value = $self->{inner_pad} + ($value - $page * 0.5); + $value = ($value - $lo) / $range; + $value = $value * $self->{scale} + $self->{offset}; - $value = 0 if $value < 0; - $page = 1 - $value if $value + $page > 1; - - $self->{knob_x} = $value; - $self->{knob_w} = $page; + $self->{knob_x} = $value - $knob_w * 0.5; + $self->{knob_w} = $knob_w; }); $self->SUPER::update; @@ -2314,13 +2314,19 @@ $self->update; } +sub set_offset { + my ($self, $offset) = @_; + + # todo: base offset on lines or so, not on pixels + $self->{children}[1]->set_value ($offset); +} + sub clear { my ($self) = @_; $self->{par} = []; $self->{height} = 0; - - $self->reflow; + $self->{children}[1]->set_range ([0, 0, 0, 1, 1]); } sub add_paragraph { @@ -2332,8 +2338,7 @@ push @{$self->{par}}, [$height, $color, $indent, $line]; } - $self->{children}[1]{range} = [$self->{height} - $self->{h}, 0, $self->{height}, $self->{h}]; - $self->{children}[1]->update; + $self->{children}[1]->set_range ([$self->{height}, 0, $self->{height}, $self->{h}, 1]); } sub update { @@ -2354,8 +2359,7 @@ $self->{height} = $height; - $self->{children}[1]{range} = [$height - $self->{h}, 0, $height, $self->{h}]; - $self->{children}[1]->update; + $self->{children}[1]->set_range ([$height, 0, $height, $self->{h}, 1]); delete $self->{texture}; } @@ -2613,7 +2617,7 @@ sub _draw { my ($self) = @_; - return unless $::CONN;#d# manage and cache textures differently + return unless $::CONN; my $face;