Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: 'Badman'
Biblioteki C++

GtkTreeView

[lekcja] Rozdział 12. Rozdział opisuje w jaki sposób korzystać z kontrolki GtkTreeView.

Wprowadzenie

GtkTreeView jest kontrolką pozwalającą wyświetlać jak sama nazwa wskazuje drzewa oraz listy.
Najważniejszą koncepcją leżąca u podstaw GtkTreeView jest to, że dane są całkowite oddzielenie od sposobu wyświetlania ich na ekranie. Czyli model / view / Controller-design (MVC). Dane różnego typu (łańcuchy, liczby, obrazy, itp.) są przechowywane w "model", natomiast "View" określa jak dane na wyświeć, tzn.
gdzie i jak wyświetlić.

Rozdział powstał w dużej mierze na podstawie "GTK+ 2.0 Tree View Tutorial" autorstwa Tim-Philipp Müller.

Zanim przejdę do omawiania tworzenia kontrolki GtkTreeView, dodawnaia kolumn, komórek, itd., należy omówić ściśle związany z tą kontrolką GtkTreeModel.

GtkTreeModel interfejs do magazynu danych

GtkTreeModel jest to w zasadzie tylko interfejs do danych (nazwijmy te dane magazynem danych), co oznacza, że jest to standardowy zestaw funkcji, które pozwalają kontrolce GtkTreeView i programiście na odpytywanie o pewne cechy magazynu danych, np. ile wierszy danych znajduje się, a w przypadku drzew, które wiersze mają potomków, itp.
GtkTreeModel dostarcza również funkcji do pobierania danych z magazynu danych oraz informuje widok drzewa (View) jakiego typu dane są przechowywane w modelu.
Interfejs GtkTreeModel nie pozwala dodać, usunąć lub  zmienić wierszy danych w magazynie danych. Odbywa się za pomocą określonych magazynie danych funkcji.
GTK+ jest wyposażony w dwa wbudowane magazyn danych (modele): GtkListStore i GtkTreeStore.
Jak sugerują nazwy GtkListStore służy do przechowywania prostych list elementów, w którym elementy nie mają hierarchii rodzic-dziecko, natomiast GtkTreeStore służy do przechowywania struktur drzewiastych, w których elementy mogą mieć relacje rodzic-dziecko.

Organizacja danych w magazynie danych

Magazyn danych (model) zawiera kolumny i wiersze. Kolumna magazynu danych (modelu) reprezentuje pewne pole danych o stałym typie danych, tzn. np. kiedy w kolumnie przechowywane są dane typu tekstowego, to nie można wstawiać tam danych powiedzmy graficznych.
Musisz wiedzieć jakiego rodzaju dane chcesz zapisać podczas tworzenia magazynu list (GtkListStore), lub magazynu drzewa (GtkTreeStore). Dla przykładu, chcemy wyświetlić listę plików. Przyjmijmy, że magazyn list składa się dwóch pól: pole przechowywujące nazwę pliku (czyli tekst), i pole przechowywujące rozmiar pliku (tj. liczbę całkowitą bez znaku). Nazwa pliku będzie przechowywana w 0-ej kolumnie modelu, a rozmiar pliku będzie zapisany w kolumnie 1-szej modelu.
Do utworzenia magazynu listy używa się:
C/C++
GtkListStore * gtk_list_store_new( gint n_columns,...);
Zwraca wskaźnik na GtkListStore, pierwszym argumentem jest ilość kolumn danych w liście, trzy kropki oznaczają, że jest funkcją wiele argumentową. Tymi argumentami mogą być różne typy danych, najczęściej używane:

  • G_TYPE_STRING typ tekstowy
  • G_TYPE_INT typ liczbowy wartości całkowitych ze znakiem
  • G_TYPE_UINT typ liczbowy wartości całkowitych bez znaku
  • G_TYPE_FLOAT, G_TYPE_DOUBLE typy liczbowe wartości zmiennoprzecinkowych
  • G_TYPE_STRING typ do przechowywania tekstów (tworzy kopię oryginalnego łańcucha)
  • G_TYPE_BOOLEAN typ logiczny (TRUE/FALSE)
  • GDK_TYPE_PIXBUF typ do przechowywania grafiki
  • G_TYPE_POINTER przechowuje wartość wskaźnika (nie kopiuje żadnych danych do magazynu danych, tylko przechowuje wartość wskaźnika)

Wracając do przykładu listy plików, magazyn list tworzymy w następujący sposób:
C/C++
GtkListStore * magazyn_listy;
magazyn_listy = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_UINT );
W ten sposób powstaje nowy magazyn listy z dwiema kolumnami. Kolumna 0 magazynu będzie przechowywać tekst, a kolumna 1 liczby całkowite bez znaku. W tym momencie model nie ma jeszcze wierszy.

Metody dostępu do wierszy

Istnieją różne metody dostępu do wierszy magazynu danych: GtkTreeIter, GtkTreePath, GtkTreeRowReference.

GtkTreeIter

Zanim omówiony zostanie GtkTreeIter, poznaj definicję co to jest iterator:
W programowaniu obiektowym iteratorem nazywamy obiekt pozwalający na sekwencyjny dostęp do wszystkich elementów lub części zawartych w innym obiekcie, zwykle kontenerze lub liście. Iterator jest czasem nazywany kursorem, zwłaszcza w zastosowaniach związanych z bazami danych.
Źródło: http://pl.wikipedia.org/wiki/Iterator

Do mnie najbardziej przemawia "Iterator jest czasem nazywany kursorem" i tak sobie go tłumacz :)
Iterator jest w istocie odniesieniem do jednego wiersza w magazynie listy, bądź węzła w drzewie.

Poniżej kilka funkcji do manipulacji na iteratorze. Ważne GtkTreeIter nie jest obiektem tylko strukturą, dlatego należy go deklarować jako strukturę, a nie jako wskaźnik na strukturę !

GtkTreeIter możemy ustawić na pierwszy element(wiersz) poprzez funkcje:
C/C++
gboolean gtk_tree_model_get_iter_first( GtkTreeModel * tree_model, GtkTreeIter * iter );

Ustawia iter na pierwszy iterator(element) w drzewie i zwraca wartość TRUE. Kiedy drzewo jest puste zwraca FALSE.
Pierwszy argument to wskaźnik na GtkTreeModel, drugi to wskaźnik na iterator do incializacji.

Można ustawić iterator na następny:
C/C++
gboolean gtk_tree_model_iter_next( GtkTreeModel * tree_model, GtkTreeIter * iter );

Ustawia iter na następny jeśli istnieje i zwraca wartość TRUE, jeżeli następny węzeł nie istnieje zwraca wartość FALSE.

Można ustawić iterator na poprzedni:
C/C++
gboolean gtk_tree_model_iter_previous( GtkTreeModel * tree_model, GtkTreeIter * iter );

Ustawia iter na poprzedni jeśli istnieje i zwraca wartość TRUE, jeżeli następny węzeł nie istnieje zwraca wartość FALSE.

GtkTreePath

GtkTreePath jest stosunkowo prosta droga do opisu logicznej pozycji rzędu w modelu. Ponieważ kontrolka widoku drzewa GtkTreeView zawsze wyświetla wszystkie wiersze w modelu, GtkTreePath zawsze opisuje ten sam wiersz, zarówno w modelu i widoku drzewa.

Funkcje operując na GtkTreePath:
C/C++
GtkTreePath * gtk_tree_path_new( void );
Tworzy nową ścieżkę zwracając wskaźnik na GtkTreePath.
C/C++
GtkTreePath * gtk_tree_path_new_from_string( const gchar * path );
Tworzy nową ścieżkę zwracając wskaźnik na GtkTreePath. Argumentem jest wskaźnik na tekst, którego pola muszą być odzielone dwukropkiem. W przypadku podania błędnego tekstu funkcja  zwróci NULL.
C/C++
gchar * gtk_tree_path_to_string( GtkTreePath * path );
Zwraca wskaźnik do tekstu, który jest ścieżką do elementu, np. "3:2:0". Argumentem jest wskaźnik do GtkTreePath.

Więcej funkcji operujących ma GtkTreePath znajdziesz w dokumentacji na stronie http://developer.gnome.org/gtk3/stable/GtkTreeModel.html

Przykład użycia

Iterator można łatwo przekształcić na ścieżkę uzywając funkcji gtk_tree_model_get_path, a ścieżkę również łatwo można przekształcić na iterator przy pomocy funkcji gtk_tree_model_get_iter. Oto przykład, który pokazuje jak uzyskać iterator (GtkTreeIter) ze ścieżki (GtkTreePath), która jest przekazywana po skojarzeniu sygnału "row-activated" z kontrolką widoku drzewa (GtkTreeView) do określonej przez programiste funkcji, dodatkowo pobiera dane z magazynu danych i wyświetla zawartość:
C/C++
void aktywowano_wiersz( GtkTreeView * treeview, GtkTreePath * path, GtkTreeViewColumn * col, gpointer userdata )
{
    GtkTreeModel * model;
    GtkTreeIter iter;
   
    g_print( "Wiersz został podwójnie kliknięty.\n" );
    model = gtk_tree_view_get_model( treeview );
    if( gtk_tree_model_get_iter( model, & iter, path ) )
    {
        gchar * nazwa;
       
        gtk_tree_model_get( model, & iter, KOLUMNA_NAZWA, & nazwa, - 1 );
        g_print( "Podwójnie klikniety wiersz zawiera: %s\n", nazwa );
        g_free( nazwa );
    }
}

"Modulacja" magazynu danych

Dowanie wierszy do magazynu listy GtkListStore

Mając magazyn listy GtkListStore można dodać nowy nie wypełnionymi danymi wiersz na koniec magazynu używająć funkcji:
C/C++
void gtk_list_store_append( GtkListStore * list_store, GtkTreeIter * iter );
Pierwszy argument to wskaźnik na listę zwróconą przez gtk_list_store_new, drugi na strukturę GtkTreeIter, która jest podstawową metodą dostępu do GtkTreeModel.
C/C++
void gtk_list_store_insert( GtkListStore * list_store, GtkTreeIter * iter, gint position );
Tworzy nowy pusty wiersz w zadanej pozycji w argumencie position. Argumentem list_store jest wskaźnik na utworzony wcześniej magazyn listy, drugi argument iter jest ustawiany na pozycje nowo utworzonego wiersza.
C/C++
void gtk_list_store_prepend( GtkListStore * list_store, GtkTreeIter * iter );
Dodaje nowy pusty wiersz na początek magazynu listy. Argumentem list_store jest wskaźnik na utworzony wcześniej magazyn listy, drugi argument iter jest ustawiany na pozycje nowo utworzonego wiersza.

Wypełnianie, zmiana wartości w wierszach magazynu danych

Wiesz już jak tworzyć nowy pusty wiersz w magazynie danych, więc teraz przedstawię funkcje ustawiające/zmieniające dane.
C/C++
void gtk_list_store_set( GtkListStore * list_store, GtkTreeIter * iter,...);
Ustawia wartościami magazyn danych listy w wierszu, na który wskazuje iterator. Pierwszym argumentem jest wskaźnik magazynu danych listy, drugim wskaźnik na iterator. Kolejnymi wartościami mogą być wartości do wstawienia przy czym  najpierw podaje się numer kolumny, a następnie wartość. Funkcja zaprzestaje przetwarzania arguemntów po napotkaniu -1.
C/C++
void gtk_tree_store_set( GtkTreeStore * tree_store, GtkTreeIter * iter,...);
Ustawia wartościami magazyn danych drzewa w węźle, na który wskazuje iterator. Pierwszym argumentem jest wskaźnik magazynu danych drzewa, drugim wskaźnik na iterator. Kolejnymi wartościami mogą być wartości do wstawienia przy czym  najpierw podaje się numer kolumny, a następnie wartość. Funkcja zaprzestaje przetwarzania arguemntów po napotkaniu -1.

Poniżej przykład tworzący magazyn listy o 3 kolumnach, 1-ej przechowuje imiona, czyli tekst, więc skorzystamy z typu G_TYPE_STRING. 2-ga kolumna nazwiska, także skorzystamy z typu G_TYPE_STRING, natomiast 3-cia kolumna rok urodzenia, czyli będzie to liczba. Po głębszym zastanowieniu się rok urodzenia nie może być wartością ujemną, dlatego wykorzystamy typ G_TYPE_UINT:
C/C++
enum {
    KOLUMNA_IMIE = 0,
    KOLUMNA_NAZWISKO,
    KOLUMNA_ROK_URODZENIA,
    ILOSC_KOLUMN
};

GtkListStore * magazyn_listy;
GtkTreeIter iter;

/* Utworzenie magazynu listy z 3 kolumnami */
magazyn_listy = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT );

/* Dodaje na koniec magazynu listy pusty wiersz oraz ustawia iterator na ten wiersz */
gtk_list_store_append( magazyn_listy, & iter );

/* Wypełnia pola danymi */
gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Michał", KOLUMNA_NAZWISKO, "Papacz", KOLUMNA_ROK_URODZENIA,( guint ) 1979, - 1 );

