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 )