Newsgroup: it.comp.os.linux.development
Titolo: Gtk: capire in che tab di un notebook mi trovo

Salve,
sto scrivendo un piccolo programmino con le Gtk, a mi sono scontrato con 
un problema col widget Notebook.
Lo uso dinamicamente, creando nuove pagine man mano che mi servono, e ho 
un pulsante nella label per chiudere la tab corrispondente.
Il problema e` come capire dentro la callback corrispondente in quale tab 
mi trovo.
Non posso memorizzare l'indice come proprieta` del bottone, perche` dovrei 
aggiornarli tutti ogni volta che ne aggiungo/rimuovo/sposto uno.
Probabilmente c'e` una funzione di uno dei widget coinvolti che mi 
permette di saperlo, ma non la conosco.
Qualche idea?
Grazie.

 permette di saperlo, ma non la conosco.
E' capitato anche a me, ho risolto mettendo la struttura dati associata 
al body del tab nello user_data della callback di click del bottone 
nella label (un widget di chiusura stile tab di firefox).
L'alternativa e` risalire dal widget che scatena la callback al tab, ma 
non te lo consiglio perche` dipende da quanti container ci metti in 
mezzo, tipicamente la tabpage dovrebbe essere in button->parent->parent 
(supponendo che tu abbia aggiunto un container intermedio), ma non ti 
consiglio di farlo perche` GtkNotebookPage e` private in teoria :)
Bye,
  Gabry

 consiglio di farlo perche` GtkNotebookPage e` private in teoria :)
E` quello che stavo facendo, e mi aveva bloccato proprio il fatto che non 
sapevo cosa fosse parent->parent. Ora che mi dici che e` privata credo mi 
orientero` sull'altra soluzione. :)
Bye.

 Ora devo capire come farlo in Vala. :)
Cosa e' vala? :)
Non che dovrei parlare di metodi "indiretti" di usare GTK perche` ti 
faccio vedere come lo faccio io:
OoView::OoView(OoEdit *app, const std::string &filename) :
    m_name(filename), m_modified("*"), m_cont(false, 2), m_app(app)
{
     // create the notebook label with filename, modify indicator and a 
close button.
     gtk::Button button;
     m_modified.Padding(2);
     gtk::Image img(gtk::IconSizeMenu, GTK_STOCK_CLOSE);
     button.Image(img);
     button.Relief(ReliefNone);
     button.OnClick(&OoEdit::closeview, app, this);
     m_cont.PackStart(m_label, true, true);
     m_cont.PackStart(m_modified, false, false);
     m_cont.PackStart(button, false, false);
     m_cont.ShowAll();
Questo e` un wrapper C++ di GTK che sto scrivendo, insoddisfatto di 
gtkmm, il codice e` tratto dal programma di esempio ooedit, un editor di 
testo a tab in 400 linee di codice (pieno di commenti).
Il SVN e` disponibile su sourceforge: 
www.sf.net/projects/oogtk
Bye,
  Gabry

 testo a tab in 400 linee di codice (pieno di commenti).
Grazie per l'esempio. Non conosco C++, ma il codice e` abbastanza chiaro 
che sono riuscito a capirlo. :)
Questo e` quello che "ho dovuto" fare in Vala.
Document e` un wrapper intorno a ScrolledWindow (per quello la variabile 
si chiama sw :) con delle variabili per tenerci i riferimenti ai suoi 
componenti:
private void add_notebook_page()
{
 var sw = new Document();
 
 var buffer = (Gtk.TextBuffer)sw.buffer;
 buffer.set_data("document", sw);
 buffer.modified_changed += this.on_document_modified;
 
 var nb = (Gtk.Notebook)this.widget("nb_main");
 
 var hb = new Gtk.HBox(false, 0);
 var label = new Gtk.Label((sw.filename=="" ? "New Document" : 
sw.filename));
 sw.label = label;
 hb.pack_start( label , true, true, 0);
 
 var close = new Gtk.Button();
 close.relief = Gtk.ReliefStyle.NONE;
 close.set_image( new Gtk.Image.from_stock(Gtk.STOCK_CLOSE, 
Gtk.IconSize.MENU) );
 close.set_data("document", sw);
 
 close.clicked += this.on_tab_close;
 
 hb.pack_start( close , false, true, 0);
 hb.show_all();
 
 nb.append_page( sw, hb);
 nb.set_current_page(nb.page_num(sw));
}
Ho dovuto usare set_data perche` la gestione dei segnali in Vala e` un po' 
particolare. La sintassi e`:
widget.segnale += classe.callback;
Quando il widget genera il segnale viene chiamata la callback definita 
della classe, e la classe stessa viene passata come user_data alla 
callback, quindi non si possono definire user_data personalizzati.
Questa funzione fa parte della classe Gui che carica da glade 
l'interfaccia e che contiene tutte le callback relative, quindi uso this.
Anche io sto scrivendo un editor multi-tab per impratichirmi col 
linguaggio, e per ora sono a 317 linee, ma dovrei aggiungerne una trentina 
ancora. Le funzionalita` sono quelle di base (apri, edita, salva, taglia, 
copia, incolla, chuidi).
Non l'ho ancora reso pubblico perche` ci sto lavorando da 3 giorni e 
perche` il codice fa abbastanza schifo, ma se ti interessa te lo mando. :)
Bye.