Wykorzystany w przykładzie został typ wyliczeniowy (enum), który w przypadku dużej ilości pól danych przechowywanych w magazynie znacznie ułatwia programowanie. Nie potrzeba ciągłego pamiętania pozycji pól danych, wystarczy korzystać ze zmiennych wyliczeniowych. Dodatkowym atutem takiego rozwiązania jest możliwość dodawania kolejnych kolumn (pól). Załóżmy, że dochodzisz do wniosku: należy dodać nowe pole przechowywujące w magazynie listy drugie imię. Zmieniony program wygląda tak
C/C++
enum {
    KOLUMNA_IMIE = 0,
    KOLUMNA_IMIE_DRUGIE,
    KOLUMNA_NAZWISKO,
    KOLUMNA_ROK_URODZENIA,
    ILOSC_KOLUMN
};

GtkListStore * magazyn_listy;
GtkTreeIter iter;

/* Utworzenie magazynu listy z 4 kolumnami */
magazyn_listy = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT );

/* Dodaje na koniec magazynu listy pusty wiersz oraz ustawia iterator na ten wiersz */
gtk_list_store_append( magazyn_listy, & iter );

/* Wypełnia pola danymi */
gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Michał", KOLUMNA_NAZWISKO, "Papacz", KOLUMNA_ROK_URODZENIA,( guint ) 1979, KOLUMNA_IMIE_DRUGIE, "Piotr", - 1 );

Zwróć uwage na
gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Michał", KOLUMNA_NAZWISKO, "Papacz", KOLUMNA_ROK_URODZENIA,( guint ) 1979, KOLUMNA_IMIE_DRUGIE, "Piotr", - 1 );
, zauważyłeś KOLUMNA_IMIE_DRUGIE, "Piotr" jest na końcu ! Nie ma to znaczenia, w którym miejscu się znajdzie, ponieważ KOLUMNA_IMIE_DRUGIE ma wartość 1, więc zostanie dodane w 2-ie pole magazynu danych, czyli tak jak powinno być. Jednak dla czytelności kodu lepiej pisać w kolejności uporządkowanej.

Ważnym elementem magazynu danych jest to, że nie trzeba martwić się o alokacje i zwalnianie pamięci dla danych w magazynie. Przykładowo wstawiany jest do magazynu danych tekst, to model zadba aby zrobić jego kopie i zapamiętać go w magazynie danych. Jeżeli później w to samo pole wstawiany jest nowy tekst, automatycznie zostanie zwolniona pamięć starego tekstu, a dla nowego zostanie wykonana kopia i zapamiętana w magazynie danych. Działa to dla większości typów, wyjątkiem jest typ G_TYPE_POINTER. W tym przypadku procedury alokacji i zwalniania pamięci spoczywają na barkach programisty.

Pobieranie wierszy danych z magazynu danych

Funkcją pozwalająca na pobieranie danych jest:
C/C++
void gtk_tree_model_get( GtkTreeModel * tree_model, GtkTreeIter * iter,...);

Pierwszym argumentem jest wskaźnik na GtkTreeModel, drugim wskaźnik na iter. Ponieważ jest funkcją wieloargumentową wartością informującą o końcu przetwarzaniu argumentów jest -1.
Argumentowo jest funkcją bardzo podoba do funkcji gtk_list_store_set lub gtk_tree_store_set, w przeciwieństwie do nich pobiera dane pod wskazany wskaźnik w podanych kolumnach. Wskaźnik musi być tego samego typu co element przechowywany w kolumnie magazynu danych.
Poniżej przedstawiony jest przykład na bazie poprzedniego rozszerzony o przeglądanie i wypisywanie pobranych wierszy z magazynu danych.
C/C++
#include <gtk/gtk.h>

enum {
    KOLUMNA_IMIE = 0,
    KOLUMNA_IMIE_DRUGIE,
    KOLUMNA_NAZWISKO,
    KOLUMNA_ROK_URODZENIA,
    ILOSC_KOLUMN
};

gboolean przegladaj_wyswietlaj( GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, gpointer user_data )
{
    gchar * pierwsze_imie, * drugie_imie, * nazwisko, * sciezka;
    guint rok_urodzenia;
   
    /* Pobiera dane z modelu, uwaga iter jest bez & ponieważ w argumencie funkcji iter juz jest wskaźnikiem */
    gtk_tree_model_get( model, iter, KOLUMNA_IMIE, & pierwsze_imie, KOLUMNA_IMIE_DRUGIE, & drugie_imie, KOLUMNA_NAZWISKO, & nazwisko, KOLUMNA_ROK_URODZENIA, & rok_urodzenia, - 1 );
   
    /* Zmienia GtkTreePath na tekst */
    sciezka = gtk_tree_path_to_string( path );
   
    g_print( "Wiersz %s: %s %s %s, urodzony %u\n", sciezka, pierwsze_imie, drugie_imie, nazwisko, rok_urodzenia );
   
    /* Pomieważ gtk_tree_model_get robi kopie danych tekstowych zawartych rezerwując dla nich pamięć należy ją zwolnić */
    g_free( sciezka );
    g_free( pierwsze_imie );
    g_free( drugie_imie );
    g_free( nazwisko );
   
    /* Zrócenie FALSE nie przerywa przechodzenia do następnego wiersza */
    return FALSE;
}

void utworz_wypelnij_wyswietl_dane( void )
{
    GtkListStore * magazyn_listy;
    GtkTreeIter iter;
   
    /* Utworzenie magazynu listy z 4 kolumnami */
    magazyn_listy = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT );
   
    /* Dodaje na koniec magazynu listy pusty wiersz oraz ustawia iterator na ten wiersz */
    gtk_list_store_append( magazyn_listy, & iter );
    /* Wypełnia pola danymi */
    gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Michał", KOLUMNA_IMIE_DRUGIE, "Bartosz", KOLUMNA_NAZWISKO, "Papacz", KOLUMNA_ROK_URODZENIA,( guint ) 1979, - 1 );
   
    /* Dodaje na koniec magazynu listy kolejny pusty wiersz oraz ustawia iterator na ten wiersz */
    gtk_list_store_append( magazyn_listy, & iter );
    /* Wypełnia pola danymi */
    gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Alicja", KOLUMNA_IMIE_DRUGIE, "Żaneta", KOLUMNA_NAZWISKO, "Król", KOLUMNA_ROK_URODZENIA,( guint ) 1983, - 1 );
   
    /* Dodaje na koniec magazynu listy kolejny pusty wiersz oraz ustawia iterator na ten wiersz */
    gtk_list_store_append( magazyn_listy, & iter );
    /* Wypełnia pola danymi */
    gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Patryk", KOLUMNA_IMIE_DRUGIE, "Roman", KOLUMNA_NAZWISKO, "Wawrzyniecki", KOLUMNA_ROK_URODZENIA,( guint ) 1961, - 1 );
   
    /* Wywołanie funkcji przegladajacej wszystkie wiersze w magazynie */
    gtk_tree_model_foreach( GTK_TREE_MODEL( magazyn_listy ), przegladaj_wyswietlaj, NULL );
}

int main( int argc, char ** argv )
{
    gtk_init( & argc, & argv );
   
    utworz_wypelnij_wyswietl_dane();
   
    return 0;
}

Zauważ, że gdy nowy wiersz jest tworzony, wszystkie pola z rzędu są ustawione na domyślne wartości zerowe odpowiednie dla typu danych. Pole typu G_TYPE_UINT  będzie automatycznie zawierać wartości 0, a pole typu G_TYPE_STRING będzie zawierać NULL.

Usuwanie wierszy danych z magazynu danych

Wiersze usuwa się za pomocą funkcji gtk_list_store_remove i gtk_tree_store_remove. Usunięty wiersz z magazynu danych zostaje automatycznie usunięty z widoku drzewa, jak również wszystkie dane przechowywane w nim będą automatycznie zwalniały zarezerwowaną pamięć. Oczywiście jak już wcześniej wspomniałem wyjątkiem od tej reguły są kolumny z danymi typu G_TYPE_POINTER.
Usuwanie pojedynczego wiersza jest proste: należy uzyskać iterator (GtkTreeIter), który identyfikuje wiersz do usunięcia, a następnie skorzystać z jednej z podanych funkcji:
C/C++
gboolean gtk_list_store_remove( GtkListStore * list_store, GtkTreeIter * iter );
Zwraca wartość TRUE wtedy, gdy iterator istnaił oraz wiersz z magazynu danych listy został usunięty, a w przeciwnym razie FALSE. Pierwszym argumentem jest wskażnik na magazyn danych listy, drugim wskaźnik na iterator.
C/C++
gboolean gtk_tree_store_remove( GtkListStore * list_store, GtkTreeIter * iter );
Zwraca wartość TRUE wtedy, gdy iterator istniał oraz węzeł został usunięty, a w przeciwnym razie FALSE. Pierwszym argumentem jest wskaźnik na magazyn danych drzewa, drugim wskaźnik na iterator.

Tworzenie kontrolki GtkTreeView

Do stworzenia kontrolki widoku drzewa służy funkcja:
C/C++
GtkWidget * gtk_tree_view_new( void );
Funkcja zwraca wskaźnik na utworzoną kontrolkę widoku drzewa.
Samo utworzenie kontroli to za mało, na ekranie nic by się nie pojawiło. Należy dołączyć model do kontrolki funkcją:
C/C++
void gtk_tree_view_set_model( GtkTreeView * tree_view, GtkTreeModel * model );
Pierwszym argumentem jest wskaźnik na kontrolkę widoku drzewa, drugim wskaźnik na model. Jeżeli kontrolka GtkTreeView miała wcześniej dołączony model zostanie on usunięty przed dołączeniem nowego. W przypadku kiedy wskaźnik model będzie zawierał wartość NULL aktualny model zostanie odłączony.

Wyżej napisałem, że model istniejący zostanie usunięty przed dołączeniem nowego modelu do kontrolki widoku drzewa. Będzie to prawda gdy po dołączeniu skorzystasz z funkcji g_object_unref:
C/C++
g_object_unref( G_OBJECT( model ) );
Spowoduje to zmniejszenie licznika referencji na model, a tym samym kiedy kontrolka GtkTreeView zostanie zniszczona zostanie zwolniona pamięć zajmowana przez model.

Mapowanie danych na ekranie: GtkTreeViewColumn i GtkCellRenderer

Widok drzewa składa się z kolumn, które należy dołączyć do kontrolki (GtKTreeView), aby wyświetlić cokolwiek w widoku drzewa. Kolumny widoku drzewa (GtkTreeViewColumn) same z siebie nic nie wyświetlają. Do wyświetlania używa się wyspecjalizowanych obiektów GtkCellRenderer (komórek). Komórki GtkCellRenderer są pakowane do kolumn (GtkTreeViewColumn) podobnie jak inne kontrolki są pakowane do GtkHBoxes.
Dla ścisłości proszę przeanalizować rysunek poniżej.

Kolumny "Lp", "Kraj", "Reprezentant", "VIP" są kolumnami widoku drzewa, gdzie również "Lp", "Kraj", "Reprezentant", "VIP" są etykietami nagłówków kolumn. Równie dobrze mogą istnieć kolumny bez etykiet. Zauważ, że kolumna "Kraj" składa się z dwóch komórek, pierwsza wyświetlająca tekst, druga grafikę obrazującą flage danego kraju. Pozostałe z jednej komórki.

Tworzenie kolumn GtkTreeViewColumn i dodawanie ich do kontrolki GtkTreeView

Funkcja tworząca kolumny wygląda następująco:
C/C++
GtkTreeViewColumn * gtk_tree_view_column_new( void );
Funkcja zwraca wskaźnik na utworzoną kolumnę.

Dodatkowo kolumna może mieć nazwę, która będzie widoczna w kontrolce poprzez:
C/C++
void gtk_tree_view_column_set_title( GtkTreeViewColumn * tree_column, const gchar * title );
Pobiera wskaźnik do kolumny i tekst, który ma być wyświetlony.

Kolumne do kontrolki GtkTreeView dodajemy używając funkcji:
C/C++
gint gtk_tree_view_append_column( GtkTreeView * tree_view, GtkTreeViewColumn * column );
Zawraca numer kolumny po dodaniu do kontrolki. Argumentami są wskaźniki na kontrolkę GtkTreeView oraz kolumnę zwróconą od gtk_tree_view_column_new

Komórki GtkCellRender

Aktualnie istnieją komórki wyświetlające:
  • GtkCellRendererText wyświetlają tekst, liczby, wartości logiczne jako tekst ("Tomasz", "-82.46", "true")
  • GtkCellRendererSpin wyświetlają liczby w postaci tekstu, jednak dodatkowo pozwalają na ustawianie liczb tak jak GtkSpinButton
  • GtkCellRendererPixbuf wyświetlają grafikę wczytaną przez programistę oraz ikony (stock_icon) dostarczone przez bibliotekę GTK+
  • GtkCellRendererToggle wyświetlają wartości logiczne poprzez check box lub wartości zawarte radio button
  • GtkCellRendererProgress wyświetlają wartości numeryczne w postaci paska
  • GtkCellRendererSpinner wyświetlają animacje bardzo podobny jaką wyświetla kontrolka GtkSpinner

GtkCellRender to obiekty, które są odpowiedzialne za faktyczne wyświetlanie danych w kolumnie (GtkTreeViewColumn). Posiadają one określone atrybuty (będę używał także naprzemiennie właściwości) , określające  w jaki sposób komórka jest rysowana. Dla lepszego zrozumienia proszę przeanalizować poniższy rysunek:

Tworzenie komórki tekstowej:
C/C++
GtkCellRenderer * gtk_cell_renderer_text_new( void );
Funkcja zwraca wskaźnik na utworzoną komórkę tekstową, którą użyjemy w kolumnie.

Mając komórkę utworzoną powyższą funkcją musimy dodać atrybuty, które poinformują kod odpowiedzialny za wyświetlanie w jak sposób interpretować dane zawarte w modelu (GtkTreeModel) i z którą kolumną modelu je powiązać:
C/C++
void gtk_tree_view_column_add_attribute( GtkTreeViewColumn * tree_column, GtkCellRenderer * cell_renderer, const gchar * attribute, gint column );
Dodaje atrybut mapowania do kolumny. Pierwszym argumentem jest wskaźnik na kolumnę widoku drzewa, drugim wskaźnik na komórkę, trzecim wskaźnik na tekst określający atrybut/właściwość, natomiast czwartym numer kolumny modelu, z któregą będą pobierane dane do wyświetlenia. Tak na przykład jeśli kolumna 2 modelu zawiera łańcuchy tekstowe, można dodać atrybut "text", wtedy komórka GtkCellRendererText  będzie pobierać wartości do wyświetlenia z kolumny 2:
C/C++
gtk_tree_view_column_add_attribute( kolumna, komorka, "text", 2 );

Uwaga!
kolumny (column) są numerowane od 0, zatem w tym przypadku faktyczna kolumna modelu to 3.

Kolejna funkcja ustawiająca atrybuty:
C/C++
void gtk_tree_view_column_set_attributes( GtkTreeViewColumn * tree_column, GtkCellRenderer * cell_renderer,...);
Ustawia atrybuty mapowania w wykazie właściwości tree_column. Wszystkie istniejące atrybuty zostaną usunięte i zastąpione nowymi atrybutami. Pierwszym argumentem jest wskaźnik na kolumnę widoku drzewa, drugim wskaźnik na komórkę, kolejne takie jak w gtk_tree_view_column_add_attribute. Ostatnim argumentem jest zawsze wartość NULL:
C/C++
gtk_tree_view_column_set_attributes( kolumna, komorka, "text", 0, "foreground", 1, "strikethrough", 2, NULL );
Objekt komórka będzie wyświetlany na podsawie następujących właściwości: łańcuchy tesktowe przeznaczone do wyświetlenia będą pobierane z kolumny 0 modelu, kolor jaki ma być użyty do wyświetlania będzie pobierany z kolumny 1 modelu, a wartość określająca, czy tekst ma być przekreślony lub nie z kolumny 2 modelu.

Dołączenie komórki do konkretnej kolumny poprzez funkcję:
C/C++
void gtk_tree_view_column_pack_start( GtkTreeViewColumn * tree_column, GtkCellRenderer * cell, gboolean expand );
Argumenty funkcji to wskaźnik na kolumnę stworzoną gtk_tree_view_column_new, wskaźnik na komórkę zwrócony w naszym przypadku przez gtk_cell_renderer_text_new, expand może przyjąć wartość FALSE wtedy komórka nie zajmie więcej miejsca niż jest jej potrzebne do wyświetlenia zawartości. W przypadku TRUE  może zając więcej miejsca.

Podsumowanie. Kroki tworzenia GtkTreeView wraz z jej wypełnieniem

1. Utwórz magazyn danych GtkListStore lub GtkTreeStore funkcjami gtk_list_store_new lub gtk_tree_store_new.
2. Utwórz wiersz funkcją gtk_list_store_append lub węzeł za pomocą gtk_tree_store_append.
3. Ustaw zawartość wiersza gtk_list_store_set lub węzeł za pomocą gtk_tree_store_set.
4. Utwórz kontrolkę widoku GtkTreeView funkcją gtk_tree_view_new.
5. Dołącz model do kontrolki widoku GtkTreeView funkcją gtk_tree_view_set_model. Nie zapomnij o g_object_unref.
6. Uwórz komórki np. gtk_cell_renderer_text_new.
7. Uwórz kolumny gtk_tree_view_column_new , oraz dodaj/ustaw atrybuty gtk_tree_view_column_add_attribute, ewentualnie ustaw tytuł, który będzie widoczny w nagłówku kolumny gtk_tree_view_column_set_title.
8. Upakuj komórki do odpowienich kolumn gtk_tree_view_column_pack_start.
9. Dodaj kolumny do kontrolki widoku drzewa gtk_tree_view_append_column.

Poniżej przykład "TreeView1":
C/C++
#include <gtk/gtk.h>

int main( int argc, char * argv[] )
{
    GtkWidget * okno;
    GtkListStore * lista;
    GtkTreeIter iter;
    GtkWidget * treeview;
    GtkTreeViewColumn * kolumna;
    GtkCellRenderer * komorka;
   
    gtk_init( & argc, & argv );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "TreeView1" );
    g_signal_connect( okno, "delete_event", gtk_main_quit, NULL );
   
    lista = gtk_list_store_new( 1, G_TYPE_STRING );
   
    gtk_list_store_append( lista, & iter );
    gtk_list_store_set( lista, & iter, 0, "Jeden", - 1 );
    gtk_list_store_append( lista, & iter );
    gtk_list_store_set( lista, & iter, 0, "Dwa", - 1 );
   
    treeview = gtk_tree_view_new();
    gtk_container_add( GTK_CONTAINER( okno ), treeview );
   
    gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), GTK_TREE_MODEL( lista ) );
    g_object_unref( G_OBJECT( lista ) );
   
   
    kolumna = gtk_tree_view_column_new();
    komorka = gtk_cell_renderer_text_new();
   
    gtk_tree_view_column_set_title( kolumna, "Nazwa kolumny" );
    gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
    gtk_tree_view_column_add_attribute( kolumna, GTK_CELL_RENDERER( komorka ), "text", 0 );
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}
Po skompilowaniu i uruchomieniu programu powinieneś zobaczyć coś takiego:

Zaznaczanie, podwójne kliknięcia

Obsługa zaznaczania w widoku drzewa

Jednym z najbardziej podstawowych cech widoku listy lub widoku drzewa jest to, że wiersze mogą być wybrane lub odznaczone. Zaznaczenie jest obsługiwane przez obiekt GtkTreeSelection. Każdy widok drzewa automatycznie ma związany z nim obiekt GtkTreeSelection, programista może go pobrać za pomocą:
C/C++
GtkTreeSelection * gtk_tree_view_get_selection( GtkTreeView * tree_view );
Funkcja zwraca wskaźnik na objekt GtkTreeSelection, argumentem jest wskaźnik na kontrolkę widoku drzewa.

Tryby zazanaczania:
  • GTK_SELECTION_NONE nic nie może być zaznaczone
  • GTK_SELECTION_SINGLE nie więcej niż jeden wiersz może być zaznaczony
  • GTK_SELECTION_BROWSE zawsze tylko jeden wiersz jest zaznaczony
  • GTK_SELECTION_MULTIPLE nic lub wiele wierszy jest zazanczonych

Tryb zaznaczania ustwaia się funkcją:
C/C++
void gtk_tree_selection_set_mode( GtkTreeSelection * selection, GtkSelectionMode type );

Pierwszym argumentem jest wskaźnik na obiekt GtkTreeSelection, natomiast drugim jeden z podanych wyżej trybów.

Możesz zaznaczać lub odnaczać wiersze z poziomu programu używając funkcji: gtk_tree_selection_select_iter, gtk_tree_selection_select_path, gtk_tree_selection_unselect_iter, gtk_tree_selection_unselect_path, gtk_tree_selection_select_all, oraz gtk_tree_selection_unselect_all. Po więcej informacji odnośnie tych funkcji zajrzyj do dokumentacji Gtk+.

Pobieranie aktualnie zaznaczonych wierszy

Możesz uzyskać dostęp do aktualnie zazanczonych wierszy przechodząc przez wszystkie zaznaczone wiersze za pomocą funkcji gtk_tree_selection_selected_foreach lub uzyskać wskaźnik na strukturę listy GList ścieżek zaznaczonych wierszy za pomocą funkcji gtk_tree_selection_get_selected_rows. Jeśli wybrany jest tryb zaznaczania GTK_SELECTION_SINGLE lub GTK_SELECTION_BROWSE, najwygodniejszy sposób, aby pobrać zaznaczony wiersz jest funkcja gtk_tree_selection_get_selected, która zwróci TRUE jeżeli wiersz jest zaznaczony oraz wypełni iterator odpowiednią wartością. Używa się jej tak jak pokazano poniżej:
C/C++
//...
GtkTreeSelection * zaznaczenie;
GtkTreeModel * model;
GtkTreeIter iter;

//Działa tylko w trybach GTK_SELECTION_SINGLE lub GTK_SELECTION_BROWSE
zazanaczenie = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
if( gtk_tree_selection_get_selected( selection, & model, & iter ) )
{
    gchar * nazwa;
    gtk_tree_model_get( model, & iter, KOLUMNA_NAZWA, & nazwa, - 1 );
    g_print( "Zaznaczono wiersz: %s\n", nazwa );
    g_free( nazwa );
}
else
{
    g_print( "Brak zaznaczonych wierszy.\n" );
}
//...

Oto jak używać funkcji gtk_tree_selection_selected_foreach:
C/C++
//...
gboolean przegladaj_zazanaczone wiersze( GkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, gpointer userdata )
{
    gchar * nazwa;
    gtk_tree_model_get( model, & iter, KOLUMNA_NAZWA, & nazwa, - 1 );
    g_print( "Zaznaczono wiersz: %s\n", nazwa );
}
void zrob_cos_z_wszytkimi_zaznaczonymi_wierszami( GtkWidget * treeview )
{
    GtkTreeSelection * zaznaczenie;
   
    zaznaczenie = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
    gtk_tree_selection_selected_foreach( zazanaczenie, przegladaj_zazanaczone wiersze, NULL );
}
void utworz_drzewo_widoku( void )
{
    GtkWidget * treeview;
    GtkTreeSelection * zaznaczenie;
    [...]
    treeview = gtk_tree_view_new();
    //...
    zaznaczenie = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
    gtk_tree_selection_set_mode( zaznaczenie, GTK_SELECTION_MULTIPLE );
    //...
}
//...

Obsługa zaznaczenie po dwukrotnym kliknięciu na wierszu

Obsługa polega tylko na skojarzeniu sygnału "row-activated" kontrolki GtkTreeView z odpowiednio napisaną funkcją:
C/C++
//...
void aktywowano_wiersz( GtkTreeView * treeview, GtkTreePath * path, GtkTreeViewColumn * col, gpointer userdata )
{
    GtkTreeModel * model;
    GtkTreeIter iter;
   
    g_print( "Wiersz został podwójnie kliknięty.\n" );
    model = gtk_tree_view_get_model( treeview );
    if( gtk_tree_model_get_iter( model, & iter, path ) )
    {
        gchar * nazwa;
       
        gtk_tree_model_get( model, & iter, KOLUMNA_NAZWA, & nazwa, - 1 );
        g_print( "Podwójnie klikniety wiersz zawiera: %s\n", nazwa );
        g_free( nazwa );
    }
}

void utworz_widok_drzewa( void )
{
    GtkWidget * treeview;
   
    treeview = gtk_tree_view_new();
    //...
    g_signal_connect( treeview, "row-activated",( GCallback ) aktywowano_wiersz, NULL );
    //...
}

Edytowalne komórki

Niektóre rodzaje komórek pozwalają nie tylko na wyświetlanie danych, lecz także na ich edycje.

Edytowalna komórka GtkCellRendererText

Jak już wspomniałem komórka możne nie tylko wyświetlać tekst, ale także pozwolić użytkownikowi na edycje jej zawartości poprzez dwukrotne kliknięcie na niej.
Aby komórka stała się edytowalna należy ustawić właśC++ciwość "editable" na wartość TRUE. Kiedy komórka stanie się edytowalna można skojarzyć sygnał "edited" z odpowiednią funcją, która ją obsłuży:
C/C++
g_signal_connect( komorka, "edited",( GCallback ) obsluz_komorke_edytowalna, NULL );

Prototyp funckcji obsługującej edycję:
C/C++
void obsluz_komorke_edytowalna( GtkCellRendererText * renderer, gchar * path, gchar * new_text, gpointer user_data )
Pierwszy wskaźnik to komórka, której dotyczy edycja, drugi to ścieżka w postaci łańcuch tekstowego, trzeci to nowe zedytowane dane także w postaci tekstu, czwarty to przekazany przez użytkownika z funkcji g_signal_connect.

