LINUX.ORG.RU

Widget Foreground Color

 , , российские физики


0

1

Привет!

Вопрос про GTK3+. Не могу разобраться.

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

Написано все это по историческим причинам на GTK+ c C. И ничего сложного не было, функция gtk_widget_modify_fg() делала все что нужно. Но...

gtk_widget_modify_fg has been deprecated since version 3.0
 and should not be used in newly-written code.
Use gtk_widget_override_color() instead

Смотрим эту функцию и...

 gtk_widget_override_color has been deprecated since version 3.16 and should not be used in newly-written code.
Use a custom style provider and style classes instead

Собственно, сами GTKStyle в которых можно было бы поправить Color тоже deprecated и надо все делать через CSS. Ок... CSS это удобно и круто, но хорошо подходит для определения общего стиля, а не для чего-то быстро меняющегося в процессе работы программы.

Если CSS надо поправить прямо из кода, то получается надо городить что-то подобное...

GtkCssProvider* provider = gtk_css_provider_new();
GdkDisplay* display = gdk_display_get_default();
GdkScreen* screen = gdk_display_get_default_screen(display);

gtk_style_context_add_provider_for_screen(screen,GTK_STYLE_PROVШDER(provider),GTK_STYLE_PROVIDER_PRIORITY_USER);

gtk_css_provider_load_from_data(GTK_CSS_PROVIDER(provider),
"#main_drawing_region,GtkLabel { color: black;}", -1, NULL);

g_object_unref(provider);

Но неужели нет чего-то проще? Чтобы поменять цвет одной надписи надо создать три объекта?

Собственно вопрос - может есть какой способ проще и чтобы не депрекэйтед?

P.s. Предложение перейти на QT не расценивается как способ проще.

★★★★★

Последнее исправление: petrosha (всего исправлений: 3)

and should not be used in newly-written code.

Не стоит использовать в коде, который пишется с нуля. Если у тебя стоит задача поддержки написанного кода, то юзай и парься. У тебя код сейчас ведь собирается и работает? Вот как выпилят окончательно, тогда просто заморозишь версию библиотеки.

hippi90 ★★★★★
()

Ну раз CSS то я бы предположил что нужно в CSS указать 3 класса для разных состояний кнопки, а в коде просто менять её класс.

И ведь правда, gtk_widget_get_style_context, gtk_style_context_add_class, gtk_style_context_remove_class.

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

Код собирается и работает, но при сборке сыпет варнингами... собственно с этим я и решил было разобраться, как раз есть возможность.

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

Да, наверное так можно. Спасибо. Но все равно это как-то через одно место. Наверное я просто испорчен теперь жабоскриптом :) $(label).css({«color»:«red»}); хотеть вот так...

petrosha ★★★★★
() автор топика

Предложение перейти на QT не расценивается как способ проще

Если приложение старое и большое - тогда да, нет смысла. Для любых новых приложений стоит сразу начинать на Qt/PyQt.

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

Ты испорчен некомпетентностью. Именно поэтому тебе, пишущему софт на gtk ответ почему-то даёт человек в глаза его не видевший.

Через одно место - это менять стиль напрямую, причём для жаваскрипта в первую очередь. Весь смысл таблицы стилей - полная независимость. Чтобы код не знал ничего о цветах, а таблица имела полный контроль над представлением. Так чтобы можно было, например, не меняя ни строчки кода сделать стиль для монохромного дисплея, где вместо цвета добавляется иконка или меняется узор фона или размер шрифта. А если из кода лезет какой-то color: red эта стройная идея идёт лесом, а приложение начинает выглядеть как говно на чуть более другом устройстве чем у тебя или с чуть более другой темой. Ладно бы был сложный случай, но у тебя же фактически пример из книги - сделай три класса да переключай их. Но нет, непременно хочется напрямую стилями срать.

Но справедливости ради, я удивлён что в gtk простых методов (gtk_style_context_set_style или gtk_style_context_set_property) для этого не видно.

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

Очень здорово, наверное, быть компетентным во всем.

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

Ну тебе же надо проще.
У меня до сих пор gtk3 нету в системе. И не планируется пока его разработчики не перестанут маяться фигнёй и делать разные сомнительные вещи.

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

Проще у меня уже есть. Вариант забить выше предлагали уже :)

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

ключевые слова - pango markup

можешь дать хоть одну ссылку на пример, как это использовать. ГТК в своих лучших традициях примеров не приводит. Вернее, я не нашел.

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

Я понимаю, что вопрос этот конечно риторический и весьма глупый... :) но как предполагалось узнать о такой возможности?

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

изучение методов класса GtkLabel и собственно pango markup, полный заголовок которого - Pango Text Attribute Markup Language. все, sapienti sat

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

Ну вот да, референс на GtkLabel надо было прочитать внимательнее... но как-то я считал, что панго это только для текстовых полей.

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

Хотя, несколько менее лаконичная документация, врядли бы уменьшила сообщество пользователей GTK.

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

А вот кстати, вдруг ты в курсе... В свете повсеместного введения CSS, не сделают ли в скором времени deprecated прямой вызов методов панго? Или это позиционируется как замена html?

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

вряд ли, это совершенно разные вещи. хотя от нынешних мудацких хипстеров из gtk team всего можно ожидать. после того, как эти глиномесы stock элементы объявили deprecated я уже ничему не удивлюсь

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

если следовать аналогиям с html+css могут заставить описывать тэги этого панго маркап через css.

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

в принципе, там основной тег span. и если к нему прикрутят какой-то атрибут class с дерганьем стиля из текущего css provider, не отменяя всего остального - будет достаточно удобно. но вот в это что-то слабо верится

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