ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/AttachEditor.pm
(Generate patch)

Comparing deliantra/gde/GCE/AttachEditor.pm (file contents):
Revision 1.1 by elmex, Sun Aug 27 17:24:20 2006 UTC vs.
Revision 1.2 by elmex, Mon Aug 28 18:24:49 2006 UTC

18 18
19use Storable qw/dclone/; 19use Storable qw/dclone/;
20 20
21use strict; 21use strict;
22 22
23sub try_add_known_attachment {
24 my ($self, $att) = @_;
25
26 unless ($::CFG->{known_attachments}->{$att}) {
27 $self->{attach_combobox}->append_text ($att);
28 $::CFG->{known_attachments}->{$att} = 1;
29 }
30}
31
32#sub known_attachments {
33# my ($self) = @_;
34#
35# my $model = $self->{attach_combobox}->get_model;
36# my @known_attachments;
37#
38# my $iter = $model->get_iter_first;
39# while ($iter) {
40# push @known_attachments, $model->get ($iter);
41# $iter = $model->iter_next ($iter);
42# }
43#
44# return @known_attachments;
45#}
46
23sub save_layout { 47sub save_layout {
24 my ($self) = @_; 48 my ($self) = @_;
25 $::CFG->{attach_editor} = ::get_pos_and_size ($self); 49 $::CFG->{attach_editor} = ::get_pos_and_size ($self);
26} 50}
27 51
28sub INIT_INSTANCE { 52sub INIT_INSTANCE {
29 my ($self) = @_; 53 my ($self) = @_;
30 $self->set_title ("gcrossedit - attachment editor"); 54 $self->set_title ("gcrossedit - attachment editor");
31 ::set_pos_and_size ($self, $::CFG->{attach_editor}, 200, 300, 200, 0); 55 ::set_pos_and_size ($self, $::CFG->{attach_editor}, 400, 400, 200, 0);
56
57 $self->add (my $vb = Gtk2::VBox->new);
58 $vb->pack_start (my $hb = Gtk2::HBox->new, 0, 1, 0);
59 $hb->pack_start ($self->{attach_combobox} = Gtk2::ComboBoxEntry->new_text, 0, 1, 0);
60 $hb->pack_start (my $btn = Gtk2::Button->new ("new"), 0, 1, 0);
61 $btn->signal_connect (clicked => sub {
62 my $ent = $self->{attach_combobox}->child->get_text;
63 $self->add_attachment ($ent);
64 });
65
66 $vb->pack_start ($self->{attachbox} = Gtk2::VBox->new, 1, 1, 0);
67
68 $self->{attach_combobox}->append_text ($_)
69 for keys %{$::CFG->{known_attachments} || {}};
70}
71
72sub add_attachment {
73 my ($self, $name, $args) = @_;
74
75 return if $name =~ /^\s*$/;
76
77 $self->try_add_known_attachment ($name);
78 push @{$self->{attach}}, [$name, $args];
79 $self->{ntbook}->append_page (my $pg = $self->make_page ($name, $args), $name);
80 $pg->show_all;
81
82 $self->{upd_cb}->($self->{attach});
32} 83}
33 84
34sub update_attachments { 85sub update_attachments {
35 my ($self, $name, $args) = @_; 86 my ($self, $name, $args) = @_;
87
36 for (@{$self->{attach}}) { 88 for (@{$self->{attach}}) {
37 if ($_->[0] eq $name) { 89 if ($_->[0] eq $name) {
38 @$_ = ($name, $args); 90 @$_ = ($name, $args);
39 $name = undef; 91 $name = undef;
40 last; 92 last;
41 } 93 }
42 } 94 }
43 95
44 if ($name) { 96 $name and warn "Couldn't find attachment '$name', this is a bug!";
45 push @{$self->{attach}}, [$name, $args];
46 $self->{ntbook}->append_page ($self->make_page ($name, $args), $name);
47 $self->{ntbook}->show_all;
48 }
49 97
50 $self->{upd_cb}->($self->{attach}); 98 $self->{upd_cb}->($self->{attach});
51 return;
52} 99}
53 100
54sub kill_attachment { 101sub kill_attachment {
55 my ($self, $pos) = @_; 102 my ($self, $pos) = @_;
56 my $name = $self->{ntbook}->get_tab_label_text ($self->{ntbook}->get_nth_page ($pos)); 103 my $name = $self->{ntbook}->get_tab_label_text ($self->{ntbook}->get_nth_page ($pos));
61 108
62sub set_attachment { 109sub set_attachment {
63 my ($self, $attach, $update_cb) = @_; 110 my ($self, $attach, $update_cb) = @_;
64 $self->{upd_cb} = $update_cb 111 $self->{upd_cb} = $update_cb
65 or die "No update callback given!"; 112 or die "No update callback given!";
66 $self->{attach} = $attach;
67 113
68 my $ntbook = $self->{ntbook} = Gtk2::Notebook->new; 114 my $ntbook = $self->{ntbook} = Gtk2::Notebook->new;
69 $ntbook->set_scrollable (1); 115 $ntbook->set_scrollable (1);
116 $self->add_attachment (@$_) for @$attach;
70 117
71 for (@$attach) { 118 $self->{attachbox}->remove ($_) for $self->{attachbox}->get_children;
72 $ntbook->append_page ($self->make_page (@$_), $_->[0]); 119 $self->{attachbox}->add ($ntbook);
120 $self->{attachbox}->show_all;
121}
122
123sub add_attachment_key {
124 my ($self, $name, $key, $args) = @_;
125
126 my $tbl = $self->{table};
127 my $i = $tbl->get ('n-rows');
128 $tbl->resize ($i + 1, $self->{table}->get ('n-columns'));
129
130 $args->{$key} = "" unless defined $args->{$key};
131
132 $tbl->attach (my $ed = Gtk2::Entry->new, 0, 1, $i, $i + 1, ['fill'], 'fill', 0, 0);
133 $ed->set_editable (0);
134 $ed->set_text ($key);
135# $ed->signal_connect (changed => sub {
136# my ($ed) = @_;
137# my $newkey = $ed->get_text;
138# my $val = delete $args->{$ed->{key}};
139# $args->{$ed->{key} = $newkey} = $val;
140# $self->update_attachments ($name, $args);
141# 0
142# });
143
144 $tbl->attach (my $ed2 = Gtk2::Entry->new, 1, 2, $i, $i + 1, ['fill', 'expand'], 'fill', 0, 0);
145 $ed2->set_text ($ed2->{value} = $args->{$key});
146 $ed2->signal_connect (changed => sub {
147 my ($ed2) = @_;
148 $args->{$key} = $ed2->get_text;
149 $self->update_attachments ($name, $args);
150 0
73 } 151 });
74 152
75 $self->remove ($self->get_child) 153 $tbl->attach (my $b = Gtk2::Button->new ("X"), 2, 3, $i, $i + 1, 'fill', 'fill', 0, 0);
76 if $self->get_child; 154 $b->signal_connect (clicked => sub {
77 $self->add ($ntbook); 155 delete $args->{$key};
156 $self->rebuild_key_table ($name, $args);
157 0
158 });
159
78 $self->show_all; 160 $tbl->show_all;
79} 161}
162
163sub rebuild_key_table {
164 my ($self, $name, $args) = @_;
165 my $tbl = $self->{table};
166 $tbl->resize (scalar keys %$args, $tbl->get ('n-columns'));
167 $tbl->remove ($_) for $tbl->get_children;
168 $self->add_attachment_key ($name, $_, $args) for keys %$args;
169}
170
80 171
81sub make_page { 172sub make_page {
82 my ($self, $name, $args) = @_; 173 my ($self, $name, $args) = @_;
83 174
84 my $vb = Gtk2::VBox->new; 175 my $vb = Gtk2::VBox->new;
176
85 $vb->pack_start (my $kb = Gtk2::Button->new ("kill"), 0, 1, 0); 177 $vb->pack_start (my $kb = Gtk2::Button->new ("remove attachment"), 0, 1, 0);
86 $kb->signal_connect (clicked => sub { 178 $kb->signal_connect (clicked => sub {
87 $self->kill_attachment ($self->{ntbook}->page_num ($vb)); 179 $self->kill_attachment ($self->{ntbook}->page_num ($vb));
88 1 180 1
89 }); 181 });
90 182
91 my $rows = scalar (keys %$args); 183 $vb->pack_start (my $sw = Gtk2::ScrolledWindow->new, 1, 1, 0);
92 my $cols = 3; 184 $sw->set_policy (qw/automatic automatic/);
185 $sw->add_with_viewport ($self->{table} = Gtk2::Table->new (1, 3));
186
187 $self->add_attachment_key ($name, $_, $args) for keys %$args;
188
93 $vb->pack_start (my $tbl = Gtk2::Table->new ($rows, $cols), 1, 1, 0); 189 $vb->pack_start (my $hb = Gtk2::HBox->new, 0, 1, 0);
94 190 $hb->pack_start (my $ed = Gtk2::Entry->new, 1, 1, 0);
95 my $i = 0; 191 $hb->pack_start (my $kb = Gtk2::Button->new ("new key"), 0, 1, 0);
96 for my $key (keys %$args) {
97 $tbl->attach (my $ed = Gtk2::Entry->new, 0, 1, $i, $i + 1, ['fill'], 'fill', 0, 0);
98 $ed->set_text ($ed->{key} = $key);
99 $ed->signal_connect (changed => sub { 192 $kb->signal_connect (clicked => sub {
100 my ($ed) = @_;
101 my $newkey = $ed->get_text; 193 my $newkey = $ed->get_text;
102 my $val = delete $args->{$ed->{key}}; 194 return 0 if exists $args->{$newkey};
103 $args->{$ed->{key} = $newkey} = $val;
104 $self->update_attachments ($name, $args); 195 $self->update_attachments ($name, $args);
196 $self->add_attachment_key ($name, $newkey, $args);
105 0 197 0
106 }); 198 });
107 199
108 $tbl->attach (my $ed2 = Gtk2::Entry->new, 1, 2, $i, $i + 1, ['fill', 'expand'], 'fill', 0, 0);
109 $ed2->set_text ($ed2->{value} = $args->{$key});
110 $ed2->signal_connect (changed => sub {
111 my ($ed2) = @_;
112 $args->{$key} = $ed2->get_text;
113 $self->update_attachments ($name, $args);
114 0
115 });
116
117 $i++;
118 }
119 200
120 $vb 201 $vb
121} 202}
122 203
123=head1 AUTHOR 204=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines