LINUX.ORG.RU

GtkCellRendererToggle и GtkCellRendererText в одной колонке


0

0

Если вкратце, то необходимо создать TreeView, в котором будет отображаться дерево файлов и каталогов, причем в колонке с именем файла должен находится флажок, с помощью которого можно выбирать, нужно ли скачивать файл или нет (точь в точь как просмотр файлов торрента в KTorrent).

Проблема в следующем. Если упаковать GtkCellRendererToggle и GtkCellRendererText в одну колонку при помощи gtk_tree_view_column_pack_start, а потом назначить обработчик сигнала для GtkCellRendererToggle, то обработчик нажатия на GtkCellRendererToggle будет активироваться даже тогда, когда я нажимаю не на флажок, а просто на строку GtkTreeView (а точнее на GtkCellRendererText). Привязка обработчика на GtkCellRendererText не помогает - он просто не вызывается.

Подскажите, пожалуйста, что тут можно сделать.

anonymous
Ответ на: комментарий от Deleted

Дело в том, что необходимо, чтобы древовидность прослеживалась в обоих рендерерах. Если разнести их по разным колонкам, то она из них полностью потеряет древовидную структуру, и получится совсем не то, чего хотелось бы.

anonymous
()
Ответ на: комментарий от anonymous

Так оно так и будет. Мне кажется ты не до конца разобрался со структурой GtkTreeView, в смысле как он работает.

Deleted
()

Активируется сразу вся ячейка со всеми рендерами,
поэтому чтобы это нормально реализовать надо лезть вглубь gtk :)

Можно заюзать такой хак (мышой будет кликаться только toggle,
но с клавиатуры выбираться вся ячейка):

static gint
gtk_cell_renderer_toggle_activate(GtkCellRenderer * cell,
				  GdkEvent * event,
				  GtkWidget * widget,
				  const gchar * path,
				  GdkRectangle * background_area,
				  GdkRectangle * cell_area,
				  GtkCellRendererState flags)
{
    GtkCellRendererToggle *celltoggle;

    celltoggle = GTK_CELL_RENDERER_TOGGLE(cell);
    if (celltoggle->activatable) {
	if (!event || (event->type != GDK_BUTTON_PRESS)) {
	    g_signal_emit_by_name(cell, "toggled", path);
	    return TRUE;
	} else if (((event->button.x - cell_area->x) < cell_area->width)
		   && ((cell_area->y - event->button.y) <
		       cell_area->height)) {
	    g_signal_emit_by_name(cell, "toggled", path);
	    return TRUE;
	}
	return FALSE;
    }
    return FALSE;
}

...
int main(int argc, char *argv[])
{
...
    GtkCellRenderer *toggle_renderer;
    GtkCellRendererClass *cell_class;
...
    gtk_init(&argc, &argv);
...
    toggle_renderer = gtk_cell_renderer_toggle_new();

    cell_class = GTK_CELL_RENDERER_CLASS(GTK_WIDGET_GET_CLASS(toggle_renderer));
    cell_class->activate = gtk_cell_renderer_toggle_activate;
...

p.s. А почему древовидная структура от отдельной колонки теряется?

anonymous
()
Ответ на: комментарий от anonymous

anonymous, огромное спасибо. Пусть и хак, но главное, что работает.

> p.s. А почему древовидная структура от отдельной колонки теряется?

Ну потому, что если, например, в колонку с expander'ами запихнуть имя файла, а флажки поместить в следующую колонку, то имена файлов из-за expander'ов будут иметь древовидную структуру, как и требуется, но вот флажки в другой колонке будут "в одну линию". Это очень неудобно, когда пользователь нажимает на флажок для директории, в результате чего должны сняться флажки всех дочерних файлов и директорий - желательно, чтобы при этом флажки тоже имели древовидность и были по-ближе к имени файла (в одной колонке), чтобы процесс включения/отключения файлов для закачки был как можно более интуитивно понятен.

anonymous
()
Ответ на: комментарий от Deleted

halter, спасибо, но это все-же не совсем то, что мне бы хотелось. :) В приведенном вами примере имя помещается в отдельную колонку. С увеличением вложенности имена файлов/директорий корневых каталогов будут располагаться все дальше от флажков, что будет очень некрасиво - слева дерево из флажков, а справа столбец (не дерево!) имен. На приведенном скриншоте это не очень заметно, т. к. здесь всего один уровень вложенности.

anonymous
()
Ответ на: комментарий от anonymous

Ну, значит я изначально не совсем понял сути вопроса :)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.