7 июля 2009 г.

Отображение списков. Часть 5

Отображение списков. Часть 1
Отображение списков. Часть 2
Отображение списков. Часть 3
Отображение списков. Часть 4

Продолжаем работать над списком. Сегодня добавим к нему сортируемые колонки, горизонтальные и вертикальные линии и колонку с изображениями.


  • Для того, чтобы сделать колонку сортируемой, достаточно вызова для неё метода set_sort_column_id().
    $column1 = new GtkTreeViewColumn('Колонка 1', $render_text, 'text', 0);
    $view->append_column($column1);
    $column1->set_sort_column_id(0);

    Этот код можно прочитать следующим образом: при нажатии на заголовок колонки $column1 произвести сортировку колонки с ID == 0.

  • Вертикальные и горизонтальные линии создаются методом set_grid_lines() для GtkTreeView. Существует три вида линий:
    • Gtk::TREE_VIEW_GRID_LINES_HORIZONTAL - только горизонтальные;

    • Gtk::TREE_VIEW_GRID_LINES_VERTICAL - только вертикальные;

    • Gtk::TREE_VIEW_GRID_LINES_BOTH - оба вида;

    • Gtk::TREE_VIEW_GRID_LINES_NONE - без линий.

    $view->set_grid_lines(Gtk::TREE_VIEW_GRID_LINES_BOTH);

  • Для того, чтобы вставить изображение, необходимо создать специальную колонку:
    $render_image = new GtkCellRendererPixbuf();
    $view->append_column($column0 = new GtkTreeViewColumn());
    $column0->pack_start($render_image);

    Эта колонка особенная и должна заполняться отдельно от всех остальных, для этого методом set_cell_data_func() вызовем функцию create_image_column(), в которой реализуем заполнение колонки.
    $column0->set_cell_data_func($render_image, 'create_image_column');
     
    function create_image_column($column, $render, $model, $iter)
    {
    $type = $model->get_value($iter, 1);
    if ($type == '<DIR>')
    {
    $render->set_property('stock-id', 'gtk-directory');
    }
    else
    {
    $render->set_property('stock-id', 'gtk-file');
    }
    }


Полный код программы:
<?php
 
$window = new GtkWindow;
$window->set_size_request(250, 100);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$store = new GtkListStore(GObject::TYPE_STRING, GObject::TYPE_STRING);
$store->append(array('etc', '<DIR>'));
$store->append(array('index.html', '<FILE>'));
$store->append(array('index.php', '<FILE>'));
 
$view = new GtkTreeView($store);
$view->set_grid_lines(Gtk::TREE_VIEW_GRID_LINES_BOTH);
 
$render_image = new GtkCellRendererPixbuf();
$view->append_column($column0 = new GtkTreeViewColumn());
$column0->pack_start($render_image);
$column0->set_cell_data_func($render_image, 'create_image_column');
 
function create_image_column($column, $render, $model, $iter)
{
$type = $model->get_value($iter, 1);
if ($type == '<DIR>')
{
$render->set_property('stock-id', 'gtk-directory');
}
else
{
$render->set_property('stock-id', 'gtk-file');
}
}
 
$render_text = new GtkCellRendererText;
$column1 = new GtkTreeViewColumn('Колонка 1', $render_text, 'text', 0);
$view->append_column($column1);
$column1->set_sort_column_id(0);
$column2 = new GtkTreeViewColumn('Колонка 2', $render_text, 'text', 1);
$view->append_column($column2);
$column2->set_sort_column_id(1);
 
$scroll = new GtkScrolledWindow();
$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scroll->add($view);
 
$window->add($scroll);
$window->show_all();
Gtk::main();
 
?>

Комментариев нет: