Kurs GTK+ – rozdział 11
Ostrzeżenie
Ten post został opublikowany 13 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 GtkTextMark
a, 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
.