Przykład w pseudo kodzie:
C/C++
void obsluz_komorke_edytowalna( GtkCellRendererText * renderer, gchar * path, gchar * new_text, gpointer user_data )
{
    GtkTreePath * sciezka;
    GtkTreeIter iter;
    GtkTreeModel * model;
    GtkTreeView * treeview;
   
    treeview =( GtkTreeView * ) user_data;
    /* Pobranie modelu z widoku dzrewa */
    model = gtk_tree_view_get_model( treeview );
   
    /* Utworzenie ścieżki GtkTreePath z przekazanego łańcucha tekstowego path */
    sciezka = gtk_tree_path_new_from_string( path );
    /* Ustawienie iteratora iter na podstawie sciezka */
    gtk_tree_model_get_iter( model, & iter, sciezka );
    /* Zwolnienie pamięci zajmowanej przez sciezka */
    gtk_tree_path_free( sciezka );
   
    /* Np. ustawienie nowej wartości w komórce */
    gtk_list_store_set( GTK_LIST_STORE( model ), & iter, 0, new_text, - 1 );
}

void utworz_drzewo_widoku( void )
{
    GtkWidget * treeview;
    //...
    treeview = gtk_tree_view_new();
    komorka = gtk_cell_renderer_text_new();
    /* Ustawia właściwość komórki na możliwośc edycji */
    g_object_set( komorka, "editable", TRUE, NULL );
    g_signal_connect( komorka, "edited",( GCallback ) obsluz_komorke_edytowalna, treeview );
    //...
}

Edytowalna komórka GtkCellGtkCellRendererSpin

Ponieważ objekt GtkCellGtkCellRendererSpin wywodzi się z GtkCellRendererText obsługuję się tak samo jak GtkCellRendererText. Jedynie w funkcji obsługującej edycje nie można się spodziewać, że otrzymamy liczbę. Ponieważ kojarzymy komorkę także z sygnałem "edited" prototyp funkcji jest idetyczny jak dla obsługi GtkCellRendererText, więc otrzymamy liczbę w postaci łańcucha tekstowego w zmiennej new_text. Dlatego należy użyć, którejś z funkcji konwertującej tekst na liczbę.  

Przykłady i opisy

Przykład "TreeView2"

Poniższy przykład pozwala na dodawanie, usuwanie i zmienianie wierszy w magazynie danych. Na początku aktywny jest tylko przycisk "Dodaj", dopiero kiedy w kolumnie są dane i dodatkowo zostanie zaznaczony wiersz danych aktywne stają się przyciski "Usuń" i "Zmień". Warto zwrócić uwagę w jaki sposób obsługuje się zaznaczanie wierszy:
C/C++
#include <gtk/gtk.h>

enum {
    KOLUMNA_OSOBA = 0,
    ILOSC_KOLUMN
};

GtkTreeView * treeview;
GtkWidget * przycisk_usun, * przycisk_zmien;

void wcisnieto_Dodaj( GtkWidget * entry, gpointer data )
{
    const gchar * tekst;
   
    tekst = gtk_entry_get_text( GTK_ENTRY( entry ) );
   
    // Jeśli wypełniono kontrolke entry
    if( strlen( tekst ) )
    {
        GtkTreeModel * model;
        GtkTreeIter iter;
       
        // Pobranie modelu z kontrolki
        model = gtk_tree_view_get_model( GTK_TREE_VIEW( treeview ) );
       
        // Dodatnie wiersza na koniec listy
        gtk_list_store_append( GTK_LIST_STORE( model ), & iter );
        gtk_list_store_set( GTK_LIST_STORE( model ), & iter, KOLUMNA_OSOBA, tekst, - 1 );
       
        gtk_entry_set_text( GTK_ENTRY( entry ), "" );
    }
}

void wcisnieto_Usun( GtkWidget * button, gpointer data )
{
   
    GtkTreeSelection * sel;
    GtkTreeModel * model;
    GtkTreeIter wybrany_wiersz;
   
    // Pobranie zaznaczenia
    sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
   
    if( gtk_tree_selection_get_selected( sel, & model, & wybrany_wiersz ) )
         gtk_list_store_remove( GTK_LIST_STORE( model ), & wybrany_wiersz );
   
}

void wcisnieto_Zmien( GtkWidget * entry, gpointer data )
{
   
    GtkTreeSelection * sel;
    GtkTreeModel * model;
    GtkTreeIter wybrany_wiersz;
   
    sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
   
    if( gtk_tree_selection_get_selected( sel, & model, & wybrany_wiersz ) )
    {
        const gchar * tekst;
       
        tekst = gtk_entry_get_text( GTK_ENTRY( entry ) );
       
        if( strlen( tekst ) )
        {
            gtk_list_store_set( GTK_LIST_STORE( model ), & wybrany_wiersz, KOLUMNA_OSOBA, tekst, - 1 );
            gtk_entry_set_text( GTK_ENTRY( entry ), "" );
        }
    }
   
    // Odznacz wybrany wiersz
    gtk_tree_selection_unselect_iter( sel, & wybrany_wiersz );
}



void zmiana_Zaznaczenia( GtkTreeSelection * sel, GtkListStore * lista )
{
    GtkTreeIter zaznaczony_wiersz;
   
    // Sprawdzenie czy wiersz jest zaznaczony i odpowiednio aktywacja/dezaktywacja przycisków
    if( gtk_tree_selection_get_selected( sel, NULL, & zaznaczony_wiersz ) )
    {
        gtk_widget_set_sensitive( przycisk_usun, TRUE );
        gtk_widget_set_sensitive( przycisk_zmien, TRUE );
    }
    else
    {
        gtk_widget_set_sensitive( przycisk_usun, FALSE );
        gtk_widget_set_sensitive( przycisk_zmien, FALSE );
    }
}

int main( int argc, char * argv[] )
{
   
    GtkWidget * okno, * vbox, * hbox;
    GtkWidget * label, * entry, * przycisk;
    GtkTreeViewColumn * kolumna;
    GtkCellRenderer * komorka;
    GtkListStore * lista;
    GtkTreeSelection * sel;
   
   
    gtk_init( & argc, & argv );
   
    // Utworzenie okna z połączeniem sygnału destroy
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "TreeView2" );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 );
    g_signal_connect( okno, "destroy", G_CALLBACK( gtk_main_quit ), NULL );
   
    vbox = gtk_vbox_new( FALSE, 2 );
    gtk_container_add( GTK_CONTAINER( okno ), vbox );
   
   
    // Utworzenie kontrolki GtkTreeView z dodaniem jej do okna
    treeview = gtk_tree_view_new();
    gtk_box_pack_start( GTK_BOX( vbox ), treeview, TRUE, TRUE, 0 );
    //gtk_container_add (GTK_CONTAINER(okno), treeview);
   
    // Utworzenie komórki tekstowej, utworzenie kolumny z nazwą Osoby oraz dołączenie komórki wraz z ustawieniem atrybutu text wskazującego na pozycje 0 modelu. Dodanie kolumny do kontrolki 
    komorka = gtk_cell_renderer_text_new();
    kolumna = gtk_tree_view_column_new_with_attributes( "Osoby", komorka, "text", 0, NULL );
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    // Utworzenie "listy" 1 elementowej, 1 kolumna typu tekstowego
    lista = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING );
   
   
    // Dołączenie modelu do kontrolki
    gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), GTK_TREE_MODEL( lista ) );
   
    g_object_unref( lista );
   
    sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
    g_signal_connect( sel, "changed", G_CALLBACK( zmiana_Zaznaczenia ), lista );
   
    // Utworzenie 2 elementowego kontenera hbox
    hbox = gtk_hbox_new( FALSE, 14 );
   
    // Utworzenie kontrolki tekstowej z tekstem Osoba i dodanie jej do kontenera hbox
    label = gtk_label_new( "Osoba" );
    gtk_box_pack_start( GTK_BOX( hbox ), label, FALSE, FALSE, 0 );
   
    // Utworzenie kontrolki wpisu i dodanie jej do kontenera hbox
    entry = gtk_entry_new();
    gtk_box_pack_start( GTK_BOX( hbox ), entry, TRUE, TRUE, 0 );
   
    // Utworzenie przycisku Dodaj, dodanie go do kontenera hbox, powiązanie sygnału cliked przycisku z funkcją wcisnieto_Dodaj
    przycisk = gtk_button_new_with_label( "Dodaj" );
    gtk_box_pack_start( GTK_BOX( hbox ), przycisk, FALSE, TRUE, 5 );
    g_signal_connect_swapped( przycisk, "clicked", G_CALLBACK( wcisnieto_Dodaj ), entry );
   
    // Utworzenie przycisku Usuń, dodanie go do kontenera hbox, powiązanie sygnału cliked przycisku z funkcją wcisnieto_Usun oraz ustawienie przycisku jako nieaktywnego
    przycisk_usun = gtk_button_new_with_label( "Usuń" );
    gtk_box_pack_start( GTK_BOX( hbox ), przycisk_usun, FALSE, TRUE, 0 );
    g_signal_connect( przycisk_usun, "clicked", G_CALLBACK( wcisnieto_Usun ), NULL );
    gtk_widget_set_sensitive( przycisk_usun, FALSE );
   
    // Utworzenie przycisku Zmień, dodanie go do kontenera hbox, powiązanie sygnału cliked przycisku z funkcją wcisnieto_Zmien oraz ustawienie przycisku jako nieaktywnego
    przycisk_zmien = gtk_button_new_with_label( "Zmień" );
    gtk_box_pack_start( GTK_BOX( hbox ), przycisk_zmien, FALSE, TRUE, 5 );
    g_signal_connect_swapped( przycisk_zmien, "clicked", G_CALLBACK( wcisnieto_Zmien ), entry );
    gtk_widget_set_sensitive( GTK_WIDGET( przycisk_zmien ), FALSE );
   
    // Dodanie kontenera poziomego hbox do kontenera pionowego vbox
    gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
   
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}


W powyższym przykładzie użyto funkcji gtk_tree_view_column_new_with_attributes. Jest to funkcja pomagająca przyspieszyć pisanie, ponieważ za jednym użyciem tworzy kolumnę, ustawia jej tytuł oraz ustawia atrybuty. Czyli jest równoważna użyciu funkcji gtk_tree_view_column_set_title, gtk_tree_view_column_pack_start, i gtk_tree_view_column_add_attribute.

C/C++
GtkTreeViewColumn * gtk_tree_view_column_new_with_attributes( const gchar * title, GtkCellRenderer * cell,...);
Zwraca wskaźnik na utworzoną kolumnę. Pierwszym argumentem jest tekst z nazwą kolumny, drugim wskaźnik na utworzoną wcześniej komórkę, kolejnym/kolejnymi mogą być atrybuty. Argumentem informującym funkcje o końcu przetwarzania argumentów jest NULL.

Przykład z własną obsługą wyświetlanej komórki

Bardzo ciekawy przykład przedstawiający w jaki sposób wpływa się na przetwarzanie, a co z tym się wiąże wyświetlanie danych w komórce. Staraj się, żeby funkcja obsługująca przetwarzanaie w przykładzie poniżej age_cell_data_func była jak najkrótsza i optymalnie napisana, ponieważ jej czas wykonania ma wpływ na czas renderowania komórki:
C/C++
#include <gtk/gtk.h>

enum
{
    KOLUMNA_NAZWISKO = 0,
    KOLUMNA_IMIE,
    KOLUMNA_ROK_URODZENIA,
    ILOSC_KOLUMN
};

GtkTreeModel * utworz_i_wypelnij_model( void )
{
    GtkTreeStore * magazyn_drzewa;
    GtkTreeIter rodzic, potomek;
   
    magazyn_drzewa = gtk_tree_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT ); /* ILOSC_KOLUMN = 3 */
   
    /* Tworzy pusty węzeł bez potomka */
    gtk_tree_store_append( magazyn_drzewa, & rodzic, NULL );
   
    /* Wypełnia danymi stworzony węzeł */
    gtk_tree_store_set( magazyn_drzewa, & rodzic, KOLUMNA_IMIE, "Maria", KOLUMNA_NAZWISKO, "Niezabitowska", - 1 );
   
    /* Tworzy 2 pusty węzeł i wypełnia go danymi */
    gtk_tree_store_append( magazyn_drzewa, & rodzic, NULL );
    gtk_tree_store_set( magazyn_drzewa, & rodzic,
    KOLUMNA_IMIE, "Jan",
    KOLUMNA_NAZWISKO, "Głgowski",
    KOLUMNA_ROK_URODZENIA,( guint ) 1951,
    - 1 );
   
    /* Tworzy pustego potomka rodzica, oraz wypełnia go danymi */
    gtk_tree_store_append( magazyn_drzewa, & potomek, & rodzic );
    gtk_tree_store_set( magazyn_drzewa, & potomek,
    KOLUMNA_IMIE, "Piotr",
    KOLUMNA_NAZWISKO, "Głogowski",
    KOLUMNA_ROK_URODZENIA,( guint ) 1979,
    - 1 );
   
    /* Tworzy 3 pusty węzeł i wypełnia go danymi */
    gtk_tree_store_append( magazyn_drzewa, & rodzic, NULL );
    gtk_tree_store_set( magazyn_drzewa, & rodzic,
    KOLUMNA_IMIE, "Małgorzata",
    KOLUMNA_NAZWISKO, "Żukowska",
    KOLUMNA_ROK_URODZENIA,( guint ) 2011,
    - 1 );
   
    /* Tworzy pustego potomka rodzica, oraz wypełnia go danymi */
    gtk_tree_store_append( magazyn_drzewa, & potomek, & rodzic );
    gtk_tree_store_set( magazyn_drzewa, & potomek,
    KOLUMNA_IMIE, "Renata",
    KOLUMNA_NAZWISKO, "Żukowska",
    KOLUMNA_ROK_URODZENIA,( guint ) 2005,
    - 1 );
   
    return GTK_TREE_MODEL( magazyn_drzewa );
}

