2016-07-16 12 views
2

Первый раз постер; долгое время поклонник ангелов переполнения стека.Новый символический цвет в тексте Панго

У меня проблема с цветами в тексте диапазона, которые контролируются Pango.

Long Version:
Я обновляю старые программы пользовательского интерфейса, который имеет C++ код кишок с GTK, XML (написанной Поляны), и обработки графики RC таблицы стилей. Некоторые из наших цветных текстов разметки жестко закодированы в XML. Некоторые из них динамически задаются в коде C++. Проблема в том, что, когда программа работает в наших старых системах, цвет, на который ссылается текст интервала как «зеленый», отображается как # 00FF00. В наших новых системах «зеленый» отображается как # 008000. Пример кода печати на виджете метки:

gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='green'>Orbital Cannon Positioning</span>"); 

Я абсолютно уверен, что Панго контролирует пролете разметки текста. Я обнаружил, что разница между зеленью - это различие между списками цветов X11 и W3C (https://en.wikipedia.org/wiki/X11_color_names#Clashes_between_web_and_X11_colors). Кажется, что наши старые системы используют X11, а наши новые используют W3C, что имеет смысл.


Я мог бы просто заменить все экземпляры «зеленых» с «# 00ff00», но если мы хотим изменить цвета в будущем, мы должны были бы снова пройти через все это. Я бы предпочел бы, чтобы цвета изменялись через таблицу стилей, а не запекались в коде.

C++ Код:

GtkWidget * TitleBarLabel; 
    TitleBarLabel = GTK_WIDGET (get_builder_object (builder, "TitleBarLabel")); 
    gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='#00FF00'>Death Ray Power Status</span>"); 

я могу создать GdkColor во время выполнения и gdk_color_parse его со значениями из конфигурационного файла, а затем использовать gtk_widget_modify_text(), чтобы применить цвет к виджетам этикеток , Но тогда это не работает для всего жестко закодированного текста диапазона в XML. Кроме того, мы располагаем этикетками с битами текста, по-разному окрашенными внутри одной линии.

C++ Код:

GdkColor pass_color; 
    gdk_color_parse("#00FF00", &pass_color); 

    gtk_widget_modify_text(TitleBarLabel, GTK_STATE_NORMAL, &pass_color); 

я могу сделать стиль в моем файле RC для каждого цвета и связать каждую метку, которая будет использовать этот цвет во время выполнения. Но нам нужно удалить всю разметку и добавить много кода для захвата виджетов, с которыми мы никогда не беспокоились, и кода для установки имен виджетов вместо того, чтобы просто печатать их с новым текстом диапазона. Он получает желаемый результат изменения цвета в таблице стилей, но это массовое мероприятие, и это неинтересно для наших инженеров-ветеранов, которые привыкли использовать атрибуты цвета.

RC файла:

style "pass_color" 
    { 
     fg[NORMAL] = #00FF00 
    } 
    widget "*TitleBarLabel_Pass" style "pass_color" 

C++ Код:

gtk_widget_set_name(TitleBarLabel, "TitleBarLabel_Pass"); 

Короткая версия:
В идеале, я хотел бы быть в состоянии сделать новый цвет в run- время, которое мы можем связать с текстом диапазона в такой фракции:

<span color='MyNewColor'>Weather Manipulation Settings</span> 

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

<span><MyNewColor>Shark Tank pH Balance</MyNewColor></span> 

Но я сомневаюсь, что это возможно.

Я попытался поиграть с pango_attr_type_register(), pango_attr_foreground_new() и друзьями, но я не мог понять, как работают атрибуты, если они могут даже делать то, что, как я думал, они сделали. После долгих исследований, похоже, что «атрибут» - это всего лишь одноразовая настройка для одной строки текста. И не новое значение, которое можно назвать в соответствии с текстом диапазона, как я надеялся.

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

версия Технические характеристики:
Компьютеры, показывающие, как зеленый # 00FF00
ОС: Linux Slackware 13.37 и ниже
GTK: 2.24.4
Панго: 1.28.4

Компьютеры, показывающие, как зеленый # 008000
ОС: Linux Slackware 14.1
GTK: 2.24.20
Панго: 1.34.1

ответ

0

Если вы способный использовать GTK 3.x, я бы предложил сделать это, где это намного проще сделать с помощью CSS. Существует даже способ использовать несколько стилей CSS для разных регионов на одном ярлыке, хотя это неудобно.

В GTK 2, как вы отметили, вы можете ссылаться на виджеты по их name собственности в файле RC:

widget "shark-tank-ph-label" style "green-text" 
style "green-text" { 
    text[NORMAL] = #008000 
} 

Я бы рекомендовал принимать этот подход, даже если это не то, что вы привыкли. Рефакторинг один раз, чтобы удалить жестко закодированные цвета с ваших ярлыков, значительно облегчит следующий раз, когда вам придется что-то изменить, и также приблизит ваш код к тому, как все будет работать в GTK 3.x, если вы решите сделать порт в будущем.

 Смежные вопросы

  • Нет связанных вопросов^_^