Programmare una GUI

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Messaggio da absinthe »

sir_alex ha scritto: magari le abiliti con un #ifdef DEBUG,
sono pienamente d'accordo... però se posso essere pignolo:

l'ansi c ha una flag di default (o per lo meno mi sembra di ricordare):

_DEBUG

basta che abiliti /disabiliti quella per eliminare il dump degli errori è inutile che ne inventi un'altra... ma è tanto per cercare il pelo nell'uovo... :D

M.

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

Sono sulla scia di una scelta difficile :
Allora come sapete sto creando un AreaEditor, un programma che a grandi linee gestisce dei file di testo con tag.
Ora ho ovviamente la necessità di poter avere nello stesso momento più file caricati in memoria, sostanzialmente di poter aprire e lavorare su più file come un qualsiasi programma che si rispetti.
Ovviamente avrò l'interfaccia grafica "occupata" da un solo file per volta, i restanti devono rimanere in memoria.
Ora ascoltate la mia soluzione e ditemi se va bene o se si può far di meglio.

Allora memorizzo ogni file rappresentante un'area in una struttura linkata, strutture area_data, ogni struttura conterrà i dati dell'area. Ogni struttura area_data sarà linkata da una seconda lista di strutture file_data contenenti il link alla struttura area_data interessata e il percorso/nome del file più qualche altra informazione utile.
Su una variabile globale area_in_lavorazione memorizzo il link alla struttura file_data che in quel momento occupa l'interfaccia e tutte le chiamate di callback dell'interfaccia (salvataggi, modifiche ai testi, tasti vari) lavoreranno sulla struttura linkata da area_in_lavorazione.
Ad ogni nuovo caricamento andrò a creare una nuova struttura area_data e file_data da linkare.
Ogni volta che l'utente vorrà lavorare su una nuova area tra quelle caricate non farò altro che cambiare il link contenuto in area_in_lavorazione.
Tramite le chiamate di callback opportune cercherò di mantenere aggiornata la struttura area_data interessata al momento in relazione ai dati presenti sull'interfaccia, per esempio tramite l'evento "changed" degli oggetti entry (quelli per scrivere testo) manterrò aggiornata la variabile char * relativa nella struttura area_data linkata al momento.
Alla chiusura di un file non farò altro che fare l'unlink delle strutture area_data e file_data interessate e aggiornare area_in_lavorazione se necessario. (cioè se il file chiuso stava utilizzando l'interfaccia)


Ciò pensato su bene prima di giungere a questa conclusione e penso che sia abbastanza buona. Se qualcuno ha capito qualcosa, visto che sicuramente mi sono spiegato malissimo, può dirmi se è buona come gestione o se è migliorabile?

epd20
Linux 0.x
Linux 0.x
Messaggi: 92
Iscritto il: lun 15 ago 2005, 0:00
Località: Aosta
Contatta:

Messaggio da epd20 »

Sembra una buona soluzione, con un puntatore globale praticamente fai tutto il lavoro.
Però...
...però però...
con tutte queste strutture non ti è venuta la voglia di passare ad un semplice oggettino C++?
Premesso che io stesso preferisco il C, forse in C++ avresti meno "problemi" iniziali nel creare le varie struct. In più, se sai abbastanza bene il C, passare al C++ non è così complicato, devi solo cercare di pensare in un altro modo -il mondo ad oggetti dopo un po' di pratica è pratico e molto più "user-friendly" per queste applicazioni....
Spero di non averti portato troppo fuori strada; ribadisco che se hai voglia di scrivere la struct la tua soluzione mi sembra molto buona.

Ciao

Emile

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

Mhm ho deciso a suo tempo di usare il C :)
Sono abituato a programmare in C da due anni e visto che questo proggetto è ambizioso vorrei partire con una base solida. Grazie del parere.

P.S: Bello Anjuta comunque, non avevo mai usato un ambiente di sviluppo che andasse oltre il semplice Kate :p

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

