Kurs GTK+ – rozdział 11
Ostrzeżenie
Ten post został opublikowany 14 lat temu. Informacje mogą być przestarzałe, poglądy autora mogły ewoluować lub post może być nieaktualny w jakiś inny sposób. Weź to pod uwagę podczas czytania tego posta.11. GtkTextView
11.1. Wstęp
W tym rozdziale dowiesz się, czym jest kontrolka GtkTextView, do czego służy oraz jak ją utworzyć i używać.
GtkTextView to zaawansowany widżet służący do wyświetlania wieloliniowego tekstu i ewentualnej jego modyfikacji, również przez użytkownika. Posiada ogromne możliwości. Można formatować w nim tekst za pomocą tagów, można dostać się do znaków za pomocą iteratorów, a sam tekst wyświetlany przez ten widżet dodaje się do bufora.
11.2. Utworzenie GtkTextView i dodawanie czystego tekstu
GtkTextView można utworzyć za pomocą funkcji:
GtkWidget* ;
Warto wspomnieć, że istnieje jeszcze podobna bardzo funkcja do powyższej, a jest nią:
GtkWidget* ;
Czym one się różnią? Otóż pierwsza tworzy nowy widżet GtkTextView wraz z buforem. W przypadku drugiej funkcji bufor ten należy utworzyć samemu. Warto również wiedzieć o dwóch użytecznych funkcjach:
GtkTextBuffer* ;
void ;
Pierwsza z nich jest szczególnie użyteczna przy tworzeniu GtkTextView za pomocą funkcji gtk_text_view_new(). Zwraca ona bowiem wskaźnik do utworzonego bufora. Druga natomiast ustawia nowy bufor dla widżetu.
Ok, wiesz już jak utworzyć kontrolkę GtkTextView wraz z buforem oraz jak się do tego bufora dostać. Jak jednak dodać do niego jakiś tekst?
Do tego celu posłuży nam funkcja:
void ;
W pierwszym argumencie przyjmuje ona wskaźnik do bufora tekstowego, w następnym do iteratora (o iteratorach za chwilę), w następnym żądany tekst, a w ostatnim — długość tego tekstu. W ostatnim argumencie można podać -1 — wtedy jednak trzeba zadbać o to, aby ciąg znaków kończył się znakiem NULL — 0.
Wspomniałem o iteratorach. Wyznaczają one pozycję umieszczenia ciągu znaków. Aby otrzymać taki iterator, można się posłużyć na przykład funkcją:
void ;
W pierwszym argumencie należy podać referencję do bufora tekstowego, w następnym do iteratora, a w ostatnim należy podać żądaną pozycję.
Z taką wiedzą można już utworzyć widżet GtkTextView i dodać do niego tekst. Warto również przeanalizować poniższy kod źródłowy:
int
Działanie tego kodu można zobaczyć poniżej.
11.3. Tagi
Napisałem we wstępie, że w GtkTextView można formatować tekst za pomocą tagów. Nie są to co prawda takie tagi jak np. w HTML-u, jednak również są bardzo użyteczne. Do tworzenia tagów służy funkcja:
GtkTextTag* ;
W pierwszym argumencie przyjmuje ona wskaźnik do bufora tekstowego, w następnym nazwę tagu, natomiast w kolejnych należy podać kolejno nazwę właściwości i żądaną jej wartość. Powyższa funkcja przyjmuje nieograniczoną liczbę argumentów, a ostatnim argumentem musi być NULL. Listę właściwości i wartości, które można im ustawić można znaleźć w dokumentacji GTK+.
Aby teraz do bufora dodać otagowany tekst, można użyć funkcji:
void ;
Jak nietrudno zauważyć, funkcja ta jest bardzo podobna do omawianej w poprzednim podrozdziale gtk_text_buffer_insert(), tak więc nie ma sensu omawiać jej pierwszych czterech argumentów ponownie, jednak — podobnie jak powyższa — ta funkcja może przyjąć nieskończoną liczbę argumentów. Należy podać bowiem nazwy tagów, które chcesz dodać do dodawanego tekstu. Ostatnim argumentem musi być oczywiście NULL.
Zachęcam do przeanalizowania poniższego kodu źródłowego. Może on pomóc w zrozumieniu działania tagów.
int
Działania powyższego kodu źródłowego możesz zobaczyć poniżej.
11.4. Linie i kolumny
Aby pobrać numer aktualnej linii i kolumny należy posłużyć się iteratorem. Aby natomiast taki iterator — który wskazuje na aktualne położenie kursora — otrzymać, można posłużyć się funkcją:
void ;
W pierwszym argumencie należy podać oczywiście wskaźnik do bufora, w drugim do iteratora, natomiast w trzecim należy podać wskaźnik do GtkTextMark. GtkTextMark to pozycja w buforze, którą można otrzymać np. poprzez funkcję:
GtkTextMark* ;
Powyższa funkcja przyjmuje jako argument referencję do bufora i zwraca GtkTextMark w miejscu aktualnego położenia kursora.
Ok, tak więc mamy już nasz iterator. Teraz przydadzą nam się dwie funkcje:
gint ;
gint ;
Obie przyjmują tylko jeden argument — jest nim wskaźnik do iteratora. Pierwsza z tych dwóch funkcji zwraca numer linii, natomiast druga numer znaku (kolumny).
Pozostała jeszcze jedna kwestia — jak przechwycić zmodyfikowanie bufora lub przesunięcie kursora?
Jest to możliwe dzięki sygnałom changed oraz mark_set. Można je podpiąć do bufora za pomocą poznanej już funkcji g_signal_connect(). Przy czym warto wiedzieć, jakiej konstrukcji wywoływanej funkcji sygnały te wymagają, aby potem uniknąć ewentualnych błędów.
Dla sygnału changed jest to:
void
I tutaj pierwszym argumentem jest oczywiście bufor tekstowy, a drugim — wskaźnik do ewentualnych innych danych czy zmiennych, natomiast dla sygnału mark_set:
void
Pierwszym argumentem jest tutaj wskaźnik do bufora tekstowego, następnym iterator dla GtkTextMarka, do którego wskaźnik jest przekazywany w następnym argumencie, no a czwarty argument to oczywiście dodatkowe dane.
Ze zdobytą wiedzą możesz już utworzyć widżet GtkTextView i np. pasek statusu, w którym podasz aktualny wiersz i kolumnę. Jeżeli wciąż czegoś nie rozumiesz, możesz spróbować przeanalizować poniższy kod źródłowy.
void
void
int
W powyższym kodzie możesz znaleźć jeszcze dwie nowe funkcje i są to:
gchar* ;
void ;
Pierwsza z nich jest odpowiednikiem standardowego sprintf(), jednak bezpieczniejszym i przystosowanym do GTK+. Natomiast druga usuwa wiadomość z paska statusu. Warto zauważyć, że nie posługujemy się funkcją gtk_statusbar_get_context_id() omówioną w rozdziale 7, ponieważ nie musimy tutaj dodawać kilku wiadomości o różnej treści.
Działanie powyższego kodu źródłowego można zobaczyć poniżej.
To by było na tyle w tym rozdziale. Opisuje on bardzo niewielką część możliwości GtkTextView, jednak zachęcam do samodzielnego głębszego poznawania tego widżetu. Następny rozdział opisuje użyteczny widżet GtkTreeView.


