Gtk2-Ex-DbLinker
view release on metacpan or search on metacpan
lib/Gtk2/Ex/DbLinker/Form.pm view on Meta::CPAN
use Class::InsideOut qw(public private register id);
use Gtk2::Ex::DbLinker;
our $VERSION = $Gtk2::Ex::DbLinker::VERSION;
use strict;
use warnings;
use parent 'Gtk2::Ex::DbLinker::AbForm';
use Glib qw/TRUE FALSE/;
use Carp qw(croak confess carp);
use Log::Any;
#use DateTime::Format::Strptime;
#use Data::Dumper;
my %fieldtype = (
varchar => "Glib::String",
char => "Glib::String",
integer => "Glib::Int",
boolean => "Glib::Boolean",
date => "Glib::String",
serial => "Glib::Int",
text => "Glib::String",
smallint => "Glib::Int",
mediumint => "Glib::Int",
timestamp => "Glib::String",
enum => "Glib::String",
);
my %signals = (
'GtkCalendar' => 'day_selected',
'GtkToggleButton' => 'toggled',
'GtkTextView' => \&_get_textbuffer,
'Gtk2::TextBuffer' => 'changed',
'GtkComboBoxEntry' => 'changed',
'GtkComboBox' => 'changed',
'GtkCheckButton' => 'toggled',
'GtkEntry' => 'changed',
'GtkSpinButton' => 'value_changed'
);
#
#coderef to place the value of record x in each field, combo, toggle...
#
my %setter = (
'GtkEntry' => \&_set_entry,
'GtkToggleButton' => \&_set_check,
'GtkComboBox' => \&_set_combo,
'GtkComboBoxEntry' => \&_set_combo,
'GtkCheckButton' => \&_set_check,
'GtkSpinButton' => \&_set_spinbutton,
'GtkTextView' => \&_set_textentry
);
my %getter = (
'GtkEntry' => sub { my ( $self, $w ) = @_; return $w->get_text; },
'GtkToggleButton' => sub {
my ( $self, $w ) = @_;
my $v = $w->get_active;
return ( defined $v ? $v : 0 );
},
'GtkComboBox' =>,
\&_get_combobox_firstvalue,
'GtkComboBoxEntry' => \&_get_combobox_firstvalue,
'GtkCheckButton' => sub {
my ( $self, $w ) = @_;
my $v = $w->get_active;
return ( defined $v && length($v) ? $v : 0 );
},
'GtkSpinButton' => sub {
my ( $self, $w ) = @_;
return $w->get_active;
},
'GtkTextView' => sub {
my ( $self, $textview ) = @_;
my $buffer = $textview->get_buffer;
return $buffer->get_text( $buffer->get_bounds, FALSE );
},
);
private log => my %log;
private event => my %events;
private states => my %states;
private widgets => my %widgets;
# 'GtkSpinButton' => \&set_spinbutton,
# sub {return shift->child->get_text; },
# sub {my $c = shift; print "getter_cbe\n"; my $iter = $c->get_active_iter; return $c->get_model->get( $iter ); }
#
sub new {
my $class = shift;
#my ($class, $req)=@_;
my %def = (
null_string => "null",
rec_spinner => "RecordSpinner",
status_label => "lbl_RecordStatus",
rec_count_label => "lbl_RecordCount",
locale => "fr_CH",
auto_apply => 1,
data_lock => 0,
);
my %arg = ( ref $_[0] eq "HASH" ? ( %def, %{ $_[0] } ) : ( %def, @_ ) );
# @$self{qw(dman cols)} = delete @arg{qw(data_manager datawidgets)};
# @$self{ keys %arg } = values(%arg);
my $self = $class->SUPER::new(
childclass => __PACKAGE__,
data_manager => $arg{data_manager},
builder => $arg{builder},
datawidgets => $arg{datawidgets},
on_current => $arg{on_current},
date_formatters => $arg{date_formatters},
time_zone => $arg{time_zone},
locale => $arg{locale},
rec_spinner_callback => sub {
my $self = shift;
my $id = id $self;
lib/Gtk2/Ex/DbLinker/Form.pm view on Meta::CPAN
}
sub _set_entry {
my ( $self, $w, $x ) = @_;
my $id = id $self;
if ( defined $x ) {
$log{ $id }->debug( "set_entry: " . $x );
$w->set_text($x);
} else {
$log{ $id }->debug( "set_entry: text entry undef " . $w->get_name );
$w->set_text("");
}
}
sub _set_textentry {
my ( $self, $w, $x ) = @_;
my $id = id $self;
$log{ $id }->debug("set_textentry text entry undef") if ( !defined $x );
$w->get_buffer->set_text( $x || "" );
}
sub _set_combo {
my ( $self, $w, $x ) = @_;
my $id = id $self;
$log{ $id }->debug( "set_combo value "
. ( defined $x ? $x : " undef" )
. " widget: "
. ref $w );
my $m = $w->get_model;
my $iter = $m->get_iter_first if ($m);
if ( ref $w eq "Gtk2::ComboBoxEntry" ) {
$w->get_child->set_text("");
}
my $match_found = 0;
while ($iter) {
if ( ( defined $x ) && ( $x eq $m->get( $iter, 0 ) ) ) {
$match_found = 1;
$w->set_active_iter($iter);
last;
}
$iter = $m->iter_next($iter);
}
if ( !$match_found && $x ) {
$log{ $id }->debug( "Failed to set " . ref $w . " to $x\n" );
}
}
sub _set_check {
my ( $self, $w, $x ) = @_;
my $id = id $self;
$w->set_active( ( defined $x ? $x : 0 ) );
}
sub _get_combobox_firstvalue {
my ( $self, $c ) = @_;
my $id = id $self;
#print "getter_cb\n";
my $iter = $c->get_active_iter;
unless ($iter) {
$log{ $id }->debug( "iter undef row: " . $c->get_active );
}
return ( $iter ? $c->get_model->get( $iter, 0 ) : undef );
}
sub _set_spinbutton {
my ( $self, $w, $x ) = @_;
my $id = id $self;
if ( $self->getID($w) eq $self->getID( $widgets{ $id }->{rec_spinner} ) ) {
$log{ $id }->debug("Found record_spinner... leaving");
return;
}
$w->set_value( $x || 0 );
}
sub _get_textbuffer {
my ( $self, $w ) = @_;
my $id = id $self;
return $w->get_buffer;
}
sub _change_values {
my ( $self, $fieldname ) = @_;
my $id = id $self;
# $log{ $id }->debug("self->changed for $fieldname");
if ( !$self->_painting ) {
$self->_changed(1);
if ( $events{ $id }->{on_change} ) {
$events{ $id }->{on_change}();
}
$self->_set_record_status_label;
}
return FALSE;
}
sub _set_record_status_label {
my $self = shift;
my $id = id $self;
$log{ $id }->debug("set_record_satus_label changed is " . $self->_changed);
if ( $widgets{ $id }->{status_label} ) {
if ( $events{ $id }->{data_lock} ) {
$widgets{ $id }->{status_label}
->set_markup("<b><i><span color='red'>Locked</span></i></b>");
} elsif ( $self->_changed ) {
$widgets{ $id }->{status_label}
->set_markup("<b><span color='red'>Changed</span></b>");
} else {
( run in 1.443 second using v1.01-cache-2.11-cpan-8dfa8b56332 )