LINUX.ORG.RU

GTK multiline tab widget.

 , gtknotebook


1

1

Существует ли в природе Tab widget написанный на GTK в котором заголовки табов располагаются в несколько строк? Ну или на крайний случай есть ли способ вызвать функцию которая рисует заголовок таба у GtkNotebook, дабы костыль заимплементить ?


Нет.

Лучше подумай, зачем тебе столько табов на экране и не лучше ли к ним дать доступ по-другому.

Я тоже страдал от отсутствия подобного функционала, потом понял — просто не нужно.

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

Мне этот функционал ни на каком месте не вертелся, а вот кастомеры желающие подобного имеются.

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

а вот кастомеры желающие подобного имеются.

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

anonymous
()
Ответ на: комментарий от batbko

В оффициальной гтк такого нет. Кто-то делал соответствующий патч, но его не приняли в основную ветку. Для новых версий гтк, скорее всего, ничего подобного нет. Но всегда можно написать самому. :)

hibou ★★★★★
()

Ну или на крайний случай есть ли способ вызвать функцию которая рисует заголовок таба у GtkNotebook, дабы костыль заимплементить ?

Глянь в сторону GtkStyle/GtkStyleContext и GTK_STYLE_REGION_TAВ, но это такая возня.

Amp ★★★
()
Последнее исправление: Amp (всего исправлений: 1)

ни того, ни другого нет. точнее, функция которая рисует вкладку есть, но она его рисует после проверки IS_GTK_NOTEBOOK(widget), что делает ее бесполезной. теоретически, можно накостылить, создать невидимый notebook, и при вызове функции подсовывать этот виджет вместе со своим drawable/cr, но это не факт что сработает.

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

можно сделать табы без содержимого вообще, и сложить их в GtkVBox.

в gtk нет виджета «табы без содержимого». ну и управлять двумя отдельными виджетами — это месиво. между ними не будет работать drag-n-drop, и куча других радостей.

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

Но всегда можно написать самому. :)

самому написать таб-виджет не проблема, проблема нарисовать табы стилями gtk. я это пробовал в deadbeef, не получилось.

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

Кто-то делал соответствующий патч, но его не приняли в основную ветку.[\quote]

А что нибудь вроде pull requesta или ссылка на переписку не сохранилась ?

batbko
() автор топика

Может быть в каком то GTK приложении уже есть такой функционал ?

Глянь в сторону GtkStyle/GtkStyleContext и GTK_STYLE_REGION_TAВ, но это такая возня.

Спасибо, но рисовать в ручную пока не очень хочется. Хотя мэй би придется.

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

Как вариант, конечно не самый лучший, но всё же. Можно сделать табы из обычных кнопок, расположенных в GtkTable. Когда кнопок в ряду становится много, то в таблицу добавляется ещё одна строчка и новая кнопка вставляется туда. Чётко и по пацански :)

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

Нет, к сожалению не подойдет, решение должно выглядеть как табы.

наипи всех - вложи Tab виджеты друг в друга, настолько сколько multiline тебе нужно, а сверху стек котором сам будешь управлять

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

Пока так. Сейчас гляжу в исходники notebook'a дабы понять что за виджеты там используются для рисования лэйблов.

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

то за виджеты там используются для рисования лэйблов.

именно лейблов? GtkLabel и используется. а сами табы рисуются GtkStyle/GtkStyleContext, т.е. рисует их theme engine.

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

Добился вот такой отрисовки, путем использования gtk_paint_extension. Единственная проблема на данный момент это получить такой же Allocation который получает вкладка при отрисовке gtknotebook'om .

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

о, очень неплохо. получить allocation не сложно, можно код из gtknotebook.c просто содрать.

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

содрать код из gtknotebook не комильфо, т.к. никто не гарантирует его неизменность, так что это будет план z. Рисую прямо на gtknotebooke. Функция отрисовки своя, если ты это имеешь ввиду, исходники GtkNotebook пока что не используются.

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

Наверняка можно получить какие то стартовые константы из стиля самому рассчитать размер заново ?

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

не, я советовал создать скрытый виджет notebook, и рисовать его стилями на своем виджете. но суть та же. вобщем, у тебя тоже идея интересная. расскажи потом про результат.

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

Наверняка можно получить какие то стартовые константы из стиля самому рассчитать размер заново ?

именно в notebook не знаю, я делал подобное для собственного listview — считать высоту строк, расположение текста в них, и т.п.

там все hardcoded, пришлось повторять алгоритм из cellrenderertext и т.п.

ессно, может поменяться, но я не хотел использовать cellrenderers, а другого пути не нашел.

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

кстати, если это gtk2 — то неизменность кода уже гарантируется :)

а в gtk3 этот способ отрисовки deprecated, и переписывать/переделывать все равно придется.

waker ★★★★★
()

как вариант - напихать несколько табов в вбокс, и при помощи size_request сворачивать активный виджет неактивного таба в единичную полоску

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

size_request меняет размер, а не запрашивает. узнать размер можно через gtk_widget_get_allocation, но он просто вернет размер label, а не размер таба целиком. можешь через gtkparasite посмотреть — все будет достаточно наглядно.

править сообщения вроде после 2 звезд можно.

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

А не попадалась никому случайно реализация proxy виджетов? Под proxy виджетами я подразумеваю виджеты, которые только отражают || фильтруют состояние заданного виджета. Например: есть label, пользователь изменил текст этого лэйбла, прокси виджет должен тоже изменить текст.

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

Блин, обидно, на питоне нашлось вроде, но мне нужно на C т.к. основа уже практически готова на C а интегрировать решение на питоне выглядит как извращение.

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