📄 gtk_tut_it-9.html
字号:
*/ gtklist=gtk_list_new(); gtk_container_add(GTK_CONTAINER(scrolled_window), gtklist); gtk_widget_show(gtklist); gtk_signal_connect(GTK_OBJECT(gtklist), "selection_changed", GTK_SIGNAL_FUNC(sigh_print_selection), NULL); /* creiamo una "Prigione" (Prison) in cui mettere gli elementi di lista ;) */ frame=gtk_frame_new("Prison"); gtk_widget_set_usize(frame, 200, 50); gtk_container_border_width(GTK_CONTAINER(frame), 5); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(vbox), frame); gtk_widget_show(frame); /* connette il gestore di segnale sigh_button_event() alla GtkList * il quale gestira' l'"imprigionamento" degli elementi di lista */ gtk_signal_connect(GTK_OBJECT(gtklist), "button_release_event", GTK_SIGNAL_FUNC(sigh_button_event), frame); /* crea un separatore */ separator=gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(vbox), separator); gtk_widget_show(separator); /* infine creiamo un bottone e connettiamone il segnale "clicked" * alla distruzione della finestra */ button=gtk_button_new_with_label("Close"); gtk_container_add(GTK_CONTAINER(vbox), button); gtk_widget_show(button); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(window)); /* a questo punto creiamo 5 elementi di lista, ognuno con la * propria etichetta, e li aggiungiamo alla GtkList usando * gtk_container_add(). Inoltre, recuperiamo la stringa di testo * dall'etichetta e la associamo, per ogni elemento, a * list_item_data_key */ for (i=0; i<5; i++) { GtkWidget *label; gchar *string; sprintf(buffer, "ListItemContainer with Label #%d", i); label=gtk_label_new(buffer); list_item=gtk_list_item_new(); gtk_container_add(GTK_CONTAINER(list_item), label); gtk_widget_show(label); gtk_container_add(GTK_CONTAINER(gtklist), list_item); gtk_widget_show(list_item); gtk_label_get(GTK_LABEL(label), &string); gtk_object_set_data(GTK_OBJECT(list_item), list_item_data_key, string); } /* qui creiamo altre 5 etichette, questa volta usando * per la creazione gtk_list_item_new_with_label(). * Non possiamo recuperare la stringa di testo dall'etichetta * dal momento che non disponiamo di puntatori alle etichette, * quindi associamo semplicemente il list_item_data_key di ogni * elemento di lista con la medesima stringa di testo. * Per aggiungere elementi di lista, li mettiamo tutti in una lista * doppiamente collegata (GList), e quindi li aggiungiamo con una * unica chiamata a gtk_list_append_items(). * Dal momento che usiamo g_list_prepend() per mettere gli elementi * nella lista doppiamente collegata, il loro ordine sara' discendente * (invece che ascendente come sarebbe se usassimo g_list_append()) */ dlist=NULL; for (; i<10; i++) { sprintf(buffer, "List Item with Label %d", i); list_item=gtk_list_item_new_with_label(buffer); dlist=g_list_prepend(dlist, list_item); gtk_widget_show(list_item); gtk_object_set_data(GTK_OBJECT(list_item), list_item_data_key, "ListItem with integrated Label"); } gtk_list_append_items(GTK_LIST(gtklist), dlist); /* e finalmente vogliamo vedere la finestra, non e' vero? ;) */ gtk_widget_show(window); /* lancia il ciclo principale di gtk */ gtk_main(); /* si arriva a questo punto dopo la chiamata di gtk_main_quit(), * il che accade quando viene distrutta la finestra principale */ return 0;}/* questo e' il gestore di segnale che e' stato connesso all'evento di * pressione/rilascio del bottone della GtkList */voidsigh_button_event (GtkWidget *gtklist, GdkEventButton *event, GtkWidget *frame){ /* facciamo qualcosa solo nel caso di rilascio del terzo bottone * (quello piu' a destra) */ if (event->type==GDK_BUTTON_RELEASE && event->button==3) { GList *dlist, *free_list; GtkWidget *new_prisoner; /* recuperiamo l'elemento di lista selezionato correntemente, * che sara' il nostro prossimo prigioniero ;) */ dlist=GTK_LIST(gtklist)->selection; if (dlist) new_prisoner=GTK_WIDGET(dlist->data); else new_prisoner=NULL; /* cerchiamo elementi di lista gia' imprigionati, * li rimetteremo nella lista. * Ricordare di liberare la lista doppiamente collegata * che viene restituita da gtk_container_children() */ dlist=gtk_container_children(GTK_CONTAINER(frame)); free_list=dlist; while (dlist) { GtkWidget *list_item; list_item=dlist->data; gtk_widget_reparent(list_item, gtklist); dlist=dlist->next; } g_list_free(free_list); /* se abbiamo un nuovo prigioniero, lo rimuoviamo * dalla GtkList e lo mettiamo nella cornice della * "Prigione". Dobbiamo prima deselezionare l'elemento */ if (new_prisoner) { GList static_dlist; static_dlist.data=new_prisoner; static_dlist.next=NULL; static_dlist.prev=NULL; gtk_list_unselect_child(GTK_LIST(gtklist), new_prisoner); gtk_widget_reparent(new_prisoner, frame); } }}/* questo e' il gestore di segnaleche viene chiamato de la * GtkList emette il segnale "selection_changed" */voidsigh_print_selection (GtkWidget *gtklist, gpointer func_data){ GList *dlist; /* recuperiamo la lista doppiamente collegata degli * elementi selezionati della GtkList, ricordate di * trattarla come sola lettura */ dlist=GTK_LIST(gtklist)->selection; /* se non ci sono elementi selezionati non c'e' altro da * fare che dirlo all'utente */ if (!dlist) { g_print("Selection cleared\n"); return; } /* ok, abbiamo una selezione e quindi lo scriviamo */ g_print("The selection is a "); /* ottieniamo l'elemento di lista dalla lista doppiamente * collegata e poi richiediamo i dati associati con * list_item_data_key. Poi semplicemente li stampiamo */ while (dlist) { GtkObject *list_item; gchar *item_data_string; list_item=GTK_OBJECT(dlist->data); item_data_string=gtk_object_get_data(list_item, list_item_data_key); g_print("%s ", item_data_string); dlist=dlist->next; } g_print("\n");}</PRE></CODE></BLOCKQUOTE><P><H2><A NAME="ss9.4">9.4 Il Widget Elemento di Lista (List Item)</A></H2><P>Il widget GtkListItem è progettato allo scopo di essere un contenitorecollegato ad un figlio, per fornire le funzioni per la selezione e deselezioneallo stesso modo in cui il widget GtkList ne ha bisogno per i propri figli.<P>Un GtkListItem ha la sua propria finestra per ricevere eventi, e ha il suoproprio colore di sfondo, che di solito è bianco.<P>Dal momento che questo widget deriva direttamente da GtkItem, può esseretrattato come tale usando la macro GTK_ITEM(ListItem), vedere il widgetGtkItem per ulteriori informazioni.Di solito un GtkListItem ha solo un'etichetta per identificare per esempioun nome di file all'interno di una GtkList -- per cui viene fornita lafunzione appropriata gtk_list_item_new_with_label(). Si può ottenere lostesso effetto creando una GtkLabel da sola, assegnando al suo allineamentoi valori xalign=0 e yalign=0.5, aggiungendo successivamente un contenitorealla GtkListItem.<P>Dal momento che non si è obbligati a mettere una GtkLabel, si può ancheaggiungere una GtkVBox una GtkArrow ecc. alla GtkListItem.<P><P><H2><A NAME="ss9.5">9.5 Segnali</A></H2><P>Un GtkListItem non crea alcun nuovo segnale di per se, ma ereditai segnali di GtkItem. Per ulteriori informazioni, vedere GtkItem::.<P><H2><A NAME="ss9.6">9.6 Funzioni</A></H2><P><P><BLOCKQUOTE><CODE><PRE>guint gtk_list_item_get_type (void)</PRE></CODE></BLOCKQUOTE><P>Restituisce l'identificatore di tipo `GtkListItem'.<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_list_item_new (void)</PRE></CODE></BLOCKQUOTE><P>Crea un nuovo oggetto `GtkListItem'. Il nuovo widget viene restituitosottoforma di un puntatore ad un oggetto `GtkWidget'. In caso di fallimento, viene restituito `NULL'.<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_list_item_new_with_label (gchar *LABEL)</PRE></CODE></BLOCKQUOTE><P>Cre un nuovo oggetto `GtkListItem', avente come unico figlioun GtkLabel. Il nuovo widget viene restituitosottoforma di un puntatore ad un oggetto `GtkWidget'. In caso di fallimento, viene restituito `NULL'.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_item_select (GtkListItem *LIST_ITEM)</PRE></CODE></BLOCKQUOTE><P>Questa funzione è essenzialmente un wrapper per una chiamata agtk_item_select (GTK_ITEM (list_item)) che emetterà il segnaleselect.Vedere GtkItem:: per maggiori informazioni.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_item_deselect (GtkListItem *LIST_ITEM)</PRE></CODE></BLOCKQUOTE><P>Questa funzione è essenzialmente un wrapper per una chiamata agtk_item_deselect (GTK_ITEM (list_item)) che emetterà il segnaledeselect.Vedere GtkItem:: per maggiori informazioni.<P><BLOCKQUOTE><CODE><PRE>GtkListItem* GTK_LIST_ITEM (gpointer OBJ)</PRE></CODE></BLOCKQUOTE><P>Effettua il cast di un puntatore generico a `GtkListItem*'. VedereStandard Macros:: per maggiorni informazioni.<P><BLOCKQUOTE><CODE><PRE>GtkListItemClass* GTK_LIST_ITEM_CLASS (gpointer CLASS)</PRE></CODE></BLOCKQUOTE><P>Effettua il cast di un puntatore generico a `GtkListItemClass*'. VedereStandard Macros:: per maggiorni informazioni.<P><BLOCKQUOTE><CODE><PRE>gint GTK_IS_LIST_ITEM (gpointer OBJ)</PRE></CODE></BLOCKQUOTE><P>Determina se un puntatore generico si riferisce ad un oggetto`GtkListItem'. Vedere Standard Macros:: per maggiorni informazioni.<P> <H2><A NAME="ss9.7">9.7 Esempio</A></H2><P>Come esempio su questo argomento, si veda quello relativo alla GtkList,che riguarda anche l'uso del GtkListItem.<P><HR NOSHADE><A HREF="gtk_tut_it-10.html">Avanti</A><A HREF="gtk_tut_it-8.html">Indietro</A><A HREF="gtk_tut_it.html#toc9">Indice</A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -