package GCE::AttrEdit; =head1 NAME GCE::AttrEdit - an edit wiget for attributes =cut use Gtk2; use Gtk2::Gdk::Keysyms; use Gtk2::SimpleList; use Glib::Object::Subclass Gtk2::VBox; use GCE::AttrList; use Crossfire; sub INIT_INSTANCE { my ($self) = @_; $self->pack_start (my $lbl = $self->{arch_name_lbl} = Gtk2::Label->new, 0, 1, 0); $self->pack_start (my $ntbook = $self->{ntbook} = Gtk2::Notebook->new, 1, 1, 0); $self->pack_start (my $hb = Gtk2::HBox->new, 0, 1, 0); $hb->pack_start (my $ek = $self->{new_attrkey_entry} = Gtk2::Entry->new, 0, 1, 0); $hb->pack_start (my $ev = $self->{new_attrval_entry} = Gtk2::Entry->new, 0, 1, 0); $ek->signal_connect (activate => sub { $ev->grab_focus; }); $ev->signal_connect (activate => sub { my ($e) = @_; $self->set_attr ($ek->get_text, $ev->get_text); $ev->set_text (''); $ek->set_text (''); }); my $al = $self->{al} = GCE::AttrList->new (editable => 1, raw => 0); $ntbook->append_page ($al, "obj attrs"); $al->set_arch_cb (sub { $self->update_arch (@_) }); $al = $self->{raw_al} = GCE::AttrList->new (editable => 1); $ntbook->append_page ($al, "raw attrs"); $al->set_arch_cb (sub { $self->update_arch (@_) }); $al = $self->{al_arch} = GCE::AttrList->new (editable => 0); $ntbook->append_page ($al, "arch attrs"); $al->set_arch_cb (sub { $self->update_arch (@_) }); # XXX: Implement autosave! for my $type (qw/lore msg/) { $ntbook->append_page (my $vb = Gtk2::VBox->new, $type); $vb->pack_start (my $txtv = $self->{"${type}_view"} = Gtk2::TextView->new, 1, 1, 0); $vb->pack_start (my $btn = Gtk2::Button->new_with_label ("save $type"), 0, 1, 0); $btn->signal_connect (clicked => sub { my $txtbuf = $txtv->get_buffer; my ($start_iter, $end_iter) = ($txtbuf->get_start_iter, $txtbuf->get_end_iter); my $txt = $txtv->get_buffer ()->get_text ($start_iter, $end_iter, 0); $self->update_arch ($self->{arch}, $type, $txt); }); } } sub update_arch { my ($self, $arch, $key, $value) = @_; if ($value ne '') { $arch->{$key} = $value; } else { delete $arch->{$key}; } # XXX: maybe update a little bit more intelligent... $self->set_arch ($arch); } sub set_attr { my ($self, $key, $value) = @_; my $attr = $self->{arch}->{$key}; unless (ref $attr) { $self->update_arch ($self->{arch}, $key, $value); } } sub set_arch { my ($self, $arch, $ro) = @_; $self->{arch} = $arch; if ($ro) { $self->{al}->set (editable => 0); $self->{raw_al}->set (editable => 0); $self->{msg_view}->set (editable => 0); $self->{lore_view}->set (editable => 0); $self->{new_attrkey_entry}->set (sensitive => 0); $self->{new_attrval_entry}->set (sensitive => 0); } else { $self->{al}->set (editable => 1); $self->{raw_al}->set (editable => 1); $self->{msg_view}->set (editable => 1); $self->{lore_view}->set (editable => 1); $self->{new_attrkey_entry}->set (sensitive => 1); $self->{new_attrval_entry}->set (sensitive => 1); } $self->{al}->set_arch ($arch); $self->{raw_al}->set_arch ($arch); $self->{msg_view}->get_buffer ()->set_text ($arch->{msg}); $self->{lore_view}->get_buffer ()->set_text ($arch->{lore}); $self->{arch_name_lbl}->set_text ( $arch->{_name} . ($arch->{name} ? " - $arch->{name}" : "") ); my $al_arch = $Crossfire::ARCH->{$arch->{_name}}; if ($al_arch) { $self->{al_arch}->set_arch ($al_arch); } else { $self->{al_arch}->set_arch ({ noarch => 'noarch' }); } } =head1 AUTHOR Marc Lehmann http://home.schmorp.de/ Robin Redeker http://www.ta-sa.org/ =cut 1;