… | |
… | |
255 | my ($self, $text) = @_; |
255 | my ($self, $text) = @_; |
256 | |
256 | |
257 | $self->{parent}->_append_text ($self->{r}, $text); |
257 | $self->{parent}->_append_text ($self->{r}, $text); |
258 | } |
258 | } |
259 | |
259 | |
|
|
260 | sub append_widget { |
|
|
261 | my ($self, $widget) = @_; |
|
|
262 | |
|
|
263 | $widget->show_all; |
|
|
264 | |
|
|
265 | my $anchor = $self->{buffer}->create_child_anchor ($self->riter); |
|
|
266 | $self->{parent}{view}->add_child_at_anchor ($widget, $anchor); |
|
|
267 | } |
|
|
268 | |
|
|
269 | sub append_optionmenu { |
|
|
270 | my ($self, $ref, @entry) = @_; |
|
|
271 | |
|
|
272 | my @vals; |
|
|
273 | |
|
|
274 | my $widget = new Gtk2::OptionMenu; |
|
|
275 | $widget->set (menu => my $menu = new Gtk2::Menu); |
|
|
276 | |
|
|
277 | my $idx = 0; |
|
|
278 | |
|
|
279 | while (@entry >= 2) { |
|
|
280 | my $value = shift @entry; |
|
|
281 | my $label = shift @entry; |
|
|
282 | |
|
|
283 | $menu->append (new Gtk2::MenuItem $label); |
|
|
284 | push @vals, $value; |
|
|
285 | |
|
|
286 | if ($value eq $$ref && $idx >= 0) { |
|
|
287 | $widget->set_history ($idx); |
|
|
288 | $idx = -1e6; |
|
|
289 | } |
|
|
290 | $idx++; |
|
|
291 | } |
|
|
292 | |
|
|
293 | my $cb = shift @entry; |
|
|
294 | |
|
|
295 | $widget->signal_connect (changed => sub { |
|
|
296 | my $new = $vals[$_[0]->get_history]; |
|
|
297 | |
|
|
298 | if ($new ne $$ref) { |
|
|
299 | $$ref = $new; |
|
|
300 | $cb->($new) if $cb; |
|
|
301 | } |
|
|
302 | }); |
|
|
303 | |
|
|
304 | $self->append_widget ($widget); |
|
|
305 | |
|
|
306 | $widget; |
|
|
307 | } |
|
|
308 | |
|
|
309 | sub append_entry { |
|
|
310 | my ($self, $ref, $width, $cb) = @_; |
|
|
311 | |
|
|
312 | my $widget = new Gtk2::Entry; |
|
|
313 | $widget->set (text => $$ref, width_chars => $width, xalign => 1); |
|
|
314 | $widget->signal_connect (changed => sub { |
|
|
315 | $$ref = $_[0]->get_text; |
|
|
316 | $cb->($$ref) if $cb; |
|
|
317 | }); |
|
|
318 | |
|
|
319 | $self->append_widget ($widget); |
|
|
320 | $widget; |
|
|
321 | } |
|
|
322 | |
|
|
323 | sub append_button { |
|
|
324 | my ($self, $label, $cb) = @_; |
|
|
325 | |
|
|
326 | my $widget = new_with_label Gtk2::Button $label; |
|
|
327 | $widget->signal_connect (clicked => sub { $cb->() if $cb }); |
|
|
328 | |
|
|
329 | $self->append_widget ($widget); |
|
|
330 | $widget; |
|
|
331 | } |
|
|
332 | |
260 | sub visible { $_[0]{visible} } |
333 | sub visible { $_[0]{visible} } |
|
|
334 | |
261 | sub set_visible { |
335 | sub set_visible { |
262 | my ($self, $visible) = @_; |
336 | my ($self, $visible) = @_; |
263 | |
337 | |
264 | return if $self->{visible} == $visible; |
338 | return if $self->{visible} == $visible; |
265 | $self->{visible} = $visible; |
339 | $self->{visible} = $visible; |
… | |
… | |
280 | return unless $self->{visible}; |
354 | return unless $self->{visible}; |
281 | |
355 | |
282 | $self->{cb}->($self); |
356 | $self->{cb}->($self); |
283 | } |
357 | } |
284 | |
358 | |
|
|
359 | sub destroy { |
|
|
360 | my ($self) = @_; |
|
|
361 | |
|
|
362 | return if !$self->{l} || !$self->{buffer} || $self->{l}->get_deleted; |
|
|
363 | |
|
|
364 | $self->clear if $self->{buffer}; |
|
|
365 | $self->{parent}{tagtable}->remove (delete $self->{tag}) if $self->{tag} && $self->{parent}; |
|
|
366 | |
|
|
367 | delete $self->{parent}; |
|
|
368 | delete $self->{buffer}; |
|
|
369 | delete $self->{l}; |
|
|
370 | delete $self->{r}; |
|
|
371 | } |
|
|
372 | |
285 | sub DESTROY { |
373 | sub DESTROY { |
286 | my ($self) = @_; |
374 | &destroy; |
287 | |
|
|
288 | $self->{parent}{tagtable}->remove (delete $self->{tag}) if $self->{tag}; |
|
|
289 | } |
375 | } |
290 | |
376 | |
291 | 1; |
377 | 1; |
292 | |
378 | |