App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/SymlistListModel.pm view on Meta::CPAN
$self->set_property (columns => [ 'key', 'name', 'condition' ],
table => 'symlist',
dbh => $dbh);
$self->signal_connect (rows_reordered => \&_do_rows_reordered);
App::Chart::chart_dirbroadcast()->connect_for_object
('symlist-list-inserted', \&_do_symlist_inserted, $self);
App::Chart::chart_dirbroadcast()->connect_for_object
('symlist-list-deleted', \&_do_symlist_deleted, $self);
}
#------------------------------------------------------------------------------
# remote changes
# 'symlist-list-inserted' broadcast handler
sub _do_symlist_inserted {
my ($self, $seq, $key) = @_;
if ($self->{'reading_database'}) {
# this is a broadcast resulting from an insert on the ListStore, it's
# only for everyone else (locally and remotely), not a ListStore/DB sync
### Symlist-List symlist-list-inserted handler while reading_database ...
return;
}
# someone external has changed the database
# insert a row to make the liststore hopefully like the database except
# for this wone new row, and check with reread
{ local $self->{'reading_database'} = 1;
$self->insert_with_values ($seq, COL_KEY, $key);
}
$self->reread;
}
# 'symlist-list-deleted' broadcast handler
sub _do_symlist_deleted {
my ($self, $seq) = @_;
if ($self->{'reading_database'}) {
# this is a broadcast resulting from a delete on the ListStore, so it's
# only for everyone else (locally and remotely), not a ListStore/DB sync
### Symlist-List symlist-list-deleted handler while reading_database ...
return;
}
# someone external has changed the database
# try to make the liststore look like the database, then reread to be sure
{ local $self->{'reading_database'} = 1;
if (my $iter = $self->iter_nth_child (undef, $seq)) {
$self->remove ($iter);
}
}
$self->reread;
}
#------------------------------------------------------------------------------
# local changes applied to database
sub remove {
my ($self, $iter) = @_;
my $key = $self->get($iter,COL_KEY);
delete $App::Chart::Gtk2::Symlist::instances{$key};
return $self->SUPER::remove ($iter);
}
# 'row-changed' class closure
sub _do_row_changed {
my ($self, $path, $iter) = @_;
$self->signal_chain_from_overridden ($path, $iter);
if ($self->{'reading_database'}) { return; }
my ($seq) = $path->get_indices;
my $key = $self->get_value($iter,COL_KEY);
if (DEBUG) {
my $name = $self->get_value($iter,COL_NAME);
my $condition = $self->get_value($iter,COL_CONDITION);
print "Symlist List database change seq=$seq",
" to key=",defined $key ? "'$key'" : 'undef',
" name=",defined $name ? "'$name'" : 'undef',
" cond=",defined $condition ? "'$condition'" : 'undef',"\n";
}
local $self->{'reading_database'} = 1;
App::Chart::chart_dirbroadcast()->send ('symlist-list-changed', $seq,$key);
}
# 'row-deleted' class closure
sub _do_row_deleted {
my ($self, $path) = @_;
$self->signal_chain_from_overridden ($path);
if ($self->{'reading_database'}) { return; }
my ($seq) = $path->get_indices;
### Symlist-List database delete seq: $seq
# database_delete ($self, $seq);
local $self->{'reading_database'} = 1;
App::Chart::chart_dirbroadcast()->send ('symlist-list-deleted', $seq);
}
# 'row-inserted' class closure
sub _do_row_inserted {
my ($self, $path, $iter) = @_;
$self->signal_chain_from_overridden ($path, $iter);
if ($self->{'reading_database'}) {
### Symlist-List row-inserted while reading_database
return;
}
my ($seq) = $path->get_indices;
my $key = $self->get_value($iter,0) // '';
if (DEBUG) {
my $name = $self->get_value($iter,1) // 'undef';
print "Symlist List database insert at seq=$seq",
" key=$key name=$name\n";
}
local $self->{'reading_database'} = 1;
App::Chart::chart_dirbroadcast()->send ('symlist-list-inserted',$seq,$key);
}
# 'rows-reordered' connected on self
sub _do_rows_reordered {
my ($self, $path, $iter, $aref) = @_;
if ($self->{'reading_database'}) { return; }
( run in 0.542 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )