--- deliantra/Deliantra-Client/DC/UI.pm 2006/12/08 22:25:32 1.360 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/12/09 02:21:25 1.361 @@ -264,6 +264,7 @@ my ($self) = @_; $self->hide; + $self->emit ("destroy"); %$self = (); } @@ -506,6 +507,12 @@ } } +sub disconnect_all { + my ($self, $signal) = @_; + + delete $self->{signal_cb}{$signal}; +} + my %has_coords = ( button_down => 1, button_up => 1, @@ -640,10 +647,10 @@ return if CFPlus::in_destruct; - delete $WIDGET{$self+0}; - eval { $self->destroy }; warn "exception during widget destruction: $@" if $@ & $@ != /during global destruction/; + + delete $WIDGET{$self+0}; } ############################################################################# @@ -3753,191 +3760,6 @@ } ############################################################################# - -package CFPlus::UI::Inventory; - -our @ISA = CFPlus::UI::Table::; - -sub new { - my $class = shift; - - my $self = $class->SUPER::new ( - col_expand => [0, 1, 0], - items => [], - @_, - ); - - $self->set_sort_order (undef); - - $self -} - -sub update_items { - my ($self) = @_; - - $self->clear; - - my @item = $self->{sort}->(@{ $self->{items} }); - - my @adds; - my $row = 0; - for my $item ($self->{sort}->(@{ $self->{items} })) { - CFPlus::Item::update_widgets $item; - - push @adds, 0, $row, $item->{face_widget}; - push @adds, 1, $row, $item->{desc_widget}; - push @adds, 2, $row, $item->{weight_widget}; - - $row++; - } - - $self->add (@adds); -} - -sub set_sort_order { - my ($self, $order) = @_; - - $self->{sort} = $order ||= sub { - sort { - $a->{type} <=> $b->{type} - or $a->{name} cmp $b->{name} - } @_ - }; - - $self->update_items; -} - -sub set_items { - my ($self, $items) = @_; - - $self->{items} = [$items ? values %$items : ()]; - $self->update_items; -} - -############################################################################# - -package CFPlus::UI::SpellList; - -our @ISA = CFPlus::UI::Table::; - -sub new { - my $class = shift; - - my $self = $class->SUPER::new ( - binding => [], - commands => [], - @_, - ) -} - -my $TOOLTIP_ALL = "\n\nLeft click - ready spell\nMiddle click - invoke spell\nRight click - further options"; - -my @TOOLTIP_NAME = (align => -1, can_events => 1, can_hover => 1, tooltip => - "Name. The name of the spell.$TOOLTIP_ALL"); -my @TOOLTIP_SKILL = (align => -1, can_events => 1, can_hover => 1, tooltip => - "Skill. The skill (or magic school) required to be able to attempt casting this spell.$TOOLTIP_ALL"); -my @TOOLTIP_LVL = (align => 1, can_events => 1, can_hover => 1, tooltip => - "Level. Minimum level the caster needs in the associated skill to be able to attempt casting this spell.$TOOLTIP_ALL"); -my @TOOLTIP_SP = (align => 1, can_events => 1, can_hover => 1, tooltip => - "Spell points / Grace points. Amount of spell or grace points used by each invocation.$TOOLTIP_ALL"); -my @TOOLTIP_DMG = (align => 1, can_events => 1, can_hover => 1, tooltip => - "Damage. The amount of damage the spell deals when it hits.$TOOLTIP_ALL"); - -sub rebuild_spell_list { - my ($self) = @_; - - $CFPlus::UI::ROOT->on_refresh ($self => sub { - $self->clear; - - return unless $::CONN; - - $self->add (1, 0, new CFPlus::UI::Label text => "Spell Name", @TOOLTIP_NAME); - $self->add (2, 0, new CFPlus::UI::Label text => "Skill", @TOOLTIP_SKILL); - $self->add (3, 0, new CFPlus::UI::Label text => "Lvl" , @TOOLTIP_LVL); - $self->add (4, 0, new CFPlus::UI::Label text => "Sp/Gp", @TOOLTIP_SP); - $self->add (5, 0, new CFPlus::UI::Label text => "Dmg" , @TOOLTIP_DMG); - - my $row = 0; - - for (sort { $a cmp $b } keys %{ $self->{spell} }) { - my $spell = $self->{spell}{$_}; - - $row++; - - my $spell_cb = sub { - my ($widget, $ev) = @_; - - if ($ev->{button} == 1) { - $::CONN->user_send ("cast $spell->{name}"); - } elsif ($ev->{button} == 2) { - $::CONN->user_send ("invoke $spell->{name}"); - } elsif ($ev->{button} == 3) { - my $shortname = CFPlus::shorten $spell->{name}, 14; - (new CFPlus::UI::Menu - items => [ - ["bind cast $shortname to a key" => sub { $::BIND_EDITOR->do_quick_binding (["cast $spell->{name}"]) }], - ["bind invoke $shortname to a key" => sub { $::BIND_EDITOR->do_quick_binding (["invoke $spell->{name}"]) }], - ], - )->popup ($ev); - } else { - return 0; - } - - 1 - }; - - my $tooltip = (CFPlus::asxml $spell->{message}) . $TOOLTIP_ALL; - - #TODO: add path info to tooltip - #$self->add (6, $row, new CFPlus::UI::Label text => $spell->{path}); - - $self->add (0, $row, new CFPlus::UI::Face - face => $spell->{face}, - can_hover => 1, - can_events => 1, - tooltip => $tooltip, - on_button_down => $spell_cb, - ); - - $self->add (1, $row, new CFPlus::UI::Label - expand => 1, - text => $spell->{name}, - can_hover => 1, - can_events => 1, - tooltip => $tooltip, - on_button_down => $spell_cb, - ); - - $self->add (2, $row, new CFPlus::UI::Label text => $::CONN->{skill_info}{$spell->{skill}}, @TOOLTIP_SKILL); - $self->add (3, $row, new CFPlus::UI::Label text => $spell->{level}, @TOOLTIP_LVL); - $self->add (4, $row, new CFPlus::UI::Label text => $spell->{mana} || $spell->{grace}, @TOOLTIP_SP); - $self->add (5, $row, new CFPlus::UI::Label text => $spell->{damage}, @TOOLTIP_DMG); - } - }); -} - -sub add_spell { - my ($self, $spell) = @_; - - $self->{spell}->{$spell->{name}} = $spell; - $self->rebuild_spell_list; -} - -sub remove_spell { - my ($self, $spell) = @_; - - delete $self->{spell}->{$spell->{name}}; - $self->rebuild_spell_list; -} - -sub clear_spells { - my ($self) = @_; - - $self->{spell} = {}; - $self->rebuild_spell_list; -} - -############################################################################# package CFPlus::UI::Root;