2016-03-15 2 views
2

Я прочитал и пробовал существующие решения для этого вопроса, и я не могу заставить их работать. Я надеялся, что кто-то может указать, что я делаю неправильно, или сказать мне, почему эти решения больше не работают.Как чередовать светлые/темные строки в GtkTreeView?

Я хотел быть уверен, эти решения не работали, поэтому я сделал таблицу стилей следующим образом:

GtkTreeView row { 
    color: #FFFFFF; 
    background-color: #FF0000; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #FF00FF; 
} 
GtkTreeView row:nth-child(odd) { 
    background-color: #00FFFF; 
} 

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

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) 
{ 
    int i; 
    gtk_init(&argc,&argv); 
    //GtkBuilder* b = gtk_builder_new_from_file("derp.glade.xml"); 
    GtkWidget* top = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    GtkListStore* items = gtk_list_store_new(2, 
              G_TYPE_STRING, 
              G_TYPE_STRING); 

    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(items)); 
    gtk_tree_view_insert_column_with_attributes 
    (GTK_TREE_VIEW(view), 
    0, 
    "Herp", 
    gtk_cell_renderer_text_new(), 
    "text",0, 
    NULL); 
    gtk_tree_view_insert_column_with_attributes 
    (GTK_TREE_VIEW(view), 
    1, 
    "Derp", 
    gtk_cell_renderer_text_new(), 
    "text",1, 
    NULL); 
    gtk_container_add(GTK_CONTAINER(top),view); 
    GtkCssProvider* prov = gtk_css_provider_new(); 
    gtk_css_provider_load_from_path 
    (prov, 
    "derp.css", 
    NULL); 
    gtk_style_context_add_provider 
    (gtk_widget_get_style_context(view), 
    GTK_STYLE_PROVIDER(prov), 
    GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); 

    GtkTreeIter iter; 
    gtk_tree_model_get_iter_first(GTK_TREE_MODEL(items),&iter); 

    for(i=0;i<3;++i) { 
    gtk_list_store_insert_with_values 
     (items,&iter,0, 
     0, "Row", 
     1, "Row", 
     -1); 
    } 
    gtk_widget_show_all(top); 
    gtk_main(); 
    return 0; 
} 

скомпилированные:

gcc -o test teststyle.c `pkg-config gtk+-3.0 --cflags --libs` 

При запуске приложения, три строки отображения с # 00ffff как цвет фона. Они не чередуются. Они принимают только цвет из раздела «row: nth-child (odd)», и даже четные строки принимают этот цвет. Прошивка с помощью файла css может также делать некоторые смешные вещи. Переключение четной и нечетной, например:

GtkTreeView row { 
    color: #FFFFFF; 
    background-color: #FF0000; 
} 
GtkTreeView row:nth-child(odd) { 
    background-color: #FF00FF; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #00FFFF; 
} 

Теперь все строки отображаются как # FF00FF, без чередования. Я думаю, что GTK просто полностью не читает псевдоклассы так или иначе, случайно превращая «строку GtkTreeView: nth-child (нечетно)» в «строку GtkTreeView» и полностью исключая селектор nth-child (even) ». Если удалить нечетные селектор и только даже:

GtkTreeView row { 
    color: #FFFFFF; 
    background-color: #FF0000; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #FF00FF; 
} 

Теперь у него есть фоновый цвет # FF0000, поэтому он игнорирует (даже) правила полностью.

Я попытался установить правила, намекающие на древовидную структуру, и ничего не сделал, кроме как жаловаться на то, что установка подсказки правил была устаревшей. Я использую GTK 3.18.9, в базовой системе Arch, с XFCE в качестве диспетчера окон. Я делаю что-то неправильно здесь? Или моя версия GTK просто испортилась?

ответ

1

Я думаю, что только 2 блоки достаточно что-то вроде этих

GtkTreeView row:nth-child(odd) { 
    background-color: #FF00FF; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #00FFFF; 
} 

ниже пример в питоне, испытанный о'кеы перед ответом

#!/usr/bin/env python3 
# -*- coding: ISO-8859-1 -*- 
from gi.repository import Gtk,Gdk 

window = Gtk.Window() 
window.connect("destroy", lambda q: Gtk.main_quit()) 

liststore = Gtk.ListStore(str, int) 
liststore.append(["Oranges", 5]) 
liststore.append(["Apples", 3]) 
liststore.append(["Bananas", 1]) 
liststore.append(["Tomatoes", 4]) 
liststore.append(["Cucumber", 1]) 
liststore.append(["potatoes", 10]) 
liststore.append(["apricot", 100]) 

treeview = Gtk.TreeView(model=liststore) 
treeview.set_rules_hint(True) 
window.add(treeview) 

treeviewcolumn = Gtk.TreeViewColumn("Item") 
treeview.append_column(treeviewcolumn) 
cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, "text", 0) 

treeviewcolumn = Gtk.TreeViewColumn("Quantity") 
treeview.append_column(treeviewcolumn) 
cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, "text", 1) 
css_provider = Gtk.CssProvider() 
css = """ 
       /* font operate on entire GtkTreeView not for selected row */ 
       GtkTreeView {font-weight: bold;font: Sans 20;font-style: italic;} 
       GtkTreeView row:nth-child(even) { 
       background-image: -gtk-gradient (linear, 
                left top, 
        left bottom, 
        from (#d0e4f7), 
        color-stop (0.5, darker (#d0e4f7)), 
        to (#fdffff)); 
       } 
       GtkTreeView row:nth-child(odd) { 
       background-image: -gtk-gradient (linear, 
                left top, 
        left bottom, 
        from (yellow), 
        color-stop (0.5, darker (yellow)), 
        to (#fdffff)); 
       } 
       /* next line only border action operate */ 
       GtkTreeView:selected{color: white; background: green; border-width: 1px; border-color: black;} 
       /* next line for Gtk.TreeViewColumn */ 
       column-header .button{color: white; background: purple;} 

      """ 
css_provider.load_from_data(css) 
screen = Gdk.Screen.get_default() 
style_context = window.get_style_context() 
style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) 

window.show_all() 

Gtk.main() 
+0

Пример кода не работает «TraceBack (самый последний вызов последнего) : Файл «zebragtk.py», строка 58, в css_provider.load_from_data (css) TypeError: Item 0: Должен быть числом, а не str " – Sam

+0

Я немного удивлен. Мой gtk - версия GtK 3.8.10, а python - 2.7.6. Код работает нормально. Я не знаю, о чем. Кто-нибудь может это объяснить? – Manmax

+0

Я использую GTK 3.18.2. Знакомая знакомая set_rules_hint была обесценена в GTK 3.14 https://developer.gnome.org/gtk3/3.16/GtkTreeView.html#gtk-tree-view-set-rules-hint – Sam

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