Hi again :)

I've made steady progress today, but now I'm stumped again. I've been
used bits of pieces of code borrowed from Odot and other examples I've
found. Hence, I don't *quite* understand what they're doing
completely :) Anyway, I'm getting into START_EDITING() fine. But when
this exits, I get the error:

Can't locate object method "EDITING_STARTED" via package
"Gtk3::Ex::Datasheet::DBI::CellRendererText"
at /usr/lib64/perl5/site_perl/5.12.4/Gtk3.pm line 228.

>From my searching around, 'editing_started' is a signal, not a method.
What's going on?

Dan

---

package Gtk3::Ex::Datasheet::DBI::CellEditableText;

# Copied and pasted from Odot

use strict;
use warnings;

use Glib qw(TRUE FALSE);
use Glib::Object::Subclass
  Gtk3::TextView::,
  interfaces => [ Gtk3::CellEditable:: ];

sub set_text {
    
    my ( $editable, $text ) = @_;
    
    $text = "" unless ( defined( $text ) );
    
    $editable->get_buffer()->set_text( $text, length( $text ) );
    
}

sub get_text {
    
    my ( $editable ) = @_;
    my $buffer = $editable->get_buffer();
    
    return $buffer->get_text( $buffer->get_bounds(), TRUE );
    
}

sub select_all {
    
    my ( $editable ) = @_;
    my $buffer = $editable->get_buffer();
    
    my ( $start, $end ) = $buffer->get_bounds();
    $buffer->move_mark_by_name( insert => $start );
    $buffer->move_mark_by_name( selection_bound => $end );
    
}

1;

package Gtk3::Ex::Datasheet::DBI::CellRendererText;

# Originally from Odot, with bits and pieces from the
CellRendererSpinButton example,
# and even some of my own stuff worked in :)

use constant x_padding => 2;
use constant y_padding => 3;

use strict;
use warnings;

#use Gtk3::Gdk;
use Glib qw(TRUE FALSE);

use Glib::Object::Subclass
  Gtk3::CellRendererText::,
  properties => [
                    Glib::ParamSpec->object(
                                                    "editable-widget",
                                                    "Editable widget",
                                                    "The editable that's
used for cell editing.",

Gtk3::Ex::Datasheet::DBI::CellEditableText::,
                                                    [ qw( readable
writable ) ]
                                           ),
                    Glib::ParamSpec->boolean(
                                                    "number",
                                                    "Number",
                                                    "Should I apply
number formatting to the data?",
                                                    0,
                                                    [ qw( readable
writable ) ]
                                            ),
                    Glib::ParamSpec->string(
                                                    "decimals",
                                                    "Decimals",
                                                    "How many decimal
places should be displayed?",
                                                    -1,
                                                    [ qw( readable
writable ) ]
                                           ),
                    Glib::ParamSpec->boolean(
                                                    "currency",
                                                    "Currency",
                                                    "Should I prepend a
dollar sign to the data?",
                                                    0,
                                                    [ qw( readable
writable ) ]
                                            )
                ];

sub INIT_INSTANCE {
    
    my ( $cell ) = @_;
    
    my $editable = Gtk3::Ex::Datasheet::DBI::CellEditableText->new();
    
    $editable->set( border_width => $cell->get( "ypad" ) );
    
    $editable->signal_connect( key_press_event => sub {
        
        my ( $editable, $event ) = @_;
        
        #if (
        #    $event -> keyval == $Gtk2::Gdk::Keysyms{ Return } ||
        #    $event -> keyval == $Gtk2::Gdk::Keysyms{ KP_Enter }
        #    and not $event -> state & qw(control-mask)
        #   )
        
        # TODO: Find these constants ...
        if (
            $event->keyval == $Gtk3::Gdk::KEY_RETURN ||
            $event->keyval == $Gtk3::Gdk::KEY_KP_ENTER
            and not $event-> state & qw(control-mask)
           )
        {
            
            # Grab parent
            my $parent = $editable->get_parent;
            
            $editable->{ _editing_canceled } = FALSE;
            $editable->editing_done();
            $editable->remove_widget();
            
            my ( $path, $focus_column ) = $parent->get_cursor;
            my @cols = $parent->get_columns;
            my $next_col = undef;
            
            foreach my $i (0..$#cols) {
                if ( $cols[$i] == $focus_column ) {
                    if ( $event->state >= 'shift-mask' ) {
                        # go backwards
                        $next_col = $cols[$i-1] if $i > 0;
                    } else {
                        # Go forwards
                        # First check whether the next column is
read_only
                        while ( $i-1 < $#cols ) {
                            $i++;
                            if ( ! $cols[$i]->{definition}->{read_only}
) {
                                last;
                            }
                        }
                        $next_col = $cols[$i];
                    }
                    last;
                }
            }
            
            # For some reason, the last item returned by the above call
to
            # $parent->get_columns isn't a Gtk3::TreeViewColumn, and
therefore
            # the $parent_set_cursor line fails. Avoid this.
            if ( ref $next_col eq 'Gtk3::TreeViewColumn' ) {
                $parent->set_cursor ( $path, $next_col, 1 )
                    if $next_col;
            }
            
            return TRUE;
            
        }
        
        return FALSE;
        
    });
    
    $editable->signal_connect( editing_done => sub {
        
        my ( $editable ) = @_;
        
        # TODO: figure out what used to be going on here, and what is
now appropriate
        
        # gtk+ changed semantics in 2.6.  you now need to call
stop_editing().
        #if ( Gtk2->CHECK_VERSION( 2, 6, 0 ) ) {
            $cell->stop_editing( $editable->{ _editing_canceled } );
        #}
        
        # if gtk+ < 2.4.0, emit the signal regardless of whether editing
was
        # canceled to make undo/redo work.
        
        #my $new = Gtk2->CHECK_VERSION( 2, 4, 0 );
        #
        #if ( ! $new || ( $new && ! $editable->{ _editing_canceled } ) )
{
        #    $cell->signal_emit( edited => $editable->{ _path },
$editable -> get_text() );
        #} else {
            $cell->editing_canceled();
        #}
    });
    
    $cell->set( editable_widget => $editable );
    
}

sub GET_SIZE {
    
    my ( $self, $widget, $cell_area ) = @_;
    
    return $self->SUPER::GET_SIZE ( $widget, $cell_area );
    
}

sub START_EDITING {
    
    my ( $cell, $event, $view, $path, $background_area, $cell_area,
$flags ) = @_;
    
    if ( $event ) {
        return unless ( $event->button == 1 );
    }
    
    my $editable = $cell->get( "editable-widget" );
    
    #
$editable->modify_font( Gtk2::Pango::FontDescription->from_string( "Arial " . 
$cell->get( "font" ) ) );
    $editable->modify_font( Pango::FontDescription->from_string( "Arial
" . $cell->get( "font" ) ) );
    
    $editable->{ _editing_canceled } = FALSE;
    $editable->{ _path } = $path;
    $editable->set( height_request => $cell_area->{height} );
    
    $editable->set_text( $cell->get( "text" ) );
    $editable->select_all();
    $editable->show();
    
    $editable -> signal_connect_after(
            'focus-out-event'       => sub {
                                                my ( $event_box, $event
) = @_;

$cell->signal_emit( edited => $editable->{ _path }, $editable->get_text
);
                                                return $event;
            }
                               );
    
    return $editable;
    
}

sub get_layout {
    
    my ( $cell, $widget ) = @_;
    
    return $widget->create_pango_layout( "" );
    
}

1;
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to