Guida gtk+ a puntate ( XVIII parte )
Si continua a parlare di gtk+, vedo che durante queste guide ho iniziato ad affascinare molte ( rispetto a quanto mi aspettavo all’inizio ) persone e ne son contento
Dopo la mia piccola riflessione iniziale di autoapprezzamento, possiamo continuare l’argomento textview affrontando velocemente l’ultimo argomento per poi poter finalmente passare ad altro.
GtkTextTag
I tag forse qualcuno di voi può già intuire cosa siano, per chi non lo sapesse lo spiego non preoccupatevi. Sono delle “entità” astratte che permettono di applicare degli effetti al testo come ad esempio il grassetto, evidenziazione, colore, ecc.. Non sono così particolari come utilità, mi è capitato più volte di aver bisogno ad esempio della possibilità di evidenziare del testo per far risaltare ad esempio le parole durante una ricerca di qualche parola cosa non fattibile nel caso i tag non esistessero.
I tag oltre ad avere degli attributi ( cosa principale per un tag che più avanti vedremo come settare e quali sono ) hanno anche delle priorità, ovvero se noi abbiamo due tag che evidenziano e capita che vengano utilizzati tutti e due sappiamo che uno dei due sarà sotto l’altro nel caso si ritrovino nello stesso punto. Solitamente la priorità di tutti i tag è 0 quindi l’ultimo applicato copre l’altro. Ciò però si può cambiare tramite una funzione chiamata gtk_text_tag_set_priority () ( per ottenerla gtk_text_tag_get_priority () unico argomento il tag, ritorna l’int rappresentante la priorità ) che riceve come primo argomento il tag, e come secondo argomento la priorità ( da specificare come int ).
Voi ora vi chiederete ma come lo creo il tag? semplicissimamente con la funzione gtk_text_tag_new () che riceve come unico argomento il nome da dare al tag, e ritorna il tag creato ( GtkTextTag * ).
La parte “difficile” è quella del settaggio dei vari attributi che per farla dobbiamo ricorrere al tipo primitivo GObject e quindi alla relativa funzione g_object_set () che abbiamo già incontrato durante queste guide. Vi dò un codice di esempio:
1 2 3 4 | GtkTextTag *tag; tag = gtk_text_tag_new ("highlighting"); g_object_set (G_OBJECT (tag), "foreground", "#ffffff", "background", "#000000", NULL); |
Come vedete la funzione g_object_set () riceve come primo argomento il nostro tag convertito in GObject tramite la macro G_OBJECT dopodichè ci sono in sequenza attributo, valore, attributo, valore, .. quando si termina l’impostazione dei vari attributi diamo NULL come parametro e abbiam finito. Gli attributi da poter dare non sto qui ad elencarli perchè sono veramente tanti, vi rimando quindi alla pagina delle api ufficiali delle gtk+ relativa ai tag.
Per finire rimane l’ultima questione: Ok, ho capito come creare e impostare il tag, ora però che me ne faccio se non so come applicarlo al testo?
Boh! Scherzo
diciamo che ci sono molti metodi per usare un tag relativi alla situazione in cui ci si ritrova, perchè ad esso fanno riferimenti molti widget di diversa natura. Elenco qualche funzione:
- gtk_text_buffer_insert_with_tags (): primo argomento il buffer di testo, secondo argomento l’iter che individua la posizione in cui inserire il testo, terzo argomento il testo accompagnato dal quarto argomento che è la sua lunghezza ( o -1 se è NULL-terminated ), quinto argomento in poi i vari tag che verranno applicati al testo.. alla fine per terminare gli argomenti è necessario inserire il valore NULL.
- gtk_text_buffer_insert_with_tags_by_name (): ( gli autori delle gtk+ non si può dire che siano avari sulla lunghezza dei nomi delle funzioni ) come la funzione precedente solo che al posto di passare i tag veri e propri si può passare il nome del tag creato. Questo però aggiungendo prima il tag alla TagTable del buffer. Non ne ho parlato e non ne parlo per confondere le idee, vi basti sapere che la TagTable ( GtkTextTagTable ) del buffer la si prende tramite la funzione gtk_text_buffer_get_tag_table () che riceve come argomento il buffer e ritorna un puntatore a GtkTextTagTable. Dopodichè si può aggiungere il tag alla tabella tramite la funzione gtk_text_tag_table_add () che riceve come primo argomento la TagTable e come secondo argomento il tag da inserire.
- gtk_text_buffer_apply_tag (): primo argomento il buffer, secondo argomento il tag da applicare e i due parametri successivi sono il GtkTextIter iniziale e quello finale che delimitano lo spazio a cui il tag viene applicato.
- gtk_text_buffer_apply_tag_by_name (): come la funzione precedente, solo che il secondo parametro al posto di essere il tag vero e proprio sarà il nome del tag, e qui si torna al ragionamento fatto per la funzione gtk_text_buffer_insert_with_tags_by_name ().
- gtk_text_buffer_remove_tag (): Come la funzione gtk_text_buffer_apply_tag () solo che al posto di applicare il tag passato all’area compresa tra l’iter iniziale e quello finale, rimuove eventuali occorrenze dello stesso in quell’area.
- gtk_text_buffer_remove_tag_by_name (): Come la funzione precedente, il tag anche qui c’è la differenza che viene passato per nome e quindi si ritorna al discorso delle funzioni _by_name precedenti.
- gtk_text_buffer_remove_all_tags (): come la funzione gtk_text_buffer_remove_tag () solo che non c’è l’argomento per il tag dato che rimuove tutti i tag eventualmente applicati nell’area compresa tra l’iter iniziale e quello finale.
Ok, abbiam finito con la gestione di una textview, ho tralasciato alcune parti, nel caso però vi servissero fate pure domande nei commenti che risponderò come posso per affrontare quei lati che ho tralasciato.
Fine Diciottesima Puntata
Capite ora perchè me la son presa con calma per trattare i tag? XD va bien, alla prossima!
Ciauz
Commenti recenti