void
age_cell_data_func( GtkTreeViewColumn * col,
GtkCellRenderer * renderer,
GtkTreeModel * model,
GtkTreeIter * iter,
gpointer user_data )
{
    guint rok_urodzenia;
    guint rok_terazniejszy = 2012;
    gchar buf[ 64 ];
   
    gtk_tree_model_get( model, iter, KOLUMNA_ROK_URODZENIA, & rok_urodzenia, - 1 );
   
    if( rok_urodzenia <= rok_terazniejszy && rok_urodzenia > 0 )
    {
        gchar * tekst;
        guint wiek = rok_terazniejszy - rok_urodzenia;
       
       
        if( wiek < 10 )
             g_snprintf( buf, sizeof( buf ), "%u lat", wiek );
        else
        {
            tekst = g_strdup_printf( "%d", wiek );
            if(( tekst[ 1 ] > '1' ) &&( tekst[ 1 ] < '5' ) )
                 g_snprintf( buf, sizeof( buf ), "%u lata", wiek );
            else
                 g_snprintf( buf, sizeof( buf ), "%u lat", wiek );
           
        }
        if( wiek == 1 )
             g_snprintf( buf, sizeof( buf ), "%u rok", wiek );
       
        g_object_set( renderer, "foreground-set", FALSE, NULL ); /* print this normal */
    }
    else
    {
        g_snprintf( buf, sizeof( buf ), "wiek nieznany" );
        g_object_set( renderer, "foreground", "Red", "foreground-set", TRUE, NULL ); /* make red */
    }
   
    g_object_set( renderer, "text", buf, NULL );
}


GtkWidget * utworz_treeview_i_model( void )
{
    GtkTreeViewColumn * kolumna;
    GtkCellRenderer * komorka;
    GtkWidget * treeview;
    GtkTreeModel * model;
   
    /* Utworzenie kontrolki GtkTreeView */
    treeview = gtk_tree_view_new();
   
    /* --- Kolumna #1 --- */
   
    /* Utworzenie nowej kolumny */
    kolumna = gtk_tree_view_column_new();
   
    /* Ustawienie nazwy kolumny tekstem 'Imię' */
    gtk_tree_view_column_set_title( kolumna, "Nazwisko" );
   
    /* Dodanie kolumny do kontrolki GtkTreeView */
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    /* Utworzenie nowej komórki tekstowej */
    komorka = gtk_cell_renderer_text_new();
   
    /* Dodanie komórki do kolumny */
    gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
   
    /* Dodanie atrybutu 'text', tzn. dołączenie do komórki 
       connect 'text' property of the cell renderer to model column that contains the first name */
    gtk_tree_view_column_add_attribute( kolumna, komorka, "text", KOLUMNA_NAZWISKO );
   
    /* Ustawieni właściwości 'weight' komórki na pogrubienie */
    g_object_set( komorka, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL );
   
   
    /* --- Kolumna #2 --- */
   
    /* Utworzenie nowej kolumny */
    kolumna = gtk_tree_view_column_new();
   
    /* Ustawienie nazwy kolumny tekstem 'Nazwisko' */
    gtk_tree_view_column_set_title( kolumna, "Imię" );
   
    /* Dodanie kolumny do kontrolki GtkTreeView */
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    /* Utworzenie nowej komórki tekstowej */
    komorka = gtk_cell_renderer_text_new();
   
    /* Dodanie komórki do kolumny */
    gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
   
    /* connect 'text' property of the cell renderer to model column that contains the last name */
    gtk_tree_view_column_add_attribute( kolumna, komorka, "text", KOLUMNA_IMIE );
   
   
    /* --- Kolumna #3 --- */
   
    /* Utworzenie nowej kolumny */
    kolumna = gtk_tree_view_column_new();
   
    /* Ustawienie nazwy kolumny tekstem 'Wiek' */
    gtk_tree_view_column_set_title( kolumna, "Wiek" );
   
    /* Dodanie kolumny do kontrolki GtkTreeView */
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    /* Utworzenie nowej komórki tekstowej */
    komorka = gtk_cell_renderer_text_new();
   
    /* Dodanie komórki do kolumny */
    gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
   
    /* connect a cell data function */
    gtk_tree_view_column_set_cell_data_func( kolumna, komorka, age_cell_data_func, NULL, NULL );
   
   
    model = utworz_i_wypelnij_model();
   
    gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), model );
   
    /* Model zostanie automatycznie zniszczony wraz GtkTreeView */
    g_object_unref( model );
   
    /* Brak zaznaczania wierszy */
    gtk_tree_selection_set_mode( gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) ), GTK_SELECTION_NONE );
   
    return treeview;
}


int main( int argc, char ** argv )
{
    GtkWidget * okno;
    GtkWidget * treeview;
   
    gtk_init( & argc, & argv );
   
    /* Utworzenie  okna o rozmaiarch 300x200 na środku ekranu */
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "TreeView3" );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
   
    g_signal_connect( okno, "delete_event", gtk_main_quit, NULL );
   
    /* Utworzenie kontrolki GtkTreeView wraz z modelm */
    treeview = utworz_treeview_i_model();
   
    /* Dodanie kontrolki GtkTreeView do okna */
    gtk_container_add( GTK_CONTAINER( okno ), treeview );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}
Efekt działania programu:

Przykład pobiernia danych i wyświetlania ich w oknie dialogowym "TreeView4"

W tym przykładzie przedstawiona jest obsługa sygnału "row-activated", oraz w jaki sposób można wyświetlić wartości pobrane z magazynu danych (modelu). Dodatkowo pokazano jak obsługiwać komórki GtkCellRendererToggle, a w tym przypadku podobne do GtkCheckButton, skojarzone z sygnałem "toggled":
C/C++
#include <gtk/gtk.h>

enum {
    KOLUMNA_LP = 0,
    KOLUMNA_IMIE,
    KOLUMNA_NAZWISKO,
    KOLUMNA_AKTYWNY,
    ILOSC_KOLUMN
};

struct _data {
    gchar * imie;
    gchar * nazwisko;
    gboolean czy_aktywny;
};

struct _data osoby[] = {
    { "Jan", "Kowalski", TRUE },
    { "Tadeusz", "Kościuszko", FALSE },
    { "Krzysztof", "Wiśniewski", TRUE },
    { "Mirosław", "Nowak", FALSE },
    { "Łukasz", "Bach", FALSE },
};

const gchar * nazwy_kolumn[] = {
    "Lp",
    "Imię",
    "Nazwisko",
    "Aktywny"
};

void wybrano_wiersz( GtkTreeView * treeview, GtkTreePath * path, GtkTreeViewColumn * column, gpointer user_data )
{
    GtkWidget * dialog;
    GtkTreeModel * model;
    GtkTreeIter iter;
    guint lp;
    gchar * imie, * nazwisko;
    gboolean czy_aktywny;
    gchar * wiersz;
   
    model = gtk_tree_view_get_model( treeview );
    gtk_tree_model_get_iter( model, & iter, path );
    gtk_tree_model_get( model, & iter, KOLUMNA_LP, & lp, KOLUMNA_IMIE, & imie, KOLUMNA_NAZWISKO, & nazwisko,
    KOLUMNA_AKTYWNY, & czy_aktywny, - 1 );
   
    wiersz = g_strdup_printf( "Wybrano wiersz: %d", lp );
   
    dialog = gtk_message_dialog_new( NULL,
    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
    GTK_MESSAGE_INFO, GTK_BUTTONS_OK, wiersz );
    gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG( dialog ),
    "%s %s\n%s", imie, nazwisko, czy_aktywny ? "Aktywny"
        : "Nie aktywny" );
    gtk_dialog_run( GTK_DIALOG( dialog ) );
    gtk_widget_destroy( dialog );
   
    g_free( imie );
    g_free( nazwisko );
    g_free( wiersz );
}

void zmieniono( GtkCellRendererToggle * cell, gchar * path_str, gpointer data )
{
    GtkTreeModel * model =( GtkTreeModel * ) data;
    GtkTreeIter iter;
    GtkTreePath * path = gtk_tree_path_new_from_string( path_str );
    gboolean aktywny;
   
    gtk_tree_model_get_iter( model, & iter, path );
    gtk_tree_model_get( model, & iter, KOLUMNA_AKTYWNY, & aktywny, - 1 );
   
    aktywny ^= 1;
   
    gtk_list_store_set( GTK_LIST_STORE( model ), & iter, KOLUMNA_AKTYWNY, aktywny, - 1 );
   
    gtk_tree_path_free( path );
}

int main( int argc, char * argv[] )
{
   
    GtkWidget * okno;
    GtkWidget * treeview;
    GtkTreeViewColumn * kolumna;
    GtkCellRenderer * komorka;
    GtkListStore * lista;
    GtkTreeIter iter;
    guint i;
   
    gtk_init( & argc, & argv );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "TreeView4" );
    g_signal_connect( okno, "destroy", G_CALLBACK( gtk_main_quit ), NULL );
   
    treeview = gtk_tree_view_new();
    gtk_container_add( GTK_CONTAINER( okno ), treeview );
    g_signal_connect( treeview, "row-activated", G_CALLBACK( wybrano_wiersz ), NULL );
   
    for( i = 0; i < 3; i++ )
    {
        kolumna = gtk_tree_view_column_new();
        komorka = gtk_cell_renderer_text_new();
        gtk_tree_view_column_set_title( kolumna, nazwy_kolumn[ i ] );
        gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
        gtk_tree_view_column_add_attribute( kolumna, komorka, "text", i );
        gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
    }
   
    kolumna = gtk_tree_view_column_new();
    komorka = gtk_cell_renderer_toggle_new();
   
    gtk_tree_view_column_set_title( kolumna, nazwy_kolumn[ i ] );
    gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
    gtk_tree_view_column_add_attribute( kolumna, komorka, "active", KOLUMNA_AKTYWNY );
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    lista = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN );
   
    for( i = 0; i < G_N_ELEMENTS( osoby ); i++ )
    {
        gtk_list_store_append( lista, & iter );
        gtk_list_store_set( lista, & iter, KOLUMNA_LP, i + 1, KOLUMNA_IMIE, osoby[ i ].imie, KOLUMNA_NAZWISKO, osoby[ i ].nazwisko,
        KOLUMNA_AKTYWNY, osoby[ i ].czy_aktywny, - 1 );
    }
   
    g_signal_connect( komorka, "toggled", G_CALLBACK( zmieniono ), lista );
   
    gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), GTK_TREE_MODEL( lista ) );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}
Ujrzysz to:

Dodatkowo po kliknięciu na wiersz widoku drzewa pojaw sie okno dialogo z informacjami:

Przykład pokazujący możliwość wyświetlania wielu komórek w kolumnie, w tym użycie grafiki. GtkCellRendererToggle - toggle button obsługa

Poniżej bardziej skomplikowany przykład, m.in. kolumna Kraj z dwoma komórkami,  w tym użycie grafiki, wyświetlanie na podstawie właściwości zawartych w modelu oraz modyfikowalna kolumna VIP z opcjami wyboru, których wybranie ma wpływ na sposób wyświetlania.
Ponieważ użyłem grafiki, która symbolizuje flagi państw kod został podzielony na dwie części flahi.h - definicje flag oraz właściwy program. Definicję flag zostały ztworzone programem gdk-pixbuf-csource, który jest na wyposażeniu biblioteki Gtk+. Przykładowe użycie z konwesją grafiki "obraz.png" na plik "obrazinline.h". Dane definiujące grafikę bedą dostępne pod nazwą zmiennej "mojobraz_inline":
$gdk-pixbuf-csource --raw --name=mojobraz_inline obraz.png > obrazinline.h

Zawartość flagi.h:
C/C++
/* GdkPixbuf RGB C-Source image dump */

