LINUX.ORG.RU

Как сделать возможность ресайза GTKWindow с фиксированным aratio дочернего элемента?

 ,


0

1

Как сделать, чтобы квадрат в окне, при ресайзе оставался квадратом, а окно ресайзилось строго по контуру дочернего квадрата? Т.е. также как ресайзится mpv c фильмом.

Нужно так: https://s9.postimg.org/iziggotdb/2017-07-19_09-27-47.png Также ресайзится (например) mpv c фильмом.

Если применить Gdk.WindowHints.ASPECT к окну, то все равно пояляются поля вокруг квадрата, т.к. aspect считается от размеров всего окна, вместе с заголовком, а не от области размещения дочернего виджета: https://s10.postimg.org/ki5me2gsp/2017-07-19_09-26-14.png

Вот код примера:

using Gtk;

int main (string[] args) {
    Gtk.init (ref args);

    var window = new Window ();
    window.set_default_size (300, 300);
    window.destroy.connect (Gtk.main_quit);

    var geometry = new Gdk.Geometry();
    geometry.min_aspect = 1.0;
    geometry.max_aspect = 1.0;
    window.set_geometry_hints (window, geometry, Gdk.WindowHints.ASPECT);

    var aframe = new AspectFrame (null, 0.5f, 0.5f, 1.0f, false);

    var button = new Button.with_label ("Button 1:1");
  
    window.add (aframe);
    aframe.add (button);
    window.show_all ();

    Gtk.main ();
    return 0;
}

★★★

Последнее исправление: nvl (всего исправлений: 3)
Ответ на: комментарий от eternal_sorrow

Алгоритм должен быть следующим:

  1. При событии ресайза получить размеры дочернего элемента
  2. Изменить размеры окна в соотвествии с размером дочернего элемента

В качестве события ресайза можно использовать configure-event:

using Gtk;
using Gdk;

public class AspectWindow : Gtk.Window {

	private Gtk.AspectFrame aframe;
	private Gtk.Button button;
	
	public AspectWindow () {
		GLib.Object (type: Gtk.WindowType.TOPLEVEL);
		set_size_request (300, 300);

		this.aframe = new AspectFrame (null, 0.5f, 0.5f, 1.0f, false);
		this.button = new Button.with_label ("Button 1:1");
		this.add (this.aframe);
		this.aframe.add (this.button);
		show_all ();

		this.destroy.connect (Gtk.main_quit);
		this.configure_event.connect (configure_callback);
	}
	private bool configure_callback (Gtk.Widget sender, Gdk.EventConfigure event) {
		int width, height;
		/* получаем размеры окна */
		width = event.configure.width;
		height = event.configure.height;
		/* получаем размеры дочернего элемента */
		int button_width = this.button.get_allocated_width ();
		int button_height = this.button.get_allocated_height ();

		stdout.printf(" Window: %d, %d\n", width, height);
		stdout.printf(" Button: %d, %d\n", button_width, button_height);

		return true;
	}
}

int main (string[] args) {
	Gtk.init (ref args);
	var window = new AspectWindow ();
	Gtk.main ();
	return 0;
}

А вот со вторым пунктом ничего не получается. Каким образом менять размер окна?

nvl ★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

нэ?

Да, но если тупо применить gtk_window_resize:

private bool configure_callback (Gtk.Widget sender, Gdk.EventConfigure event) {
		int width, height;
		/* получаем размеры окна */
		width = event.configure.width;
		height = event.configure.height;
		/* получаем размеры дочернего элемента */
		int button_width = this.button.get_allocated_width ();
		int button_height = this.button.get_allocated_height ();

		this.resize (button_width, button_height);

		stdout.printf(" Window: %d, %d\n", window_width, window_height);
		stdout.printf(" Button: %d, %d\n", button_width, button_height);
		return true;
	}
То окно вообще не отрисовывается, хотя в консоли:
 Window: 356, 352
 Button: 261, 261
 Window: 356, 352
 Button: 261, 261

nvl ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.