PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 302: How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 3 - process selections?
Written by kksou   
Saturday, 18 August 2007
Problem

We have set up three radio buttons in a treeview in How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 2 - three radio buttons?

In this Part 3, we will process the user selections as shown below:

How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 3 - process selections?


Solution
  • First use the technique as outlined in Part 2 to set up the three radio buttons.
  • To get the user selection of the radio buttons, we need to manually go through each of the radio button to test its status and find out which is the selected one.

Sample Code
1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87   
88   
89   
90   
91   
92   
93   
94   
95   
96   
97   
98   
99   
100   
101   
102   
103   
104   
105   
106   
107   
108   
109   
110   
111   
112   
113   
114   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 230);
$window->connect_simple('destroy', array('Gtk','main_quit'));

$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("Set up radio buttons in GtkTreeView\n".
"      Part 3 (process selections)");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$title->set_size_request(-1, 40);
$vbox->pack_start($title, 0, 0);
$vbox->pack_start(new GtkLabel(), 0, 0);

$vbox->pack_start($hbox = new GtkHBox, 0, 0);
$button = new GtkButton('Process Rows');
$hbox->pack_start(new GtkLabel(
    'Press the button to process all rows '), 0, 0);
$hbox->pack_start($button, 0, 0);

// the 2D table
$data = array(
array('row0', 'item 1', 2, 3.1),
array('row1', 'item 4', 5, 6.21),
array('row2', 'item 7', 8, 9.36),
array('row3', 'item 10', 11, 12.4),
array('row4', 'item 21', 14, 15.5),
array('row5', 'item 36', 17, 18.6),
array('row6', 'item 42', 20, 21.73));

$model = display_table($vbox, $data);
$button->connect('clicked', 'on_clicked', $model);

$window->show_all();
Gtk::main();

function display_table($vbox, $data) {

    // Set up a scroll window
    $scrolled_win = new GtkScrolledWindow();
    $scrolled_win->set_policy( Gtk::POLICY_AUTOMATIC,
        Gtk::POLICY_AUTOMATIC);
    $vbox->pack_start($scrolled_win);

    // Creates the list store
    if (defined("GObject::TYPE_STRING")) {
        $model = new GtkListStore(GObject::TYPE_STRING,
            GObject::TYPE_STRING, GObject::TYPE_LONG, GObject::TYPE_DOUBLE,
            GObject::TYPE_BOOLEAN, GObject::TYPE_BOOLEAN, GObject::TYPE_BOOLEAN);
    } else {
        $model = new GtkListStore(Gtk::TYPE_STRING,
            Gtk::TYPE_STRING, Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE,
            Gtk::TYPE_BOOLEAN, Gtk::TYPE_BOOLEAN, Gtk::TYPE_BOOLEAN);
    }
    $field_header = array('Row #', 'Description', 'Qty', 'Price');

    // Creates the view to display the list store
    $view = new GtkTreeView($model);
    $scrolled_win->add($view);

    // Creates the selection column

    // Creates the rest of the column
    for ($col=0; $col<count($field_header); ++$col) {
        $cell_renderer = new GtkCellRendererText();
        $column = new GtkTreeViewColumn($field_header[$col],
            $cell_renderer, 'text', $col);
        $column->set_cell_data_func($cell_renderer, "format_col", $col);
        if ($col==1) $column->set_expand(true);
        $view->append_column($column);
    }

    setup_radio($view, 'A', 4);
    setup_radio($view, 'B', 5);
    setup_radio($view, 'C', 6);

    // pupulates the data
    for ($row=0; $row<count($data); ++$row) {
        $values = array();
        for ($col=0; $col<count($data[$row]); ++$col) {
            $values[] = $data[$row][$col];
        }
        $values = array_merge($values, array(0, 0, 0));
        $model->append($values);
    }

    $selection = $view->get_selection();
    $selection->set_mode(Gtk::SELECTION_NONE);

    return $model;

}

// setup radio buttons
function setup_radio($view, $label, $col_num) {
    $column = new GtkTreeViewColumn();
    $view->append_column($column);

    $cell_renderer1 = new GtkCellRendererText();
    $cell_renderer1->set_property('text', $label);
    $column->pack_start($cell_renderer1, true);
    $column->set_cell_data_func($cell_renderer1, "format_col", $col_num);

    $cell_renderer2 = new GtkCellRendererToggle();
    $cell_renderer2->set_property('activatable', true);
    $cell_renderer2->set_radio(true);
    $cell_renderer2->connect('toggled', 'on_toggle', $view, $col_num);
    $column->pack_start($cell_renderer2, true);
    $column->set_attributes($cell_renderer2, 'active', $col_num);
    $column->set_cell_data_func($cell_renderer2, "format_col", $col_num);
}

  • Note that this is only 70% of the sample code. You have to be a registered member to see the entire sample code. Please login or register.
  • Registration is free and immediate.
  • Have some doubt about the registration? Please read this forum article.
Explanation

We make use of the code in How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 2 - three radio buttons?

What's new here:

  1. Find out the status of each of the radio button.
  2. Place the selected one in the variable $option.

Related Articles


User reviews

There are no user reviews yet.

Note: You have to be a registered member to leave a comment. Free registration here.

 
< Prev   Next >

Blog - Forum - Privacy Policy - Contact Us
Copyright © 2006-2008. kksou.com. All Rights Reserved