es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cierre de pestañas en el Bloc de notas GTK 3

Lo que estoy tratando de hacer es cerrar pestañas en un cuaderno GTK con un botón agregado a la pestaña, pero la función para obtener el número de página parece no funcionar y parece que las páginas se cierran desde la última creada hacia atrás.

void close_tab(GtkWidget *button, gpointer data){

  gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), button);
  gtk_notebook_remove_page(GTK_NOTEBOOK(notebook) , pg_num);
}

void add_tab (char *name){

  GtkWidget *textview = gtk_text_view_new();
  GtkWidget *text = gtk_label_new(name);
  GtkWidget *label = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  GtkWidget *icon = gtk_image_new_from_file ("close.png");
  GtkWidget *button = gtk_button_new();
  gtk_button_set_image(GTK_BUTTON(button), icon);
  gtk_widget_set_tooltip_text(button , "Close Tab");
  gtk_box_pack_start(GTK_BOX(label), text, TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(label), button, FALSE, FALSE, 0);
  g_signal_connect(GTK_WIDGET(button), "clicked",
                                       G_CALLBACK(close_tab),
                                       NULL);
  GtkWidget *scrollwindow = gtk_scrolled_window_new(NULL, NULL);
  gtk_container_add(GTK_CONTAINER(scrollwindow), textview);
  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrollwindow, label);

  gtk_widget_show_all(label);
  gtk_widget_show_all(scrollwindow);
}

void button_click(GtkWidget *button, gpointer data){
  char *btn = (char *) data;
  if (strcmp(btn, "New") == 0);
    add_tab("new tab");
}

Mi experimento es con dos pestañas, la primera se crea automáticamente con la etiqueta “text” como “untitled”, y la segunda como “new tab” y traté de darle al botón el nombre pasado a la función de agregar pestaña, pero el resultado fue el mismo, así que no sé cómo hacer que el botón sepa en qué página pertenece.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en el código proporcionado es que la línea gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), button); intenta obtener el número de página en función del widget del botón, lo cual no es el enfoque correcto ya que el botón no es un hijo del widget del cuaderno.

    Para solucionar este problema y cerrar la pestaña desde el botón agregado a la pestaña, puede utilizar la función g_signal_connect_swapped en lugar de g_signal_connect para conectar la función close_tab al widget del botón, con el widget del cuaderno como su parámetro de datos.

    Aquí se encuentra el código actualizado de la función close_tab:

    void close_tab(GtkWidget *notebook, GtkWidget *scrollwindow) {
        gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), scrollwindow);
        gtk_notebook_remove_page(GTK_NOTEBOOK(notebook) , pg_num);
    }
    

    Y aquí se encuentra el código modificado de la función add_tab:

    void add_tab (char *name){
    
        GtkWidget *textview = gtk_text_view_new();
        GtkWidget *text = gtk_label_new(name);
        GtkWidget *label = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
        GtkWidget *icon = gtk_image_new_from_file("close.png");
        GtkWidget *button = gtk_button_new();
        gtk_button_set_image(GTK_BUTTON(button), icon);
        gtk_widget_set_tooltip_text(button , "Cerrar pestaña");
        gtk_box_pack_start(GTK_BOX(label), text, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(label), button, FALSE, FALSE, 0);
        gtk_widget_show_all(label);
        gtk_widget_show_all(button);
    
        GtkWidget *scrollwindow = gtk_scrolled_window_new(NULL, NULL);
        gtk_container_add(GTK_CONTAINER(scrollwindow), textview);
        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrollwindow, label);
    
        g_signal_connect_swapped(button, "clicked", G_CALLBACK(close_tab), scrollwindow);
     }
    

    Con esta modificación, el widget scrollwindow se pasa a la función close_tab a través de la función g_signal_connect_swapped, y se obtiene el número de página utilizando este widget en lugar del widget del botón.

    Tenga en cuenta que la función g_signal_connect_swapped intercambia el orden del parámetro data y el parámetro user_data, por lo que el widget scrollwindow se pasa como parámetro user_data a la función close_tab.

Comments are closed.