#ifdef __SUNPRO_C
#pragma align 4 (flaga_polski)
#endif
#ifdef __GNUC__
static const guint8 flaga_polski[] __attribute__(( __aligned__( 4 ) ) ) =
#else
static const guint8 flaga_polski[] =
#endif
{ ""
    /* Pixbuf magic (0x47646b50) */
    "GdkP"
    /* length: header (24) + pixel_data (4712) */
    "\0\0\22\200"
    /* pixdata_type (0x1010001) */
    "\1\1\0\1"
    /* rowstride (152) */
    "\0\0\0\230"
    /* width (50) */
    "\0\0\0" "2"
    /* height (31) */
    "\0\0\0\37"
    /* pixel_data: */
    "vvv\260\260\260\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255"
    "\255\255\255\255\255\261\261\261\230\230\230\0\0\260\260\260\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\342\342\342\0\0\255\255\255\377\377\377\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\377\377\377\336\336\336\0\0\255\255\255\377\377\377\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\377"
    "\377\377\336\336\336\0\0\255\255\255\377\377\377\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\377\377\377"
    "\336\336\336\0\0\255\255\255\377\377\377\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\377\377\377\336\336"
    "\336\0\0\255\255\255\377\377\377\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\377\377\377\336\336\336\0\0"
    "\255\255\255\377\377\377\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\377\377\377\336\336\336\0\0\255\255"
    "\255\377\377\377\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\377\377\377\336\336\336\0\0\255\255\255\377"
    "\377\377\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\377\377\377\336\336\336\0\0\255\255\255\377\377\377"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\377\377\377\336\336\336\0\0\255\255\255\377\377\377\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\377\377\377\336\336\336\0\0\255\255\255\377\377\377\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\377\377"
    "\377\336\336\336\0\0\255\255\255\377\377\377\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
    "\376\376\376\376\376\376\376\376\376\376\376\376\376\377\377\377\336"
    "\336\336\0\0\257\264\264\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\340\350\347"
    "\0\0\246\216\220\365\321\324\364\320\323\364\320\323\364\320\323\364"
    "\320\323\364\320\323\364\320\323\364\320\323\364\320\323\364\320\323"
    "\364\320\323\364\320\323\364\320\323\364\320\323\364\320\323\364\320"
    "\323\364\320\323\364\320\323\364\320\323\364\320\323\364\320\323\364"
    "\320\323\364\320\323\364\320\323\364\320\323\364\320\323\364\320\323"
    "\364\320\323\364\320\323\364\320\323\364\320\323]
    #include rodzic, NULL);
    gtk_tree_store_set( magazyn_drzewa, mojobraz_inline
    64\320\323\364\320 "
    "\323\364\320\323\364\320\323\364\320\323\364\320\323\364\320\323\364"
    "\320\323\364\320\323\364\320\323\3
    64\320\323\364\320\323\364\320\323 "
    "\364\320\323\364\320\323\364\320\323\366\321\324\325\266\270\0\0\221"
    "-5\330DN\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM"
    "\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324"
    "CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM"
    "\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324CM\324"
    "CM\324CM\331EO\271:C\0\0\22229\332KU\326JT\326JT\326JT\326JT\326JT\326"
    "JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT"
    "\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326"
    "JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT\326JT"
    "\326JT\326JT\326JT\326JT\326JT\326JT\333LV\273@I\0\0\2223:\332LV\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\333"
    "MW\273AJ\0\0\2223:\332LV\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\333MW\273AJ\0\0\2223:\332LV\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\333MW\273AJ\0"
    "\0\2223:\332LV\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\333MW\273AJ\0\0\2223:\332LV\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\333MW\273AJ\0\0\2223:\332"
    "LV\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\333MW\273AJ\0\0\2223:\332LV\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\333MW\273AJ\0\0\2223:\332LV\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\333MW\273"
    "AJ\0\0\2223:\332LV\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\333MW\273AJ\0\0\2223:\332LV\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\333MW\273AJ\0\0\222"
    "3:\332LV\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU"
    "\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326"
    "KU\326KU\333MW\273AJ\0\0\2264;\337NX\333MW\333MW\333MW\333MW\333MW\333"
    "MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW"
    "\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333"
    "MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW\333MW"
    "\333MW\333MW\333MW\333MW\333MW\333MW\340OY\300CL\0\0\200-2\276BK\273"
    "AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ"
    "\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273"
    "AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ"
    "\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\273AJ\277"
    "CL\2439@\0\0" };


/* GdkPixbuf RGB C-Source image dump */

#ifdef __SUNPRO_C
#pragma align 4 (flaga_czech)
#endif
#ifdef __GNUC__
static const guint8 flaga_czech[] __attribute__(( __aligned__( 4 ) ) ) =
#else
static const guint8 flaga_czech[] =
#endif
{ ""
    /* Pixbuf magic (0x47646b50) */
    "GdkP"
    /* length: header (24) + pixel_data (4712) */
    "\0\0\22\200"
    /* pixdata_type (0x1010001) */
    "\1\1\0\1"
    /* rowstride (152) */
    "\0\0\0\230"
    /* width (50) */
    "\0\0\0" "2"
    /* height (31) */
    "\0\0\0\37"
    /* pixel_data: */
    "\"4N\256\256\256\277\273\266\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\277\273\266\230\230\230\0\0\34" "8_Nv\260\264"
    "\305\336\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\332\341\356\0\0!Bo&U\231&U\231c\205\265\332\341\356"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\337\337\337\0\0"
    "\34" "8_-c\250/[\234&U\231Aj\245\233\246\305\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\337\337\337\0\0#Al-c\250/[\234-c\250&U\231&U\231Nv\260\312"
    "\326\346\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\337\337\337\0\0#Al4`\237/[\2344`\2374`\2374"
    "`\237&U\231/[\234\207\241\306\355\361\367\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\337\337\337\0\0\34" "8_-c\250/[\2344"
    "`\237/[\234/[\2344`\237&U\231&U\231Ms\253\244\267\324\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\337\337\337\0\0#Al-c\250/[\2344`\237"
    "/[\2344`\2374`\2374`\237/[\234&U\231/[\234v\224\276\332\341\356\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\337\337\337\0\0\34" "8_4`\2374`\237/[\2344`\237/[\234"
    "/[\2344`\237/[\2344`\237/[\234&U\231-c\250\233\246\305\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\337"
    "\337\337\0\0#Al-c\250/[\2344`\237/[\2344`\2374`\237/[\2344`\237/[\234"
    "/[\2344`\237/[\234&U\231`\202\264\316\331\350\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\337\337\337\0\0#Al/[\2344`\237/[\234"
    "4`\237/[\234/[\2344`\237/[\2344`\237/[\2344`\237/[\234/[\234&U\231&U"
    "\231\207\241\306\355\361\367\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\337\337"
    "\337\0\0#Al-c\250/[\2344`\237/[\2344`\2374`\237/[\2344`\237/[\2344`\237"
    "/[\2344`\2374`\237/[\234/[\234&U\231Ms\253\267\306\335\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\337\337\337\0\0#Al/[\2344`\237/[\2344`\237/[\234/[\2344`\237/[\234"
    "4`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\234&U\231&U\231c\205\265"
    "\336\346\360\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\337\337\337\0\0\34" "8_-c\250/[\2344`\237/[\2344`\2374`\237/"
    "[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\2374`\237/[\234"
    "&U\231Aj\245\244\267\324\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\337\337\337\0\0!BoE\\\2264`\237/[\2344`\237/[\234/[\2344`\237"
    "/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\234/[\2344`\2374`"
    "\237&U\231&U\231Ou\254\312\326\346\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\336\346"
    "\360\0\0#Al-c\250/[\2344`\237/[\2344`\2374`\237/[\2344`\237/[\2344`\237"
    "/[\2344`\237/[\2344`\237/[\2344`\2374`\237/[\234/[\2344`\237/[\234&U"
    "\231'_\243\233\246\305\372\325\327\372\325\327\372\325\327\372\325\327"
    "\372\325\327\372\325\327\372\325\327\372\325\327\372\325\327\372\325"
    "\327\372\325\327\372\325\327\372\325\327\372\325\327\372\325\327\372"
    "\325\327\372\325\327\372\325\327\372\325\327\372\325\327\372\325\327"
    "\372\325\327\372\326\327\372\326\327\332\273\274\0\0#Al/[\2344`\237/"
    "[\2344`\237/[\234/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\234"
    "4`\237/[\234/[\2344`\2374`\237/[\2344`\237'_\242gU\203\323KX\325>@\361"
    "HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\325>@"
    "\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\314"
    ">B\0\0#Al-c\250/[\2344`\237/[\2344`\2374`\237/[\2344`\237/[\2344`\237"
    "/[\2344`\237/[\2344`\237/[\2344`\2374`\237/[\234/[\234'_\243E\\\226\245"
    "Ql\361HJ\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ"
    "\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361HJ\361HJ\325>@\361"
    "HJ\361HJ\361HJ\361HJ\314>B\0\0\34" "8_4`\237/[\2344`\237/[\2344`\237/"
    "[\234/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\234"
    "'_\2434`\237zV~\340JR\364HI\357IN\325>@\357IN\357IN\340JR\357IN\357I"
    "N\340JR\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357"
    "IN\340JR\357IN\357IN\357IN\325>@\340JR\357IN\314>B\0\0#Al-c\250/[\234"
    "4`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/["
    "\2344`\237'_\242'_\242WZ\216\267Od\361HJ\361HJ\361HJ\357IN\357IN\357"
    "IN\340JR\361HJ\340JR\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357IN"
    "\340JR\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357IN\357IN\357IN\357"
    "IN\314>B\0\0#Al4`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237"
    "/[\2344`\237/[\2344`\237/[\2344`\237/[\234\214Sw\361HJ\361HJ\361HJ\361"
    "HJ\340JR\357IN\340JR\340JR\361HJ\340JR\357IN\357IN\325>@\357IN\357IN"
    "\325>@\357IN\357IN\325>@\357IN\357IN\325>@\357IN\357IN\325>@\361HJ\340"
    "JR\340JR\357IN\340JR\357IN\314@D\0\0\34" "8_-c\250/[\2344`\237/[\2344"
    "`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\234'_\242&U\231hX\206\323"
    "KX\364HI\361HJ\325>@\357IN\340JR\361HJ\340JR\361HJ\361HJ\340JR\361HJ"
    "\340JR\357IN\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357IN\340JR\357"
    "IN\357IN\340JR\357IN\357IN\357IN\325>@\357IN\357IN\357IN\314@D\0\0\34"
    "8_Aj\245/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237/[\2344`\237"
    "'_\243E\\\226\245Ql\361HJ\361HJ\357IN\357IN\357IN\340JR\361HJ\340JR\361"
    "HJ\340JR\357IN\325>@\361HJ\340JR\361HJ\340JR\357IN\340JR\357IN\340JR"
    "\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357IN\340JR\357IN\357IN\357"
    "IN\340JR\357IN\314@D\0\0!Bo3`\241/[\234/[\2344`\237/[\2344`\237/[\234"
    "4`\237/[\234'_\2434`\237zV~\340JR\361HJ\361HJ\340JR\361HJ\340JR\357I"
    "N\357IN\340JR\361HJ\340JR\361HJ\340JR\357IN\357IN\340JR\361HJ\340JR\361"
    "HJ\325>@\357IN\357IN\340JR\361HJ\340JR\361HJ\340JR\361HJ\340JR\361HJ"
    "\340JR\357IN\340JR\357IN\361HJ\357IN\314@D\0\0\34" "8_-c\250/[\2344`\237"
    "/[\2344`\237/[\2344`\237/[\234'_\243WZ\216\267Qh\361HJ\361HJ\361HJ\340"
    "JR\361HJ\340JR\357IN\325>@\340JR\361HJ\340JR\361HJ\340JR\357IN\340JR"
    "\361HJ\340JR\361HJ\340JR\357IN\357IN\357IN\357IN\325>@\361HJ\340JR\361"
    "HJ\340JR\361HJ\340JR\357IN\325>@\357IN\357IN\325>@\340JR\357IN\314@D"
    "\0\0#Al-c\250/[\2344`\237/[\2344`\237/[\234'_\243/[\234\217Su\357IN\361"
    "HJ\361HJ\325>@\357IN\357IN\340JR\361HJ\357IN\357IN\357IN\340JR\361HJ"
    "\325>@\357IN\357IN\325>@\357IN\357IN\340JR\361HJ\340JR\340JR\357IN\340"
    "JR\357IN\357IN\340JR\361HJ\325>@\357IN\357IN\357IN\357IN\340JR\357IN"
    "\357IN\357IN\357IN\314@D\0\0#AlE\\\226/[\2344`\237/[\2344`\237'_\243"
    "hX\206\310M\\\361HJ\357IN\325>@\357IN\357IN\340JR\365MR\325>@\361HJ\340"
    "JR\340JR\361HJ\340JR\357IN\357IN\340JR\357IN\357IN\357IN\340JR\361HJ"
    "\340JR\361HJ\361HJ\340JR\357IN\340JR\361HJ\340JR\357IN\357IN\340JR\361"
    "HJ\340JR\340JR\357IN\357IN\340JR\357IN\357IN\314@D\0\0#Al-c\250/[\234"
    "4`\237'_\243E\\\226\245Ql\361HJ\361HJ\357IN\357IN\365MR\340JR\357IN\340"
    "JR\361HJ\357IN\340JR\361HJ\357IN\340JR\361HJ\340JR\357IN\357IN\340JR"
    "\357IN\340JR\361HJ\325>@\357IN\340JR\361HJ\340JR\361HJ\340JR\361HJ\340"
    "JR\361HJ\340JR\357IN\340JR\361HJ\361HJ\340JR\325>@\357IN\357IN\357IN"
    "\314@D\0\0#Al/[\234-c\250&U\231wV\200\340JR\361HJ\361HJ\357IN\365MR\325"
    ">@\340JR\361HJ\340JR\361HJ\340JR\357IN\340JR\361HJ\340JR\357IN\325>@"
    "\357IN\357IN\325>@\361HJ\340JR\361HJ\340JR\357IN\357IN\361HJ\340JR\357"
    "IN\357IN\325>@\361HJ\340JR\361HJ\340JR\361HJ\340JR\361HJ\340JR\357IN"
    "\357IN\357IN\340JR\357IN\314@D\0\0#Al'_\243V]\223\267Qh\365MR\361HJ\357"
    "IN\357IN\357IN\357IN\365MR\365MR\357IN\357IN\357IN\357IN\357IN\357IN"
    "\357IN\357IN\357IN\365MR\357IN\357IN\365MR\357IN\357IN\357IN\357IN\357"
    "IN\357IN\357IN\357IN\357IN\357IN\365MR\357IN\357IN\357IN\357IN\357IN"
    "\357IN\357IN\357IN\357IN\365MR\357IN\357IN\365MR\314@D\0\0\34" "8_qKn"
    "\314@D\325>@\314@D\314@D\314@D\314@D\303AH\314@D\314@D\303AH\314@D\314"
    "@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D"
    "\314@D\314@D\314@D\314@D\314@D\303AH\314@D\303AH\314@D\314@D\314@D\314"
    "@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D\314@D\303AH\314@D\314@D"
    "\314@D\2628;\0\0" };


/* GdkPixbuf RGB C-Source image dump */

#ifdef __SUNPRO_C
#pragma align 4 (flaga_rosji)
#endif
#ifdef __GNUC__
static const guint8 flaga_rosji[] __attribute__(( __aligned__( 4 ) ) ) =
#else
static const guint8 flaga_rosji[] =
#endif
{ ""
    /* Pixbuf magic (0x47646b50) */
    "GdkP"
    /* length: header (24) + pixel_data (4712) */
    "\0\0\22\200"
    /* pixdata_type (0x1010001) */
    "\1\1\0\1"
    /* rowstride (152) */
    "\0\0\0\230"
    /* width (50) */
    "\0\0\0" "2"
    /* height (31) */
    "\0\0\0\37"
    /* pixel_data: */
    "www\260\260\260\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256"
    "\256\256\256\256\256\270\263\261\230\230\230\0\0\270\263\261\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\343\343\343\0\0\256\256\256\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\337\337\337\0\0\256\256\256\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\337\337\337\0\0\256\256\256\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\337\337\337\0\0\256\256\256\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\337\337"
    "\337\0\0\256\256\256\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\337\337\337\0\0"
    "\256\256\256\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\337\337\337\0\0\256\256"
    "\256\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\337\337\337\0\0\270\263\261\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
    "\377\377\377\377\377\377\377\354\345\342\0\0c\211\232\223\313\346\223"
    "\313\346\221\310\342\223\313\346\221\310\342\223\313\346\221\310\342"
    "\223\313\346\221\310\342\223\313\346\221\310\342\223\313\346\221\310"
    "\342\223\313\346\221\310\342\223\313\346\221\310\342\223\313\346\221"
    "\310\342\223\313\346\221\310\342\223\313\346\221\310\342\223\313\346"
    "\221\310\342\223\313\346\221\310\342\223\313\346\221\310\342\223\313"
    "\346\221\310\342\223\313\346\221\310\342\223\313\346\221\310\342\223"
    "\313\346\221\310\342\223\313\346\221\310\342\223\313\346\221\310\342"
    "\223\313\346\221\310\342\223\313\346\221\310\342\223\313\346\223\313"
    "\346\223\313\346~\257\305\0\0\0S~\0{\273\0{\273\0{\273\0r\247\0{\273"
    "\0{\273\0{\273\0{\273\0r\247\0{\273\0{\273\0{\273\0r\247\0{\273\0{\273"
    "\0{\273\0r\247\0{\273\0{\273\0{\273\0r\247\0{\273\0{\273\0{\273\0r\247"
    "\0{\273\0{\273\0{\273\0r\247\0{\273\0{\273\0{\273\0r\247\0{\273\0{\273"
    "\0{\273\0r\247\0{\273\0{\273\0{\273\0r\247\0{\273\0{\273\0{\273\0r\247"
    "\0{\273\0{\273\0{\273\0j\240\0\0\0S~\0{\273\0{\273\0{\273\0{\273\0{\273"
    "\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273"
    "\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273"
    "\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273"
    "\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273\0{\273"
    "\0{\273\0{\273\0\202\276\0j\240\0\0\0S~\0\202\276\0\202\276\0\202\276"
    "\0{\273\0\202\276\0{\273\0\202\276\0{\273\0\202\276\0\202\276\0{\273"
    "\0\202\276\0\202\276\0{\273\0\202\276\0\202\276\0\202\276\0{\273\0\202"
    "\276\0\202\276\0\202\276\0{\273\0\202\276\0\202\276\0\202\276\0{\273"
    "\0\202\276\0\202\276\0\202\276\0{\273\0\202\276\0\202\276\0\202\276\0"
    "{\273\0\202\276\0\202\276\0\202\276\0{\273\0\202\276\0\202\276\0\202"
    "\276\0{\273\0\202\276\0\202\276\0\202\276\0{\273\0\202\276\0\202\276"
    "\0r\247\0\0\0S~\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\200"
    "\273\0\200\273\0\202\276\0{\273\0\202\276\0\202\276\0r\247\0\202\276"
    "\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0r\247\0\202"
    "\276\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0r\247"
    "\0\202\276\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0"
    "r\247\0\202\276\0\200\273\0\202\276\0{\273\0\202\276\0\202\276\0r\247"
    "\0\202\276\0{\273\0\202\276\0\202\276\0\202\276\0j\240\0\0\0S~\0\202"
    "\276\0\202\276\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0r\247"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0r\247\0\202\276\0"
    "\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0r\247\0\202"
    "\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0r\247"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0r\247\0\202\276\0\202\276\0\200\273\0\202\276\0\202\276\0\202\276\0"
    "\200\273\0\202\276\0{\273\0\202\276\0r\247\0\0\0S~\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0"
    "\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0\202\276\0\202"
    "\276\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0"
    "\202\276\0\202\276\0r\247\0\200\273\0\200\273\0\202\276\0\202\276\0r"
    "\247\0\202\276\0\202\276\0r\247\0\0\0S~\0\202\276\0\202\276\0{\273\0"
    "\202\276\0\200\273\0\200\273\0\200\273\0\202\276\0\200\273\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0"
    "\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0r\247\0\202\276\0\202"
    "\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0r\247\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\200\273\0\202\276\0\200\273"
    "\0\202\276\0\202\276\0\202\276\0\200\273\0r\247\0\202\276\0\202\276\0"
    "\202\276\0\202\276\0p\243\0\0\0S~\0\202\276\0\200\273\0\200\273\0\202"
    "\276\0\202\276\0r\247\0\202\276\0\202\276\0r\247\0\200\273\0\202\276"
    "\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0\202\276\0r\247\0\202"
    "\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0\202\276\0r\247"
    "\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0\202\276\0\202\276\0"
    "\202\276\0r\247\0\202\276\0\202\276\0r\247\0\202\276\0\202\276\0r\247"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0r\247\0\0\0Z\203\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276\0\202\276"
    "\0\202\276\0r\247\0\0\27Qt\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251"
    "\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251"
    "\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251"
    "\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251"
    "\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251\"v\251"
    "\"v\251\"v\251\35h\223\0\0\225-1\336CI\336CI\336CI\336CI\336CI\336CI"
    "\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336"
    "CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI"
    "\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\336"
    "CI\336CI\336CI\336CI\336CI\336CI\336CI\336CI\262/1\0\0\244))\364=>\360"
    "<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<="
    "\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360"
    "<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<="
    "\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\360<=\366"
    "BD\32155\0\0\240*+\360<=\360<=\360<=\32155\360<=\360<=\32189\\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326KU\326
    HJ\325\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377 =\3 60360 <=\3 60 "
    "<=\32189\360<=\360<=\32189\360<=\360<=\32189\360<=\360<=\32189\360<="
    "\360<=\32189\360<=\360<=\32155\360<=\360<=\32155\360<=\360<=\32\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\256\202\276\0\202\276\0p\243\0\0\0S~\0\202\276\0\200\273\0\200\273\0\202155\360"
    "<=\360<=\32155\360<=\360<=\32189\360<=\360<=\32189\360<=\360<=\32155"
    "\360<=\360<=\360<=\360<=\360<=\32155\0\0\240*+\360@B\32189\360<=\360"
    "@B\360<=\360@B\360<=\360@B\360<=\360@B\360<=\360<=\360@B\360<=\360@B"
    "\360<=\360@B\360<=\360@B\360<=\360<=\360@B\360<=\360@B\360@B\360<=\360"
    "@B\360@B\360@B\360<=\360@B\360@B\360<=\360@B\360@B\360<=\360@B\360<="
    "\360@B\360<=\360@B\360<=\360@B\360@B\32189\360<=\336CI\360@B\32155\0"
    "\0\240*+\360@B\360@B\360@B\32189\360@B\32189\360@B\32189\360@B\360@B"
    "\32189\360@B\336CI\360<=\32189\360@B\32189\360@B\360@B\32189\360@B\336"
    "CI\360<=\32189\360@B\336CI\360<=\32189\360@B\32189\360@B\32189\360@B"
    "\360<=\32189\360@B\32189\360@B\32189\360@B\360<=\336CI\360<=\360<=\360"
    "@B\360<=\360<=\360@B\32155\0\0\240*+\360@B\360<=\360@B\360@B\360@B\360"
    "@B\360@B\366BD\32189\360@B\360@B\360<=\360<=\360<=\360@B\360@B\366BD"
    "\32189\360@B\360@B\360<=\360<=\360<=\360@B\360<=\360<=\360<=\360@B\360"
    "@B\360@B\360@B\360<=\336CI\360@B\360@B\360@B\360@B\360@B\360<=\336CI"
    "\360<=\360@B\32189\360<=\336CI\360<=\332BH\360@B\32155\0\0\240*+\360"
    "<=\336CI\360<=\32189\360@B\360<=\360@B\360<=\360@B\360@B\32189\360@B"
    "\336CI\360<=\32189\360@B\360@B\360@B\360<=\336CI\360<=\336CI\360<=\321"
    "89\360@B\336CI\360<=\32189\360@B\360<=\360<=\360@B\360<=\32189\360@B"
    "\360<=\336CI\360<=\360<=\360<=\32189\360@B\360@B\360<=\360<=\32155\360"
    "@B\360@B\32155\0\0\240*+\360<=\360<=\360<=\360@B\360@B\360@B\32189\360"
    "<=\336CI\360<=\360@B\360<=\360<=\360<=\360@B\360@B\360<=\360@B\32189"
    "\360<=\360<=\32189\360@B\360@B\360<=\360<=\360<=\360@B\360@B\360@B\321"
    "55\336CI\360<=\360@B\360@B\32189\360<=\360@B\32189\360@B\360@B\360<="
    "\360<=\336CI\360@B\360@B\360<=\360@B\32155\0\0\244))\360@B\360@B\360"
    "@B\360@B\360@B\360@B\360@B\360@B\360<=\360@B\360@B\360@B\360@B\360@B"
    "\360@B\360@B\360@B\360@B\360@B\360@B\360@B\360@B\360@B\360@B\360@B\360"
    "@B\360@B\360@B\360@B\360@B\360@B\366BD\360<=\360@B\360@B\366BD\360@B"
    "\360@B\360@B\360@B\360@B\360@B\360@B\360<=\360@B\360@B\360@B\360@B\321"
    "55\0\0\214%&\32155\262/1\32155\32155\262/1\32155\32155\32155\32155\262"
    "/1\32155\32155\262/1\32155\262/1\32155\262/1\32155\32155\32155\32155"
    "\32155\32155\32155\32155\262/1\32155\32155\262/1\32155\32155\32155\321"
    "55\32155\32155\32155\32155\32155\32155\32155\32155\32155\32155\32155"
    "\262/1\32155\32155\32155\262/1\0\0" };


/* GdkPixbuf RGB C-Source image dump */

#ifdef __SUNPRO_C
#pragma align 4 (flaga_niemiec)
#endif
#ifdef __GNUC__
static const guint8 flaga_niemiec[] __attribute__(( __aligned__( 4 ) ) ) =
#else
static const guint8 flaga_niemiec[] =
#endif
{ ""
    /* Pixbuf magic (0x47646b50) */
    "GdkP"
    /* length: header (24) + pixel_data (4712) */
    "\0\0\22\200"
    /* pixdata_type (0x1010001) */
    "\1\1\0\1"
    /* rowstride (152) */
    "\0\0\0\230"
    /* width (50) */
    "\0\0\0" "2"
    /* height (31) */
    "\0\0\0\37"
    /* pixel_data: */
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0E\22\23e\33\33e\33\33"
    "e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33"
    "e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33"
    "e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33"
    "e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33"
    "e\33\33e\33\33e\33\33e\33\33e\33\33e\33\33X\27\30\0\0\240'+\375CE\375"
    "CE\375CE\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD"
    "\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372"
    "BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD"
    "\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\372BD\375"
    "CE\3279;\0\0\240'+\353>@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\351"
    "9@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@"
    "\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\351"
    "9@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@"
    "\3519@\3519@\3519@\3519@\360@B\31428\0\0\240'+\360@B\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\31428\0"
    "\0\240'+\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353"
    ">@\353>@\353>@\360@B\31428\0\0\240'+\353>@\353>@\353>@\353>@\3279;\353"
    ">@\353>@\353>@\3279;\353>@\353>@\353>@\3279;\353>@\353>@\353>@\3279;"
    "\353>@\353>@\353>@\3279;\353>@\353>@\353>@\3279;\353>@\353>@\353>@\327"
    "9;\353>@\353>@\353>@\3279;\353>@\353>@\353>@\3279;\353>@\353>@\353>@"
    "\3279;\353>@\353>@\353>@\353>@\353>@\353>@\353>@\31428\0\0\240'+\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\3279;\353>@\353>@\353"
    ">@\360@B\31428\0\0\240'+\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@"
    "\353>@\353>@\353>@\353>@\353>@\353>@\31428\0\0\240'+\353>@\353>@\353"
    ">@\353>@\353>@\353>@\353>@\353>@\353>@\3279;\353>@\353>@\353>@\3279;"
    "\353>@\353>@\353>@\3279;\353>@\353>@\353>@\3279;\353>@\353>@\353>@\327"
    "9;\353>@\353>@\353>@\3279;\353>@\353>@\353>@\3279;\353>@\353>@\353>@"
    "\353>@\3279;\353>@\353>@\353>@\353>@\353>@\353>@\353>@\353>@\360@B\314"
    "28\0\0\240'+\3519@\3519@\3519@\3279;\3519@\3519@\3279;\3519@\3519@\351"
    "9@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@"
    "\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\351"
    "9@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@\3519@"
    "\3519@\3519@\3519@\3519@\31428\0\0\2416+\354O@\354O@\354O@\354O@\354"
    "O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@"
    "\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354"
    "O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@"
    "\354O@\354O@\354O@\354O@\354O@\354O@\354O@\354O@\362QB\315E8\0\0\250"
    "u+\373\271A\372\256A\372\256A\372\256A\372\256A\372\256A\372\256A\372"
    "\256A\372\256A\366\253@\372\256A\366\253@\366\253@\372\256A\366\253@"
    "\366\253@\372\256A\366\253@\372\256A\366\253@\366\253@\372\256A\366\253"
    "@\366\253@\372\256A\366\253@\372\256A\366\253@\366\253@\372\256A\366"
    "\253@\366\253@\372\256A\366\253@\366\253@\366\253@\366\253@\366\253@"
    "\372\256A\366\253@\366\253@\366\253@\366\253@\366\253@\366\253@\366\253"
    "@\366\253@\373\271A\330\2348\0\0\250u+\373\271A\367\266@\367\266@\367"
    "\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@"
    "\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266"
    "@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367"
    "\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@"
    "\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266"
    "@\367\266@\367\266@\367\266@\367\266@\373\271A\377\273D\330\2348\0\0"
    "\250u+\373\271A\372\256A\367\266@\366\253@\367\266@\366\253@\367\266"
    "@\366\253@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367"
    "\266@\367\266@\367\266@\366\253@\367\266@\367\266@\367\266@\367\266@"
    "\367\266@\367\266@\367\266@\366\253@\367\266@\367\266@\367\266@\367\266"
    "@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367"
    "\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@\367\266@"
    "\366\253@\367\266@\373\271A\330\2348\0\0\250u+\373\271A\366\253@\367"
    "\266@\367\266@\366\253@\367\266@\367\266@\367\266@\367\266@\367\266@"
    "\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\366\253@\367\266"
    "@\367\266@\366\253@\367\266@\366\253@\367\266@\366\253@\367\266@\367"
    "\266@\366\253@\367\266@\366\253@\367\266@\366\253@\367\266@\366\253@"
    "\367\266@\366\253@\367\266@\366\253@\367\266@\366\253@\367\266@\366\253"
    "@\367\266@\366\253@\367\266@\366\253@\367\266@\372\256A\373\271A\330"
    "\2348\0\0\250u+\373\271A\373\271A\366\253@\367\266@\367\266@\366\253"
    "@\367\266@\366\253@\367\266@\366\253@\367\266@\367\266@\367\266@\366"
    "\253@\367\266@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@"
    "\367\266@\367\266@\366\253@\367\266@\367\266@\367\266@\367\266@\366\253"
    "@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367"
    "\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@"
    "\367\266@\367\266@\366\253@\373\271A\330\2348\0\0\250u+\373\271A\367"
    "\266@\367\266@\367\266@\366\253@\367\266@\367\266@\367\266@\366\253@"
    "\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\366\253"
    "@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367"
    "\266@\366\253@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@"
    "\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253"
    "@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\373\271A\373"
    "\271A\330\2348\0\0\250u+\373\271A\366\253@\367\266@\366\253@\367\266"
    "@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366"
    "\253@\367\266@\367\266@\367\266@\367\266@\366\253@\367\266@\367\266@"
    "\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266"
    "@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366"
    "\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@"
    "\367\266@\366\253@\367\266@\366\253@\373\271A\330\2348\0\0\250u+\373"
    "\271A\367\266@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@"
    "\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\366\253"
    "@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367"
    "\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@"
    "\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266"
    "@\366\253@\367\266@\367\266@\366\253@\367\266@\367\266@\366\253@\373"
    "\271A\373\271A\330\2348\0\0\250u+\373\271A\373\271A\373\271A\373\271"
    "A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373"
    "\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A"
    "\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271"
    "A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373"
    "\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A"
    "\373\271A\373\271A\373\271A\373\271A\373\271A\373\271A\330\2348\0\0\223"
    "j&\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330"
    "\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348"
    "\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\234"
    "8\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330"
    "\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348"
    "\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\2348\330\234"
    "8\330\2348\330\2348\274\2101\0\0" };

Właściwy program:
C/C++
#include <gtk/gtk.h>
#include "flagi.h"

enum {
    KOLUMNA_LP = 0,
    KOLUMNA_KRAJ,
    KOLUMNA_REPREZENTANT,
    KOLUMNA_VIP,
    KOLUMNA_KOLOR,
    KOLUMNA_PRZEKRESLONY,
    KOLUMNA_FLAGA,
    ILOSC_KOLUMN
};

struct _data {
    gchar * kraj;
    gchar * reprezentant;
    gchar * vip;
    gchar * kolor;
    gboolean przekreslony;
    guint kod;
};

struct _data osoby[] = {
    { "Polska", "Kowalski Jan", "TAK", "red", FALSE, 0 },
    { "Rosja", "Petrowski Dimitr", "NIE", "black", FALSE, 2 },
    { "Niemcy", "Klos Hans", "NIE", "black", FALSE, 3 },
    { "Polska", "Nowak Mirosław", "NIEZNANY", "gray", TRUE, 0 },
    { "Czechy", "Klaus Peter", "TAK", "red", FALSE, 1 },
    { "Rosja", "Istwanowicz Igor", "NIE", "black", FALSE, 2 }, };

const gchar * nazwy_kolumn[] = {
    "Lp",
    "Kraj",
    "Reprezentant",
    "VIP"
};

const guint8 * flagi[] = {
    flaga_polski,
    flaga_czech,
    flaga_rosji,
    flaga_niemiec
};

GtkWidget * treeview;

void zmieniono( GtkCellRendererCombo * combo, gchar * path_string, GtkTreeIter * new_iter, gpointer user_data )
{
    GtkTreeModel * model =( GtkTreeModel * ) user_data;
    GtkTreeIter iter;
    GtkTreePath * sciezka;
    gchar * i;
    GtkListStore * lista;
    gint nr;
   
    lista = GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview ) ) );
   
    sciezka = gtk_tree_path_new_from_string( path_string );
    gtk_tree_model_get_iter( GTK_TREE_MODEL( lista ), & iter, sciezka );
    gtk_tree_path_free( sciezka );
   
    i = gtk_tree_model_get_string_from_iter( model, new_iter );
    g_print( "%s %s\n", path_string, i );
    nr = g_ascii_strtoll( i, NULL, 0 );
    g_free( i );
   
    switch( nr )
    {
    case 0:
        gtk_list_store_set( lista, & iter, KOLUMNA_VIP, "TAK", KOLUMNA_KOLOR, "red", KOLUMNA_PRZEKRESLONY, FALSE, - 1 );
        break;
    case 1:
        gtk_list_store_set( lista, & iter, KOLUMNA_VIP, "NIE", KOLUMNA_KOLOR, "black", KOLUMNA_PRZEKRESLONY, FALSE, - 1 );
        break;
    case 2:
        gtk_list_store_set( lista, & iter, KOLUMNA_VIP, "NIEZNANY", KOLUMNA_KOLOR, "grey", KOLUMNA_PRZEKRESLONY, TRUE, - 1 );
        break;
    }
}


