package GCE::AttachEditor; =head1 NAME GCE::AttachEditor - this is a editor for attachments for maps and objects =cut use Gtk2; use Gtk2::Gdk::Keysyms; use Gtk2::SimpleMenu; use Crossfire; use GCE::Util; use Glib::Object::Subclass Gtk2::Window; use Storable qw/dclone/; use strict; sub save_layout { my ($self) = @_; $::CFG->{attach_editor} = ::get_pos_and_size ($self); } sub INIT_INSTANCE { my ($self) = @_; $self->set_title ("gcrossedit - attachment editor"); ::set_pos_and_size ($self, $::CFG->{attach_editor}, 200, 300, 200, 0); } sub update_attachments { my ($self, $name, $args) = @_; for (@{$self->{attach}}) { if ($_->[0] eq $name) { @$_ = ($name, $args); $name = undef; last; } } if ($name) { push @{$self->{attach}}, [$name, $args]; $self->{ntbook}->append_page ($self->make_page ($name, $args), $name); $self->{ntbook}->show_all; } $self->{upd_cb}->($self->{attach}); return; } sub kill_attachment { my ($self, $pos) = @_; my $name = $self->{ntbook}->get_tab_label_text ($self->{ntbook}->get_nth_page ($pos)); $self->{ntbook}->remove_page ($pos); @{$self->{attach}} = grep { $_->[0] ne $name } @{$self->{attach}}; $self->{upd_cb}->($self->{attach}); } sub set_attachment { my ($self, $attach, $update_cb) = @_; $self->{upd_cb} = $update_cb or die "No update callback given!"; $self->{attach} = $attach; my $ntbook = $self->{ntbook} = Gtk2::Notebook->new; $ntbook->set_scrollable (1); for (@$attach) { $ntbook->append_page ($self->make_page (@$_), $_->[0]); } $self->remove ($self->get_child) if $self->get_child; $self->add ($ntbook); $self->show_all; } sub make_page { my ($self, $name, $args) = @_; my $vb = Gtk2::VBox->new; $vb->pack_start (my $kb = Gtk2::Button->new ("kill"), 0, 1, 0); $kb->signal_connect (clicked => sub { $self->kill_attachment ($self->{ntbook}->page_num ($vb)); 1 }); my $rows = scalar (keys %$args); my $cols = 3; $vb->pack_start (my $tbl = Gtk2::Table->new ($rows, $cols), 1, 1, 0); my $i = 0; for my $key (keys %$args) { $tbl->attach (my $ed = Gtk2::Entry->new, 0, 1, $i, $i + 1, ['fill'], 'fill', 0, 0); $ed->set_text ($ed->{key} = $key); $ed->signal_connect (changed => sub { my ($ed) = @_; my $newkey = $ed->get_text; my $val = delete $args->{$ed->{key}}; $args->{$ed->{key} = $newkey} = $val; $self->update_attachments ($name, $args); 0 }); $tbl->attach (my $ed2 = Gtk2::Entry->new, 1, 2, $i, $i + 1, ['fill', 'expand'], 'fill', 0, 0); $ed2->set_text ($ed2->{value} = $args->{$key}); $ed2->signal_connect (changed => sub { my ($ed2) = @_; $args->{$key} = $ed2->get_text; $self->update_attachments ($name, $args); 0 }); $i++; } $vb } =head1 AUTHOR Robin Redeker http://www.ta-sa.org/ =cut 1;