Ecco un'altra domanda :

GtkTextView mi permette di inserire testo su più linee al contrario di GtkEntry e fin quì tutto ok.
Ma il problema è, se con gtkentry per avere il testo mi basta usare la callback change (così so di ogni minima modifica) in accoppiata di gtk_entry_get_text, con GtkTextView come faccio? Non ho proprio idea di come gestire sta cosa sosp sosp. Per GtkTextView non c'e' manco una funzione che mi restituisca testo per giunta...


Modifica :

Dopo estenuanti ricerche ho trovato la soluzione che fa per me, passo a gestire tutti i cambiamenti sfruttando un evento comune a tutti gli Widgets, il focud_out, alla fine mi basta e avanza.

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio da useless »

giungo un po' in ritardo ma approvo la scelta di c, gtk e glade! :)

x ricavare il testo da un TextView devi agire sul TextBuffer associato, così:

gchar *text;
GtkTextIter start, end;
gtk_text_buffer_get_bounds (tb, &start, &end);
text = gtk_text_buffer_get_text (tb, &start, &end, FALSE);

dove tb è appunto il TextBuffer.

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

ecco sta cosa del textbuffer proprio non l'ho capita :p anche perchè ho notato che il textbuffer ha dei callback molto interessanti (come il changed che il gtktextview non ha). Precisamente come lo posso usare, e come lo associo a un gtktextview se questo e' possibile?

sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

Messaggio da sir_alex »

Ho la soluzione definitiva: scaricati le API delle gtk+!!!
Aspetta che cerco il link...

http://www.gtk.org/api/ (easy in effetti...)

qui c'è scritto tutto in comodo html con riferimenti incrociati, ci sono spiegati tutti gli widget con tutte le funzioni riferite, le proprietà ed i segnali! Io le trovo stupende ogni volta che ho bisogno di qualcosa lì lo trovi! Prova un po'... 8)

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

effettivamente quella guida è molto completa e ben strutturata e son riuscito a scoprire come associare ad un gtktextview il suo gtktextbuffer 8)

Ora però sorge un dubbio di gestione. E' la prima volta che uso le Gtk e la gui la creo con Glade, unico problema è che glade riscrive da 0 il file interfaccia.c ... questo fatto comporta che devo crearmi tutta l'interfaccia e poi programmare? Per esempio per associare al gtktextview il gtktextbuffer devo andare a modificare interfaccia.c e questo comporta che la prima volta che apro glade e risalvo il proggetto mi si sballa tutto... potrei gestire la cosa ( forse ) con l'evento di creazione ma è pulito e bello fare una cosa del genere?

La mia soluzione, la prima che mi è venuta in mente, è di creare tutta l'interfaccia senza alcun evento gestito e di gestire le chiamate di callback sucessivamente a mano, una per una con calma. Premetto però che la gui è alquanto complessa, almeno un 200 entry e textview, alcuni notebook, menù, barra strumenti, un bel tree e varie finestre secondarie, alcune semplici altre meno.

Esiste una soluzione ai miei problemi? Insomma un modo professionale per gestire il tutto?

Modifica : Scusate ma era l'1 di notte e ora è l'1 e un quarto :P e in soli 15 minuti mi sono risposto da solo ... lookup_widget() ... il bello è che nel file interface.c era scritto grosso come una casa "COME OTTENERE UN PUNTATORE" e io tonno (o il mio cervello) non volevo afferrare il concetto che puntatore = fai quel che vuoi.

Riassumendo per me e per chi leggesse questa discussione in futuro :

1) - Creo un gtktextbuffer
2) - Associo al gtktextview il gtktextbuffer con
gtk_text_view_set_buffer (
GTK_TEXTVIEW( lookup_widget( gtktextview) ),
GTK_TEXTBUFFER( gtktextbuffer ) )
3) - uso gli eventi di GTK_TEXTBUFFER, ricavo il testo ... ecc

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio da useless »