int main( int argc, char * argv[] )
{
   
    GtkWidget * okno;
    GtkTreeViewColumn * kolumna;
    GtkCellRenderer * komorka;
    GtkListStore * lista;
    GtkTreeIter iter, iter2;
    guint i;
    GtkTreeModel * model;
    GdkPixbuf * pixbuf;
    GtkWidget * obraz;
   
   
    gtk_init( & argc, & argv );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "TreeView5" );
    g_signal_connect( okno, "destroy", G_CALLBACK( gtk_main_quit ), NULL );
   
    treeview = gtk_tree_view_new();
    gtk_container_add( GTK_CONTAINER( okno ), treeview );
   
   
    for( i = 0; i < 3; i++ )
    {
        komorka = gtk_cell_renderer_text_new();
        if( i == KOLUMNA_KRAJ )
        {
            kolumna = gtk_tree_view_column_new();
            gtk_tree_view_column_set_title( kolumna, nazwy_kolumn[ i ] );
            gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
            gtk_tree_view_column_add_attribute( kolumna, komorka, "text", i );
           
            komorka = gtk_cell_renderer_pixbuf_new();
            gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
            gtk_tree_view_column_add_attribute( kolumna, komorka, "pixbuf", KOLUMNA_FLAGA );
            gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
            continue;
        }
        kolumna = gtk_tree_view_column_new_with_attributes( nazwy_kolumn[ i ], komorka, "text", i, NULL );
        if( i == KOLUMNA_REPREZENTANT )
        gtk_tree_view_column_set_attributes( kolumna, komorka, "text", i, "foreground", KOLUMNA_KOLOR,
             "strikethrough", KOLUMNA_PRZEKRESLONY, NULL );
       
        gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
    }
   
   
    lista = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF );
   
   
    for( i = 0; i < G_N_ELEMENTS( osoby ); i++ )
    {
        guint kod_kraju;
       
        kod_kraju = osoby[ i ].kod;
       
        pixbuf = gdk_pixbuf_new_from_inline( - 1, flagi[ kod_kraju ], FALSE, NULL );
        obraz = gtk_image_new_from_pixbuf( pixbuf );
        g_object_unref( G_OBJECT( pixbuf ) );
        gtk_list_store_append( lista, & iter );
        gtk_list_store_set( lista, & iter, KOLUMNA_LP,( guint ) i + 1, KOLUMNA_KRAJ, osoby[ i ].kraj, KOLUMNA_REPREZENTANT, osoby[ i ].reprezentant,
        KOLUMNA_VIP, osoby[ i ].vip, KOLUMNA_KOLOR, osoby[ i ].kolor, KOLUMNA_PRZEKRESLONY, osoby[ i ].przekreslony,
        KOLUMNA_FLAGA, pixbuf, - 1 );
    }
   
    model = GTK_TREE_MODEL( gtk_list_store_new( 1, G_TYPE_STRING ) );
    gtk_list_store_append( model, & iter2 );
    gtk_list_store_set( model, & iter2, 0, "TAK", - 1 );
    gtk_list_store_append( model, & iter2 );
    gtk_list_store_set( model, & iter2, 0, "NIE", - 1 );
    gtk_list_store_append( model, & iter2 );
    gtk_list_store_set( model, & iter2, 0, "NIEZNANY", - 1 );
   
    komorka = gtk_cell_renderer_combo_new();
    kolumna = gtk_tree_view_column_new_with_attributes( nazwy_kolumn[ KOLUMNA_VIP ], komorka, "text", 3, NULL );
    gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
   
    g_object_set( komorka, "model", model, "text-column", 0, "has-entry", FALSE, "editable", TRUE, NULL );
   
    g_signal_connect( komorka, "changed", G_CALLBACK( zmieniono ), model );
   
    gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), GTK_TREE_MODEL( lista ) );
    g_object_unref( model );
   
    gtk_tree_view_set_grid_lines( treeview, GTK_TREE_VIEW_GRID_LINES_VERTICAL );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}
Oto efekty:

Kolumna VIP pozwal na wybór:

Została wybrana opcja "NIEZNANY", efektem jest przekreślenie w kolumnie "Reprezentant" tekstu "Klos Hans":
Poprzedni dokument Następny dokument
Kurs GTK+, C++ GtkProgressBar