Я использую Gtk.FlowBox
с несколькими Gtk.FlowBoxChild
детьми. На основе кнопок, выбранных пользователем, я применяю различные Gtk.FlowBoxFilterFunc
функции. Я хотел бы определить в любой момент времени, сколько детей видимы (т.е. не отфильтрованы). Я пробовал проверять все различные свойства visible
, no_show_all
, а также функции is_visible()
, get_visible()
. Кажется, я не могу найти какое-либо свойство или метод для определения того, какие дочерние элементы не отфильтрованы - возможно ли это?
Я заметил, что когда я использую GTK Inspector для отладки, он, кажется, обнаруживает изменение, потому что текст в дереве иерархии меняется с черного на серый. Это заставляет меня думать, что это должно быть как-то возможно!
MCVE:
public class Mcve.Application : Gtk.Application {
public Application () {
Object (
application_id: Constants.APP_ID,
flags: ApplicationFlags.FLAGS_NONE
);
}
protected override void activate () {
var flow_box = new Gtk.FlowBox () {
expand = true
};
var child1 = new Gtk.FlowBoxChild ();
child1.child = new Gtk.Label ("Child 1");
var child2 = new Gtk.FlowBoxChild ();
child2.child = new Gtk.Label ("Child 2");
flow_box.add (child1);
flow_box.add (child2);
var button = new Gtk.Button.with_label ("Filter");
button.clicked.connect (() => {
flow_box.set_filter_func ((child) => {
var item = child.get_child () as Gtk.Label;
return item.label == "Child 1";
});
foreach (var child in flow_box.get_children ()) {
var item = child as Gtk.FlowBoxChild;
int index = item.get_index () + 1;
debug ("[Child %d] item.visible = %s", index, item.visible.to_string ());
debug ("[Child %d] item.no_show_all = %s", index, item.no_show_all.to_string ());
debug ("[Child %d] item.is_visible () = %s", index, item.is_visible ().to_string ());
debug ("[Child %d] item.get_visible () = %s", index, item.get_visible ().to_string ());
debug ("[Child %d] item.get_child ().visible = %s", index, item.get_child ().visible.to_string ());
debug ("[Child %d] item.get_child ().no_show_all = %s", index, item.get_child ().no_show_all.to_string ());
debug ("[Child %d] item.get_child ().is_visible () = %s", index, item.get_child ().is_visible ().to_string ());
debug ("[Child %d] item.get_child ().get_visible () = %s", index, item.get_child ().get_visible ().to_string ());
}
});
var grid = new Gtk.Grid ();
grid.attach (flow_box, 0, 0);
grid.attach (button, 0, 1);
var window = new Gtk.Window ();
window.add (grid);
this.add_window (window);
window.present ();
window.show_all ();
}
public static int main (string[] args) {
var app = new Mcve.Application ();
return app.run (args);
}
}
Вывод при нажатии на фильтр:
[Child 1] item.visible = true
[Child 1] item.no_show_all = false
[Child 1] item.is_visible () = true
[Child 1] item.get_visible () = true
[Child 1] item.get_child ().visible = true
[Child 1] item.get_child ().no_show_all = false
[Child 1] item.get_child ().is_visible () = true
[Child 1] item.get_child ().get_visible () = true
[Child 2] item.visible = true
[Child 2] item.no_show_all = false
[Child 2] item.is_visible () = true
[Child 2] item.get_visible () = true
[Child 2] item.get_child ().visible = true
[Child 2] item.get_child ().no_show_all = false
[Child 2] item.get_child ().is_visible () = true
[Child 2] item.get_child ().get_visible () = true
В инспекторе GTK я вижу, что он каким-то образом знает, что второй дочерний элемент не виден:
Обновлено: похоже, что инспектор GTK отвечает на сигнал mapped
: https://github.com/GNOME/gtk/blob/main/gtk/spector/object-tree.c#L700, и действительно, вызов get_mapped ()
на FlowBoxChild
вернет true
или false
в зависимости от того, виден ли элемент. Я не совсем уверен, что означает отображение виджета, поэтому я немного не решаюсь этому доверять.
@BobMorane - Добавлено, спасибо! Нажатие на кнопку применяет фильтр, и все свойства и т. д., похоже, указывают на то, что FlowBoxChild, а также дочерний виджет будут видны.
Ницца! по возможности посмотрю!!
@BobMorane - я копался в исходниках Gtk Inspector, и похоже, что использование get_mapped()
работает. Это что-то новое для меня, я раньше не слышал о концепции отображаемого виджета. valadoc.org/gtk+-3.0/Gtk.Widget.map.html
Хорошо, я проверю на своей стороне, как только смогу. "покопался в исходниках Gtk Inspector": молодец!
Из это: «Виджет сопоставляется, когда виджет виден (который управляется с помощью GtkWidget:visible
), и все его родители до виджета верхнего уровня также видны. Сигнал ::map
можно использовать для определения того, будет ли отображаться виджет».
Похоже, вы нашли его! Я бы порекомендовал вам протестировать его и, если он работает так, как ожидалось, опубликовать свои выводы в качестве решения.
Он отлично работает - жаль, что вчера я не заглянул в исходный код GTK Inspector! Удивительно, что может сделать хороший ночной сон!
Кстати, спасибо за GTK Inspector... Я уже некоторое время занимаюсь разработкой с использованием GTK и почему-то никогда об этом не слышал. Сейчас разберусь...!
Это возможно с помощью метода get_mapped()
в виджете Gtk.FlowBoxChild
.
Как упоминалось в комментариях @BobMorane, документация ГТК имеет следующую запись для сигнала map
:
A widget is mapped when the widget is visible (which is controlled with GtkWidget:visible) and all its parents up to the toplevel widget are also visible. The ::map signal can be used to determine whether a widget will be drawn
Я хотел бы взглянуть. Не могли бы вы привести минимальный и воспроизводимый пример?