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

Comparing deliantra/Deliantra-Client/DC/UI.pm (file contents):
Revision 1.258 by root, Tue May 30 02:55:45 2006 UTC vs.
Revision 1.259 by root, Tue May 30 07:13:09 2006 UTC

219 $self->connect ($1 => delete $self->{$_}); 219 $self->connect ($1 => delete $self->{$_});
220 } 220 }
221 } 221 }
222 222
223 if (my $layout = $CFClient::UI::LAYOUT->{$self->{name}}) { 223 if (my $layout = $CFClient::UI::LAYOUT->{$self->{name}}) {
224 $self->{x} = $layout->{x} * $CFClient::UI::ROOT->{w} if exists $layout->{x}; 224 $self->{x} = $layout->{x} * $CFClient::UI::ROOT->{alloc_w} if exists $layout->{x};
225 $self->{y} = $layout->{y} * $CFClient::UI::ROOT->{h} if exists $layout->{y}; 225 $self->{y} = $layout->{y} * $CFClient::UI::ROOT->{alloc_h} if exists $layout->{y};
226 $self->{force_w} = $layout->{w} * $CFClient::UI::ROOT->{w} if exists $layout->{w}; 226 $self->{force_w} = $layout->{w} * $CFClient::UI::ROOT->{alloc_w} if exists $layout->{w};
227 $self->{force_h} = $layout->{h} * $CFClient::UI::ROOT->{h} if exists $layout->{h}; 227 $self->{force_h} = $layout->{h} * $CFClient::UI::ROOT->{alloc_h} if exists $layout->{h};
228 228
229 $self->{x} -= $self->{force_w} * 0.5 if exists $layout->{x}; 229 $self->{x} -= $self->{force_w} * 0.5 if exists $layout->{x};
230 $self->{y} -= $self->{force_h} * 0.5 if exists $layout->{y}; 230 $self->{y} -= $self->{force_h} * 0.5 if exists $layout->{y};
231 231
232 $self->show if $layout->{show}; 232 $self->show if $layout->{show};
355 $self->{x} = $x; 355 $self->{x} = $x;
356 $self->{y} = $y; 356 $self->{y} = $y;
357 $self->update; 357 $self->update;
358 } 358 }
359 359
360 if ($self->{w} != $w || $self->{h} != $h) { 360 if ($self->{alloc_w} != $w || $self->{alloc_h} != $h) {
361 return unless $self->{visible}; 361 return unless $self->{visible};
362 362
363 $self->{alloc_w} = $w;
364 $self->{alloc_h} = $h;
365
363 $self->{root}->{size_alloc}{$self+0} = [$self, $w, $h]; 366 $self->{root}{size_alloc}{$self+0} = $self;
364 } 367 }
365} 368}
366 369
367sub size_allocate { 370sub size_allocate {
368 # nothing to be done 371 # nothing to be done
498 501
499sub realloc { 502sub realloc {
500 my ($self) = @_; 503 my ($self) = @_;
501 504
502 if ($self->{visible}) { 505 if ($self->{visible}) {
503 return if $self->{root}{realloc}{$self}; 506 return if $self->{root}{realloc}{$self+0};
504 507
505 $self->{root}{realloc}{$self} = $self; 508 $self->{root}{realloc}{$self+0} = $self;
506 $self->{root}->update; 509 $self->{root}->update;
507 } else { 510 } else {
508 delete $self->{req_w}; 511 delete $self->{req_w};
512 delete $self->{req_h};
509 } 513 }
510} 514}
511 515
512sub update { 516sub update {
513 my ($self) = @_; 517 my ($self) = @_;
546 glVertex $x , $y + $self->{h}; 550 glVertex $x , $y + $self->{h};
547 glEnd; 551 glEnd;
548 glDisable GL_BLEND; 552 glDisable GL_BLEND;
549 } 553 }
550 554
551 if ($ENV{CFPLUS_DEBUG}) { 555 if ($ENV{CFPLUS_DEBUG} & 1) {
552 glPushMatrix; 556 glPushMatrix;
553 glColor 1, 1, 0, 1; 557 glColor 1, 1, 0, 1;
554 glTranslate $self->{x} + 0.375, $self->{y} + 0.375; 558 glTranslate $self->{x} + 0.375, $self->{y} + 0.375;
555 glBegin GL_LINE_LOOP; 559 glBegin GL_LINE_LOOP;
556 glVertex 0 , 0; 560 glVertex 0 , 0;
765sub size_request { 769sub size_request {
766 $_[0]{children}[0]->size_request 770 $_[0]{children}[0]->size_request
767} 771}
768 772
769sub size_allocate { 773sub size_allocate {
770 my ($self, $w, $h, $changed) = @_; 774 my ($self, $w, $h) = @_;
771 775
772 $self->{children}[0]->configure (0, 0, $w, $h); 776 $self->{children}[0]->configure (0, 0, $w, $h);
773} 777}
774 778
775############################################################################# 779#############################################################################
792 $ROOT->on_post_alloc ($self => sub { $self->render_child }); 796 $ROOT->on_post_alloc ($self => sub { $self->render_child });
793 $self->SUPER::update; 797 $self->SUPER::update;
794} 798}
795 799
796sub size_allocate { 800sub size_allocate {
797 my ($self, $w, $h, $changed) = @_; 801 my ($self, $w, $h) = @_;
798 802
799 $self->SUPER::size_allocate ($w, $h, $changed); 803 $self->SUPER::size_allocate ($w, $h);
800 $self->update 804 $self->update;
801 if $changed;
802} 805}
803 806
804sub _render { 807sub _render {
805 $_[0]{children}[0]->draw; 808 $_[0]{children}[0]->draw;
806} 809}
850} 853}
851 854
852sub size_request { 855sub size_request {
853 my ($self) = @_; 856 my ($self) = @_;
854 857
855 my ($w, $h) = @$self{qw(child_w child_h)} = @{$self->child}{qw(req_w req_h)}; 858 my ($w, $h) = @{$self->child}{qw(req_w req_h)};
856 859
857 $w = 10 if $self->{scroll_x}; 860 $w = 10 if $self->{scroll_x};
858 $h = 10 if $self->{scroll_y}; 861 $h = 10 if $self->{scroll_y};
859 862
860 ($w, $h) 863 ($w, $h)
861} 864}
862 865
863sub size_allocate { 866sub size_allocate {
864 my ($self, $w, $h, $changed) = @_; 867 my ($self, $w, $h) = @_;
865 868
869 my $child = $self->child;
870
866 $w = $self->{child_w} if $self->{scroll_x} && $self->{child_w}; 871 $w = $child->{req_w} if $self->{scroll_x} && $child->{req_w};
867 $h = $self->{child_h} if $self->{scroll_y} && $self->{child_h}; 872 $h = $child->{req_h} if $self->{scroll_y} && $child->{req_h};
868 873
869 $self->child->configure (0, 0, $w, $h); 874 $self->child->configure (0, 0, $w, $h);
870 $self->update; 875 $self->update;
871} 876}
872 877
956 my $child = $self->{vp}->child; 961 my $child = $self->{vp}->child;
957 $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $child->{h}, $self->{vp}{h}, 1]); 962 $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $child->{h}, $self->{vp}{h}, 1]);
958} 963}
959 964
960sub size_allocate { 965sub size_allocate {
961 my ($self, $w, $h, $changed) = @_; 966 my ($self, $w, $h) = @_;
962 967
963 $self->SUPER::size_allocate ($w, $h, $changed); 968 $self->SUPER::size_allocate ($w, $h);
964 969
965 my $child = $self->{vp}->child; 970 my $child = $self->{vp}->child;
966 $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $child->{h}, $self->{vp}{h}, 1]); 971 $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $child->{h}, $self->{vp}{h}, 1]);
967} 972}
968 973
1061 $h + $self->border * 2, 1066 $h + $self->border * 2,
1062 ) 1067 )
1063} 1068}
1064 1069
1065sub size_allocate { 1070sub size_allocate {
1066 my ($self, $w, $h, $changed) = @_; 1071 my ($self, $w, $h) = @_;
1067
1068 return unless $changed;
1069 1072
1070 $h -= List::Util::max 0, $self->border * 2; 1073 $h -= List::Util::max 0, $self->border * 2;
1071 $w -= List::Util::max 0, $self->border * 2; 1074 $w -= List::Util::max 0, $self->border * 2;
1072 1075
1073 $self->{title}->configure ($self->border, int $self->border - $::FONTSIZE * 2, $w, int $::FONTSIZE * 2) 1076 $self->{title}->configure ($self->border, int $self->border - $::FONTSIZE * 2, $w, int $::FONTSIZE * 2)
1245 (sum @$hs), 1248 (sum @$hs),
1246 ) 1249 )
1247} 1250}
1248 1251
1249sub size_allocate { 1252sub size_allocate {
1250 my ($self, $w, $h, $changed) = @_; 1253 my ($self, $w, $h) = @_;
1251 1254
1252 my ($ws, $hs) = $self->get_wh; 1255 my ($ws, $hs) = $self->get_wh;
1253 1256
1254 my $req_w = (sum @$ws) || 1; 1257 my $req_w = (sum @$ws) || 1;
1255 my $req_h = (sum @$hs) || 1; 1258 my $req_h = (sum @$hs) || 1;
1333 (List::Util::max map $_->{req_h}, @{$self->{children}}), 1336 (List::Util::max map $_->{req_h}, @{$self->{children}}),
1334 ) 1337 )
1335} 1338}
1336 1339
1337sub size_allocate { 1340sub size_allocate {
1338 my ($self, $w, $h, $changed) = @_; 1341 my ($self, $w, $h) = @_;
1339 1342
1340 my $space = $self->{vertical} ? $h : $w; 1343 my $space = $self->{vertical} ? $h : $w;
1341 my $children = $self->{children}; 1344 my $children = $self->{children};
1342 1345
1343 my @req; 1346 my @req;
1517 1520
1518 ($w, $h) 1521 ($w, $h)
1519} 1522}
1520 1523
1521sub size_allocate { 1524sub size_allocate {
1522 my ($self, $w, $h, $changed) = @_; 1525 my ($self, $w, $h) = @_;
1523 1526
1524 delete $self->{texture} 1527 delete $self->{texture};
1525 if $changed;
1526} 1528}
1527 1529
1528sub set_fontsize { 1530sub set_fontsize {
1529 my ($self, $fontsize) = @_; 1531 my ($self, $fontsize) = @_;
1530 1532
2382 $self->{fontsize} = $fontsize; 2384 $self->{fontsize} = $fontsize;
2383 $self->reflow; 2385 $self->reflow;
2384} 2386}
2385 2387
2386sub size_allocate { 2388sub size_allocate {
2387 my ($self, $w, $h, $changed) = @_; 2389 my ($self, $w, $h) = @_;
2388 2390
2389 $self->SUPER::size_allocate ($w, $h, $changed); 2391 $self->SUPER::size_allocate ($w, $h);
2390
2391 return unless $changed;
2392 2392
2393 $self->{layout}->set_font ($self->{font}) if $self->{font}; 2393 $self->{layout}->set_font ($self->{font}) if $self->{font};
2394 $self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE); 2394 $self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE);
2395 $self->{layout}->set_width ($self->{children}[0]{w}); 2395 $self->{layout}->set_width ($self->{children}[0]{w});
2396 2396
2619} 2619}
2620 2620
2621sub set_tooltip_from { 2621sub set_tooltip_from {
2622 my ($self, $widget) = @_; 2622 my ($self, $widget) = @_;
2623 2623
2624 my $tooltip = $widget->{tooltip};
2625
2626 if ($ENV{CFPLUS_DEBUG} & 2) {
2627 $tooltip .= "\n\n" . (ref $widget) . "\n"
2628 . "$widget->{x} $widget->{y} $widget->{w} $widget->{h}\n"
2629 . "req $widget->{req_w} $widget->{req_h}\n"
2630 . "visible $widget->{visible}";
2631 }
2632
2624 $self->add (new CFClient::UI::Label 2633 $self->add (new CFClient::UI::Label
2625 markup => $widget->{tooltip}, 2634 markup => $tooltip,
2626 max_w => ($widget->{tooltip_width} || 0.25) * $::WIDTH, 2635 max_w => ($widget->{tooltip_width} || 0.25) * $::WIDTH,
2627 fontsize => 0.8, 2636 fontsize => 0.8,
2628 fg => [0, 0, 0, 1], 2637 fg => [0, 0, 0, 1],
2629 ellipsise => 0, 2638 ellipsise => 0,
2630 font => ($widget->{tooltip_font} || $::FONT_PROP), 2639 font => ($widget->{tooltip_font} || $::FONT_PROP),
2638 2647
2639 ($w + 4, $h + 4) 2648 ($w + 4, $h + 4)
2640} 2649}
2641 2650
2642sub size_allocate { 2651sub size_allocate {
2643 my ($self, $w, $h, $changed) = @_; 2652 my ($self, $w, $h) = @_;
2644 2653
2645 return unless $changed;
2646
2647 $self->SUPER::size_allocate ($w - 4, $h - 4, $changed); 2654 $self->SUPER::size_allocate ($w - 4, $h - 4);
2648} 2655}
2649 2656
2650sub visibility_change { 2657sub visibility_change {
2651 my ($self, $visible) = @_; 2658 my ($self, $visible) = @_;
2652 2659
3016 Scalar::Util::weaken ($self->{root} = $self); 3023 Scalar::Util::weaken ($self->{root} = $self);
3017 3024
3018 $self 3025 $self
3019} 3026}
3020 3027
3021sub configure {
3022 my ($self, $x, $y, $w, $h) = @_;
3023
3024 $self->{w} = $w;
3025 $self->{h} = $h;
3026}
3027
3028sub reconfigure {
3029 my ($self) = @_;
3030
3031 $self->SUPER::reconfigure;
3032
3033 $self->size_allocate ($self->{w}, $self->{h}, 1)
3034 if $self->{w};
3035}
3036
3037sub size_request { 3028sub size_request {
3038 my ($self) = @_; 3029 my ($self) = @_;
3039 3030
3040 ($self->{w}, $self->{h}) 3031 ($self->{w}, $self->{h})
3041} 3032}
3053 3044
3054 int $coord + 0.5 3045 int $coord + 0.5
3055} 3046}
3056 3047
3057sub size_allocate { 3048sub size_allocate {
3058 my ($self, $w, $h, $changed) = @_; 3049 my ($self, $w, $h) = @_;
3059 3050
3060 for my $child ($self->children) { 3051 for my $child ($self->children) {
3061 my ($X, $Y, $W, $H) = @$child{qw(x y req_w req_h)}; 3052 my ($X, $Y, $W, $H) = @$child{qw(x y req_w req_h)};
3062 3053
3063 $X = $child->{force_x} if exists $child->{force_x}; 3054 $X = $child->{force_x} if exists $child->{force_x};
3137 3128
3138 while () { 3129 while () {
3139 if ($self->{realloc}) { 3130 if ($self->{realloc}) {
3140 #TODO use array-of-depth approach 3131 #TODO use array-of-depth approach
3141 3132
3133 use sort 'stable';
3134
3142 @queue = sort { $a->{visible} <=> $b->{visible} } 3135 @queue = sort { $a->{visible} <=> $b->{visible} }
3143 @queue, values %{delete $self->{realloc}}; 3136 @queue, values %{delete $self->{realloc}};
3144 } 3137 }
3145 3138
3146 my $widget = pop @queue || last; 3139 my $widget = pop @queue || last;
3153 $h = List::Util::max $widget->{min_h}, $h + $widget->{padding_y} * 2; 3146 $h = List::Util::max $widget->{min_h}, $h + $widget->{padding_y} * 2;
3154 3147
3155 $w = $widget->{force_w} if exists $widget->{force_w}; 3148 $w = $widget->{force_w} if exists $widget->{force_w};
3156 $h = $widget->{force_h} if exists $widget->{force_h}; 3149 $h = $widget->{force_h} if exists $widget->{force_h};
3157 3150
3151 if ($widget->{req_w} != $w || $widget->{req_h} != $h
3152 || delete $widget->{force_realloc}) {
3158 $widget->{req_w} = $w; 3153 $widget->{req_w} = $w;
3159 $widget->{req_h} = $h; 3154 $widget->{req_h} = $h;
3160 3155
3161 $self->{size_alloc}{$widget} = [$widget, undef, undef]; 3156 $self->{size_alloc}{$widget+0} = $widget;
3162 3157
3163 push @queue, $widget->{parent} 3158 if (my $parent = $widget->{parent}) {
3164 if ($self->{w} != $w || $self->{h} != $h) && $widget->{parent}; 3159 $self->{realloc}{$parent+0} = $parent;
3160 #unshift @queue, $parent;
3161 $parent->{force_size_alloc} = 1;
3162 $self->{size_alloc}{$parent+0} = $parent;
3163 }
3164 }
3165
3166 delete $self->{realloc}{$widget+0};
3165 } 3167 }
3166 } 3168 }
3167 3169
3168 while (my $size_alloc = delete $self->{size_alloc}) { 3170 while (my $size_alloc = delete $self->{size_alloc}) {
3169 my @queue = sort $b->[0]{visible} <=> $a->[0]{visible}, 3171 my @queue = sort { $b->{visible} <=> $a->{visible} }
3170 values %$size_alloc; 3172 values %$size_alloc;
3171 3173
3172 while () { 3174 while () {
3173 my ($widget, $w, $h) = @{ pop @queue or last }; 3175 my $widget = pop @queue || last;
3174 3176
3175 $w = $widget->{w} || $widget->{req_w} unless defined $w; 3177 my ($w, $h) = @$widget{qw(alloc_w alloc_h)};
3176 $h = $widget->{h} || $widget->{req_h} unless defined $h;
3177 3178
3178 $w = 0 if $w < 0; 3179 $w = 0 if $w < 0;
3179 $h = 0 if $h < 0; 3180 $h = 0 if $h < 0;
3180 3181
3181 $w = int $w + 0.5; 3182 $w = int $w + 0.5;
3182 $h = int $h + 0.5; 3183 $h = int $h + 0.5;
3183 3184
3184 my $changed = $widget->{w} != $w || $widget->{h} != $h; 3185 if ($widget->{w} != $w || $widget->{h} != $h || delete $widget->{force_size_alloc}) {
3185
3186 $widget->{w} = $w; 3186 $widget->{w} = $w;
3187 $widget->{h} = $h; 3187 $widget->{h} = $h;
3188 3188
3189 $widget->emit (size_allocate => $w, $h, $changed); 3189 $widget->emit (size_allocate => $w, $h);
3190 }
3190 } 3191 }
3191 } 3192 }
3192 3193
3193 while ($self->{post_alloc_hook}) { 3194 while ($self->{post_alloc_hook}) {
3194 $_->() 3195 $_->()
3195 for values %{delete $self->{post_alloc_hook}}; 3196 for values %{delete $self->{post_alloc_hook}};
3196 } 3197 }
3198
3197 3199
3198 glViewport 0, 0, $::WIDTH, $::HEIGHT; 3200 glViewport 0, 0, $::WIDTH, $::HEIGHT;
3199 glClearColor +($::CFG->{fow_intensity}) x 3, 1; 3201 glClearColor +($::CFG->{fow_intensity}) x 3, 1;
3200 glClear GL_COLOR_BUFFER_BIT; 3202 glClear GL_COLOR_BUFFER_BIT;
3201 3203

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines