LINUX.ORG.RU

AFAIK только руками. Ловить allocation у бокса и менять размеры виджетов.

baverman ★★★
()

Proof-of-concept:

import gtk

w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.set_default_size(400, -1)
w.connect('destroy', gtk.main_quit)

box = gtk.HBox()
w.add(box)

b1 = gtk.Button('One')
box.pack_start(b1)
b2 = gtk.Button('Two')
box.pack_start(b2)

def resize(widget, r):
    b1_width = r.width * 2 / 3
    b1.size_allocate((r.x, r.y, b1_width, r.height))
    b2.size_allocate((r.x+b1_width, r.y, r.width - b1_width, r.height))

box.connect_after('size-allocate', resize)

w.show_all()

gtk.main()

Ждем экспертное мнение ananas

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

зависит от виджетов. да и от задачи тоже. подобные пропорции хорошо задавать для GtkPaned. особенно если именно 2:1. а для боксов, особенно если в них безоконные виждеты типа GtkLabel впихнуты - гемора дофига

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

я постоянно этим пользуюсь когда пишу на Qt... задать пропорции панелей в GUI, где все на контейнерах и лэйаутах - самое важное ИМХО... но не суть, я может что-то упустил, всего день с GTK

например, есть VBox с тремя секциями, в одной из них лежит Gtk.TreeView, в другой лежит TextView - хочу чтобы тест занимал половину окна, а TreeView - четверть, как это сделать?

наверное лучше книжку почитать какую-нибудь, а то так и буду албанский вопросы задавать...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

например, есть VBox с тремя секциями, в одной из них лежит Gtk.TreeView, в другой лежит TextView - хочу чтобы тест занимал половину окна, а TreeView - четверть, как это сделать?

Резон в этом, конечно, есть, но я, обычно, просто делаю set_size_request у TreeView. Фиксированный или в зависимости от содежимого.

А так, мой пример кода должен с этим справиться.

baverman ★★★
()
Ответ на: комментарий от I-Love-Microsoft

а в третьей что? обычно варьируя expand, fill и вложенные box-ы можно спокойно добиться желаемого результата не заморачиваясь с расчетом геометрии

ananas ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

> в одной из них лежит Gtk.TreeView, в другой лежит TextView - хочу чтобы тест занимал половину окна, а TreeView - четверть, как это сделать?

а если кто-то захочет по-другому?. может стоит treeview с чем-то там еще поместить в box, а потом этот box и textview запихать в paned?

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

нашел правильное (на мой взгляд) решение: Using tables, we create a grid that we can place widgets in. The widgets may take up as many spaces as we specify. - вот таким вот образом, вместе со свойством таблицы homogeneous), я добился нужного мне эффекта простым стандартным путем :)

я начинаю веровать в GTK ^_^

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от baverman

не получается, я пытаюсь менять размер не кнопок, а TreeView и других подобных виджетов (которые даже в GtkTable почему-то не могут занимать несколько ячеек)... не очень понятно

	protected void OnVbox1SizeAllocated(object o, Gtk.SizeAllocatedArgs args)
	{
		System.Console.WriteLine("resize " + this.Allocation);

		int h1 = this.Allocation.Height / 3;
		int h2 = this.Allocation.Height * 2 / 3;
		text_sc.SetSizeRequest(text_sc.Allocation.Width, h1);
		tasks_sc.SetSizeRequest(tasks_sc.Allocation.Width, h2);
	}

есть VBox на окне, в нем TreeView (tasks) в одной части, TextView (text) в другой, их scrolled контейнеры так же названы + _sc, вот OnVbox1SizeAllocated ловит новый размер и правильно его выводит в консоль

хочу чтобы TreeView был на 1/3 от высоты экрана - что надо делать? лучше алгоритм понять, чем код... то что я привел в коде - это не работает, но приводит к рекурсивному расползанию окна до гигантских размеров и повисает

а всего-лишь надо размер поменять... пропорционально... =(

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

которые даже в GtkTable почему-то не могут занимать несколько ячеек

Не обманывай.

import gtk

w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.set_default_size(400, 400)
w.connect('destroy', gtk.main_quit)

table = gtk.Table(10, 10, True)
w.add(table)

tree = gtk.TreeView()
tree_sw = gtk.ScrolledWindow()
tree_sw.add(tree)
table.attach(tree_sw, 0, 4, 0, 4)

text = gtk.TextView()
text_sw = gtk.ScrolledWindow()
text_sw.add(text)
table.attach(text_sw, 4, 10, 4, 10)

w.show_all()

gtk.main()

OnVbox1SizeAllocated…

1) Обработчик точно вызывается *после* основного? (см. connect_after)

2) Где в том моем примере SetSizeRequest?

P.S. Вообще-то я забыл про grid верстку, когда относительные размеры элементов задаются равномерной сеткой. Поэтому GtkTable самое то.

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

Не обманывай.

Не, чесслово, не работает такое, я говорю про визуальный дизайнер, возможно это просто недоработка или баг в MonoDevelop, точно не знаю. Спасибо за подсказку - я попробую через код сделать такое же.

Про connect_after, пример я так вижу написан на питоне, у меня GTK#, я там не могу найти connect_after (ни connectafter и вообще ни в каком виде), не вижу аналога, пытаюсь разобраться как сделать.

Про size_allocate понял, ошибся...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от baverman

спасибо! все получилось:

	private void create_gui()
	{
		Build();
		
		Gtk.Table table = new Gtk.Table(10, 10, true);
		table.RowSpacing = 6;
		table.ColumnSpacing = 6;
		layout.Add(table);
		layout.ReorderChild(table, 0);
		
		Gtk.TreeView tree = new Gtk.TreeView();
		Gtk.ScrolledWindow tree_sw = new Gtk.ScrolledWindow();
		tree_sw.Add(tree);
		table.Attach(tree_sw, 0, 10, 7, 10);
		
		Gtk.TextView text = new Gtk.TextView();
		Gtk.ScrolledWindow text_sw = new Gtk.ScrolledWindow();
		text_sw.Add(text);
		table.Attach(text_sw, 0, 10, 0, 7);
		
		this.ShowAll();
	}

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