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

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   
70   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87   
88   
89   
90   
91   
94   
95   
96   
97   
99   
100   
101   
102   
103   
104   
105   
106   
107   
108   
109   
110   
111   
112   
113   
114   
115   
116   
117   
118   
119   
120   
121   
122   
123   
124   
125   
126   
127   
129   
130   
131   
132   
133   
134   
136   
139   
140   
141   
142   
143   
144   
145   
146   
147   
148   
149   
150   
151   
152   
153   
154   
156   
157   
158   
159   
160   
161   
162   
163   
164   
165   
166   
167   
168   
169   
170   
171   
172   
173   
174   
175   
176   
177   
<?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);
}

// toggle the selection box
function on_toggle($renderer, $row, $view, $col_num) {
    $model = $view->get_model();
    $iter = $model->get_iter($row); // get the iter
       for ($i=4; $i<=6; ++$i) {
           if ($i==$col_num) {
               $model->set($iter, $i, true);
           } else {
               $model->set($iter, $i, false);
           }
       }
}

// display alternate row color
function format_col($column, $cell, $model, $iter, $col_num) {
    $path = $model->get_path($iter);
    $row_num = $path[0];
    if ($col_num==3) {
        $amt = $model->get_value($iter, 3);
        $cell->set_property('text', '$'.number_format($amt,2));
    }
    $row_color = ($row_num%2==1) ? '#dddddd' : '#ffffff';
    $cell->set_property('cell-background', $row_color);
}

// process user selection
function on_clicked($button, $model) {
    $num_rows = $model->iter_n_children(NULL);
    for ($i=0; $i<$num_rows; ++$i) {
        $iter = $model->get_iter($i);
        $row_id = $model->get_value($iter, 0);
        $row_desc = $model->get_value($iter, 1);
        $qty = $model->get_value($iter, 2);
        $price = $model->get_value($iter, 3);

        $option_A = $model->get_value($iter, 4); // note 1
        $option_B = $model->get_value($iter, 5); // note 1
        $option_C = $model->get_value($iter, 6); // note 1
        $option = '';
        if ($option_A) $option = 'A'; // note 2
        elseif ($option_B) $option = 'B'; // note 2
        elseif ($option_C) $option = 'C'; // note 2
        echo "You have selected: $row_id ($row_desc) \n".
        "qty=$qty (price=$price) option=$option\n";
        // your action here
    }
}

?>

Output

As shown above.

 

Add comment


Security code
Refresh