LINUX.ORG.RU

GTK2. Стиль для определённого состояния виджета

 ,


0

1

Возможно ли применить стиль к определённому состоянию виджета в теме gtk2?
Например для кнопки, которая нажата.
Т. е. реализовать разное поведение, в зависимости от состояния.
Что-нибудь вроде:

class "GtkButton::pressed" 	style "button-pressed"

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

только цвета подкрутить можешь

Вот как раз это и хочу сделать — изменить цвет кнопки, чтобы он менялся по разному в зависимости от её состояния.
Т. е. кнопка имеет несколько стандартных состояний:

  bg	[NORMAL]	= @grey 	# отжата
  bg	[PRELIGHT]	= @green	# в фокусе
  bg	[SELECTED]	= @cyan 	# выбрана
  bg	[ACTIVE]	= @magenta	# нажата
  bg	[INSENSITIVE]	= @dark 	# неактивна

Если поместить курсор над ненажатой кнопкой, она подсвечивается, например, зелёным, а когда кнопка нажата хочу иметь другой цвет подсветки. Такое возможно реализовать?

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

да, можешь. описываешь, что тебе нужно в блоке style, потом назначаешь этот стиль через widget_class определенному шаблону

style "tb_button" {
    bg[ACTIVE] = "#808080"
}
widget_class "*<GtkToolbar>*<GtkButton>" style "tb_button"

так, к примеру, можно изменить фон только для кнопок панелей инструментов

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

Неверно меня понял. Изменить надо не разные классы виджетов, а разные состояния одного и того же виджета.
Т. е. чтобы виджет, при наведении на него курсора, в нажатом состоянии подсвечивался иначе, нежели в не нажатом состоянии.

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

состояния указываются аргументами к fg/bg или text/base, пара fg/bg используется для виджетов, ввод в которых невозможен, text/base - для всяких GtkEntry, GtkTextView или GtkTreeView

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

дальше этот стиль надо привязать к каким-то объектам. привязки делаются при помощи class, widget_class и widget.

class - для любого виджета данного класса, к примеру class «GtkButton» style «mystyle» применит стиль mystyle для всех кнопок

widget_class привязывает стиль к определенному классу виджетов, но позволяет выстраивать иерархические цепочки, т.е. привязать стиль не ко всем кнопкам, а, как в моем примере, только к тем, контейнером для которых выступает GtkToolbar

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

для своего кода все просто, задаешь нужному виджету имя, и привязываешь нужный стиль через widget. ну или прямо в коде задаешь через gtk_widget_modify_style

для чужого кода сложнее. есть модуль gtkparasite при помощи которого можно исследовать дерево виджетов чужой программы и правильно определить идентификацию нужного тебе виджета

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

А вот в момент, когда привязываешь «стиль» к объекту возможно указать состояние объекта? Например, как-нибудь так:

class "GtkButton::pressed"	style "button-pressed"

Т. е. бывают ли какие-нибудь дополнительные «указатели» для объекта при назначении стиля?

Dreamdrawer ()
Последнее исправление: Dreamdrawer (всего исправлений: 1)
Ответ на: комментарий от ananas

Да уж, там с этим по проще. Хотел привести тему gtk2 в соответствие c gtk3. Всё же есть непреодолимые «моменты». Придётся от обратного идти — подтягивать тему гтк3 к возможностям гтк2, чтобы добиться однообразного вида и поведения.

Спасибо за подробные ответы. Прояснил мне несколько моментов, которые не вполне понимал ранее.

Dreamdrawer ()