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ę:
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:
Wracając do przykładu listy plików, magazyn list tworzymy w następujący sposób:
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/IteratorDo 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:
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:
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:
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:
GtkTreePath * gtk_tree_path_new( void );
Tworzy nową ścieżkę zwracając wskaźnik na GtkTreePath.
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.
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.htmlPrzykł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ść:
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:
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.
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.
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.
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.
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:
enum {
KOLUMNA_IMIE = 0,
KOLUMNA_NAZWISKO,
KOLUMNA_ROK_URODZENIA,
ILOSC_KOLUMN
};
GtkListStore * magazyn_listy;
GtkTreeIter iter;
magazyn_listy = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT );
gtk_list_store_append( magazyn_listy, & iter );
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
enum {
KOLUMNA_IMIE = 0,
KOLUMNA_IMIE_DRUGIE,
KOLUMNA_NAZWISKO,
KOLUMNA_ROK_URODZENIA,
ILOSC_KOLUMN
};
GtkListStore * magazyn_listy;
GtkTreeIter iter;
magazyn_listy = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT );
gtk_list_store_append( magazyn_listy, & iter );
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:
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.
#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;
gtk_tree_model_get( model, iter, KOLUMNA_IMIE, & pierwsze_imie, KOLUMNA_IMIE_DRUGIE, & drugie_imie, KOLUMNA_NAZWISKO, & nazwisko, KOLUMNA_ROK_URODZENIA, & rok_urodzenia, - 1 );
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 );
g_free( sciezka );
g_free( pierwsze_imie );
g_free( drugie_imie );
g_free( nazwisko );
return FALSE;
}
void utworz_wypelnij_wyswietl_dane( void )
{
GtkListStore * magazyn_listy;
GtkTreeIter iter;
magazyn_listy = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT );
gtk_list_store_append( magazyn_listy, & iter );
gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Michał", KOLUMNA_IMIE_DRUGIE, "Bartosz", KOLUMNA_NAZWISKO, "Papacz", KOLUMNA_ROK_URODZENIA,( guint ) 1979, - 1 );
gtk_list_store_append( magazyn_listy, & iter );
gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Alicja", KOLUMNA_IMIE_DRUGIE, "Żaneta", KOLUMNA_NAZWISKO, "Król", KOLUMNA_ROK_URODZENIA,( guint ) 1983, - 1 );
gtk_list_store_append( magazyn_listy, & iter );
gtk_list_store_set( magazyn_listy, & iter, KOLUMNA_IMIE, "Patryk", KOLUMNA_IMIE_DRUGIE, "Roman", KOLUMNA_NAZWISKO, "Wawrzyniecki", KOLUMNA_ROK_URODZENIA,( guint ) 1961, - 1 );
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:
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.
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:
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ą:
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:
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:
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:
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:
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_newKomórki GtkCellRender
Aktualnie istnieją komórki wyświetlające:
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:
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ć:
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:
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:
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:
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ę:
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":
#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ą:
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:
Tryb zaznaczania ustwaia się funkcją:
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:
GtkTreeSelection * zaznaczenie;
GtkTreeModel * model;
GtkTreeIter iter;
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:
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ą:
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:
g_signal_connect( komorka, "edited",( GCallback ) obsluz_komorke_edytowalna, NULL );
Prototyp funckcji obsługującej edycję:
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:
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;
model = gtk_tree_view_get_model( treeview );
sciezka = gtk_tree_path_new_from_string( path );
gtk_tree_model_get_iter( model, & iter, sciezka );
gtk_tree_path_free( sciezka );
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();
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:
#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 ) );
if( strlen( tekst ) )
{
GtkTreeModel * model;
GtkTreeIter iter;
model = gtk_tree_view_get_model( GTK_TREE_VIEW( treeview ) );
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;
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 ), "" );
}
}
gtk_tree_selection_unselect_iter( sel, & wybrany_wiersz );
}
void zmiana_Zaznaczenia( GtkTreeSelection * sel, GtkListStore * lista )
{
GtkTreeIter zaznaczony_wiersz;
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 );
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 );
treeview = gtk_tree_view_new();
gtk_box_pack_start( GTK_BOX( vbox ), treeview, TRUE, TRUE, 0 );
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 );
lista = gtk_list_store_new( ILOSC_KOLUMN, G_TYPE_STRING );
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 );
hbox = gtk_hbox_new( FALSE, 14 );
label = gtk_label_new( "Osoba" );
gtk_box_pack_start( GTK_BOX( hbox ), label, FALSE, FALSE, 0 );
entry = gtk_entry_new();
gtk_box_pack_start( GTK_BOX( hbox ), entry, TRUE, TRUE, 0 );
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 );
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 );
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 );
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.
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:
#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 );
gtk_tree_store_append( magazyn_drzewa, & rodzic, NULL );
gtk_tree_store_set( magazyn_drzewa, & rodzic, KOLUMNA_IMIE, "Maria", KOLUMNA_NAZWISKO, "Niezabitowska", - 1 );
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 );
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 );
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 );
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 );
}
else
{
g_snprintf( buf, sizeof( buf ), "wiek nieznany" );
g_object_set( renderer, "foreground", "Red", "foreground-set", TRUE, NULL );
}
g_object_set( renderer, "text", buf, NULL );
}
GtkWidget * utworz_treeview_i_model( void )
{
GtkTreeViewColumn * kolumna;
GtkCellRenderer * komorka;
GtkWidget * treeview;
GtkTreeModel * model;
treeview = gtk_tree_view_new();
kolumna = gtk_tree_view_column_new();
gtk_tree_view_column_set_title( kolumna, "Nazwisko" );
gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
komorka = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
gtk_tree_view_column_add_attribute( kolumna, komorka, "text", KOLUMNA_NAZWISKO );
g_object_set( komorka, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL );
kolumna = gtk_tree_view_column_new();
gtk_tree_view_column_set_title( kolumna, "Imię" );
gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
komorka = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
gtk_tree_view_column_add_attribute( kolumna, komorka, "text", KOLUMNA_IMIE );
kolumna = gtk_tree_view_column_new();
gtk_tree_view_column_set_title( kolumna, "Wiek" );
gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), kolumna );
komorka = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start( kolumna, komorka, TRUE );
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 );
g_object_unref( model );
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 );
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 );
treeview = utworz_treeview_i_model();
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":
#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:
#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
{ ""
"GdkP"
"\0\0\22\200"
"\1\1\0\1"
"\0\0\0\230"
"\0\0\0" "2"
"\0\0\0\37"
"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" };
#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
{ ""
"GdkP"
"\0\0\22\200"
"\1\1\0\1"
"\0\0\0\230"
"\0\0\0" "2"
"\0\0\0\37"
"\"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" };
#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
{ ""
"GdkP"
"\0\0\22\200"
"\1\1\0\1"
"\0\0\0\230"
"\0\0\0" "2"
"\0\0\0\37"
"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" };
#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
{ ""
"GdkP"
"\0\0\22\200"
"\1\1\0\1"
"\0\0\0\230"
"\0\0\0" "2"
"\0\0\0\37"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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:
#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":