lascia perdere il codice C generato da glade e usa libglade. tra l'altro dalla versione 3 di glade il codice C non sarà + generabile.
x ottenere il textbuffer (che in sostanza è l'oggetto che gestisce il testo in un textview, mentre l'oggetto textview in sé non ha una grande utilità) io faccio qualcosa tipo:
textbuffer_recvsms = gtk_text_view_get_buffer (GTK_TEXT_VIEW (glade_xml_get_widget (xml, "textview_recvsms")));

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

libglade mhm, altre cose da imparare? Cosa contiene questa libglade che io non conosco? Scusa l'ignoranza :p

Praticamente alla fine devo crearmela a mano l'interfaccia per fare una cosa fatta bene?

Modifica : A quello che ho scoperto googlando, libglade permette di non utilizzare il file interfaccia.c ma di andare direttamente alla radice utilizzando il file xml del proggetto creato con glade.... Per esempio se necessito (caso banale) del puntatore alla finestra principale per disegnarla farò così :

xml = glade_xml_new("interfaccia.glade", NULL, NULL);
finestra_principale = glade_xml_get_widget(xml, "finestra_principale");
gtk_widget_show (finestra_principale);

se questa è la risposta questa libreria mi piace un sacco :)

sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

Messaggio da sir_alex »

Io al momento uso ancora la generazione di codice... è simpatico vedere il pc compilare un file interface.c da 1600 righe di codice... 8)
comunque su libglade domandina: se ho + finestre ne genero una sola chiamando come secondo argomento di glade_xml_new il nome della finestra, poi per creare le altre? richiamo ancora glade_xml_new con altri nomi di finestra, ma poi per usare gtk_widget_show/hide devo usare glade_xml_get_widget con il nome della finestra come parametro? Ho capito bene?

sir_alex
Linux 3.x
Linux 3.x
Messaggi: 735
Iscritto il: lun 21 mar 2005, 0:00
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu
Località: Milano - Corbola (RO)
Contatta:

Messaggio da sir_alex »

useless ha scritto:lascia perdere il codice C generato da glade e usa libglade. tra l'altro dalla versione 3 di glade il codice C non sarà + generabile.
per curiosità, dove hai letto questa notizia? Mi sa che mi tocca passare veramente anch'io a libglade a questo punto... :cry:

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio da useless »

be', dai, non è così drammatico passare a usare libglade, bastano 2 o 3 righ righe in +, e ci sono mooolti pro, come ad esempio il poter modificare l'interfaccia senza ricompilare il programma, e una chiara distinzione tra il codice del programma e quello della gui.

su http://www.jamesh.id.au/software/libglade/ c'è subito un esempio di come si usa libglade. non so come fare ad aprire una finestra +ttosto che un'altra, sinceramente è la parte di gtk che + mi è oscura! io di solito ho un'unica finestra principale e varie dialog che partono hidden e sono showate quando necessario. come dovrei procedere se avessi + finestre?

quanto a dove ho letto quella cosa:
http://glade.gnome.org/todo.html

quanto ai widget deprecati: sono deprecati xké ora c'è un sistema migliore x fare le stesse cose, ravana la api reference :).

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio da Sari »

Be, anche io ho una sola finestra principale con tutto ben strutturato all'interno e una serie di finestre secondarie che però distruggo ogni volta (amo risparmiare memoria :p).
Comunque usando libglade devo costruire semplicemente l'insieme degli eventi/chiamate di callback dato che tutta la strutturazione dell'interfaccia è gestita da libglade attraverso il file xml? Io ho intenzione di fare un file.c e all'interno richiamare tutti i puntatori agli oggetti gestendo per ognuno tutti gli eventi che mi servono con gtk_signal_connect_object, e un secondo file dove assegno alle variabili globali "finestra" i loro puntatori così da averle belle e pronte da creare quando mi servono.

Rispondi