Определить количество видимых дочерних элементов Gtk.FlowBox

Я использую 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.FlowBox


Обновлено: похоже, что инспектор GTK отвечает на сигнал mapped: https://github.com/GNOME/gtk/blob/main/gtk/spector/object-tree.c#L700, и действительно, вызов get_mapped () на FlowBoxChild вернет true или false в зависимости от того, виден ли элемент. Я не совсем уверен, что означает отображение виджета, поэтому я немного не решаюсь этому доверять.

Я хотел бы взглянуть. Не могли бы вы привести минимальный и воспроизводимый пример?

BobMorane 19.03.2022 16:08

@BobMorane - Добавлено, спасибо! Нажатие на кнопку применяет фильтр, и все свойства и т. д., похоже, указывают на то, что FlowBoxChild, а также дочерний виджет будут видны.

avojak 19.03.2022 16:52

Ницца! по возможности посмотрю!!

BobMorane 19.03.2022 16:55

@BobMorane - я копался в исходниках Gtk Inspector, и похоже, что использование get_mapped() работает. Это что-то новое для меня, я раньше не слышал о концепции отображаемого виджета. valadoc.org/gtk+-3.0/Gtk.Widget.map.html

avojak 19.03.2022 17:14

Хорошо, я проверю на своей стороне, как только смогу. "покопался в исходниках Gtk Inspector": молодец!

BobMorane 19.03.2022 17:47

Из это: «Виджет сопоставляется, когда виджет виден (который управляется с помощью GtkWidget:visible), и все его родители до виджета верхнего уровня также видны. Сигнал ::map можно использовать для определения того, будет ли отображаться виджет».

BobMorane 19.03.2022 18:33

Похоже, вы нашли его! Я бы порекомендовал вам протестировать его и, если он работает так, как ожидалось, опубликовать свои выводы в качестве решения.

BobMorane 19.03.2022 18:33

Он отлично работает - жаль, что вчера я не заглянул в исходный код GTK Inspector! Удивительно, что может сделать хороший ночной сон!

avojak 19.03.2022 18:48

Кстати, спасибо за GTK Inspector... Я уже некоторое время занимаюсь разработкой с использованием GTK и почему-то никогда об этом не слышал. Сейчас разберусь...!

BobMorane 19.03.2022 18:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это возможно с помощью метода 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

Другие вопросы по теме