Как контролировать, какие виджеты GTK видны в расширенной строке дерева? - PullRequest
0 голосов
/ 06 апреля 2019

Я создаю хранилище дерева с GTK3 в C, в котором есть первичные строки, которые всегда отображаются, и, щелкнув по маленькому треугольному значку слева от основной строки, дополнительные вторичные (дочерние) строки расширяются нижепервична.В качестве примера рассмотрим, что первичные строки могут быть каталогами, а когда они развернуты, строки ниже показывают файлы в этих каталогах.Я делаю это, чтобы позволить пользователю выбрать первичные элементы для удаления, в то время как вторичные строки являются просто информационными, например, сообщая, какие файлы находятся в каталоге, чтобы они знали, действительно ли они хотят удалить весьвещь.

Чтобы включить выбор для удаления, первый столбец содержит GTK_CELL_RENDERER_TOGGLE, и у меня есть обратный вызов, связанный с переключателем флажка.Все работает хорошо, за исключением одного.Когда пользователь щелкает маленький треугольник, чтобы развернуть строку, большая часть содержимого первичной строки не появляется во вторичных строках (это ожидаемо и желательно), но ... флажок переключателя делает появляются в первом столбце.Хотя в примере каталогов / файлов это может иметь смысл, в моем случае не имеет смысла удалять содержимое вторичных строк.

При создании вторичных строк я пробовал что-то вроде:

gtk_tree_store_set(TS,&J,2,"filename",-1);

или

gtk_tree_store_set(TS,&J,0,NULL,2,"filename",-1);

в надежде, что NULL приведет к подавлению переключения, но безрезультатно.GTK по-прежнему отображает флажок, вероятно, просто интерпретируя NULL как ноль.

Есть ли способ контролировать (и в моем случае подавлять) отображение переключателя?Или, вообще говоря, есть ли чистый способ контролировать, какие столбцы отображаются в дочерних строках?Кажется, он работает с TEXT, но только не с TOGGLE.

Чуть позже: есть потенциально полезная функция с именем gtk_cell_renderer_set_visible (), но она требует ссылки на средство визуализации ячеек.Как получить это для каждой строки или для каждой ячейки, когда все, что у меня есть во время построения, это GtkTreeStore и GtkTreeIter?

1 Ответ

0 голосов
/ 15 апреля 2019

Есть (как минимум) 2 решения:

  1. Базовый класс GtkCellRenderer имеет свойство visible. Вы можете добавить в свою модель дополнительное поле, которое указывает, должен ли переключатель отображаться для этой строки.
  2. Если в вашей модели есть другие поля, которые указывают, является ли это первичной или вторичной строкой, но не напрямую, вы можете использовать gtk_tree_view_column_set_cell_data_func, чтобы установить функцию, вызываемую перед рендерингом. Там вы можете вызвать gtk_cell_renderer_set_visible или любую другую функцию, чтобы установить свойства рендерера вручную.
...