Problem
The sample code in Part 5 allows only single row selection.
Suppose you would like to allow multiple rows selection by users as shown below:
Solution
- First use GtkTreeview::get_selection() to get the GtkTreeSelection associated with the view.
- Enable multiple rows selection with GtkTreeSelection::set_mode(Gtk::SELECTION_MULTIPLE).
- Get the selected rows with GtkTreeselection::get_selected_rows().
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 93 94 95 96 97 98 99 100 104 105 106 107 108 109 110 111 112 113 115 116 117 119 120 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | <?php $window = new GtkWindow(); $window->set_size_request(400, 246); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox()); // display title $title = new GtkLabel("Display 2D Array in GtkTreeView - Part 6\n". " allow multiple 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); // setup button $vbox->pack_start($hbox = new GtkHBox(), 0); $hbox->pack_start($button = new GtkButton('Process selections'), 0); // the 2D table $data = array( array('row0', 'item 42', 2, 3.1), array('row1', 'item 36', 20, 6.21), array('row2', 'item 21', 8, 9.36), array('row3', 'item 10', 11, 12.4), array('row4', 'item 7', 5, 15.5), array('row5', 'item 4', 17, 18.6), array('row6', 'item 3', 20, 21.73)); $view = display_table($vbox, $data); $button->connect('clicked', 'on_button', $view); $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); } else { $model = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING, Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE); } $field_header = array('Row #', 'Description', 'Qty', 'Price'); $field_justification = array(0.0, 0.0, 0.5, 1.0); // Creates the view to display the list store global $view; $view = new GtkTreeView($model); $scrolled_win->add($view); // Creates the columns for ($col=0; $col<count($field_header); ++$col) { $cell_renderer = new GtkCellRendererText(); $cell_renderer->set_property("xalign", $field_justification[$col]); $column = new GtkTreeViewColumn($field_header[$col], $cell_renderer, 'text', $col); $column->set_alignment($field_justification[$col]); $column->set_sort_column_id($col); // set the header font and color $label = new GtkLabel($field_header[$col]); $label->modify_font(new PangoFontDescription("Arial Bold")); $label->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000FF")); $column->set_widget($label); $label->show(); // setup self-defined function to display alternate row color $column->set_cell_data_func($cell_renderer, "format_col", $col); $view->append_column($column); } // pupulates the data for ($row=0; $row<count($data); ++$row) { $values = array(); for ($col=0; $col<count($data[$row]); ++$col) { $values[] = $data[$row][$col]; } $model->append($values); } $selection = $view->get_selection(); // note 1 $selection->set_mode(Gtk::SELECTION_MULTIPLE); // note 2 return $view; } // self-defined function to format the price column function format_col($column, $cell, $model, $iter, $col_num) { $path = $model->get_path($iter); // get the current path $row_num = $path[0]; // get the row number 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); } // the function that is called when the user clicks the Process button function on_button($button, $view) { $selection = $view->get_selection(); list($model, $selected_paths) = $selection->get_selected_rows(); // note 3 if (count($selected_paths)==0) return; $selection = array(); foreach($selected_paths as $path) { // note 4 $iter = $model->get_iter($path); $desc = $model->get_value($iter, 1); $qty = $model->get_value($iter, 2); $price = $model->get_value($iter, 3); $selection[] = array($desc, $qty, $price); } print "selected rows: "; print_r($selection); } ?> |
Output
As shown above.
Explanation
- Get the GtkTreeSelection associated with the view.
- Enable multiple rwos selection.
- Retrieve the selected rows.
- Loop through each selected rows.
Related Links
- How to display a 2D array in GtkTreeView - Part 1?
- How to display a 2D array in GtkTreeView - Part 2 - set alignment and headers?
- How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors?
- How to display a 2D array in GtkTreeView - Part 4 - format cell content?
- How to display a 2D array in GtkTreeView - Part 5 - get user selection?
- How to display a 2D array in GtkTreeView - Part 7 - alternate column colors?
- How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors - Method 2?
- How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 2?
- How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 3 - set_attributes?
- How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 4 - add_attribute?
- How to display a 2D array in GtkTreeView - Part 4 - format cell content - Method 2?
Read more...