Как в Gtk4 получить уведомление об изменении размера виджета?
Пытаюсь переписать свое старое приложение для просмотра картинок с Gtk3 на Gtk4.
Если раньше можно было спокойно подключиться к сигналу size_allocate, то в gtk4 этот сигнал удалили и теперь я не могу понять как узнать когда у виджета меняются размеры.
Ответы (1 шт):
После некоторых экспериментов, я нашел решение которое меня устраивает.
Возможно есть более красивые варианты, но я их не знаю.
class MyAppWindow: Gtk.ApplicationWindow {
public int windowWidth {
get { return get_width(); }
set {
Idle.add(() => {
print(@"window width: $value\n");
return Source.REMOVE;
});
}
}
public bool isMaximized {
get { return maximized; }
set {
Idle.add(() => {
print(@"window maximized: $isMaximized; width: $(get_width())\n");
return Source.REMOVE;
});
}
}
public MyAppWindow(Gtk.Application app) {
Object(application: app);
this.bind_property("default-width", this, "windowWidth", BindingFlags.DEFAULT | BindingFlags.SYNC_CREATE);
this.bind_property("maximized", this, "isMaximized", BindingFlags.DEFAULT | BindingFlags.SYNC_CREATE);
}
}
Здесь я свойства default_width и maximized которые есть в Gtk.ApplicationWindow подключаю к свойствам windowWidth и isMaximized.
При обычном растягивании окна вызывается setter в windowWidth, где мы можем вызвать сигнал или другой метод.
isMaximized сработает только при максимизации окна и это нужно для получения размера окна т.к. в этом случаее windowWidth не сработает.
В Gtk.Widget подобное у меня не получилось сделать, но можно попробовать реализовать методы measure, size_allocate, get_request_mode и в size_allocate перехватывать изменения размера виджета.
В Gtk4 добавили бредовые LayoutManager, хотя может они и полезны, но мне пока только мешают.
Если в виджет добавить LayoutManager, то методы measure, size_allocate, get_request_mode которые вы переопределите в классе виджета не будут вызываться.