8 июля 2009 г.

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

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

По умолчанию, если текст выходит за пределы колонки, то он очень некрасиво обрезается - колонки "наезжают" друг на друга и может обрезаться часть буквы. Это видно на скриншоте:

Я очень долго искал решение этой проблемы и в итоге нашёл. Необходимо установить свойство 'ellipsize' для класса GtkCellRendererText() в значение Pango::ELLIPSIZE_END.
$render->set_property('ellipsize', Pango::ELLIPSIZE_END);

При этом в правой части колонки появится многоточие, причём Gtk+ сам позаботится о том, чтобы буквы не обрезались. Данное свойство также может иметь ещё два значения - Pango::ELLIPSIZE_START и Pango::ELLIPSIZE_MIDDLE, в таком случае текст будет обрезаться в начале и посередине соответственно. Получится следующее:


Полный код программы:
<?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);
$store->append(array('Длинный текст', 'Ещё более длинный текст'));
 
$view = new GtkTreeView($store);
 
$render = new GtkCellRendererText;
$render->set_property('ellipsize', Pango::ELLIPSIZE_END);
$column1 = new GtkTreeViewColumn('Колонка 1', $render, 'text', 0);
$column1->set_resizable(TRUE);
$view->append_column($column1);
$column2 = new GtkTreeViewColumn('Колонка 2', $render, 'text', 1);
$view->append_column($column2);
 
$scroll = new GtkScrolledWindow();
$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scroll->add($view);
 
$window->add($scroll);
$window->show_all();
Gtk::main();
 
?>

2 комментария:

SViver88 комментирует...

Жесть, а я хотел как то обрезать и добавлять "..."
Спасибо.

Shecspi комментирует...

SViver88, я сам предпринимал неудачные попытки написать собственную "обрезалку". Как оказалось, есть гораздо более простой способ.