ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/AttrEdit.pm
Revision: 1.7
Committed: Mon Feb 20 13:30:28 2006 UTC (18 years, 3 months ago) by elmex
Branch: MAIN
Changes since 1.6: +10 -4 lines
Log Message:
implemented edit actions and layout saving

File Contents

# Content
1 package GCE::AttrEdit;
2
3 =head1 NAME
4
5 GCE::AttrEdit - an edit wiget for attributes
6
7 =cut
8
9 use Gtk2;
10 use Gtk2::Gdk::Keysyms;
11 use Gtk2::SimpleList;
12
13 use Glib::Object::Subclass Gtk2::VBox;
14
15 use GCE::AttrList;
16
17 use Crossfire;
18
19 sub INIT_INSTANCE {
20 my ($self) = @_;
21
22 $self->pack_start (my $lbl = $self->{arch_name_lbl} = Gtk2::Label->new, 0, 1, 0);
23 $self->pack_start (my $ntbook = $self->{ntbook} = Gtk2::Notebook->new, 1, 1, 0);
24 $self->pack_start (my $hb = Gtk2::HBox->new (1, 0), 0, 1, 0);
25 $hb->pack_start (my $ek = $self->{new_attrkey_entry} = Gtk2::Entry->new, 1, 1, 0);
26 $hb->pack_start (my $ev = $self->{new_attrval_entry} = Gtk2::Entry->new, 1, 1, 0);
27 $ek->signal_connect (activate => sub {
28 $ev->grab_focus;
29 });
30 $ev->signal_connect (activate => sub {
31 my ($e) = @_;
32
33 $self->set_attr ($ek->get_text, $ev->get_text);
34 $ev->set_text ('');
35 $ek->set_text ('');
36 });
37
38 my $al = $self->{al} = GCE::AttrList->new (editable => 1, raw => 0);
39 $ntbook->append_page ($al, "obj attrs");
40 $al->set_arch_cb (sub { $self->update_arch (@_) });
41
42 $al = $self->{raw_al} = GCE::AttrList->new (editable => 1);
43 $ntbook->append_page ($al, "raw attrs");
44 $al->set_arch_cb (sub { $self->update_arch (@_) });
45
46 $al = $self->{al_arch} = GCE::AttrList->new (editable => 0);
47 $ntbook->append_page ($al, "arch attrs");
48 $al->set_arch_cb (sub { $self->update_arch (@_) });
49
50 # XXX: Implement autosave!
51 for my $type (qw/lore msg/) {
52
53 $ntbook->append_page (my $vb = Gtk2::VBox->new, $type);
54 $vb->pack_start (my $txtv = $self->{"${type}_view"} = Gtk2::TextView->new, 1, 1, 0);
55 $vb->pack_start (my $btn = Gtk2::Button->new_with_label ("save $type"), 0, 1, 0);
56 $btn->signal_connect (clicked => sub {
57
58 my $txtbuf = $txtv->get_buffer;
59
60 my ($start_iter, $end_iter) = ($txtbuf->get_start_iter, $txtbuf->get_end_iter);
61 my $txt = $txtv->get_buffer ()->get_text ($start_iter, $end_iter, 0);
62
63 $self->update_arch ($self->{arch}, $type, $txt);
64 });
65 }
66 }
67
68 sub update_arch {
69 my ($self, $arch, $key, $value) = @_;
70
71 if ($value ne '') {
72
73 $arch->{$key} = $value;
74
75 } else {
76
77 delete $arch->{$key};
78 }
79
80 $self->{change_cb}->($arch)
81 if defined $self->{change_cb};
82
83 # XXX: maybe update a little bit more intelligent...
84 $self->set_arch ($arch, $self->{change_cb});
85 }
86
87 sub set_attr {
88 my ($self, $key, $value) = @_;
89
90 my $attr = $self->{arch}->{$key};
91
92 unless (ref $attr) {
93
94 $self->update_arch ($self->{arch}, $key, $value);
95 }
96 }
97
98 sub set_arch {
99 my ($self, $arch, $change_cb) = @_;
100
101 $self->{change_cb} = $change_cb;
102
103 $self->{arch} = $arch;
104
105 if (not defined $change_cb) {
106
107 $self->{al}->set (editable => 0);
108 $self->{raw_al}->set (editable => 0);
109 $self->{msg_view}->set (editable => 0);
110 $self->{lore_view}->set (editable => 0);
111 $self->{new_attrkey_entry}->set (sensitive => 0);
112 $self->{new_attrval_entry}->set (sensitive => 0);
113
114 } else {
115
116 $self->{al}->set (editable => 1);
117 $self->{raw_al}->set (editable => 1);
118 $self->{msg_view}->set (editable => 1);
119 $self->{lore_view}->set (editable => 1);
120 $self->{new_attrkey_entry}->set (sensitive => 1);
121 $self->{new_attrval_entry}->set (sensitive => 1);
122 }
123
124 $self->{al}->set_arch ($arch);
125 $self->{raw_al}->set_arch ($arch);
126 $self->{msg_view}->get_buffer ()->set_text ($arch->{msg});
127 $self->{lore_view}->get_buffer ()->set_text ($arch->{lore});
128
129 $self->{arch_name_lbl}->set_text (
130 $arch->{_name} . ($arch->{name} ? " - $arch->{name}" : "")
131 );
132
133 my $al_arch = $Crossfire::ARCH{$arch->{_name}};
134
135 if ($al_arch) {
136
137 $self->{al_arch}->set_arch ($al_arch);
138
139 } else {
140 print "NOARCH FOR: $arch->{_name}\n";
141
142 $self->{al_arch}->set_arch ({ noarch => 'noarch' });
143 }
144 }
145
146
147 =head1 AUTHOR
148
149 Marc Lehmann <schmorp@schmorp.de>
150 http://home.schmorp.de/
151
152 Robin Redeker <elmex@ta-sa.org>
153 http://www.ta-sa.org/
154
155 =cut
156 1;