GTK+ Forums

Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
It is currently Fri Jul 25, 2014 3:21 pm

All times are UTC




Post new topic Reply to topic  [ 2 posts ] 
Author Message
 Post subject: [C]Creating a dynamic matrix with tables and Gtkentries....
PostPosted: Fri Apr 04, 2008 10:24 am 
Offline
Familiar Face

Joined: Fri Apr 04, 2008 9:59 am
Posts: 10
Hello Everyone
I'm currently developping a linear system resolution application (Gauss,Cholesky,LU....) And I want to create a dynamic sizeable matrix to allow the user to enter datas.I'm working on DEVC++,GTK+2.0 and windows.
On the windows, there are three areas with labelled frames containing tables:
-An area for the matrix with the matrix table.
-An area for a vector with vector table.
-An area for the solution with the solution table.
My main problem is that above the size of 2(3,4 more precisely), the entries does not appear correctly in the vector and solution table.And when I enter 5, the application crash with a window error....Knowing I want the user to be able to enter infos for matrixes up to 10*10 size....

Well, I think an code should be more "talking":

Code:
void Creation_matrice(void)
{
     
     //Variables 
     int taille,i,j;
     GtkWidget *pChoix;
     GtkWidget *pCadre;
     GtkWidget *pSelect;
     GtkWidget *pHbox;
     GtkWidget *pMatrice;
     GtkWidget *pFrame[3];
     GtkWidget *pTable[3];
     GtkWidget *pEntryVec[taille];
     GtkWidget *pEntrySol[taille];
     GtkWidget *pEntryMat[taille*taille];
     
     
     //Creation de Frame
     pCadre = gtk_frame_new("Choix de la taille");
     
     //creation de la fenetre de dialogue de choix de la taille;
     pChoix=gtk_dialog_new();
     gtk_window_set_title(GTK_WINDOW(pChoix),"Taille de la matrice");
     gtk_window_set_transient_for(GTK_WINDOW(pChoix),GTK_WINDOW(pWindow));
     gtk_window_set_resizable(GTK_WINDOW(pChoix),FALSE);
     
     //Insertion de boutons dans la fenetre de dialogue
     gtk_dialog_add_buttons(GTK_DIALOG(pChoix),"OK",GTK_RESPONSE_OK,
                                               "Annuler",GTK_RESPONSE_CANCEL,
                                               NULL);
     //Creation de la zone de selection+insertion dans la frame
     pSelect = gtk_spin_button_new_with_range(1,10,1);
     gtk_container_add(GTK_CONTAINER(pCadre),pSelect);
     
     
     //Insertion du cadre dans la fenetre de dialogue de choix de taille
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pChoix)->vbox),pCadre,TRUE,TRUE,0);
     
     //on limite les actions à cette fenêtre
     gtk_window_set_modal(GTK_WINDOW(pChoix),TRUE);
     
     //affichage de la fenetre
     gtk_widget_show_all(pChoix);
     
     //Récupération des réponses des boutons:
     if (gtk_dialog_run(GTK_DIALOG(pChoix))== GTK_RESPONSE_OK)
     {
        taille=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pSelect));                                     
        gtk_widget_destroy(pChoix);
       
             
        //Creation de la fenetre+Insertion boutons
        pMatrice=gtk_dialog_new();
        gtk_window_set_title(GTK_WINDOW(pMatrice),g_locale_to_utf8("Insertion des données",-1,NULL,NULL,NULL));
        gtk_window_set_transient_for(GTK_WINDOW(pMatrice),GTK_WINDOW(pWindow));
        gtk_dialog_add_buttons(GTK_DIALOG(pMatrice),g_locale_to_utf8("Résolution",-1,NULL,NULL,NULL),GTK_RESPONSE_OK,
                                                                     "Nouveau",GTK_RESPONSE_APPLY,
                                                    g_locale_to_utf8("Arrêter",-1,NULL,NULL,NULL),GTK_RESPONSE_CANCEL
                                                    ,NULL);
     
        //Création de la Hbox + Insertion dans la Vbox de la boite de dialogue
        pHbox=gtk_hbox_new(FALSE,0);
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pMatrice)->vbox),pHbox,FALSE,TRUE,0);
     
     
        //Création des frames
        pFrame[0]=gtk_frame_new("Matrice");
        pFrame[1]=gtk_frame_new("Vecteur");
        pFrame[2]=gtk_frame_new("Solution");
       
        //Création des tables pour la matrice, le vecteur et la solution
        pTable[0]= gtk_table_new(taille,taille,TRUE);
        pTable[1]= gtk_table_new(taille,1,TRUE);
        pTable[2]= gtk_table_new(taille,1,TRUE);
       
        //Creation des zones d'entree des nombres+definition de leur taille
            /*Pour les vecteurs*/         
             for(i=0;i<taille;i++)
             {
              pEntryVec[i]=gtk_entry_new();
              pEntrySol[i]=gtk_entry_new();
                     
             }
            /*Pour la matrice*/
             for(i=0;i<taille*taille;i++)
             {
               pEntryMat[i]=gtk_entry_new();               
                                            }
        //Attachement des zones d'entrées aux différentes tables
            /*Pour la table Matricielle*/
           
           
            for(i=0;i<taille;i++)
            {
              for(j=0;j<taille;j++)
              {                   
                gtk_table_attach_defaults(GTK_TABLE(pTable[0]),pEntryMat[i*taille+j],i,i+1,j,j+1);
                                                                                                  }
                                                                                         
                                                                                                   }
             /*Pour la table Vectorielle*/
              for(i=0;i<taille;i++)
                {                   
                 gtk_table_attach_defaults(GTK_TABLE(pTable[1]),pEntryVec[i],0,1,i,i+1);
                                                                                         }
             /*Pour la table Solution*/ 
              for(i=0;i<taille;i++)
                {
                  gtk_table_attach_defaults(GTK_TABLE(pTable[2]),pEntrySol[i],0,1,i,i+1);
                                                                                         }
                                                                                                                                                               
        //Insertion des tables dans les frames
        for(i=0;i<3;i++)
        {
           gtk_container_add(GTK_CONTAINER(pFrame[i]),pTable[i]);             
                                                                 }
        //Insertion des frames dans la Hbox
        for(i=0;i<3;i++)
        {
         gtk_box_pack_start(GTK_BOX(pHbox),pFrame[i],FALSE,FALSE,15);
        }
       
       
       //limitaion des actions à cette fenêtre
       gtk_window_set_modal(GTK_WINDOW(pMatrice),TRUE);
   
       //Affichage fenêtre
       gtk_widget_show_all(pMatrice);
     }
     else
     {
       gtk_widget_destroy(pChoix); 
         }                                                         
}     



