Autoupdating EntryCompletion (was Selectively trapping keypresses)
- From: "Jeffrey Ratcliffe" <jeffrey ratcliffe gmail com>
- To: muppet <scott asofyet org>
- Cc: gtk-perl-list gnome org
- Subject: Autoupdating EntryCompletion (was Selectively trapping keypresses)
- Date: Tue, 17 Apr 2007 10:26:15 +0200
On 16/04/07, muppet <scott asofyet org> wrote:
Everything's good right up until the end. ;-)
I've added a couple of callbacks to get new entries into the ListModel
to which the EntryCompletion is bound. Selecting entries several times
from the EntryCompletion is giving me:
Gtk-CRITICAL **: gtk_list_store_get_value: assertion `VALID_ITER
(iter, list_store)' failed at ./EntryCompletion3.pl line 105.
GLib-GObject-CRITICAL **: g_object_set_property: assertion `G_IS_VALUE
(value)' failed at ./EntryCompletion3.pl line 105.
I've attached the code.
What am I doing wrong?
#!/usr/bin/perl -w
package Mup::CellRendererCompletion;
use strict;
use Gtk2;
use Glib ':constants';
use Glib::Object::Subclass
"Gtk2::CellRendererText",
properties => [
Glib::ParamSpec->object ('completion',
'Completion',
'The entry completion object for this cell',
'Gtk2::EntryCompletion',
G_PARAM_READWRITE),
],
;
sub START_EDITING {
my ($cell, $event, $view, $path, $background_area, $cell_area, $flags) = @_;
my $editable = $cell->SUPER::START_EDITING (
$event, $view, $path, $background_area, $cell_area, $flags
);
$editable->set_completion ($cell->{completion})
if ($editable && $editable->isa ('Gtk2::Entry') && $cell-> {completion});
return $editable;
}
######################################################################## #######
package main;
use strict;
use Gtk2 -init;
use Glib qw(TRUE FALSE);
use Gtk2::Ex::Simple::List;
my $cmp_model = Gtk2::ListStore->new ('Glib::String');
$cmp_model->set ($cmp_model->append, 0, $_)
foreach qw(one two three four five six seven eight nine ten eleven twelve);
$cmp_model -> signal_connect('row-inserted' => sub {
my ($model, $path, $iter) = @_;
my ($val) = $cmp_model->get($iter, 0);
warn "inserted $val\n";
# Weed out duplicates
my $iter2 = $cmp_model->iter_next($iter);
while ($iter2) {
my ($val2) = $cmp_model->get($iter2, 0);
warn "list $val2\n";
if ($val eq $val2) {
warn "removing $val2\n";
$cmp_model->remove ($iter2);
warn "removed $val2\n";
}
else {
$iter = $iter2;
}
$iter2 = $cmp_model->iter_next($iter);
}
});
my $completion = Gtk2::EntryCompletion->new;
$completion->set_model ($cmp_model);
$completion->set_text_column (0);
Gtk2::Ex::Simple::List->add_column_type( 'entrycompletion',
type => 'Glib::Scalar',
renderer => 'Mup::CellRendererCompletion',
attr => sub {
my ($treecol, $cell, $model, $iter, $col_num) = @_;
my $info = $model->get ($iter, $col_num);
$cell->set (text => $info);
}
);
my $slist = Gtk2::Ex::Simple::List->new( text => 'entrycompletion' );
$slist -> set_column_editable (0, TRUE);
push @{$slist->{data}}, [$_]
foreach ('one', 'one and a half', 'one and two thirds', 'one and
three quarters', 'two');
$slist -> get_model -> signal_connect('row-changed' => sub {
my ($model, $path, $iter) = @_;
my $text = $slist->get_model->get($iter, 0);
$cmp_model->insert_with_values(0, 0, $text);
});
my $window = Gtk2::Window->new;
$window->signal_connect (destroy => sub { Gtk2->main_quit });
# Get the already-existing renderer for column 0, so we can modify it.
my $renderer = ($slist->get_column(0)->get_cell_renderers)[0];
$renderer->set (mode => "editable",
editable => TRUE,
completion => $completion);
$renderer->signal_connect (edited => sub {
my ($cell, $path, $new_value) = @_;
$slist->{data}[$path][0] = $new_value;
});
$window->add ($slist);
$window->show_all;
Gtk2->main;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]