Gtk2

 view release on metacpan or  search on metacpan

gtk-demo/combobox.pl  view on Meta::CPAN

#!/usr/bin/perl -w
#
# Combo boxes 
#
# The ComboBox widget allows to select one option out of a list.
# The ComboBoxEntry additionally allows the user to enter a value
# that is not in the list of options. 
#
# How the options are displayed is controlled by cell renderers.
#

package combobox;

use strict;
use warnings;
use Glib ':constants';
use Gtk2;
#include "demo-common.h"

use constant PIXBUF_COL => 0;
use constant TEXT_COL => 1;

my $window = undef;


sub create_stock_icon_store()
{
  my @stock_id = (
    'gtk-dialog-warning',
    'gtk-stop',
    'gtk-new',
    'gtk-clear',
    undef,
    'gtk-open'    
  );

  my ($item, $pixbuf, $cellview, $iter, $store, $label);

  $cellview = Gtk2::CellView->new();
  
  $store = Gtk2::ListStore->new('Gtk2::Gdk::Pixbuf', 'Glib::String');

  for my $i (@stock_id) {
    if ($i)
    {
      $pixbuf = $cellview->render_icon($i,
                       'GTK_ICON_SIZE_BUTTON');
      $item = Gtk2::Stock->lookup($i);
      $label = $item->{label};
      # strip underscores
      $label =~ tr/_//d;
      $iter = $store->append();
      $store->set ($iter,
                  PIXBUF_COL, $pixbuf,
                  TEXT_COL, $label);
      undef $pixbuf;
    } else {
      $iter = $store->append();
      $store->set($iter,
                  PIXBUF_COL, undef,
                  TEXT_COL, "separator");
    }
  }

  $cellview->destroy();
  
  return $store;
}


# A GtkCellLayoutDataFunc that demonstrates how one can control
# sensitivity of rows. This particular function does nothing 

gtk-demo/combobox.pl  view on Meta::CPAN

# A simple validating entry
package Gtk2::MaskEntry;
use Gtk2;
use base qw(Gtk2::Entry);


sub mask_entry_set_background($)
{
    my $entry = shift;
    if ($entry->get('mask')) {
       my $re = $entry->get('mask');
       if (! ($entry->get_text() =~ $re) ) {
          $entry->modify_base('GTK_STATE_NORMAL', Gtk2::Gdk::Color->new(65535, 60000, 60000));
          return;
       }
    }
  $entry->modify_base('GTK_STATE_NORMAL', undef);
}

sub mask_entry_changed($)
{
    my $editable = shift;
    mask_entry_set_background($editable);
}

sub INIT_INSTANCE($)
{
  my $self = shift;
  $self->set('mask', undef);
}

use Glib::Object::Subclass
     'Gtk2::Entry',
     properties => [
        Glib::ParamSpec->string (
           'mask',
           '',
           '',
           'Glib::String',
           [qw/readable writable/]
        ),
     ],
     signals => {
        changed => \&mask_entry_changed,
     },
     interfaces => [
        'Gtk2::CellEditable',
     ];


sub new($@)
{
    my $class = shift;
    my $self = $class->SUPER::new();
    
    bless $self, $class;

    $self;
}

package combobox;


sub do {  
  my $do_widget = shift;
  
  if (!$window) {
    $window = Gtk2::Window->new('GTK_WINDOW_TOPLEVEL');
    $window->set_screen ($do_widget->get_screen)
      if Gtk2->CHECK_VERSION (2, 2, 0);
    $window->set_title("Combo boxes");

    $window->signal_connect("destroy", sub { $window = undef; });
    
    $window->set_border_width(10);

    my $vbox = Gtk2::VBox->new(FALSE, 2);
    $window->add($vbox);

    # A combobox demonstrating cell renderers, separators and
    # insensitive rows 
    #
    my $frame = Gtk2::Frame->new("Some stock icons");
    $vbox->pack_start($frame, FALSE, FALSE, 0);
    
    my $box = Gtk2::VBox->new(FALSE, 0);
    $box->set_border_width(5);
    $frame->add($box);
    
    my $model = create_stock_icon_store();
    my $combo = Gtk2::ComboBox->new_with_model($model);
    undef $model;
    $box->add($combo);
    
    my $renderer = Gtk2::CellRendererPixbuf->new();
    $combo->pack_start($renderer, FALSE);
    $combo->set_attributes($renderer,
                    "pixbuf", PIXBUF_COL);

    $combo->set_cell_data_func($renderer, \&set_sensitive);
    
    $renderer = Gtk2::CellRendererText->new();
    $combo->pack_start($renderer, TRUE);
    $combo->set_attributes($renderer,
                    "text", TEXT_COL);

    $combo->set_cell_data_func($renderer, \&set_sensitive);

    $combo->set_row_separator_func(\&is_separator);
    
    $combo->set_active(0);
    
    # A combobox demonstrating trees.
    #
    $frame = Gtk2::Frame->new("Where are we ?");
    $vbox->pack_start($frame, FALSE, FALSE, 0);

    $box = Gtk2::VBox->new(FALSE, 0);
    $box->set_border_width(5);
    $frame->add($box);
    
    $model = create_capital_store ();
    $combo = Gtk2::ComboBox->new_with_model($model);
    # undef $model;
    $box->add($combo);

    $renderer = Gtk2::CellRendererText->new();
    $combo->pack_start($renderer, TRUE);
    $combo->set_attributes($renderer,
                    "text", 0);
    $combo->set_cell_data_func($renderer, \&is_capital_sensitive);

    my $path = Gtk2::TreePath->new_from_indices(0, 8);
    my $iter = $model->get_iter($path);
    undef $path;
    $combo->set_active_iter($iter);

    # A GtkComboBoxEntry with validation.
    #
    $frame = Gtk2::Frame->new("Editable");
    $vbox->pack_start($frame, FALSE, FALSE, 0);
    
    $box = Gtk2::VBox->new(FALSE, 0);
    $box->set_border_width(5);
    $frame->add($box);
    
    $combo = undef;
    eval {
        $combo = Gtk2::ComboBox->text_new_with_entry();
    };
    eval {
        $combo = Gtk2::ComboBoxEntry->new_text();
    } if (!$combo);
    fill_combo_entry($combo);
    $box->add($combo);
    
    my $entry = Gtk2::MaskEntry->new();
    $entry->set('mask', "^([0-9]*|One|Two|2\x{00bd}|Three)\$");
     
    $combo->remove($combo->get_child());
    $combo->add($entry);
  }

  if (!$window->visible()) {
      $window->show_all();
  } else {
      $window->destroy();
  }

  return $window;
}




( run in 0.754 second using v1.01-cache-2.11-cpan-8dfa8b56332 )