Kurs GTK+ – rozdział 11
Ostrzeżenie
Ten post został opublikowany 15 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.
Comments
Comments are closed for this post.



Skończyłeś pisać kolejne rozdziały ?
Na chwilę obecną - tak.
W jaki sposób można podświetlić aktualna linię?
Albo w jaki sposób dodać numery wierszy po lewej stronie. Albo klamry jak w Mathematica?
Jest jakiś sposób by zmienić wyświetlanie pojedyńczej linijki?
Prościej pewnie będzie użyć GtkSourceViewniż próbować to implementować samemu. GtkSourceView jest widżetem stworzonym właśnie do edycji kodu źródłowego (używany np. w edytorze gedit).
jakis przykład użycia?
a jak w Twoim przykładzie zrobic enter? powiedzmy jak w terminalu enter staje się wykonaniem instrukcji
Jest szansa bys się odezwał na e-mail lub irc, jabber ?
gtk_widget_add_accelerator Jak dodać do tego edytora skrót?
oczywiście można dodać w menu, ale nie chce by to było widoczne. Musiałbym tych skrótów dodac ogromną ilośc np. PgDwn+Alt
Shift+Home itd.
BTW(napisz może do mnie, mam jeszcze jedno pytanie)
Można podpiąć się pod
key-press-event. Czyli z grubsza:(Na GTK+ 3 te stałe mają nieco inne nazwy, m.in.
GDK_KEY_Page_Down)Bardzo dziękuję za odpowiedź. Kod działa. Niestety nie wiem jak obsłużyć prawy alt (czasem linux mapuje) anie jak obsluzyc prawy i lewy control. Sprawdzilem wszystkie MOD?_ wszystko co znalazlem w GDK_ alt_R Super Hiper i podobne klawisze. To może przydać się innym.
Postanowiłem przepisywać i analizować to. Niestety jakimś zbiegiem okoliczności w 20 i 21 linii cały czas wychodzi coś w rodzaju "błędu", gdyż skompilowany program się wywala. Może to jest po prostu poradnik dla linuxa? Pozostaje dalej aplikacja konsolowa, po oknie ani widu ani słychu, nie no słychu - error message.
Chciałem się nauczyć chociaż kilku poleceń, ale zawsze w moim przypadku z C++ mam tak że wywala mi błędy w (jak myślę) poprawnym kodzie. Nie kopiuję tego, tylko przepisuję żeby mi się wryło w pamięć, ale aplikacja cały czas wywala crasha.
Mniejsza o to, złapałem się na typowy błąd - jeden znak w te czy wewte i program leży. Teraz mam pytanko - bo ten kod faktycznie tworzy okienko, ale przy tym zostaje uruchomione okno konsoli. Jak się tego okienka CMD pozbyć?