LINUX.ORG.RU

[gtk] Как сделать кнопки которые могут менять размер как в апплете «Список окон» (панель задач)?

 


0

0

Кнопки в панели задач могут расширяться до определенной максимальной ширины, если на панели есть место, если места нет, то кнопка становится меньше, при этом текста на кнопке может обрезаться (в конце дописывается "..."), в крайнем случае значок может быть обрезан.
Есть HBox с кнопками, хочется сделать тоже самое.
Еще интересует возможность сделать такое не для всех кнопок, а только для некоторых.

Как?

★★★★★

кнопка может выступать в роли GtkContainer. цепляй к ней свой [hv]box, в него помещай GtkImage и GtkLabel. для GtkLabel выставляй нужные тебе gtk_label_set_max_width_chars() и gtk_label_set_ellipsize()

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

Спасибо за быстрый ответ. С боксом все понятно, а со свойствами не очень. Их надо будет менять каждый раз как кнопка получила новый размер? И, кстати, не получается сделать кнопку меньше чем картинка и "...", а апплет так может.

Вот кнопка [кттттттттт]
к - картинка
т - текст
Картинка и текст помещены в hbox, для картинки это pack_start(image,False), для текста - pack_start(label,True).

Кнопки помещены в hbox, pack_start(button,False).
Если я меняю на True, то свободное место делится между всеми.
А можно сделать, чтобы свободное доставалось одной?

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

И еще вопросики...
Как выставить максимальный размер для кнопки?
Если кнопки добавлять так:
pack_start(button,True), то они занимают столько места, сколько могут.
Кнопки на апплете потребляют место до определенного предела, после чего не растут.

Другой вопрос, про другие кнопки. :)
Есть Vbox, заполнен кнопками.

Все кнопки в нем имеют одинаковую ширину, равную ширине VBox'а.
Как сделать так, чтобы по ширине кнопка занимала не больше чем ей надо и была выровнена по центру?
Т.е. если кнопке надо меньше чем ширина VBox'а, то слева и справа будет пустое место.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

в общих чертах где-то так

не знаю, как там в gnome-panel, но теоретически - можно ловить size-request и соответственным образом масштабировать кнопку.

для растягивания - использовать комбинации expand/fill аргументов gtk_box_pack_start(). если нужно выравнивать - добавляй контейнер GtkAlignment и выравнивай через него. для создания пустого пространства вокруг дочернего виджета также можно воспользоваться gtk_container_set_border_width()

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

> Как сделать так, чтобы по ширине кнопка занимала не больше чем ей надо и была выровнена по центру?

fill = false, expand = true

Как выставить максимальный размер для кнопки?

Надо установить size_request (но у кнопки он устанавливается сам) и expand = false

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

>> Как сделать так, чтобы по ширине кнопка занимала не больше чем ей надо и была выровнена по центру?

fill = false, expand = true

Не помогает.
Еще раз. Есть VBox с кнопками. Кнопки по ширине равняются ширине VBox'а, а мне надо, чтобы кнопки по _ширине_ (с высотой для VBox все понятно) занимали минимум.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от dmitry_vk

>> Как выставить максимальный размер для кнопки?

Надо установить size_request (но у кнопки он устанавливается сам) и expand = false

А другого способа нету, чтобы expand = true? Т.е. чтобы кнопка сама расширялась когда есть место (но не больше максимального размера), чтобы не высчитывать size_request.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

Попробуй засунуть кнопку сперва в GtkHBox, вруби fill и выруби expand. Сделай size-request у кнопки, потом все это запихай в GtkVBox.

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

Спасибо, я тоже об этом думал.
Есть некоторые проблемы с таким решением, дело в том, что хочется еще возможность вертикальный список менять на горизонтальный (динамически, по требованию пользователя), т.е. VBox на HBox, соответственно проблема с шириной превратится в проблему с высотой.
Пересобирать «матрешку» из боксов не очень удобно.
Хотелось бы решение без дополнительных сущностей.
Но если ничего не будет, то, наверное придется геморройиться.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

Думаю, без пересборки тут не обойтись. В принципе, там не особо сложно все это сделать, главное - аккуратно :) Можно, конечно, попробовать это сделать через GtkTable, но там, имхо, все будет еще геморнее.

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

Да, GtkTable будет полный пипец.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от MuZHiK-2

У меня в программе свои классы от GtkButton, поэтому выворачиваться придется много.

ls-h ★★★★★
() автор топика

Нашел костыльное решение - положить в gtk.Alignment.
И менять xscale, yscale.

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