Wx-Perl-DbLinker
view release on metacpan or search on metacpan
lib/Wx/Perl/DbLinker/Wxform.pm view on Meta::CPAN
package Wx::Perl::DbLinker::Wxform;
use Class::InsideOut qw(public private register id);
use Wx::Perl::DbLinker;
our $VERSION = $Wx::Perl::DbLinker::VERSION;
use strict;
use warnings;
use parent 'Gtk2::Ex::DbLinker::AbForm';
use Carp qw(croak confess carp);
use Log::Any;
#use DateTime::Format::Strptime;
#use Data::Dumper;
use Scalar::Util qw( weaken );
use Wx qw[:everything];
#EVT_DATAVIEW_ITEM_VALUE_CHANGED
use Wx::Event
qw[EVT_TEXT EVT_LIST_ITEM_SELECTED EVT_COMBOBOX EVT_LISTBOX &EVT_CHECKBOX EVT_RADIOBUTTON EVT_SPINCTRL EVT_TEXT_ENTER];
#my %pos_seen;
my %signals = (
'Wx::TextEntry' => \&EVT_TEXT,
'Wx::ComboBox' => \&EVT_COMBOBOX,
'Wx::CheckBox' => \&EVT_CHECKBOX,
'Wx::SpinCtrl' => \&EVT_SPINCTRL,
'Wx::TextCtrl' => \&EVT_TEXT,
'Wx::ListCtrl' => \&EVT_LIST_ITEM_SELECTED,
'Wx::ListBox' => \&EVT_LISTBOX,
'Wx::RadioButton' => \&EVT_RADIOBUTTON,
);
#
#coderef to place the value of record x in each field, combo, toggle...
#'Wx::DataViewListCtrl' => \&_set_combo,
my %setter = (
'Wx::TextCtrl' => \&_set_entry,
'Wx::RadioButton' => \&_set_check,
'Wx::ComboBox' => \&_set_combo,
'Wx::CheckBox' => \&_set_check,
'Wx::SpinButton' => \&_set_spinbutton,
'Wx::ListCtrl' => \&_set_combo,
'Wx::ListBox' => \&_set_combo,
);
my %getter = (
'Wx::TextCtrl' => sub { my ( $self, $w, $id ) = @_; return $w->GetValue; },
'Wx::ToggleButton' =>
sub { my ( $self, $w, $id ) = @_; return $w->GetValue; },
'Wx::ComboBox' => sub {
my ( $self, $w, $id ) = @_;
return $self->_get_combobox_selectedvalue($id);
},
'Wx::ListBox' => sub {
my ( $self, $w, $id ) = @_;
return $self->_get_combobox_selectedvalue($id);
},
'Wx::CheckBox' => sub {
my ( $self, $w, $id ) = @_;
return $w->IsChecked;
},
'Wx::SpinButton' => sub {
my ( $self, $w, $id ) = @_;
return $w->IsChecked;
},
'Wx::ListCtrl' => sub {
my ( $self, $w, $id ) = @_;
$self->_get_combobox_selectedvalue($id);
},
);
private log => my %log;
private event => my %events;
# private states => my %states;
private widgets => my %widgets;
private fields_with_event => my %ecols;
private is_with_event => my %is_ecols;
private datawidgets_value => my %datawidgets_value;
private datawidgets_pos => my %datawidgets_pos;
private combos => my %combos;
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
);
my %arg = ( ref $_[0] eq "HASH" ? ( %def, %{ $_[0] } ) : ( %def, @_ ) );
my $self = $class->SUPER::new(
childclass => __PACKAGE__,
data_manager => $arg{data_manager},
builder => $arg{builder},
datawidgets => $arg{datawidgets},
datawidgets_ro => $arg{datawidgets_ro},
on_current => $arg{on_current},
date_formatters => $arg{date_formatters},
datawidgets_ro => $arg{datawidgets_ro},
time_zone => $arg{time_zone},
locale => $arg{locale},
rec_spinner_callback => sub {
my $self = shift;
my $id = id $self;
return unless $widgets{ $id }->{rec_spinner};
$widgets{ $id }->{rec_spinner}->SetValue( $self->_pos + 1 );
},
rec_spinner_insert_callback => sub {
my ( $self, $new_pos ) = @_;
my $id = id $self;
return unless $widgets{ $id }->{rec_spinner};
my $first = ( $self->_pos < 0 ? 0 : 1 );
$widgets{ $id }->{rec_spinner}->SetRange( $first, $new_pos + 1 );
$widgets{ $id }->{rec_spinner}->SetValue( $new_pos + 1 );
},
);
register $self;
my $ido = id $self;
delete @arg{ $self->_super_args_needed };
# @$self{qw(dman cols ecols)} = delete @arg{qw(data_manager datawidgets datawidgets_changed)};
#@$self{ keys %arg } = values(%arg);
lib/Wx/Perl/DbLinker/Wxform.pm view on Meta::CPAN
#print "value: $x selected : ", $w->GetSelectedItemCount, "\n";
my $item = $w->FindItem( -1, $x );
$w->SetItemState( $item, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
} elsif ( $name eq "Wx::ComboBox" || $name eq "Wx::ListBox" ) {
confess($log{$id }->error( "undef datawidgetsPos for ", $id ))
unless ( $datawidgets_pos{ $ido }->{$id} );
#unless ( $self->{datawidgetsPos}->{$id} );
#my %idpos = %{ $self->{datawidgetsPos}->{$id} };
my %idpos = %{ $datawidgets_pos{ $ido }->{$id} };
my $i = $idpos{$x} if ( defined $x );
$log{ $ido }
->debug( "_set_combo pos is " . ( defined $i ? $i : " undef" ) );
# $w->SetSelection(wxNOT_FOUND);
if ( defined $i ) {
$w->SetSelection($i);
} else {
$w->SetSelection(wxNOT_FOUND);
}
# $log{ $id }->debug($w->GetStringSelection);
}
}
sub _set_check {
my ( $self, $w, $x, $id ) = @_;
$w->SetValue($x);
}
#$comboid is the combo id and the field name in the table that received the value selected in the combo
# $field[1] is the name of the field that is displayed in the combo
# $field[0] is the field name of the values returned from the combo
sub _on_combo_newval {
my ( $self, $comboid, $frame, $event ) = @_;
my $id = id $self;
my $value = $event->GetString;
$log{ $id }->debug( "combo_newval: " . $value );
$value = ( $value eq "" ? undef : $value );
return unless ( defined $value );
my $href = $combos{ $id }->{$comboid};
my $dman = $href->{dman};
my @fields = @{ $href->{fields} };
$dman->new_row;
$dman->set_field( $fields[1], $value );
$dman->save;
$self->add_combo(
{
data_manager => $dman,
fields => $href->{fields},
id => $comboid,
init => 0
}
);
}
sub _get_combobox_selectedvalue {
my ( $self, $id ) = @_;
my $ido = id $self;
confess($log{$id }->error("id undef")) unless ( defined $id );
my $w = $self->_datawidgets( $id );
my $name = $self->_datawidgetsName( $id );
my $x;
if ( $name eq "Wx::ListCtrl" ) {
$x =
( $datawidgets_value{ $ido }->{$id}
? $datawidgets_value{ $ido }->{$id}
: undef );
} elsif ( $name eq "Wx::ComboBox" || $name eq "Wx::ListBox" ) {
my $pos = $w->GetSelection();
#die ((($pos == wxNOT_FOUND) ? "not": "") . " found");
#$log{ $id }->debug ("id : ", $id, " pos ", $pos);
#$log{ $id }->debug( $self->{datawidgetsValue}->{$id}->{$pos});
$x =
( $pos == wxNOT_FOUND )
? undef
: $datawidgets_value{ $ido }->{$id}->{$pos};
}
$log{ $ido }->debug( "_get_combobox_selectedvalue: found "
. ( defined $x ? $x : " undef" ) );
return $x;
}
sub _set_spinbutton {
my ( $self, $w, $x ) = @_;
my $id = id $self;
=for comment
if ( $self->getID($w) eq $self->getID( $widgets{ $id }->{rec_spinner} ) ) {
$log{ $id }->debug("Found record_spinner... leaving");
return;
}
=cut
$w->SetValue( $x || 0 );
}
sub _change_values {
my ( $self, $fieldname, $w, $frame, $event ) = @_;
my $id = id $self;
#my $name = ref $w;
my $name = $self->_datawidgetsName($fieldname);
$log{ $id }->debug("self->changed for $fieldname ($name)");
die ("$fieldname without type") unless defined $name;
if ( $name eq "Wx::ListCtrl" ) {
print "text: ", $event->GetText, "Index: ", $event->GetIndex, "Data: ",
$event->GetData, "\n";
$datawidgets_value{ $id }->{$fieldname} = $event->GetText;
}
if ( $is_ecols{ $id }->{$fieldname} ) {
my $coderef = $ecols{ $id }->{$fieldname};
&$coderef( $w, $event );
}
if ( !$self->_painting ) {
$self->_changed(1);
if ( $events{$id}->{on_change} ) {
$events{$id}->{on_change}();
}
$self->_set_record_status_label;
}
return 0;
}
sub _on_selected {
my ( $self, $id, $list, $event ) = @_;
my $ido = id $self;
#print Dumper $self;
#print "_on_selected: name: ", ref $list, "\n";
#print "text: " , $event->GetText, "Index: ", $event->GetIndex, "Data: ", $event->GetData, "\n";
if ( $self->_datawidgetsName( $id ) eq "Wx::ListCtrl" ) {
$datawidgets_value{ $ido }->{$id} = $event->GetText;
} else {
croak($log{$id }->error( "_on_selected not implemented for $id ("
. $self->_datawidgetsName($id)
. ")" ));
}
}
( run in 1.669 second using v1.01-cache-2.11-cpan-2398b32b56e )