3 июля 2009 г.

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

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

Сегодня мы добавим к нашему списку ещё одну колонку, в которой будут находиться перключатели для множественного выбора.



Для этого в модели $store пропишем новую колонку типа GObject::TYPE_BOOLEAN, а при добавлении в неё строк для каждой из них укажем третьим элементом TRUE или FALSE в зависимости от того, будет стоять галочка на переключателе по умолчанию или нет.
$store = new GtkListStore(
GObject::TYPE_STRING, GObject::TYPE_STRING, GObject::TYPE_BOOLEAN);
$store->append(array('etc', '<DIR>', TRUE));
$store->append(array('index.html', '<FILE>', FALSE));
$store->append(array('index.php', '<FILE>', FALSE));


Переменную $render необходимо разделить на две: для отображения текста и переключателей.
$render_text = new GtkCellRendererText();
$render_toggle = new GtkCellRendererToggle();


При щелчке левой кнопкой мыши по переключателю издаётся сигнал 'toggled', но галочка не устанавливается. Нам это придётся сделать вручную:
$render_toggle->connect('toggled', 'on_toggled', $store);
function on_toggled($renderer, $row, $store)
{
$iter = $store->get_iter($row);
$store->set($iter, 2, !$store->get_value($iter, 2));
}


В функцию on_toggled() автоматически передаётся $render_toggle и номер строки - $row. Методом set() устанавливаем новое значение в колонку с ID 2, противоположное текущему, т.е. если было TRUE - станет FALSE и наоборот.

Полный код программы:
<?php
 
$window = new GtkWindow;
$window->set_size_request(200, 100);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$store = new GtkListStore(
GObject::TYPE_STRING, GObject::TYPE_STRING, GObject::TYPE_BOOLEAN);
$store->append(array('etc', '<DIR>', TRUE));
$store->append(array('index.html', '<FILE>', FALSE));
$store->append(array('index.php', '<FILE>', FALSE));
 
$view = new GtkTreeView($store);
 
$render_text = new GtkCellRendererText();
$render_toggle = new GtkCellRendererToggle();
$render_toggle->connect('toggled', 'on_toggled', $store);
$view->append_column(new GtkTreeViewColumn('Колонка 1', $render_text, 'text', 0));
$view->append_column(new GtkTreeViewColumn('Колонка 2', $render_text, 'text', 1));
$view->append_column(new GtkTreeViewColumn('', $render_toggle, 'active', 2));
 
$scroll = new GtkScrolledWindow();
$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scroll->add($view);
 
$window->add($scroll);
$window->show_all();
Gtk::main();
 
function on_toggled($renderer, $row, $store)
{
$iter = $store->get_iter($row);
$store->set($iter, 2, !$store->get_value($iter, 2));
}
 
?>

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