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.271 by root, Fri Jun 2 22:13:47 2006 UTC vs.
Revision 1.276 by root, Sun Jun 4 00:16:01 2006 UTC

371sub size_allocate { 371sub size_allocate {
372 # nothing to be done 372 # nothing to be done
373} 373}
374 374
375sub children { 375sub children {
376 # nop
377}
378
379sub visible_children {
380 $_[0]->children
376} 381}
377 382
378sub set_max_size { 383sub set_max_size {
379 my ($self, $w, $h) = @_; 384 my ($self, $w, $h) = @_;
380 385
663our @ISA = CFClient::UI::Base::; 668our @ISA = CFClient::UI::Base::;
664 669
665sub new { 670sub new {
666 my ($class, %arg) = @_; 671 my ($class, %arg) = @_;
667 672
668 my $children = delete $arg{children} || []; 673 my $children = delete $arg{children};
669 674
670 my $self = $class->SUPER::new ( 675 my $self = $class->SUPER::new (
671 children => [], 676 children => [],
672 can_events => 0, 677 can_events => 0,
673 %arg, 678 %arg,
674 ); 679 );
680
675 $self->add ($_) for @$children; 681 $self->add (@$children)
682 if $children;
676 683
677 $self 684 $self
678} 685}
679 686
680sub add { 687sub add {
728 $x -= $self->{x}; 735 $x -= $self->{x};
729 $y -= $self->{y}; 736 $y -= $self->{y};
730 737
731 my $res; 738 my $res;
732 739
733 for (reverse @{ $self->{children} }) { 740 for (reverse $self->visible_children) {
734 $res = $_->find_widget ($x, $y) 741 $res = $_->find_widget ($x, $y)
735 and return $res; 742 and return $res;
736 } 743 }
737 744
738 $self->SUPER::find_widget ($x + $self->{x}, $y + $self->{y}) 745 $self->SUPER::find_widget ($x + $self->{x}, $y + $self->{y})
786 793
787 $self->{children}[0]->configure (0, 0, $w, $h); 794 $self->{children}[0]->configure (0, 0, $w, $h);
788} 795}
789 796
790############################################################################# 797#############################################################################
798
799# back-buffered drawing area
791 800
792package CFClient::UI::Window; 801package CFClient::UI::Window;
793 802
794our @ISA = CFClient::UI::Bin::; 803our @ISA = CFClient::UI::Bin::;
795 804
948package CFClient::UI::ScrolledWindow; 957package CFClient::UI::ScrolledWindow;
949 958
950our @ISA = CFClient::UI::HBox::; 959our @ISA = CFClient::UI::HBox::;
951 960
952sub new { 961sub new {
953 my $class = shift; 962 my ($class, %arg) = @_;
963
964 my $child = delete $arg{child};
954 965
955 my $self; 966 my $self;
956 967
957 my $slider = new CFClient::UI::Slider 968 my $slider = new CFClient::UI::Slider
958 vertical => 1, 969 vertical => 1,
963 ; 974 ;
964 975
965 $self = $class->SUPER::new ( 976 $self = $class->SUPER::new (
966 vp => (new CFClient::UI::ViewPort expand => 1), 977 vp => (new CFClient::UI::ViewPort expand => 1),
967 slider => $slider, 978 slider => $slider,
968 @_, 979 %arg,
969 ); 980 );
970 981
971 $self->{vp}->add ($self->{scrolled});
972 $self->add ($self->{vp});
973 $self->add ($self->{slider}); 982 $self->SUPER::add ($self->{vp}, $self->{slider});
983 $self->add ($child) if $child;
974 984
975 $self 985 $self
986}
987
988sub add {
989 my ($self, $widget) = @_;
990
991 $self->{vp}->add ($self->{child} = $widget);
976} 992}
977 993
978sub update { 994sub update {
979 my ($self) = @_; 995 my ($self) = @_;
980 996
1660 1676
1661 delete $self->{cur_h}; 1677 delete $self->{cur_h};
1662 1678
1663 return if $self->{text} eq $text; 1679 return if $self->{text} eq $text;
1664 1680
1665 delete $self->{texture};
1666
1667 $self->{last_activity} = $::NOW; 1681 $self->{last_activity} = $::NOW;
1668 $self->{text} = $text; 1682 $self->{text} = $text;
1669 1683
1670 $text =~ s/./*/g if $self->{hidden}; 1684 $text =~ s/./*/g if $self->{hidden};
1671 $self->{layout}->set_text ("$text "); 1685 $self->{layout}->set_text ("$text ");
1672 1686
1673 $self->_emit (changed => $self->{text}); 1687 $self->_emit (changed => $self->{text});
1688 $self->update;
1674} 1689}
1675 1690
1676sub set_text { 1691sub set_text {
1677 my ($self, $text) = @_; 1692 my ($self, $text) = @_;
1678 1693
2328} 2343}
2329 2344
2330sub update { 2345sub update {
2331 my ($self) = @_; 2346 my ($self) = @_;
2332 2347
2333 $CFClient::UI::ROOT->on_post_alloc ($self => sub { 2348 delete $self->{knob_w};
2349 $self->SUPER::update;
2350}
2351
2352sub _draw {
2353 my ($self) = @_;
2354
2355 unless ($self->{knob_w}) {
2334 $self->set_value ($self->{range}[0]); 2356 $self->set_value ($self->{range}[0]);
2335 2357
2336 my ($value, $lo, $hi, $page) = @{$self->{range}}; 2358 my ($value, $lo, $hi, $page) = @{$self->{range}};
2337 my $range = ($hi - $page - $lo) || 1e-100; 2359 my $range = ($hi - $page - $lo) || 1e-100;
2338 2360
2344 $value = ($value - $lo) / $range; 2366 $value = ($value - $lo) / $range;
2345 $value = $value * $self->{scale} + $self->{offset}; 2367 $value = $value * $self->{scale} + $self->{offset};
2346 2368
2347 $self->{knob_x} = $value - $knob_w * 0.5; 2369 $self->{knob_x} = $value - $knob_w * 0.5;
2348 $self->{knob_w} = $knob_w; 2370 $self->{knob_w} = $knob_w;
2349 }); 2371 }
2350
2351 $self->SUPER::update;
2352}
2353
2354sub _draw {
2355 my ($self) = @_;
2356 2372
2357 $self->SUPER::_draw (); 2373 $self->SUPER::_draw ();
2358 2374
2359 glScale $self->{w}, $self->{h}; 2375 glScale $self->{w}, $self->{h};
2360 2376
2854 $self->SUPER::DESTROY; 2870 $self->SUPER::DESTROY;
2855} 2871}
2856 2872
2857############################################################################# 2873#############################################################################
2858 2874
2875package CFClient::UI::Buttonbar;
2876
2877our @ISA = CFClient::UI::HBox::;
2878
2879# TODO: should actualyl wrap buttons and other goodies.
2880
2881#############################################################################
2882
2859package CFClient::UI::Menu; 2883package CFClient::UI::Menu;
2860 2884
2861our @ISA = CFClient::UI::FancyFrame::; 2885our @ISA = CFClient::UI::FancyFrame::;
2862 2886
2863use CFClient::OpenGL; 2887use CFClient::OpenGL;
2928 } else { 2952 } else {
2929 return 0 2953 return 0
2930 } 2954 }
2931 2955
2932 1 2956 1
2957}
2958
2959#############################################################################
2960
2961package CFClient::UI::Multiplexer;
2962
2963our @ISA = CFClient::UI::Container::;
2964
2965sub new {
2966 my $class = shift;
2967
2968 my $self = $class->SUPER::new (
2969 @_,
2970 );
2971
2972 $self->{current} = $self->{children}[0]
2973 if @{ $self->{children} };
2974
2975 $self
2976}
2977
2978sub add {
2979 my ($self, @widgets) = @_;
2980
2981 $self->SUPER::add (@widgets);
2982
2983 $self->{current} = $self->{children}[0]
2984 if @{ $self->{children} };
2985}
2986
2987sub set_current_page {
2988 my ($self, $page_or_widget) = @_;
2989
2990 my $widget = ref $page_or_widget
2991 ? $page_or_widget
2992 : $self->{children}[$page_or_widget];
2993
2994 $self->{current} = $widget;
2995 $self->{current}->configure (0, 0, $self->{w}, $self->{h});
2996
2997 $self->_emit (page_changed => $self->{current});
2998
2999 $self->realloc;
3000}
3001
3002sub visible_children {
3003 $_[0]{current}
3004}
3005
3006sub size_request {
3007 my ($self) = @_;
3008
3009 $self->{current}->size_request
3010}
3011
3012sub size_allocate {
3013 my ($self, $w, $h) = @_;
3014
3015 $self->{current}->configure (0, 0, $w, $h);
3016}
3017
3018sub _draw {
3019 my ($self) = @_;
3020
3021 $self->{current}->draw;
3022}
3023
3024#############################################################################
3025
3026package CFClient::UI::Notebook;
3027
3028our @ISA = CFClient::UI::VBox::;
3029
3030sub new {
3031 my $class = shift;
3032
3033 my $self = $class->SUPER::new (
3034 buttonbar => (new CFClient::UI::Buttonbar),
3035 multiplexer => (new CFClient::UI::Multiplexer expand => 1),
3036 # filter => # will be put between multiplexer and $self
3037 @_,
3038 );
3039
3040 $self->{filter}->add ($self->{multiplexer}) if $self->{filter};
3041 $self->SUPER::add ($self->{buttonbar}, $self->{filter} || $self->{multiplexer});
3042
3043 $self
3044}
3045
3046sub add {
3047 my ($self, $title, $widget, $tooltip) = @_;
3048
3049 Scalar::Util::weaken $self;
3050
3051 $self->{buttonbar}->add (new CFClient::UI::Button
3052 markup => $title,
3053 tooltip => $tooltip,
3054 on_activate => sub { $self->set_current_page ($widget) },
3055 );
3056
3057 $self->{multiplexer}->add ($widget);
3058}
3059
3060sub set_current_page {
3061 my ($self, $page) = @_;
3062
3063 $self->{multiplexer}->set_current_page ($page);
3064 $self->_emit (page_changed => $self->{multiplexer}{current});
2933} 3065}
2934 3066
2935############################################################################# 3067#############################################################################
2936 3068
2937package CFClient::UI::Statusbox; 3069package CFClient::UI::Statusbox;
3050 3182
3051sub new { 3183sub new {
3052 my $class = shift; 3184 my $class = shift;
3053 3185
3054 my $self = $class->SUPER::new ( 3186 my $self = $class->SUPER::new (
3055 scrolled => (new CFClient::UI::Table col_expand => [0, 1, 0]), 3187 child => (new CFClient::UI::Table col_expand => [0, 1, 0]),
3056 @_, 3188 @_,
3057 ); 3189 );
3058 3190
3059 $self 3191 $self
3060} 3192}
3061 3193
3062sub set_items { 3194sub set_items {
3063 my ($self, $items) = @_; 3195 my ($self, $items) = @_;
3064 3196
3065 $self->{scrolled}->clear; 3197 $self->{child}->clear;
3066 return unless $items; 3198 return unless $items;
3067 3199
3068 my @items = sort { 3200 my @items = sort {
3069 ($a->{type} <=> $b->{type}) 3201 ($a->{type} <=> $b->{type})
3070 or ($a->{name} cmp $b->{name}) 3202 or ($a->{name} cmp $b->{name})
3074 3206
3075 my $row = 0; 3207 my $row = 0;
3076 for my $item (@items) { 3208 for my $item (@items) {
3077 CFClient::Item::update_widgets $item; 3209 CFClient::Item::update_widgets $item;
3078 3210
3079 $self->{scrolled}->add (0, $row, $item->{face_widget}); 3211 $self->{child}->add (0, $row, $item->{face_widget});
3080 $self->{scrolled}->add (1, $row, $item->{desc_widget}); 3212 $self->{child}->add (1, $row, $item->{desc_widget});
3081 $self->{scrolled}->add (2, $row, $item->{weight_widget}); 3213 $self->{child}->add (2, $row, $item->{weight_widget});
3082 3214
3083 $row++; 3215 $row++;
3084 } 3216 }
3085} 3217}
3086 3218
3283 3415
3284############################################################################# 3416#############################################################################
3285 3417
3286package CFClient::UI::SpellList; 3418package CFClient::UI::SpellList;
3287 3419
3288our @ISA = CFClient::UI::FancyFrame::; 3420our @ISA = CFClient::UI::Table::;
3289 3421
3290sub new { 3422sub new {
3291 my $class = shift; 3423 my $class = shift;
3292 3424
3293 my $self = $class->SUPER::new (binding => [], commands => [], @_); 3425 my $self = $class->SUPER::new (
3294 3426 binding => [],
3295 $self->add (new CFClient::UI::ScrolledWindow 3427 commands => [],
3296 scrolled => $self->{spellbox} = new CFClient::UI::Table); 3428 @_,
3297 3429 )
3298 $self;
3299} 3430}
3300 3431
3301# XXX: Do sorting? Argl... 3432# XXX: Do sorting? Argl...
3302sub add_spell { 3433sub add_spell {
3303 my ($self, $spell) = @_; 3434 my ($self, $spell) = @_;
3304 $self->{spells}->{$spell->{name}} = $spell; 3435 $self->{spells}->{$spell->{name}} = $spell;
3305 3436
3306 $self->{spellbox}->add (0, $self->{tbl_idx}, new CFClient::UI::Face 3437 $self->add (0, $self->{tbl_idx}, new CFClient::UI::Face
3307 face => $spell->{face}, 3438 face => $spell->{face},
3308 can_hover => 1, 3439 can_hover => 1,
3309 can_events => 1, 3440 can_events => 1,
3310 tooltip => $spell->{message}); 3441 tooltip => $spell->{message});
3311 3442
3312 $self->{spellbox}->add (1, $self->{tbl_idx}, new CFClient::UI::Label 3443 $self->add (1, $self->{tbl_idx}, new CFClient::UI::Label
3313 text => $spell->{name}, 3444 text => $spell->{name},
3314 can_hover => 1, 3445 can_hover => 1,
3315 can_events => 1, 3446 can_events => 1,
3316 tooltip => $spell->{message}, 3447 tooltip => $spell->{message},
3317 expand => 1); 3448 expand => 1);
3318 3449
3319 $self->{spellbox}->add (2, $self->{tbl_idx}, new CFClient::UI::Label 3450 $self->add (2, $self->{tbl_idx}, new CFClient::UI::Label
3320 text => (sprintf "lvl: %2d sp: %2d dmg: %2d", 3451 text => (sprintf "lvl: %2d sp: %2d dmg: %2d",
3321 $spell->{level}, ($spell->{mana} || $spell->{grace}), $spell->{damage}), 3452 $spell->{level}, ($spell->{mana} || $spell->{grace}), $spell->{damage}),
3322 expand => 1); 3453 expand => 1);
3323 3454
3324 $self->{spellbox}->add (3, $self->{tbl_idx}++, new CFClient::UI::Button 3455 $self->add (3, $self->{tbl_idx}++, new CFClient::UI::Button
3325 text => "bind to key", 3456 text => "bind to key",
3326 on_activate => sub { $::BIND_EDITOR->do_quick_binding (["cast $spell->{name}"]) }); 3457 on_activate => sub { $::BIND_EDITOR->do_quick_binding (["cast $spell->{name}"]) });
3327} 3458}
3328 3459
3329sub rebuild_spell_list { 3460sub rebuild_spell_list {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines