Anzeige:
Results 1 to 4 of 4

Thread: in treeview cell mal editable mal nicht (gtk)

  1. #1
    Registrierter Benutzer
    Join Date
    24.05.2012
    Posts
    21

    in treeview cell mal editable mal nicht (gtk)

    Hallo!
    ich bräuchte dringend Hilfe zu folgendem Thema, weil ich nicht weiterkomme:
    im baue mit C und gtk ein Treeview.
    Beim Aufbauen setze ich den Cell renderer auf "editable"
    Nachher, wenn ich den Baum fülle, möchte ich aber manche Cellen haben, die nicht editierbar sind, je nachdem, was dadrin steht.
    1) kann man das editierbare schon beim Füllen des Treeview ändern?
    2) ich habe einen callback bei "editing-started" signal. Wie kann ich da das Editieren abbrechen, wenn ich merke, dass diese Zelle nicht geändert werden darf?
    ich schaffe es weder mit g_signa_emit_by_name noch mit etwas anderem.

    Kann mir jemand weiterhelfen?
    danke schön im voraus
    MBoerner


    Code:
    renderer = gtk_cell_renderer_text_new();
    g_object_set(G_OBJECT(renderer),"editable",TRUE,NULL);
    g_signal_connect(G_OBJECT(renderer),"edited",G_CALLBACK(cb_valueEdited),NULL);  
    g_signal_connect(G_OBJECT(renderer),"editing-started",G_CALLBACK(cb_valueEdited_started),NULL); 
    column = gtk_tree_view_column_new_with_attributes("value",renderer,"text",COL_VALUE,NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(pw_local.treeview),column);
    und
    Code:
    static gboolean cb_valueEdited_started(GtkCellRendererText *cell, GtkCellEditable *editable, const gchar *path_string, const gchar *new_text)
    {
    	// check if access right allows to edit the cell
    	if (pw_cell_editing_allowed(path_string))
    	{
    		if (GTK_IS_ENTRY(editable))
    		{
    			GtkEntry *entry = GTK_ENTRY(editable);
    			g_signal_connect(GTK_OBJECT(entry), "activate", (GCallback)cb_endWithEnter, NULL);
    		}
    	}
    	else
    	{
    		// cancel editing!
    	}

  2. #2
    Administrator anda_skoa's Avatar
    Join Date
    17.11.2001
    Location
    Graz, Österreich
    Posts
    5.477
    Hab dazu leider keine Erfahrung, aber vielleicht musst du für diesen Fall von GtkCellRendererText ableiten, die start_editing virtual function überschreiben und je nach Zellinhalt entweder NULL zurück geben oder die Implementierung der Basisklasse aufrufen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Join Date
    24.05.2012
    Posts
    21

    Ok, ich probiere es

    Das ist auch eine Idee, ich weiß noch nicht wie man das macht, aber ich versuche es.
    Danke schön
    MBoerner

  4. #4
    Registrierter Benutzer
    Join Date
    24.05.2012
    Posts
    21

    Smile gelöst! hier ist die Lösung

    ich habe öfter diese Frage in Foren gesehen, aber nie eine Antwort, die es konkret löste, daher, falls es jemanden interessiert: Auf englisch, weil ich das auch in einem englischsprechenden Forum setze:

    I found a way to make some cell editable or not, depending on the content of another cell:

    The important command is “gtk_tree_view_column_add_attribute(column, renderer, "editable", COL_EDIT); “
    It says that the attribute “editable” of the column value depends of the content of the column COL_EDIT

    Name of the columns:
    parameter name (COL_NAME)
    parameter value (COL_VALUE)
    parameter editable(COL_EDIT)


    1) make the model of the treeview
    Code:
    pw_local.store = gtk_tree_store_new(COL_COUNT,G_TYPE_INTEGER, G_TYPE_BOOLEAN );
    pw_local.model = GTK_TREE_MODEL(pw_local.store);
    gtk_tree_view_set_model(GTK_TREE_VIEW(pw_local.treeview),pw_local.model);
    usw...
    2) make the column editable
    Code:
    g_signal_connect(G_OBJECT(renderer),"edited",G_CALLBACK(cb_function 2),NULL);
    g_signal_connect(G_OBJECT(renderer),"editing-started",G_CALLBACK(cb_function 1),NULL);
    3) make a column which will content a boolean value:
    0 column is read only
    1 column is editable
    Code:
    #define COLNAME		0
    #define COL_VALUE	1
    #define COL_EDIT		2
    // parameter name
    Code:
    renderer = gtk_cell_renderer_text_new();
    column = gtk_tree_view_column_new_with_attributes("paramname",renderer,"text",COL_NAME,NULL);
     gtk_tree_view_column_set_visible (column,TRUE);  
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview),column);
    // parameter value
    Code:
    renderer = gtk_cell_renderer_text_new();
     g_object_set(G_OBJECT(renderer),"editable",TRUE,NULL);
    g_signal_connect(G_OBJECT(renderer),"edited",G_CALLBACK(cb_function2),NULL);  
     g_signal_connect(G_OBJECT(renderer),"editing-started",G_CALLBACK(cb_function1),NULL);
    column = gtk_tree_view_column_new_with_attributes("value",renderer,"text",COL_VALUE,NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview),column);
    _tree_view_column_add_attribute(column, renderer, "text", COL_VALUE);  // make a renderer text
    gtk_tree_view_column_add_attribute(column, renderer, "editable", COL_EDIT);  //editable depends on the value in COL_EDIT
    //editable or not
    renderer = gtk_cell_renderer_text_new();
    column = gtk_tree_view_column_new_with_attributes("paramedit",renderer,"text",COL_EDIT,NULL);
     gtk_tree_view_column_set_visible (column,TRUE);  
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview),column);
    4) fill the tree
    for each row:
    Code:
    gboolean cell_editable;
    
    cell_editable = FALSE  // or TRUE, if this row shoulb be editable
    gtk_tree_store_append(pw_local.store, &child, &iter);	 append the new row
    gtk_tree_store_set(pw_local.store, &child,
    COL_NAME, “max speed”,
    COL_VALUE, 1000,
    COL_EDIT, cell_editable
    ,-1);

    When you show the tree, in the rows where the last column contents “0” you can not edit the value. In the rows where the last column contents “1”, you can edit the row.

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •