Re: Creating new widgets



Hi again,

This is slightly off topic but related, the top row of this widget will need an extra button (the 'add to top' button), but I want this button to 'stack' on top of the normal add below button. Attached is a screen shot to demonstrate the existing perl/Tk widget.

I can't seem to find a way to shrink the internal padding of a button to allow halving its height without losing any internal room for the arrow image. I know it must be possible (Gtk2::SpinButton has two 'little' buttons with less internal padding) but I can't figure out how.

Any ideas?

Ta,
MB

On 10/11/06, muppet <scott asofyet org> wrote:

On Oct 11, 2006, at 1:42 AM, Matthew Braid wrote:

> There's also the possibility of doing the same thing inside a
> ListView with editable cells for the
> entires. But from what I've seen there are problems with combobox/
> entries in listviews, and I haven't seen a cell renderer for buttons.

You'd have to write a CellRendererButton.  It's actually not very
hard.  Entries are easy (CellRendererText), and as of later versions
of gtk+, so are comboboxes (CellRendererCombo).


> Can anyone point me in the right direction? I can work around this
> but I've found this MEF widget quite handy in the past.

If you're not willing to use a TreeView, then it sounds to me like a
job for boxes and the handy method Gtk2::Container::remove.

Here's a short procedural example.  I'll leave turning it into a
flexible and reusable class as an exercise for you.  (Things you
could do with it as a class:  emit signals when rows are added and
removed, decouple the created widget from the add_row() method so you
can create things other than just entries, etc, etc.)


#!/usr/bin/perl -w
use strict;
use Gtk2 -init;

my $window = Gtk2::Window->new;
$window->signal_connect (destroy => sub { Gtk2->main_quit });


sub add_row {
        my ($vbox, $previous) = @_;
        my $hbox = Gtk2::HBox->new;
        my $entry = Gtk2::Entry->new;
        my $add = Gtk2::Button->new ("V");
        my $del = Gtk2::Button->new ("X");
        $hbox->pack_start ($entry, 1, 1, 0);
        $hbox->pack_start ($add, 0, 0, 0);
        $hbox->pack_start ($del, 0, 0, 0);
        $add->signal_connect (clicked => sub {
                my $row = $_[0]->get_parent;
                my $box = $row->get_parent;
                add_row ($box, $row);
        });
        $del->signal_connect (clicked => sub {
                my $row = $_[0]->get_parent;
                my $box = $row->get_parent;
                $box->remove ($row);
        });

        my $i = 0;
        if (defined $previous) {
                foreach my $c ($vbox->get_children) {
                        if ($c == $previous) {
                                last;
                        } else {
                                $i++;
                        }
                }
        }
        $vbox->pack_start ($hbox, 0, 0, 0);
        $vbox->reorder_child ($hbox, $i+1);
        $hbox->show_all;
        return $entry;
}


my $box = Gtk2::VBox->new;
add_row ($box, undef);

$window->add ($box);

$window->show_all;
Gtk2->main;
__END__


--
Without treatment, a common cold will last about seven days.
With treatment, it will last about a week.
   -- conventional wisdom


Attachment: MEF.jpg
Description: JPEG image



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]