Создание сетки однородных квадратных кнопок в gtk4
Как сказано в заголовке, я хочу создать сетку из однородных квадратных кнопок в gtk4, без (или очень маленького) промежутка между ячейками. Кажется, это должно быть довольно просто, но я действительно изо всех сил пытался добиться этого в gtk.
Вот изображение того, что я пытаюсь воспроизвести: диаграмма диапазона.
Это предназначено для приложения, связанного с покером. Такие графики чрезвычайно распространены в покерном софте. Пользователь должен иметь возможность выбрать любое подмножество ячеек, каждая из которых представляет собой раздачу. Это подмножество (или, как его называют, «диапазон») может затем обрабатываться программой различными способами.
Мои (неудачные) попытки на данный момент включают:
- Использование GtkGrid с каждым дочерним элементом, содержащим GtkAspectFrame, который содержит GtkToggleButton. изображение
Это сработало, но у меня остались ужасные промежутки между ячейками, от которых я не мог придумать, как избавиться. Кроме того, когда я запускал программу, GTK выдавал кучу сообщений об ошибках, которые выглядели так:
(window:29202): Gtk-CRITICAL **: 11:07:39.057: Allocation width too small. Tried to allocate 34x34, but GtkToggleButton 0x564febf98c10 needs at least 36x34.
- Использование GtkListStore с 13 столбцами G_TYPE_STRING (по одному для каждой карты). Затем я вручную добавил каждую из 13 строк в хранилище списков и отобразил их как GtkTreeView с помощью GtkCellRendererText. изображение
Мне удалось отобразить текст, но это все. GtkTreeView больше ориентирован на строки / столбцы, чем на ячейки. Даже не похоже, что есть способ выбрать отдельные ячейки, и, похоже, нет способа добавлять кнопки по умолчанию. Возможно, я смогу реализовать собственный GtkCellRenderer с кучей настраиваемых событий / сигналов? Это похоже на кроличью нору, чтобы спуститься вниз, поэтому я хотел сначала посмотреть, смогу ли я получить какое-то руководство.
Помимо самой простой реализации, я в конечном итоге хочу, чтобы каждая ячейка могла иметь связанные данные, которые не обязательно отображаются постоянно. Я считаю, что это говорит о том, что GtkTreeView - правильный путь, если есть способ заставить его работать должным образом.
Как вы, наверное, догадались, я новичок в Gtk. Я играл с ним всего несколько дней, пытаясь понять документацию и заставить это работать. Какой здесь правильный подход? Будем очень признательны за любые советы, которые укажут мне правильное направление.
В качестве бонуса: часто хорошо разработанное приложение для игры в покер позволяет вам наводить указатель мыши на ячейки, удерживая нажатой кнопку мыши, чтобы выбрать диапазон. Любая ячейка под курсором при нажатой кнопке мыши будет добавлена к выделению. Часто это удобнее, чем щелкать каждую отдельную ячейку. Как добиться такого поведения в gtk4?
1 ответ
Ты можешь использовать GtkGrid
и установите
row-homogeneous
а также
column-homogeneous
характеристики. В результате все ячейки будут иметь одинаковую высоту / ширину с самым большим дочерним элементом соответственно.
GtkWidget *grid = gtk_grid_new();
gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
// Then just attach your button using the usual APIs:
// gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);
или в GtkBuilder XML
<object class="GtkGrid" id="grid">
<property name="row-homogeneous">1</property>
<property name="column-homogeneous">1</property>
<child>
<object class="GtkToggleButton">
<!-- initialize your toggle button -->
</object>
<layout>
<property name="column">0</property>
<property name="row">0</property>
</layout>
</child>
<!-- And so on ... -->
</object>