And an image of my "bug":
Image

Could you help me finding the issue please?And if this is not the good solution, is there another? Thanks in advance.


Top
 Profile  
 
 Post subject:
PostPosted: Sun Apr 06, 2008 1:32 pm 
Offline
Familiar Face

Joined: Fri Apr 04, 2008 9:59 am
Posts: 10
Hum...Well.I decided to change my way to present the matrices and I gonna use a GtkTreeView in order to show it.The main problem now is that I only can edit the first row of the treeview.When I try to edit the other rows, nothing is changed in the selected row and moreover,It changes the edited value of the first row.Here's the code.Can someone help me please?

Code:


#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>


void cell_edited(GtkCellRendererText *cell,
                 const gchar         *path_string,
                 const gchar         *new_text,
                 GtkTreeView *treeView        );

int main(int argc, char *argv[])
{
  //Initialisation GTK
  gtk_init(&argc, &argv);
 
  //Définition des variables
  gint i=0,Taille=0;
  GtkWidget *pWindow=NULL;
  GtkWidget *pLV=NULL;
  GtkWidget *pScroll=NULL;
  GtkListStore *pStore=NULL;
  GtkCellRenderer *pRender=NULL;
  GtkTreeViewColumn *pColumn=NULL;
  GType *types=NULL;
 
     Taille=3;
 
  //Création et définition des attributs de la fenêtre principale
    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(pWindow),GTK_WIN_POS_CENTER);
    gtk_window_set_title(GTK_WINDOW(pWindow),"Test");
    gtk_window_set_default_size(GTK_WINDOW(pWindow),400,300);
 
  //Creation du modèle et du type pour les colonnes
     types = g_new0(GType,Taille);
     for(i=0;i<Taille;i++)
     {types[i]=G_TYPE_FLOAT;}
     pStore = gtk_list_store_newv(Taille,types);
     g_free (types);
   
   
  //Insertion des éléments
    for(i=0;i<Taille;i++)
     {
        GtkTreeIter pIter;
        /*Creation de la nouvelle ligne*/
          gtk_list_store_prepend(pStore, &pIter);
        /*Insertion des données*/
          gtk_list_store_set(pStore,&pIter,i,0);
                                                          }
                             
  //Creation de la vue
    pLV= gtk_tree_view_new_with_model(GTK_TREE_MODEL(pStore));
 
  //Creation des colonnes
    for(i=0;i<Taille;i++)
    {
      pRender= gtk_cell_renderer_text_new();
      g_object_set (GTK_CELL_RENDERER (pRender), "editable",TRUE,"editable-set",TRUE,NULL);
      g_signal_connect(G_OBJECT(pRender),"edited", G_CALLBACK(cell_edited),(gpointer)pLV);                 
      pColumn=gtk_tree_view_column_new_with_attributes("",pRender,"text",i,NULL);
      gtk_tree_view_append_column(GTK_TREE_VIEW(pLV),pColumn);                   
                                                                                          }
                                                                                                                                                                                                                                                                     
                                                                                         
  //Creation de la barre de défilement+Gestion de ses attributs                                                                                     
    pScroll=gtk_scrolled_window_new(NULL,NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScroll),GTK_POLICY_ALWAYS,GTK_POLICY_ALWAYS);
    gtk_container_add(GTK_CONTAINER(pScroll),pLV);
    gtk_container_add(GTK_CONTAINER(pWindow),pScroll);
 
  //Fermeture du programme
    g_signal_connect(G_OBJECT(pWindow),"destroy", G_CALLBACK(gtk_main_quit),NULL);
 
  //Affichage de la fenêtre
    gtk_widget_show_all(pWindow);
    gtk_main();
   
   return EXIT_SUCCESS;
}

void cell_edited(GtkCellRendererText *cell,
                 const gchar         *path_string,
                 const gchar         *new_text,
                 GtkTreeView *treeView            )
                 
{
   GtkTreeIter Iter;
   GtkTreeModel *Model;
   gfloat num=atof(new_text);
   Model=gtk_tree_view_get_model(treeView);
   guint column_number = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(cell), "column"));
   gtk_tree_model_get_iter_from_string(Model,&Iter,path_string);
   gtk_list_store_set(GTK_LIST_STORE(Model),&Iter,column_number,num);             
                 
}                                       
                                         



Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 2 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group